[ovs-dev] [PATCH][backport for branch-2.3] datapath: check for rx handler register

Wanlong Gao wanlong.gao at easystack.cn
Sun Dec 20 08:57:32 UTC 2015


Backport from the upstream commit, this commit is necessary for using
2.3.x on RHEL with updated kernel, and absolutely more sane than the kernel
version adjudgement:
	commit 572e54faff70760f4bfe4a7cffc9553e6743199e
	Author: Flavio Leitner <fbl at redhat.com>
	Date:   Fri Aug 28 21:52:36 2015 -0300

	    datapath: check for rx handler register

	    Red Hat Enterprise Linux 6 has backported the netdev RX
	    handler facility so use the netdev_rx_handler_register as
	    an indicator.

	    The handler prototype changed between 2.6.36 and 2.6.39
	    since there could be backports in any stage, don't look
	    at the kernel version, but at the prototype.

	    Signed-off-by: Flavio Leitner <fbl at redhat.com>
	    Signed-off-by: Jesse Gross <jesse at nicira.com>

Signed-off-by: Wanlong Gao <wanlong.gao at easystack.cn>
---
 acinclude.m4                                    | 4 ++++
 datapath/linux/compat/dev-openvswitch.c         | 2 +-
 datapath/linux/compat/include/linux/netdevice.h | 2 +-
 datapath/vport-netdev.c                         | 9 +++++++--
 4 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/acinclude.m4 b/acinclude.m4
index 9819a91..dc0bebe 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -291,6 +291,10 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
   OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [can_checksum_protocol])
   OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [netdev_features_t])
   OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [pcpu_sw_netstats])
+  OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [netdev_rx_handler_register])
+  OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [net_device_extended])
+  OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [rx_handler_func_t.*pskb],
+                  [OVS_DEFINE([HAVE_RX_HANDLER_PSKB])])
 
   OVS_GREP_IFELSE([$KSRC/include/linux/random.h], [prandom_u32])
 
diff --git a/datapath/linux/compat/dev-openvswitch.c b/datapath/linux/compat/dev-openvswitch.c
index 1035fe8..5524634 100644
--- a/datapath/linux/compat/dev-openvswitch.c
+++ b/datapath/linux/compat/dev-openvswitch.c
@@ -33,7 +33,7 @@ void dev_disable_lro(struct net_device *dev) { }
 
 #endif /* HAVE_DEV_DISABLE_LRO */
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36) || \
+#if !defined HAVE_NETDEV_RX_HANDLER_REGISTER || \
     defined HAVE_RHEL_OVS_HOOK
 
 static int nr_bridges;
diff --git a/datapath/linux/compat/include/linux/netdevice.h b/datapath/linux/compat/include/linux/netdevice.h
index d726390..f9ebb2b 100644
--- a/datapath/linux/compat/include/linux/netdevice.h
+++ b/datapath/linux/compat/include/linux/netdevice.h
@@ -22,7 +22,7 @@ extern void unregister_netdevice_many(struct list_head *head);
 extern void dev_disable_lro(struct net_device *dev);
 #endif
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36) || \
+#if !defined HAVE_NETDEV_RX_HANDLER_REGISTER || \
     defined HAVE_RHEL_OVS_HOOK
 
 #ifdef HAVE_RHEL_OVS_HOOK
diff --git a/datapath/vport-netdev.c b/datapath/vport-netdev.c
index 102e6d0..64347a3 100644
--- a/datapath/vport-netdev.c
+++ b/datapath/vport-netdev.c
@@ -36,7 +36,7 @@
 
 static void netdev_port_receive(struct vport *vport, struct sk_buff *skb);
 
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39)
+#if defined HAVE_RX_HANDLER_PSKB  /* 2.6.39 and above or backports */
 /* Called with rcu_read_lock and bottom-halves disabled. */
 static rx_handler_result_t netdev_frame_hook(struct sk_buff **pskb)
 {
@@ -254,7 +254,7 @@ drop:
 /* Returns null if this device is not attached to a datapath. */
 struct vport *ovs_netdev_get_vport(struct net_device *dev)
 {
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36) || \
+#if defined HAVE_NETDEV_RX_HANDLER_REGISTER || \
     defined HAVE_RHEL_OVS_HOOK
 #if IFF_OVS_DATAPATH != 0
 	if (likely(dev->priv_flags & IFF_OVS_DATAPATH))
@@ -264,8 +264,13 @@ struct vport *ovs_netdev_get_vport(struct net_device *dev)
 #ifdef HAVE_RHEL_OVS_HOOK
 		return (struct vport *)rcu_dereference_rtnl(dev->ax25_ptr);
 #else
+#ifdef HAVE_NET_DEVICE_EXTENDED
+		return (struct vport *)
+			rcu_dereference_rtnl(netdev_extended(dev)->rx_handler_data);
+#else
 		return (struct vport *)rcu_dereference_rtnl(dev->rx_handler_data);
 #endif
+#endif
 	else
 		return NULL;
 #else
-- 
2.5.0




More information about the dev mailing list