kni: fix build with kernel < 2.6.35 and vhost debug enabled
authorJincheng Miao <jmiao@redhat.com>
Thu, 11 Dec 2014 05:27:07 +0000 (13:27 +0800)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Wed, 17 Dec 2014 23:26:08 +0000 (00:26 +0100)
Seen on RHEL-6.5:
lib/librte_eal/linuxapp/kni/kni_vhost.c:222:
error: ‘struct socket’ has no member named ‘wq’
lib/librte_eal/linuxapp/kni/kni_vhost.c:313:
error: implicit declaration of function ‘sk_sleep’
lib/librte_eal/linuxapp/kni/kni_vhost.c:313:
error: passing argument 1 of ‘__wake_up’ makes pointer from integer without a cast
include/linux/wait.h:146: note: expected ‘struct wait_queue_head_t *’
but argument is of type ‘int’
lib/librte_eal/linuxapp/kni/kni_vhost.c:580:
error: assignment makes pointer from integer without a cast

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
lib/librte_eal/linuxapp/kni/kni_vhost.c

index 0d87421..1313523 100644 (file)
@@ -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 */
index c05c868..7141f83 100644 (file)
@@ -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;