From: Ben Pfaff Date: Wed, 18 Nov 2009 23:19:50 +0000 (-0800) Subject: datapath: Check for proto_data_valid member instead of kernel version. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6a33828dbcc9a4f67bd730061b931c77caad2990;p=openvswitch datapath: Check for proto_data_valid member instead of kernel version. Commit 5ef800a69 "datapath: Copy Xen's checksumming fields when doing skb_copy" should copy proto_data_valid between sk_buffs when that field is present. However the check for CONFIG_XEN plus kernel version 2.6.18 isn't sufficient, because SLES 11 kernels are version 2.6.27 but do have this field. This commit adds a configure-time check for the presence of the member instead of attempting to guess based on the kernel version. Thanks to Ian Campbell for reporting this problem. CC: --- diff --git a/acinclude.m4 b/acinclude.m4 index 61156690..e938e6f3 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -144,6 +144,13 @@ AC_DEFUN([OVS_CHECK_LINUX26_COMPAT], [ [OVS_DEFINE([HAVE_CSUM_UNFOLD])]) OVS_GREP_IFELSE([$KSRC26/include/linux/skbuff.h], [skb_cow], [OVS_DEFINE([HAVE_SKB_COW])]) + # Check for the proto_data_valid member in struct sk_buff. The [^@] + # is necessary because some versions of this header remove the + # member but retain the kerneldoc comment that describes it (which + # starts with @). The brackets must be doubled because of m4 + # quoting rules. + OVS_GREP_IFELSE([$KSRC26/include/linux/skbuff.h], [[[^@]]proto_data_valid], + [OVS_DEFINE([HAVE_PROTO_DATA_VALID])]) OVS_CHECK_LOG2_H OVS_CHECK_VETH if cmp -s datapath/linux-2.6/kcompat.h.new \ diff --git a/datapath/actions.c b/datapath/actions.c index 4f23c83d..cadab05f 100644 --- a/datapath/actions.c +++ b/datapath/actions.c @@ -37,7 +37,7 @@ make_writable(struct sk_buff *skb, unsigned min_headroom, gfp_t gfp) nskb->ip_summed = skb->ip_summed; nskb->csum = skb->csum; #endif -#if defined(CONFIG_XEN) && LINUX_VERSION_CODE == KERNEL_VERSION(2,6,18) +#if defined(CONFIG_XEN) && defined(HAVE_PROTO_DATA_VALID) /* These fields are copied in skb_clone but not in * skb_copy or related functions. We need to manually * copy them over here. */