[dpdk-dev] kni: fix build on RHEL6.5

Message ID 1418275627-17145-1-git-send-email-jmiao@redhat.com (mailing list archive)
State Accepted, archived
Headers

Commit Message

Jincheng Miao Dec. 11, 2014, 5:27 a.m. UTC
  RHEL6.5 kernel is based on 2.6.32. But there are two changing
from 2.6.35:
1. socket struct is changed
It wrappered previous wait_queue_head_t of socket to
struct socket_wq. So for the kernel older than 2.6.35, we should
directly use socket->wait instead.

2. new function sk_sleep()
This function is implemented from 2.6.35 to obtain wait queue
from struct sock. This patch adds a macro in kni/compat.h
to be compatible with older kernels.

Patch is tested in RHEL6.5 and RHEL7.0 with:
CONFIG_RTE_LIBRTE_KNI=y
CONFIG_RTE_KNI_KO_DEBUG=y
CONFIG_RTE_KNI_VHOST=y
CONFIG_RTE_KNI_VHOST_MAX_CACHE_SIZE=1024
CONFIG_RTE_KNI_VHOST_VNET_HDR_EN=y
CONFIG_RTE_KNI_VHOST_DEBUG_RX=y
CONFIG_RTE_KNI_VHOST_DEBUG_TX=y


Signed-off-by: Jincheng Miao <jmiao@redhat.com>
---
 lib/librte_eal/linuxapp/kni/compat.h    |    6 ++++++
 lib/librte_eal/linuxapp/kni/kni_vhost.c |   17 +++++++++++++++++
 2 files changed, 23 insertions(+), 0 deletions(-)
  

Comments

Thomas Monjalon Dec. 16, 2014, 3:21 p.m. UTC | #1
2014-12-11 13:27, Jincheng Miao:
> RHEL6.5 kernel is based on 2.6.32. But there are two changing
> from 2.6.35:
> 1. socket struct is changed
> It wrappered previous wait_queue_head_t of socket to
> struct socket_wq. So for the kernel older than 2.6.35, we should
> directly use socket->wait instead.
> 
> 2. new function sk_sleep()
> This function is implemented from 2.6.35 to obtain wait queue
> from struct sock. This patch adds a macro in kni/compat.h
> to be compatible with older kernels.

I don't understand the relation between RHEL-6.5 and the kernel 2.6.35.
The patch seems not related to RHEL at all.
Please start your explanations by describing what is the problem
you want to solve.

Thanks
  
Jincheng Miao Dec. 17, 2014, 3:26 a.m. UTC | #2
On 12/16/2014 11:21 PM, Thomas Monjalon wrote:
> 2014-12-11 13:27, Jincheng Miao:
>> RHEL6.5 kernel is based on 2.6.32. But there are two changing
>> from 2.6.35:
>> 1. socket struct is changed
>> It wrappered previous wait_queue_head_t of socket to
>> struct socket_wq. So for the kernel older than 2.6.35, we should
>> directly use socket->wait instead.
>>
>> 2. new function sk_sleep()
>> This function is implemented from 2.6.35 to obtain wait queue
>> from struct sock. This patch adds a macro in kni/compat.h
>> to be compatible with older kernels.
> I don't understand the relation between RHEL-6.5 and the kernel 2.6.35.
> The patch seems not related to RHEL at all.
> Please start your explanations by describing what is the problem
> you want to solve.

Hi Thomas,

This patch is working for resolving the problem I found on RHEL6.5:
http://dpdk.org/ml/archives/dev/2014-December/009827.html

Because the root cause is socket struct change from 2.6.35, so this
patch also fits for all kernels older than 2.6.35.

Sorry for the ambiguous description, I think the title should be:
"kni: more compatibility for kernel older than 2.6.35"

Regards,
Jincheng Miao

>
> Thanks
  
Thomas Monjalon Dec. 17, 2014, 11:39 p.m. UTC | #3
2014-12-17 11:26, Jincheng Miao:
> On 12/16/2014 11:21 PM, Thomas Monjalon wrote:
> > 2014-12-11 13:27, Jincheng Miao:
> >> RHEL6.5 kernel is based on 2.6.32. But there are two changing
> >> from 2.6.35:
> >> 1. socket struct is changed
> >> It wrappered previous wait_queue_head_t of socket to
> >> struct socket_wq. So for the kernel older than 2.6.35, we should
> >> directly use socket->wait instead.
> >>
> >> 2. new function sk_sleep()
> >> This function is implemented from 2.6.35 to obtain wait queue
> >> from struct sock. This patch adds a macro in kni/compat.h
> >> to be compatible with older kernels.
> > I don't understand the relation between RHEL-6.5 and the kernel 2.6.35.
> > The patch seems not related to RHEL at all.
> > Please start your explanations by describing what is the problem
> > you want to solve.
> 
> Hi Thomas,
> 
> This patch is working for resolving the problem I found on RHEL6.5:
> http://dpdk.org/ml/archives/dev/2014-December/009827.html
> 
> Because the root cause is socket struct change from 2.6.35, so this
> patch also fits for all kernels older than 2.6.35.
> 
> Sorry for the ambiguous description, I think the title should be:
> "kni: more compatibility for kernel older than 2.6.35"

Applied with title "kni: fix build with kernel < 2.6.35 and vhost debug enabled"
and error log.

Thanks
  

Patch

diff --git a/lib/librte_eal/linuxapp/kni/compat.h b/lib/librte_eal/linuxapp/kni/compat.h
index 0d87421..1313523 100644
--- a/lib/librte_eal/linuxapp/kni/compat.h
+++ b/lib/librte_eal/linuxapp/kni/compat.h
@@ -13,3 +13,9 @@ 
 #define kstrtoul strict_strtoul
 
 #endif /* < 2.6.39 */
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35)
+
+#define sk_sleep(s) (s)->sk_sleep
+
+#endif /* < 2.6.35 */
diff --git a/lib/librte_eal/linuxapp/kni/kni_vhost.c b/lib/librte_eal/linuxapp/kni/kni_vhost.c
index c05c868..7141f83 100644
--- a/lib/librte_eal/linuxapp/kni/kni_vhost.c
+++ b/lib/librte_eal/linuxapp/kni/kni_vhost.c
@@ -33,6 +33,7 @@ 
 #include <linux/if_tun.h>
 #include <linux/version.h>
 
+#include "compat.h"
 #include "kni_dev.h"
 #include "kni_fifo.h"
 
@@ -215,10 +216,19 @@  kni_sock_poll(struct file *file, struct socket *sock, poll_table * wait)
 		return POLLERR;
 
 	kni = q->kni;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)
 	KNI_DBG("start kni_poll on group %d, wq 0x%16llx\n",
 		  kni->group_id, (uint64_t)sock->wq);
+#else
+	KNI_DBG("start kni_poll on group %d, wait at 0x%16llx\n",
+		  kni->group_id, (uint64_t)&sock->wait);
+#endif
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)
 	poll_wait(file, &sock->wq->wait, wait);
+#else
+	poll_wait(file, &sock->wait, wait);
+#endif
 
 	if (kni_fifo_count(kni->rx_q) > 0)
 		mask |= POLLIN | POLLRDNORM;
@@ -681,10 +691,17 @@  kni_vhost_backend_init(struct kni_dev *kni)
 
 	kni->vq_status = BE_START;
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)
 	KNI_DBG("backend init sockfd=%d, sock->wq=0x%16llx,"
 		  "sk->sk_wq=0x%16llx",
 		  q->sockfd, (uint64_t)q->sock->wq,
 		  (uint64_t)q->sk.sk_wq);
+#else
+	KNI_DBG("backend init sockfd=%d, sock->wait at 0x%16llx,"
+		  "sk->sk_sleep=0x%16llx",
+		  q->sockfd, (uint64_t)&q->sock->wait,
+		  (uint64_t)q->sk.sk_sleep);
+#endif
 
 	return 0;