From patchwork Tue Sep 15 18:09:21 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pravin B Shelar X-Patchwork-Id: 518065 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from archives.nicira.com (unknown [IPv6:2600:3c00::f03c:91ff:fe6e:bdf7]) by ozlabs.org (Postfix) with ESMTP id 6BD8B14018C for ; Wed, 16 Sep 2015 04:09:32 +1000 (AEST) Received: from archives.nicira.com (localhost [127.0.0.1]) by archives.nicira.com (Postfix) with ESMTP id 360AF109D1; Tue, 15 Sep 2015 11:09:30 -0700 (PDT) X-Original-To: dev@openvswitch.org Delivered-To: dev@openvswitch.org Received: from mx1e4.cudamail.com (mx1.cudamail.com [69.90.118.67]) by archives.nicira.com (Postfix) with ESMTPS id 327DB109CF for ; Tue, 15 Sep 2015 11:09:28 -0700 (PDT) Received: from bar2.cudamail.com (unknown [192.168.21.12]) by mx1e4.cudamail.com (Postfix) with ESMTPS id A24A91E0392 for ; Tue, 15 Sep 2015 12:09:27 -0600 (MDT) X-ASG-Debug-ID: 1442340566-03dc537fe375a50001-byXFYA Received: from mx1-pf2.cudamail.com ([192.168.24.2]) by bar2.cudamail.com with ESMTP id OaNlDpsdZCG8nNPo (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 15 Sep 2015 12:09:26 -0600 (MDT) X-Barracuda-Envelope-From: pshelar@nicira.com X-Barracuda-RBL-Trusted-Forwarder: 192.168.24.2 Received: from unknown (HELO mail-pa0-f50.google.com) (209.85.220.50) by mx1-pf2.cudamail.com with ESMTPS (RC4-SHA encrypted); 15 Sep 2015 18:09:26 -0000 Received-SPF: unknown (mx1-pf2.cudamail.com: Multiple SPF records returned) X-Barracuda-Apparent-Source-IP: 209.85.220.50 X-Barracuda-RBL-IP: 209.85.220.50 Received: by padhk3 with SMTP id hk3so183010282pad.3 for ; Tue, 15 Sep 2015 11:09:25 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=o73GAEUTjg550Myafd+jIltzx34wBGNP1SuiVS0X3WU=; b=F7TLhyV3Cc+j0Y38XbAm0sMfwJz6XitEXsBbAfQDKts4ivwuRyroo62uMbYzLKDNuW ymJA0/VOoMfvCeJXbZeJ1FwTpjMlAW6U6uQLTFkUTlSx2UlO+jiL6cy9viSYVCCNq0Mu DNUUuwCI7FGDIsE0FhGVAPeXWCqfbH/gfa3T6pDdkpQFWBs1i4ndiVCCOCO/0eSoj4Xv C2cKjropacdb9PpCAjFRjBYo4lYzOxmr6+vfY01KjLHThoirruMDsJQUOA725IutrZNl d4TZKAclOKdG3ZDYxzaY1xCtw7oY8ab+Q2F6Aobu4rodWHWvXxlnNrwhy6IXXxfn6G8s +OeQ== X-Gm-Message-State: ALoCoQktuAXk/ypktP7Uf3QAM7NDh696YFPEWyCOdxVGlj3SUyeBnV8FVrhRFCEIKdgr01QaM8E3 X-Received: by 10.66.148.71 with SMTP id tq7mr49901049pab.0.1442340565582; Tue, 15 Sep 2015 11:09:25 -0700 (PDT) Received: from localhost (c-73-162-15-99.hsd1.ca.comcast.net. [73.162.15.99]) by smtp.gmail.com with ESMTPSA id gw3sm23314947pbc.46.2015.09.15.11.09.24 (version=TLSv1.1 cipher=RC4-SHA bits=128/128); Tue, 15 Sep 2015 11:09:24 -0700 (PDT) X-CudaMail-Envelope-Sender: pshelar@nicira.com From: Pravin B Shelar To: dev@openvswitch.org X-CudaMail-Whitelist-To: dev@openvswitch.org X-CudaMail-MID: CM-E2-914070797 X-CudaMail-DTE: 091515 X-CudaMail-Originating-IP: 209.85.220.50 Date: Tue, 15 Sep 2015 11:09:21 -0700 X-ASG-Orig-Subj: [##CM-E2-914070797##][PATCH 1/3] datapath: Add support for 4.1 kernel. Message-Id: <1442340563-40106-1-git-send-email-pshelar@nicira.com> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: UNKNOWN[192.168.24.2] X-Barracuda-Start-Time: 1442340566 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://web.cudamail.com:443/cgi-mod/mark.cgi X-ASG-Whitelist: Header =?UTF-8?B?eFwtY3VkYW1haWxcLXdoaXRlbGlzdFwtdG8=?= X-Virus-Scanned: by bsmtpd at cudamail.com X-Barracuda-BRTS-Status: 1 Subject: [ovs-dev] [PATCH 1/3] datapath: Add support for 4.1 kernel. X-BeenThere: dev@openvswitch.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dev-bounces@openvswitch.org Sender: "dev" From: Joe Stringer Signed-off-by: Joe Stringer Signed-off-by: Pravin B Shelar Acked-by: Jesse Gross --- .travis.yml | 3 +- FAQ.md | 1 + acinclude.m4 | 4 +- datapath/datapath.c | 4 +-- datapath/datapath.h | 9 +++---- datapath/flow.c | 4 ++- datapath/linux/compat/geneve.c | 2 +- datapath/linux/compat/include/net/net_namespace.h | 27 +++++++++++++++++++++ datapath/linux/compat/include/net/udp_tunnel.h | 15 +++++++++++- datapath/linux/compat/include/net/vxlan.h | 14 ++++++---- datapath/linux/compat/stt.c | 16 +++++++----- datapath/linux/compat/udp_tunnel.c | 10 ++++---- datapath/linux/compat/vxlan.c | 7 ++--- datapath/vport-lisp.c | 3 +- datapath/vport-vxlan.c | 2 +- 15 files changed, 83 insertions(+), 38 deletions(-) diff --git a/.travis.yml b/.travis.yml index d14f786..f4b9188 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,8 @@ env: - TESTSUITE=1 KERNEL=3.18.1 - TESTSUITE=1 OPTS="--enable-shared" - BUILD_ENV="-m32" OPTS="--disable-ssl" - - KERNEL=4.0.2 + - KERNEL=4.1.6 + - KERNEL=4.0.9 - KERNEL=3.17.7 DPDK=1 - KERNEL=3.17.7 DPDK=1 OPTS="--enable-shared" - KERNEL=3.17.7 diff --git a/FAQ.md b/FAQ.md index 631f6a4..cea517d 100644 --- a/FAQ.md +++ b/FAQ.md @@ -156,6 +156,7 @@ A: The following table lists the Linux kernel versions against which the | 2.1.x | 2.6.32 to 3.11 | 2.3.x | 2.6.32 to 3.14 | 2.4.x | 2.6.32 to 4.0 +| 2.5.x | 2.6.32 to 4.1 Open vSwitch userspace should also work with the Linux kernel module built into Linux 3.3 and later. diff --git a/acinclude.m4 b/acinclude.m4 index b755dc4..229f900 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -134,10 +134,10 @@ AC_DEFUN([OVS_CHECK_LINUX], [ AC_MSG_RESULT([$kversion]) if test "$version" -ge 4; then - if test "$version" = 4 && test "$patchlevel" -le 0; then + if test "$version" = 4 && test "$patchlevel" -le 1; then : # Linux 4.x else - AC_ERROR([Linux kernel in $KBUILD is version $kversion, but version newer than 4.0.x is not supported (please refer to the FAQ for advice)]) + AC_ERROR([Linux kernel in $KBUILD is version $kversion, but version newer than 4.1.x is not supported (please refer to the FAQ for advice)]) fi elif test "$version" = 3; then : # Linux 3.x diff --git a/datapath/datapath.c b/datapath/datapath.c index 73c0b4a..1115649 100644 --- a/datapath/datapath.c +++ b/datapath/datapath.c @@ -205,7 +205,6 @@ static void destroy_dp_rcu(struct rcu_head *rcu) ovs_flow_tbl_destroy(&dp->table); free_percpu(dp->stats_percpu); - release_net(ovs_dp_get_net(dp)); kfree(dp->ports); kfree(dp); } @@ -1527,7 +1526,7 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info) if (dp == NULL) goto err_free_reply; - ovs_dp_set_net(dp, hold_net(sock_net(skb->sk))); + ovs_dp_set_net(dp, sock_net(skb->sk)); /* Allocate table. */ err = ovs_flow_tbl_init(&dp->table); @@ -1601,7 +1600,6 @@ err_destroy_percpu: err_destroy_table: ovs_flow_tbl_destroy(&dp->table); err_free_dp: - release_net(ovs_dp_get_net(dp)); kfree(dp); err_free_reply: kfree_skb(reply); diff --git a/datapath/datapath.h b/datapath/datapath.h index 526ddad..aca9407 100644 --- a/datapath/datapath.h +++ b/datapath/datapath.h @@ -25,6 +25,7 @@ #include #include #include +#include #include "compat.h" #include "flow.h" @@ -86,10 +87,8 @@ struct datapath { /* Stats. */ struct dp_stats_percpu __percpu *stats_percpu; -#ifdef CONFIG_NET_NS /* Network namespace ref. */ - struct net *net; -#endif + possible_net_t net; u32 user_features; }; @@ -156,12 +155,12 @@ int lockdep_ovsl_is_held(void); static inline struct net *ovs_dp_get_net(const struct datapath *dp) { - return read_pnet(&dp->net); + return rpl_read_pnet(&dp->net); } static inline void ovs_dp_set_net(struct datapath *dp, struct net *net) { - write_pnet(&dp->net, net); + rpl_write_pnet(&dp->net, net); } struct vport *ovs_lookup_vport(const struct datapath *dp, u16 port_no); diff --git a/datapath/flow.c b/datapath/flow.c index a7a2063..8ef60d1 100644 --- a/datapath/flow.c +++ b/datapath/flow.c @@ -101,7 +101,9 @@ void ovs_flow_stats_update(struct sw_flow *flow, __be16 tcp_flags, new_stats = kmem_cache_alloc_node(flow_stats_cache, - GFP_THISNODE | + GFP_NOWAIT | + __GFP_THISNODE | + __GFP_NOWARN | __GFP_NOMEMALLOC, node); if (likely(new_stats)) { diff --git a/datapath/linux/compat/geneve.c b/datapath/linux/compat/geneve.c index 78d3395..8e80180 100644 --- a/datapath/linux/compat/geneve.c +++ b/datapath/linux/compat/geneve.c @@ -117,7 +117,7 @@ int rpl_geneve_xmit_skb(struct geneve_sock *gs, struct rtable *rt, ovs_skb_set_inner_protocol(skb, htons(ETH_P_TEB)); - return udp_tunnel_xmit_skb(rt, skb, src, dst, + return udp_tunnel_xmit_skb(rt, gs->sock->sk, skb, src, dst, tos, ttl, df, src_port, dst_port, xnet, !csum); } diff --git a/datapath/linux/compat/include/net/net_namespace.h b/datapath/linux/compat/include/net/net_namespace.h index b7dbfe3..edfa131 100644 --- a/datapath/linux/compat/include/net/net_namespace.h +++ b/datapath/linux/compat/include/net/net_namespace.h @@ -51,4 +51,31 @@ static void rpl_unregister_pernet_gen_##TYPE(struct rpl_pernet_operations *rpl_p #define DEFINE_COMPAT_PNET_REG_FUNC(TYPE) #endif /* 2.6.33 */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,1,0) +typedef struct { +#ifdef CONFIG_NET_NS + struct net *net; +#endif +} possible_net_t; + +static inline void rpl_write_pnet(possible_net_t *pnet, struct net *net) +{ +#ifdef CONFIG_NET_NS + pnet->net = net; +#endif +} + +static inline struct net *rpl_read_pnet(const possible_net_t *pnet) +{ +#ifdef CONFIG_NET_NS + return pnet->net; +#else + return &init_net; +#endif +} +#else /* Linux >= 4.1 */ +#define rpl_read_pnet read_pnet +#define rpl_write_pnet write_pnet +#endif /* Linux >= 4.1 */ + #endif /* net/net_namespace.h wrapper */ diff --git a/datapath/linux/compat/include/net/udp_tunnel.h b/datapath/linux/compat/include/net/udp_tunnel.h index 81cb3df..d334746 100644 --- a/datapath/linux/compat/include/net/udp_tunnel.h +++ b/datapath/linux/compat/include/net/udp_tunnel.h @@ -19,6 +19,18 @@ rpl_udp_tunnel_handle_offloads(struct sk_buff *skb, bool udp_csum, } #define udp_tunnel_handle_offloads rpl_udp_tunnel_handle_offloads +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,1,0) +static inline int rpl_udp_tunnel_xmit_skb(struct rtable *rt, + struct sock *sk, struct sk_buff *skb, + __be32 src, __be32 dst, __u8 tos, __u8 ttl, + __be16 df, __be16 src_port, __be16 dst_port, + bool xnet, bool nocheck) +{ + return udp_tunnel_xmit_skb(rt, skb, src, dst, tos, ttl, df, src_port, + dst_port, xnet, nocheck); +} +#define udp_tunnel_xmit_skb rpl_udp_tunnel_xmit_skb +#endif #else #include @@ -71,7 +83,8 @@ void rpl_setup_udp_tunnel_sock(struct net *net, struct socket *sock, /* Transmit the skb using UDP encapsulation. */ #define udp_tunnel_xmit_skb rpl_udp_tunnel_xmit_skb -int rpl_udp_tunnel_xmit_skb(struct rtable *rt, struct sk_buff *skb, +int rpl_udp_tunnel_xmit_skb(struct rtable *rt, + struct sock *sk, struct sk_buff *skb, __be32 src, __be32 dst, __u8 tos, __u8 ttl, __be16 df, __be16 src_port, __be16 dst_port, bool xnet, bool nocheck); diff --git a/datapath/linux/compat/include/net/vxlan.h b/datapath/linux/compat/include/net/vxlan.h index 0d60c18..cafff79 100644 --- a/datapath/linux/compat/include/net/vxlan.h +++ b/datapath/linux/compat/include/net/vxlan.h @@ -88,10 +88,9 @@ struct vxlanhdr_gbp { #endif #ifdef USE_UPSTREAM_VXLAN -static inline int rpl_vxlan_xmit_skb(struct vxlan_sock *vs, - struct rtable *rt, struct sk_buff *skb, - __be32 src, __be32 dst, __u8 tos, __u8 ttl, __be16 df, - __be16 src_port, __be16 dst_port, +static inline int rpl_vxlan_xmit_skb(struct rtable *rt, struct sock *sk, + struct sk_buff *skb, __be32 src, __be32 dst, __u8 tos, + __u8 ttl, __be16 df, __be16 src_port, __be16 dst_port, struct vxlan_metadata *md, bool xnet, u32 vxflags) { if (skb_is_gso(skb) && skb_is_encapsulated(skb)) { @@ -99,7 +98,11 @@ static inline int rpl_vxlan_xmit_skb(struct vxlan_sock *vs, return -ENOSYS; } +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,1,0) return vxlan_xmit_skb(rt, skb, src, dst, tos, ttl, df, +#else + return vxlan_xmit_skb(rt, sk, skb, src, dst, tos, ttl, df, +#endif src_port, dst_port, md, xnet, vxflags); } @@ -138,8 +141,7 @@ struct vxlan_sock *rpl_vxlan_sock_add(struct net *net, __be16 port, void rpl_vxlan_sock_release(struct vxlan_sock *vs); #define vxlan_xmit_skb rpl_vxlan_xmit_skb -int rpl_vxlan_xmit_skb(struct vxlan_sock *vs, - struct rtable *rt, struct sk_buff *skb, +int rpl_vxlan_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb, __be32 src, __be32 dst, __u8 tos, __u8 ttl, __be16 df, __be16 src_port, __be16 dst_port, struct vxlan_metadata *md, bool xnet, u32 vxflags); diff --git a/datapath/linux/compat/stt.c b/datapath/linux/compat/stt.c index dd21753..e27cedf 100644 --- a/datapath/linux/compat/stt.c +++ b/datapath/linux/compat/stt.c @@ -1320,16 +1320,18 @@ static void clean_percpu(struct work_struct *work) } #ifdef HAVE_NF_HOOKFN_ARG_OPS -#define FIRST_PARAM const struct nf_hook_ops *ops, +#define FIRST_PARAM const struct nf_hook_ops *ops #else -#define FIRST_PARAM unsigned int hooknum, +#define FIRST_PARAM unsigned int hooknum #endif -static unsigned int nf_ip_hook(FIRST_PARAM - struct sk_buff *skb, - const struct net_device *in, - const struct net_device *out, - int (*okfn)(struct sk_buff *)) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,1,0) +#define LAST_PARAM const struct nf_hook_state *state +#else +#define LAST_PARAM const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *) +#endif + +static unsigned int nf_ip_hook(FIRST_PARAM, struct sk_buff *skb, LAST_PARAM) { struct stt_sock *stt_sock; int ip_hdr_len; diff --git a/datapath/linux/compat/udp_tunnel.c b/datapath/linux/compat/udp_tunnel.c index c84113b..680fd83 100644 --- a/datapath/linux/compat/udp_tunnel.c +++ b/datapath/linux/compat/udp_tunnel.c @@ -142,10 +142,10 @@ void ovs_udp_csum_gso(struct sk_buff *skb) } EXPORT_SYMBOL_GPL(ovs_udp_csum_gso); -int rpl_udp_tunnel_xmit_skb(struct rtable *rt, struct sk_buff *skb, - __be32 src, __be32 dst, __u8 tos, __u8 ttl, - __be16 df, __be16 src_port, __be16 dst_port, - bool xnet, bool nocheck) +int rpl_udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk, + struct sk_buff *skb, __be32 src, __be32 dst, + __u8 tos, __u8 ttl, __be16 df, __be16 src_port, + __be16 dst_port, bool xnet, bool nocheck) { struct udphdr *uh; @@ -159,7 +159,7 @@ int rpl_udp_tunnel_xmit_skb(struct rtable *rt, struct sk_buff *skb, udp_set_csum(nocheck, skb, src, dst, skb->len); - return iptunnel_xmit(skb->sk, rt, skb, src, dst, IPPROTO_UDP, + return iptunnel_xmit(sk, rt, skb, src, dst, IPPROTO_UDP, tos, ttl, df, xnet); } EXPORT_SYMBOL_GPL(rpl_udp_tunnel_xmit_skb); diff --git a/datapath/linux/compat/vxlan.c b/datapath/linux/compat/vxlan.c index 129f171..fd454ae 100644 --- a/datapath/linux/compat/vxlan.c +++ b/datapath/linux/compat/vxlan.c @@ -180,8 +180,7 @@ static void vxlan_build_gbp_hdr(struct vxlanhdr *vxh, u32 vxflags, gbp->policy_id = htons(md->gbp & VXLAN_GBP_ID_MASK); } -int rpl_vxlan_xmit_skb(struct vxlan_sock *vs, - struct rtable *rt, struct sk_buff *skb, +int rpl_vxlan_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb, __be32 src, __be32 dst, __u8 tos, __u8 ttl, __be16 df, __be16 src_port, __be16 dst_port, struct vxlan_metadata *md, bool xnet, u32 vxflags) @@ -217,11 +216,11 @@ int rpl_vxlan_xmit_skb(struct vxlan_sock *vs, if (vxflags & VXLAN_F_GBP) vxlan_build_gbp_hdr(vxh, vxflags, md); - vxlan_set_owner(vs->sock->sk, skb); + vxlan_set_owner(sk, skb); ovs_skb_set_inner_protocol(skb, htons(ETH_P_TEB)); - return udp_tunnel_xmit_skb(rt, skb, src, dst, tos, + return udp_tunnel_xmit_skb(rt, sk, skb, src, dst, tos, ttl, df, src_port, dst_port, xnet, !udp_sum); } diff --git a/datapath/vport-lisp.c b/datapath/vport-lisp.c index 0024eb4..104a21d 100644 --- a/datapath/vport-lisp.c +++ b/datapath/vport-lisp.c @@ -455,7 +455,8 @@ static int lisp_send(struct vport *vport, struct sk_buff *skb) ovs_skb_set_inner_protocol(skb, skb->protocol); df = tun_key->tun_flags & TUNNEL_DONT_FRAGMENT ? htons(IP_DF) : 0; - sent_len = udp_tunnel_xmit_skb(rt, skb, saddr, tun_key->ipv4_dst, + sent_len = udp_tunnel_xmit_skb(rt, lisp_port->lisp_rcv_socket->sk, skb, + saddr, tun_key->ipv4_dst, tun_key->ipv4_tos, tun_key->ipv4_ttl, df, src_port, dst_port, false, true); diff --git a/datapath/vport-vxlan.c b/datapath/vport-vxlan.c index eff7ca2..fc9f350 100644 --- a/datapath/vport-vxlan.c +++ b/datapath/vport-vxlan.c @@ -260,7 +260,7 @@ static int vxlan_tnl_send(struct vport *vport, struct sk_buff *skb) vxflags = vxlan_port->exts | (tun_key->tun_flags & TUNNEL_CSUM ? VXLAN_F_UDP_CSUM : 0); - err = vxlan_xmit_skb(vxlan_port->vs, rt, skb, + err = vxlan_xmit_skb(rt, vxlan_port->vs->sock->sk, skb, saddr, tun_key->ipv4_dst, tun_key->ipv4_tos, tun_key->ipv4_ttl, df,