From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by dpdk.org (Postfix) with ESMTP id 1B65E678C for ; Thu, 24 Jul 2014 16:27:47 +0200 (CEST) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga101.fm.intel.com with ESMTP; 24 Jul 2014 07:29:15 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.01,724,1400050800"; d="scan'208";a="566632682" Received: from irvmail001.ir.intel.com ([163.33.26.43]) by fmsmga001.fm.intel.com with ESMTP; 24 Jul 2014 07:28:53 -0700 Received: from sivswdev02.ir.intel.com (sivswdev02.ir.intel.com [10.237.217.46]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id s6OESq2A013085; Thu, 24 Jul 2014 15:28:53 +0100 Received: from sivswdev02.ir.intel.com (localhost [127.0.0.1]) by sivswdev02.ir.intel.com with ESMTP id s6OESqIY022348; Thu, 24 Jul 2014 15:28:52 +0100 Received: (from pdelarax@localhost) by sivswdev02.ir.intel.com with id s6OESqjm022344; Thu, 24 Jul 2014 15:28:52 +0100 From: Pablo de Lara To: dev@dpdk.org Date: Thu, 24 Jul 2014 15:28:51 +0100 Message-Id: <1406212131-22314-1-git-send-email-pablo.de.lara.guarch@intel.com> X-Mailer: git-send-email 1.7.0.7 Cc: Patrice Buriez Subject: [dpdk-dev] [PATCH] kni: fixed compilation error on Ubuntu 14.04 LTS (kernel 3.13.0-30.54) X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 24 Jul 2014 14:27:48 -0000 Recent Ubuntu kernel 3.13.0-30.54, although based on Linux kernel 3.13.11, already provides skb_set_hash() inline function, slightly different than the one provided by lib/librte_eal/linuxapp/kni/ethtool/igb/kcompat.h Ubuntu kernel 3.13.0-30.54 provides: * i40e/i40evf: i40e implementation for skb_set_hash - https://bugs.launchpad.net/bugs/1328037 - http://changelogs.ubuntu.com/changelogs/pool/main/l/linux/linux_3.13.0-30.54/changelog As a result, the implementation provided by kcompat.h must be skipped. It is not appropriate to test whether LINUX_VERSION_CODE >= KERNEL_VERSION(3,13,11) because previous Ubuntu kernel 3.13.0-29.53, already based on 3.13.11, needs to get the implementation provided by kcompat.h So the full Ubuntu kernel version numbering scheme must be tested: -.- See "What does a specific Ubuntu kernel version number mean?" and "How can we determine the version of the running kernel?" at: https://wiki.ubuntu.com/Kernel/FAQ Unlike RHEL_RELEASE_CODE, there is no such UBUNTU_RELEASE_CODE available out of the box, so it needs to be crafted from the Makefile Similarly, UBUNTU_KERNEL_CODE is generated with ABI and upload numbers. `lsb_release -si` is first used to check whether we are running Ubuntu `lsb_release -sr` provides release number 14.04, then converted to integer 1404 /proc/version_signature is parsed to get base kernel version, ABI and upload numbers, and flavour is dropped UBUNTU_KERNEL_CODE is indirectly defined using the UBUNTU_KERNEL_VERSION macro, which in turn is defined in kcompat.h This makes a single place to define the Ubuntu kernel version numbering scheme, which is slightly different than the usual "shift by 8" scheme: ABI numbers can be big (see: https://wiki.ubuntu.com/Kernel/Dev/TopicBranches), so 16-bits have been reserved for them. Finally, the implementaion of skb_set_hash is skipped in kcompat.h if we are running Ubuntu 14.04 with an Ubuntu kernel >= 3.13.0-30.54 Signed-off-by: Patrice Buriez --- lib/librte_eal/linuxapp/kni/Makefile | 9 +++++++++ lib/librte_eal/linuxapp/kni/ethtool/igb/kcompat.h | 16 ++++++++++++++++ 2 files changed, 25 insertions(+), 0 deletions(-) diff --git a/lib/librte_eal/linuxapp/kni/Makefile b/lib/librte_eal/linuxapp/kni/Makefile index fb9462f..725d3e7 100644 --- a/lib/librte_eal/linuxapp/kni/Makefile +++ b/lib/librte_eal/linuxapp/kni/Makefile @@ -44,6 +44,15 @@ MODULE_CFLAGS += -I$(RTE_OUTPUT)/include -I$(SRCDIR)/ethtool/ixgbe -I$(SRCDIR)/e MODULE_CFLAGS += -include $(RTE_OUTPUT)/include/rte_config.h MODULE_CFLAGS += -Wall -Werror +ifeq ($(shell type lsb_release >/dev/null 2>&1 && lsb_release -si),Ubuntu) +MODULE_CFLAGS += -DUBUNTU_RELEASE_CODE=$(subst .,,$(shell lsb_release -sr)) +UBUNTU_KERNEL_CODE := $(shell cut -d' ' -f2 /proc/version_signature |cut -d- -f1,2) +UBUNTU_KERNEL_CODE := $(subst -,$(comma),$(UBUNTU_KERNEL_CODE)) +UBUNTU_KERNEL_CODE := $(subst .,$(comma),$(UBUNTU_KERNEL_CODE)) +MODULE_CFLAGS += -D"UBUNTU_KERNEL_CODE=UBUNTU_KERNEL_VERSION($(UBUNTU_KERNEL_CODE))" +endif + + # this lib needs main eal DEPDIRS-y += lib/librte_eal/linuxapp/eal diff --git a/lib/librte_eal/linuxapp/kni/ethtool/igb/kcompat.h b/lib/librte_eal/linuxapp/kni/ethtool/igb/kcompat.h index 521a35d..5a06383 100644 --- a/lib/librte_eal/linuxapp/kni/ethtool/igb/kcompat.h +++ b/lib/librte_eal/linuxapp/kni/ethtool/igb/kcompat.h @@ -713,6 +713,20 @@ struct _kc_ethtool_pauseparam { #define SLE_VERSION_CODE 0 #endif /* SLE_VERSION_CODE */ +/* Ubuntu release and kernel codes must be specified from Makefile */ +#ifndef UBUNTU_RELEASE_VERSION +#define UBUNTU_RELEASE_VERSION(a,b) (((a) * 100) + (b)) +#endif +#ifndef UBUNTU_KERNEL_VERSION +#define UBUNTU_KERNEL_VERSION(a,b,c,abi,upload) (((a) << 40) + ((b) << 32) + ((c) << 24) + ((abi) << 8) + (upload)) +#endif +#ifndef UBUNTU_RELEASE_CODE +#define UBUNTU_RELEASE_CODE 0 +#endif +#ifndef UBUNTU_KERNEL_CODE +#define UBUNTU_KERNEL_CODE 0 +#endif + #ifdef __KLOCWORK__ #ifdef ARRAY_SIZE #undef ARRAY_SIZE @@ -3847,6 +3861,7 @@ static inline struct sk_buff *__kc__vlan_hwaccel_put_tag(struct sk_buff *skb, #if ( LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0) ) #if (!(RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,0))) +#if (!(UBUNTU_RELEASE_CODE == UBUNTU_RELEASE_VERSION(14,4) && UBUNTU_KERNEL_CODE >= UBUNTU_KERNEL_VERSION(3,13,0,30,54))) #ifdef NETIF_F_RXHASH #define PKT_HASH_TYPE_L3 0 static inline void @@ -3855,6 +3870,7 @@ skb_set_hash(struct sk_buff *skb, __u32 hash, __always_unused int type) skb->rxhash = hash; } #endif /* NETIF_F_RXHASH */ +#endif /* < 3.13.0-30.54 (Ubuntu 14.04) */ #endif /* < RHEL7 */ #endif /* < 3.14.0 */ -- 1.7.0.7