* [GIT net-next] Open vSwitch @ 2013-04-16 21:00 Jesse Gross 2013-04-16 21:00 ` [PATCH net-next 01/10] openvswitch: Specify the minimal length of OVS_PACKET_ATTR_PACKET in the policy Jesse Gross ` (8 more replies) 0 siblings, 9 replies; 54+ messages in thread From: Jesse Gross @ 2013-04-16 21:00 UTC (permalink / raw) To: David Miller; +Cc: netdev, dev A number of improvements for net-next/3.10. Highlights include: * Properly exposing linux/openvswitch.h to userspace after the uapi changes. * Simplification of locking. It immediately makes things simpler to reason about and avoids holding RTNL mutex for longer than necessary. In the near future it will also enable tunnel registration and more fine-grained locking. * Miscellaneous cleanups and simplifications. The following changes since commit f498354793d57479d4e1b0f39969acd66737234c: qlcnic: Bump up the version to 5.2.39 (2013-03-29 15:51:06 -0400) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/jesse/openvswitch.git master for you to fetch changes up to e0f0ecf33c3f13401f90bff5afdc3ed1bb40b9af: openvswitch: Use generic struct pcpu_tstats. (2013-04-15 14:56:25 -0700) ---------------------------------------------------------------- Andy Zhou (1): openvswitch: datapath.h: Fix a stale comment. Pravin B Shelar (2): openvswitch: Simplify datapath locking. openvswitch: Use generic struct pcpu_tstats. Thomas Graf (7): openvswitch: Specify the minimal length of OVS_PACKET_ATTR_PACKET in the policy openvswitch: Use nla_memcpy() to memcpy() data from attributes openvswitch: Refine Netlink message size calculation and kill FLOW_BUFSIZE openvswitch: Move common genl notify code into ovs_notify() openvswitch: Use ETH_ALEN to define ethernet addresses openvswitch: Expose <linux/openvswitch.h> to userspace openvswitch: Don't insert empty OVS_VPORT_ATTR_OPTIONS attribute include/linux/openvswitch.h | 432 +------------------------------- include/uapi/linux/Kbuild | 1 + include/uapi/linux/openvswitch.h | 456 ++++++++++++++++++++++++++++++++++ net/openvswitch/datapath.c | 393 +++++++++++++++++------------ net/openvswitch/datapath.h | 70 ++++-- net/openvswitch/dp_notify.c | 82 ++++-- net/openvswitch/flow.c | 2 +- net/openvswitch/flow.h | 21 -- net/openvswitch/vport-internal_dev.c | 6 + net/openvswitch/vport-netdev.c | 8 +- net/openvswitch/vport.c | 58 +++-- net/openvswitch/vport.h | 15 +- 12 files changed, 849 insertions(+), 695 deletions(-) create mode 100644 include/uapi/linux/openvswitch.h ^ permalink raw reply [flat|nested] 54+ messages in thread
* [PATCH net-next 01/10] openvswitch: Specify the minimal length of OVS_PACKET_ATTR_PACKET in the policy 2013-04-16 21:00 [GIT net-next] Open vSwitch Jesse Gross @ 2013-04-16 21:00 ` Jesse Gross [not found] ` <1366146019-9015-1-git-send-email-jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> ` (7 subsequent siblings) 8 siblings, 0 replies; 54+ messages in thread From: Jesse Gross @ 2013-04-16 21:00 UTC (permalink / raw) To: David Miller; +Cc: netdev, dev, Thomas Graf, Jesse Gross From: Thomas Graf <tgraf@suug.ch> Specifying the minimal length in the policy makes it reuseable and documents the interface. Signed-off-by: Thomas Graf <tgraf@suug.ch> Signed-off-by: Jesse Gross <jesse@nicira.com> --- net/openvswitch/datapath.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index 8759265..5b58d16 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c @@ -662,8 +662,7 @@ static int ovs_packet_cmd_execute(struct sk_buff *skb, struct genl_info *info) err = -EINVAL; if (!a[OVS_PACKET_ATTR_PACKET] || !a[OVS_PACKET_ATTR_KEY] || - !a[OVS_PACKET_ATTR_ACTIONS] || - nla_len(a[OVS_PACKET_ATTR_PACKET]) < ETH_HLEN) + !a[OVS_PACKET_ATTR_ACTIONS]) goto err; len = nla_len(a[OVS_PACKET_ATTR_PACKET]); @@ -744,7 +743,7 @@ err: } static const struct nla_policy packet_policy[OVS_PACKET_ATTR_MAX + 1] = { - [OVS_PACKET_ATTR_PACKET] = { .type = NLA_UNSPEC }, + [OVS_PACKET_ATTR_PACKET] = { .len = ETH_HLEN }, [OVS_PACKET_ATTR_KEY] = { .type = NLA_NESTED }, [OVS_PACKET_ATTR_ACTIONS] = { .type = NLA_NESTED }, }; -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 54+ messages in thread
[parent not found: <1366146019-9015-1-git-send-email-jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org>]
* [PATCH net-next 02/10] openvswitch: Use nla_memcpy() to memcpy() data from attributes [not found] ` <1366146019-9015-1-git-send-email-jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> @ 2013-04-16 21:00 ` Jesse Gross 2013-04-16 21:00 ` [PATCH net-next 03/10] openvswitch: Refine Netlink message size calculation and kill FLOW_BUFSIZE Jesse Gross 2013-04-16 21:00 ` [PATCH net-next 04/10] openvswitch: Move common genl notify code into ovs_notify() Jesse Gross 2 siblings, 0 replies; 54+ messages in thread From: Jesse Gross @ 2013-04-16 21:00 UTC (permalink / raw) To: David Miller; +Cc: dev-yBygre7rU0TnMu66kgdUjQ, netdev-u79uwXL29TY76Z2rM5mHXA From: Thomas Graf <tgraf-G/eBtMaohhA@public.gmane.org> Less error prone as it takes into account the length of both the destination buffer and the source attribute and documents when data is copied from an attribute. Signed-off-by: Thomas Graf <tgraf-G/eBtMaohhA@public.gmane.org> Signed-off-by: Jesse Gross <jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> --- net/openvswitch/datapath.c | 2 +- net/openvswitch/flow.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index 5b58d16..bca63c8 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c @@ -672,7 +672,7 @@ static int ovs_packet_cmd_execute(struct sk_buff *skb, struct genl_info *info) goto err; skb_reserve(packet, NET_IP_ALIGN); - memcpy(__skb_put(packet, len), nla_data(a[OVS_PACKET_ATTR_PACKET]), len); + nla_memcpy(__skb_put(packet, len), a[OVS_PACKET_ATTR_PACKET], len); skb_reset_mac_header(packet); eth = eth_hdr(packet); diff --git a/net/openvswitch/flow.c b/net/openvswitch/flow.c index 3324868..cf9328b 100644 --- a/net/openvswitch/flow.c +++ b/net/openvswitch/flow.c @@ -211,7 +211,7 @@ struct sw_flow_actions *ovs_flow_actions_alloc(const struct nlattr *actions) return ERR_PTR(-ENOMEM); sfa->actions_len = actions_len; - memcpy(sfa->actions, nla_data(actions), actions_len); + nla_memcpy(sfa->actions, actions, actions_len); return sfa; } -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* [PATCH net-next 03/10] openvswitch: Refine Netlink message size calculation and kill FLOW_BUFSIZE [not found] ` <1366146019-9015-1-git-send-email-jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> 2013-04-16 21:00 ` [PATCH net-next 02/10] openvswitch: Use nla_memcpy() to memcpy() data from attributes Jesse Gross @ 2013-04-16 21:00 ` Jesse Gross 2013-04-16 21:00 ` [PATCH net-next 04/10] openvswitch: Move common genl notify code into ovs_notify() Jesse Gross 2 siblings, 0 replies; 54+ messages in thread From: Jesse Gross @ 2013-04-16 21:00 UTC (permalink / raw) To: David Miller; +Cc: dev-yBygre7rU0TnMu66kgdUjQ, netdev-u79uwXL29TY76Z2rM5mHXA From: Thomas Graf <tgraf-G/eBtMaohhA@public.gmane.org> Kills the FLOW_BUFSIZE constant which needs to be calculated manually and replaces it with key_attr_size() based on nla_total_size(). Calculates the size of datapath messages instead of relying on NLMSG_DEFAULT_SIZE and moves the existing message size calculations into own functions for clarity. Signed-off-by: Thomas Graf <tgraf-G/eBtMaohhA@public.gmane.org> Signed-off-by: Jesse Gross <jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> --- net/openvswitch/datapath.c | 76 ++++++++++++++++++++++++++++++-------------- net/openvswitch/flow.h | 21 ------------ 2 files changed, 52 insertions(+), 45 deletions(-) diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index bca63c8..49ee37b 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c @@ -337,6 +337,35 @@ static int queue_gso_packets(struct net *net, int dp_ifindex, return err; } +static size_t key_attr_size(void) +{ + return nla_total_size(4) /* OVS_KEY_ATTR_PRIORITY */ + + nla_total_size(4) /* OVS_KEY_ATTR_IN_PORT */ + + nla_total_size(4) /* OVS_KEY_ATTR_SKB_MARK */ + + nla_total_size(12) /* OVS_KEY_ATTR_ETHERNET */ + + nla_total_size(2) /* OVS_KEY_ATTR_ETHERTYPE */ + + nla_total_size(4) /* OVS_KEY_ATTR_8021Q */ + + nla_total_size(0) /* OVS_KEY_ATTR_ENCAP */ + + nla_total_size(2) /* OVS_KEY_ATTR_ETHERTYPE */ + + nla_total_size(40) /* OVS_KEY_ATTR_IPV6 */ + + nla_total_size(2) /* OVS_KEY_ATTR_ICMPV6 */ + + nla_total_size(28); /* OVS_KEY_ATTR_ND */ +} + +static size_t upcall_msg_size(const struct sk_buff *skb, + const struct nlattr *userdata) +{ + size_t size = NLMSG_ALIGN(sizeof(struct ovs_header)) + + nla_total_size(skb->len) /* OVS_PACKET_ATTR_PACKET */ + + nla_total_size(key_attr_size()); /* OVS_PACKET_ATTR_KEY */ + + /* OVS_PACKET_ATTR_USERDATA */ + if (userdata) + size += NLA_ALIGN(userdata->nla_len); + + return size; +} + static int queue_userspace_packet(struct net *net, int dp_ifindex, struct sk_buff *skb, const struct dp_upcall_info *upcall_info) @@ -345,7 +374,6 @@ static int queue_userspace_packet(struct net *net, int dp_ifindex, struct sk_buff *nskb = NULL; struct sk_buff *user_skb; /* to be queued to userspace */ struct nlattr *nla; - unsigned int len; int err; if (vlan_tx_tag_present(skb)) { @@ -366,13 +394,7 @@ static int queue_userspace_packet(struct net *net, int dp_ifindex, goto out; } - len = sizeof(struct ovs_header); - len += nla_total_size(skb->len); - len += nla_total_size(FLOW_BUFSIZE); - if (upcall_info->userdata) - len += NLA_ALIGN(upcall_info->userdata->nla_len); - - user_skb = genlmsg_new(len, GFP_ATOMIC); + user_skb = genlmsg_new(upcall_msg_size(skb, upcall_info->userdata), GFP_ATOMIC); if (!user_skb) { err = -ENOMEM; goto out; @@ -801,6 +823,16 @@ static struct genl_multicast_group ovs_dp_flow_multicast_group = { .name = OVS_FLOW_MCGROUP }; +static size_t ovs_flow_cmd_msg_size(const struct sw_flow_actions *acts) +{ + return NLMSG_ALIGN(sizeof(struct ovs_header)) + + nla_total_size(key_attr_size()) /* OVS_FLOW_ATTR_KEY */ + + nla_total_size(sizeof(struct ovs_flow_stats)) /* OVS_FLOW_ATTR_STATS */ + + nla_total_size(1) /* OVS_FLOW_ATTR_TCP_FLAGS */ + + nla_total_size(8) /* OVS_FLOW_ATTR_USED */ + + nla_total_size(acts->actions_len); /* OVS_FLOW_ATTR_ACTIONS */ +} + /* Called with genl_lock. */ static int ovs_flow_cmd_fill_info(struct sw_flow *flow, struct datapath *dp, struct sk_buff *skb, u32 portid, @@ -879,25 +911,11 @@ error: static struct sk_buff *ovs_flow_cmd_alloc_info(struct sw_flow *flow) { const struct sw_flow_actions *sf_acts; - int len; sf_acts = rcu_dereference_protected(flow->sf_acts, lockdep_genl_is_held()); - /* OVS_FLOW_ATTR_KEY */ - len = nla_total_size(FLOW_BUFSIZE); - /* OVS_FLOW_ATTR_ACTIONS */ - len += nla_total_size(sf_acts->actions_len); - /* OVS_FLOW_ATTR_STATS */ - len += nla_total_size(sizeof(struct ovs_flow_stats)); - /* OVS_FLOW_ATTR_TCP_FLAGS */ - len += nla_total_size(1); - /* OVS_FLOW_ATTR_USED */ - len += nla_total_size(8); - - len += NLMSG_ALIGN(sizeof(struct ovs_header)); - - return genlmsg_new(len, GFP_KERNEL); + return genlmsg_new(ovs_flow_cmd_msg_size(sf_acts), GFP_KERNEL); } static struct sk_buff *ovs_flow_cmd_build_info(struct sw_flow *flow, @@ -1213,6 +1231,16 @@ static struct genl_multicast_group ovs_dp_datapath_multicast_group = { .name = OVS_DATAPATH_MCGROUP }; +static size_t ovs_dp_cmd_msg_size(void) +{ + size_t msgsize = NLMSG_ALIGN(sizeof(struct ovs_header)); + + msgsize += nla_total_size(IFNAMSIZ); + msgsize += nla_total_size(sizeof(struct ovs_dp_stats)); + + return msgsize; +} + static int ovs_dp_cmd_fill_info(struct datapath *dp, struct sk_buff *skb, u32 portid, u32 seq, u32 flags, u8 cmd) { @@ -1251,7 +1279,7 @@ static struct sk_buff *ovs_dp_cmd_build_info(struct datapath *dp, u32 portid, struct sk_buff *skb; int retval; - skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); + skb = genlmsg_new(ovs_dp_cmd_msg_size(), GFP_KERNEL); if (!skb) return ERR_PTR(-ENOMEM); diff --git a/net/openvswitch/flow.h b/net/openvswitch/flow.h index a7bb60f..0875fde 100644 --- a/net/openvswitch/flow.h +++ b/net/openvswitch/flow.h @@ -138,27 +138,6 @@ int ovs_flow_extract(struct sk_buff *, u16 in_port, struct sw_flow_key *, void ovs_flow_used(struct sw_flow *, struct sk_buff *); u64 ovs_flow_used_time(unsigned long flow_jiffies); -/* Upper bound on the length of a nlattr-formatted flow key. The longest - * nlattr-formatted flow key would be: - * - * struct pad nl hdr total - * ------ --- ------ ----- - * OVS_KEY_ATTR_PRIORITY 4 -- 4 8 - * OVS_KEY_ATTR_IN_PORT 4 -- 4 8 - * OVS_KEY_ATTR_SKB_MARK 4 -- 4 8 - * OVS_KEY_ATTR_ETHERNET 12 -- 4 16 - * OVS_KEY_ATTR_ETHERTYPE 2 2 4 8 (outer VLAN ethertype) - * OVS_KEY_ATTR_8021Q 4 -- 4 8 - * OVS_KEY_ATTR_ENCAP 0 -- 4 4 (VLAN encapsulation) - * OVS_KEY_ATTR_ETHERTYPE 2 2 4 8 (inner VLAN ethertype) - * OVS_KEY_ATTR_IPV6 40 -- 4 44 - * OVS_KEY_ATTR_ICMPV6 2 2 4 8 - * OVS_KEY_ATTR_ND 28 -- 4 32 - * ------------------------------------------------- - * total 152 - */ -#define FLOW_BUFSIZE 152 - int ovs_flow_to_nlattrs(const struct sw_flow_key *, struct sk_buff *); int ovs_flow_from_nlattrs(struct sw_flow_key *swkey, int *key_lenp, const struct nlattr *); -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* [PATCH net-next 04/10] openvswitch: Move common genl notify code into ovs_notify() [not found] ` <1366146019-9015-1-git-send-email-jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> 2013-04-16 21:00 ` [PATCH net-next 02/10] openvswitch: Use nla_memcpy() to memcpy() data from attributes Jesse Gross 2013-04-16 21:00 ` [PATCH net-next 03/10] openvswitch: Refine Netlink message size calculation and kill FLOW_BUFSIZE Jesse Gross @ 2013-04-16 21:00 ` Jesse Gross 2 siblings, 0 replies; 54+ messages in thread From: Jesse Gross @ 2013-04-16 21:00 UTC (permalink / raw) To: David Miller; +Cc: dev-yBygre7rU0TnMu66kgdUjQ, netdev-u79uwXL29TY76Z2rM5mHXA From: Thomas Graf <tgraf-G/eBtMaohhA@public.gmane.org> Signed-off-by: Thomas Graf <tgraf-G/eBtMaohhA@public.gmane.org> Signed-off-by: Jesse Gross <jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> --- net/openvswitch/datapath.c | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index 49ee37b..d406503 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c @@ -71,6 +71,13 @@ static int ovs_net_id __read_mostly; static void rehash_flow_table(struct work_struct *work); static DECLARE_DELAYED_WORK(rehash_flow_wq, rehash_flow_table); +static void ovs_notify(struct sk_buff *skb, struct genl_info *info, + struct genl_multicast_group *grp) +{ + genl_notify(skb, genl_info_net(info), info->snd_portid, + grp->id, info->nlhdr, GFP_KERNEL); +} + /** * DOC: Locking: * @@ -1061,9 +1068,7 @@ static int ovs_flow_cmd_new_or_set(struct sk_buff *skb, struct genl_info *info) } if (!IS_ERR(reply)) - genl_notify(reply, genl_info_net(info), info->snd_portid, - ovs_dp_flow_multicast_group.id, info->nlhdr, - GFP_KERNEL); + ovs_notify(reply, info, &ovs_dp_flow_multicast_group); else netlink_set_err(sock_net(skb->sk)->genl_sock, 0, ovs_dp_flow_multicast_group.id, PTR_ERR(reply)); @@ -1150,8 +1155,7 @@ static int ovs_flow_cmd_del(struct sk_buff *skb, struct genl_info *info) ovs_flow_deferred_free(flow); - genl_notify(reply, genl_info_net(info), info->snd_portid, - ovs_dp_flow_multicast_group.id, info->nlhdr, GFP_KERNEL); + ovs_notify(reply, info, &ovs_dp_flow_multicast_group); return 0; } @@ -1383,9 +1387,7 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info) list_add_tail(&dp->list_node, &ovs_net->dps); rtnl_unlock(); - genl_notify(reply, genl_info_net(info), info->snd_portid, - ovs_dp_datapath_multicast_group.id, info->nlhdr, - GFP_KERNEL); + ovs_notify(reply, info, &ovs_dp_datapath_multicast_group); return 0; err_destroy_local_port: @@ -1453,9 +1455,7 @@ static int ovs_dp_cmd_del(struct sk_buff *skb, struct genl_info *info) __dp_destroy(dp); - genl_notify(reply, genl_info_net(info), info->snd_portid, - ovs_dp_datapath_multicast_group.id, info->nlhdr, - GFP_KERNEL); + ovs_notify(reply, info, &ovs_dp_datapath_multicast_group); return 0; } @@ -1479,9 +1479,7 @@ static int ovs_dp_cmd_set(struct sk_buff *skb, struct genl_info *info) return 0; } - genl_notify(reply, genl_info_net(info), info->snd_portid, - ovs_dp_datapath_multicast_group.id, info->nlhdr, - GFP_KERNEL); + ovs_notify(reply, info, &ovs_dp_datapath_multicast_group); return 0; } @@ -1727,8 +1725,8 @@ static int ovs_vport_cmd_new(struct sk_buff *skb, struct genl_info *info) ovs_dp_detach_port(vport); goto exit_unlock; } - genl_notify(reply, genl_info_net(info), info->snd_portid, - ovs_dp_vport_multicast_group.id, info->nlhdr, GFP_KERNEL); + + ovs_notify(reply, info, &ovs_dp_vport_multicast_group); exit_unlock: rtnl_unlock(); @@ -1769,8 +1767,7 @@ static int ovs_vport_cmd_set(struct sk_buff *skb, struct genl_info *info) goto exit_unlock; } - genl_notify(reply, genl_info_net(info), info->snd_portid, - ovs_dp_vport_multicast_group.id, info->nlhdr, GFP_KERNEL); + ovs_notify(reply, info, &ovs_dp_vport_multicast_group); exit_unlock: rtnl_unlock(); @@ -1804,8 +1801,7 @@ static int ovs_vport_cmd_del(struct sk_buff *skb, struct genl_info *info) err = 0; ovs_dp_detach_port(vport); - genl_notify(reply, genl_info_net(info), info->snd_portid, - ovs_dp_vport_multicast_group.id, info->nlhdr, GFP_KERNEL); + ovs_notify(reply, info, &ovs_dp_vport_multicast_group); exit_unlock: rtnl_unlock(); -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* [PATCH net-next 05/10] openvswitch: Use ETH_ALEN to define ethernet addresses 2013-04-16 21:00 [GIT net-next] Open vSwitch Jesse Gross 2013-04-16 21:00 ` [PATCH net-next 01/10] openvswitch: Specify the minimal length of OVS_PACKET_ATTR_PACKET in the policy Jesse Gross [not found] ` <1366146019-9015-1-git-send-email-jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> @ 2013-04-16 21:00 ` Jesse Gross 2013-04-16 21:00 ` [PATCH net-next 06/10] openvswitch: Expose <linux/openvswitch.h> to userspace Jesse Gross ` (5 subsequent siblings) 8 siblings, 0 replies; 54+ messages in thread From: Jesse Gross @ 2013-04-16 21:00 UTC (permalink / raw) To: David Miller; +Cc: netdev, dev, Thomas Graf, Jesse Gross From: Thomas Graf <tgraf@suug.ch> Signed-off-by: Thomas Graf <tgraf@suug.ch> Signed-off-by: Jesse Gross <jesse@nicira.com> --- include/linux/openvswitch.h | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/include/linux/openvswitch.h b/include/linux/openvswitch.h index 67d6c7b..8b9d721 100644 --- a/include/linux/openvswitch.h +++ b/include/linux/openvswitch.h @@ -20,6 +20,7 @@ #define _LINUX_OPENVSWITCH_H 1 #include <linux/types.h> +#include <linux/if_ether.h> /** * struct ovs_header - header for OVS Generic Netlink messages. @@ -269,8 +270,8 @@ enum ovs_frag_type { #define OVS_FRAG_TYPE_MAX (__OVS_FRAG_TYPE_MAX - 1) struct ovs_key_ethernet { - __u8 eth_src[6]; - __u8 eth_dst[6]; + __u8 eth_src[ETH_ALEN]; + __u8 eth_dst[ETH_ALEN]; }; struct ovs_key_ipv4 { @@ -316,14 +317,14 @@ struct ovs_key_arp { __be32 arp_sip; __be32 arp_tip; __be16 arp_op; - __u8 arp_sha[6]; - __u8 arp_tha[6]; + __u8 arp_sha[ETH_ALEN]; + __u8 arp_tha[ETH_ALEN]; }; struct ovs_key_nd { __u32 nd_target[4]; - __u8 nd_sll[6]; - __u8 nd_tll[6]; + __u8 nd_sll[ETH_ALEN]; + __u8 nd_tll[ETH_ALEN]; }; /** -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* [PATCH net-next 06/10] openvswitch: Expose <linux/openvswitch.h> to userspace 2013-04-16 21:00 [GIT net-next] Open vSwitch Jesse Gross ` (2 preceding siblings ...) 2013-04-16 21:00 ` [PATCH net-next 05/10] openvswitch: Use ETH_ALEN to define ethernet addresses Jesse Gross @ 2013-04-16 21:00 ` Jesse Gross 2013-04-16 21:00 ` [PATCH net-next 07/10] openvswitch: Don't insert empty OVS_VPORT_ATTR_OPTIONS attribute Jesse Gross ` (4 subsequent siblings) 8 siblings, 0 replies; 54+ messages in thread From: Jesse Gross @ 2013-04-16 21:00 UTC (permalink / raw) To: David Miller; +Cc: netdev, dev, Thomas Graf, Jesse Gross From: Thomas Graf <tgraf@suug.ch> It contains the public netlink interface bits required by userspace to make use of the interface. Signed-off-by: Thomas Graf <tgraf@suug.ch> Signed-off-by: Jesse Gross <jesse@nicira.com> --- include/linux/openvswitch.h | 433 +----------------------------------- include/uapi/linux/Kbuild | 1 + include/uapi/linux/openvswitch.h | 456 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 458 insertions(+), 432 deletions(-) create mode 100644 include/uapi/linux/openvswitch.h diff --git a/include/linux/openvswitch.h b/include/linux/openvswitch.h index 8b9d721..e6b240b 100644 --- a/include/linux/openvswitch.h +++ b/include/linux/openvswitch.h @@ -19,437 +19,6 @@ #ifndef _LINUX_OPENVSWITCH_H #define _LINUX_OPENVSWITCH_H 1 -#include <linux/types.h> -#include <linux/if_ether.h> - -/** - * struct ovs_header - header for OVS Generic Netlink messages. - * @dp_ifindex: ifindex of local port for datapath (0 to make a request not - * specific to a datapath). - * - * Attributes following the header are specific to a particular OVS Generic - * Netlink family, but all of the OVS families use this header. - */ - -struct ovs_header { - int dp_ifindex; -}; - -/* Datapaths. */ - -#define OVS_DATAPATH_FAMILY "ovs_datapath" -#define OVS_DATAPATH_MCGROUP "ovs_datapath" -#define OVS_DATAPATH_VERSION 0x1 - -enum ovs_datapath_cmd { - OVS_DP_CMD_UNSPEC, - OVS_DP_CMD_NEW, - OVS_DP_CMD_DEL, - OVS_DP_CMD_GET, - OVS_DP_CMD_SET -}; - -/** - * enum ovs_datapath_attr - attributes for %OVS_DP_* commands. - * @OVS_DP_ATTR_NAME: Name of the network device that serves as the "local - * port". This is the name of the network device whose dp_ifindex is given in - * the &struct ovs_header. Always present in notifications. Required in - * %OVS_DP_NEW requests. May be used as an alternative to specifying - * dp_ifindex in other requests (with a dp_ifindex of 0). - * @OVS_DP_ATTR_UPCALL_PID: The Netlink socket in userspace that is initially - * set on the datapath port (for OVS_ACTION_ATTR_MISS). Only valid on - * %OVS_DP_CMD_NEW requests. A value of zero indicates that upcalls should - * not be sent. - * @OVS_DP_ATTR_STATS: Statistics about packets that have passed through the - * datapath. Always present in notifications. - * - * These attributes follow the &struct ovs_header within the Generic Netlink - * payload for %OVS_DP_* commands. - */ -enum ovs_datapath_attr { - OVS_DP_ATTR_UNSPEC, - OVS_DP_ATTR_NAME, /* name of dp_ifindex netdev */ - OVS_DP_ATTR_UPCALL_PID, /* Netlink PID to receive upcalls */ - OVS_DP_ATTR_STATS, /* struct ovs_dp_stats */ - __OVS_DP_ATTR_MAX -}; - -#define OVS_DP_ATTR_MAX (__OVS_DP_ATTR_MAX - 1) - -struct ovs_dp_stats { - __u64 n_hit; /* Number of flow table matches. */ - __u64 n_missed; /* Number of flow table misses. */ - __u64 n_lost; /* Number of misses not sent to userspace. */ - __u64 n_flows; /* Number of flows present */ -}; - -struct ovs_vport_stats { - __u64 rx_packets; /* total packets received */ - __u64 tx_packets; /* total packets transmitted */ - __u64 rx_bytes; /* total bytes received */ - __u64 tx_bytes; /* total bytes transmitted */ - __u64 rx_errors; /* bad packets received */ - __u64 tx_errors; /* packet transmit problems */ - __u64 rx_dropped; /* no space in linux buffers */ - __u64 tx_dropped; /* no space available in linux */ -}; - -/* Fixed logical ports. */ -#define OVSP_LOCAL ((__u32)0) - -/* Packet transfer. */ - -#define OVS_PACKET_FAMILY "ovs_packet" -#define OVS_PACKET_VERSION 0x1 - -enum ovs_packet_cmd { - OVS_PACKET_CMD_UNSPEC, - - /* Kernel-to-user notifications. */ - OVS_PACKET_CMD_MISS, /* Flow table miss. */ - OVS_PACKET_CMD_ACTION, /* OVS_ACTION_ATTR_USERSPACE action. */ - - /* Userspace commands. */ - OVS_PACKET_CMD_EXECUTE /* Apply actions to a packet. */ -}; - -/** - * enum ovs_packet_attr - attributes for %OVS_PACKET_* commands. - * @OVS_PACKET_ATTR_PACKET: Present for all notifications. Contains the entire - * packet as received, from the start of the Ethernet header onward. For - * %OVS_PACKET_CMD_ACTION, %OVS_PACKET_ATTR_PACKET reflects changes made by - * actions preceding %OVS_ACTION_ATTR_USERSPACE, but %OVS_PACKET_ATTR_KEY is - * the flow key extracted from the packet as originally received. - * @OVS_PACKET_ATTR_KEY: Present for all notifications. Contains the flow key - * extracted from the packet as nested %OVS_KEY_ATTR_* attributes. This allows - * userspace to adapt its flow setup strategy by comparing its notion of the - * flow key against the kernel's. - * @OVS_PACKET_ATTR_ACTIONS: Contains actions for the packet. Used - * for %OVS_PACKET_CMD_EXECUTE. It has nested %OVS_ACTION_ATTR_* attributes. - * @OVS_PACKET_ATTR_USERDATA: Present for an %OVS_PACKET_CMD_ACTION - * notification if the %OVS_ACTION_ATTR_USERSPACE action specified an - * %OVS_USERSPACE_ATTR_USERDATA attribute, with the same length and content - * specified there. - * - * These attributes follow the &struct ovs_header within the Generic Netlink - * payload for %OVS_PACKET_* commands. - */ -enum ovs_packet_attr { - OVS_PACKET_ATTR_UNSPEC, - OVS_PACKET_ATTR_PACKET, /* Packet data. */ - OVS_PACKET_ATTR_KEY, /* Nested OVS_KEY_ATTR_* attributes. */ - OVS_PACKET_ATTR_ACTIONS, /* Nested OVS_ACTION_ATTR_* attributes. */ - OVS_PACKET_ATTR_USERDATA, /* OVS_ACTION_ATTR_USERSPACE arg. */ - __OVS_PACKET_ATTR_MAX -}; - -#define OVS_PACKET_ATTR_MAX (__OVS_PACKET_ATTR_MAX - 1) - -/* Virtual ports. */ - -#define OVS_VPORT_FAMILY "ovs_vport" -#define OVS_VPORT_MCGROUP "ovs_vport" -#define OVS_VPORT_VERSION 0x1 - -enum ovs_vport_cmd { - OVS_VPORT_CMD_UNSPEC, - OVS_VPORT_CMD_NEW, - OVS_VPORT_CMD_DEL, - OVS_VPORT_CMD_GET, - OVS_VPORT_CMD_SET -}; - -enum ovs_vport_type { - OVS_VPORT_TYPE_UNSPEC, - OVS_VPORT_TYPE_NETDEV, /* network device */ - OVS_VPORT_TYPE_INTERNAL, /* network device implemented by datapath */ - __OVS_VPORT_TYPE_MAX -}; - -#define OVS_VPORT_TYPE_MAX (__OVS_VPORT_TYPE_MAX - 1) - -/** - * enum ovs_vport_attr - attributes for %OVS_VPORT_* commands. - * @OVS_VPORT_ATTR_PORT_NO: 32-bit port number within datapath. - * @OVS_VPORT_ATTR_TYPE: 32-bit %OVS_VPORT_TYPE_* constant describing the type - * of vport. - * @OVS_VPORT_ATTR_NAME: Name of vport. For a vport based on a network device - * this is the name of the network device. Maximum length %IFNAMSIZ-1 bytes - * plus a null terminator. - * @OVS_VPORT_ATTR_OPTIONS: Vport-specific configuration information. - * @OVS_VPORT_ATTR_UPCALL_PID: The Netlink socket in userspace that - * OVS_PACKET_CMD_MISS upcalls will be directed to for packets received on - * this port. A value of zero indicates that upcalls should not be sent. - * @OVS_VPORT_ATTR_STATS: A &struct ovs_vport_stats giving statistics for - * packets sent or received through the vport. - * - * These attributes follow the &struct ovs_header within the Generic Netlink - * payload for %OVS_VPORT_* commands. - * - * For %OVS_VPORT_CMD_NEW requests, the %OVS_VPORT_ATTR_TYPE and - * %OVS_VPORT_ATTR_NAME attributes are required. %OVS_VPORT_ATTR_PORT_NO is - * optional; if not specified a free port number is automatically selected. - * Whether %OVS_VPORT_ATTR_OPTIONS is required or optional depends on the type - * of vport. - * and other attributes are ignored. - * - * For other requests, if %OVS_VPORT_ATTR_NAME is specified then it is used to - * look up the vport to operate on; otherwise dp_idx from the &struct - * ovs_header plus %OVS_VPORT_ATTR_PORT_NO determine the vport. - */ -enum ovs_vport_attr { - OVS_VPORT_ATTR_UNSPEC, - OVS_VPORT_ATTR_PORT_NO, /* u32 port number within datapath */ - OVS_VPORT_ATTR_TYPE, /* u32 OVS_VPORT_TYPE_* constant. */ - OVS_VPORT_ATTR_NAME, /* string name, up to IFNAMSIZ bytes long */ - OVS_VPORT_ATTR_OPTIONS, /* nested attributes, varies by vport type */ - OVS_VPORT_ATTR_UPCALL_PID, /* u32 Netlink PID to receive upcalls */ - OVS_VPORT_ATTR_STATS, /* struct ovs_vport_stats */ - __OVS_VPORT_ATTR_MAX -}; - -#define OVS_VPORT_ATTR_MAX (__OVS_VPORT_ATTR_MAX - 1) - -/* Flows. */ - -#define OVS_FLOW_FAMILY "ovs_flow" -#define OVS_FLOW_MCGROUP "ovs_flow" -#define OVS_FLOW_VERSION 0x1 - -enum ovs_flow_cmd { - OVS_FLOW_CMD_UNSPEC, - OVS_FLOW_CMD_NEW, - OVS_FLOW_CMD_DEL, - OVS_FLOW_CMD_GET, - OVS_FLOW_CMD_SET -}; - -struct ovs_flow_stats { - __u64 n_packets; /* Number of matched packets. */ - __u64 n_bytes; /* Number of matched bytes. */ -}; - -enum ovs_key_attr { - OVS_KEY_ATTR_UNSPEC, - OVS_KEY_ATTR_ENCAP, /* Nested set of encapsulated attributes. */ - OVS_KEY_ATTR_PRIORITY, /* u32 skb->priority */ - OVS_KEY_ATTR_IN_PORT, /* u32 OVS dp port number */ - OVS_KEY_ATTR_ETHERNET, /* struct ovs_key_ethernet */ - OVS_KEY_ATTR_VLAN, /* be16 VLAN TCI */ - OVS_KEY_ATTR_ETHERTYPE, /* be16 Ethernet type */ - OVS_KEY_ATTR_IPV4, /* struct ovs_key_ipv4 */ - OVS_KEY_ATTR_IPV6, /* struct ovs_key_ipv6 */ - OVS_KEY_ATTR_TCP, /* struct ovs_key_tcp */ - OVS_KEY_ATTR_UDP, /* struct ovs_key_udp */ - OVS_KEY_ATTR_ICMP, /* struct ovs_key_icmp */ - OVS_KEY_ATTR_ICMPV6, /* struct ovs_key_icmpv6 */ - OVS_KEY_ATTR_ARP, /* struct ovs_key_arp */ - OVS_KEY_ATTR_ND, /* struct ovs_key_nd */ - OVS_KEY_ATTR_SKB_MARK, /* u32 skb mark */ - __OVS_KEY_ATTR_MAX -}; - -#define OVS_KEY_ATTR_MAX (__OVS_KEY_ATTR_MAX - 1) - -/** - * enum ovs_frag_type - IPv4 and IPv6 fragment type - * @OVS_FRAG_TYPE_NONE: Packet is not a fragment. - * @OVS_FRAG_TYPE_FIRST: Packet is a fragment with offset 0. - * @OVS_FRAG_TYPE_LATER: Packet is a fragment with nonzero offset. - * - * Used as the @ipv4_frag in &struct ovs_key_ipv4 and as @ipv6_frag &struct - * ovs_key_ipv6. - */ -enum ovs_frag_type { - OVS_FRAG_TYPE_NONE, - OVS_FRAG_TYPE_FIRST, - OVS_FRAG_TYPE_LATER, - __OVS_FRAG_TYPE_MAX -}; - -#define OVS_FRAG_TYPE_MAX (__OVS_FRAG_TYPE_MAX - 1) - -struct ovs_key_ethernet { - __u8 eth_src[ETH_ALEN]; - __u8 eth_dst[ETH_ALEN]; -}; - -struct ovs_key_ipv4 { - __be32 ipv4_src; - __be32 ipv4_dst; - __u8 ipv4_proto; - __u8 ipv4_tos; - __u8 ipv4_ttl; - __u8 ipv4_frag; /* One of OVS_FRAG_TYPE_*. */ -}; - -struct ovs_key_ipv6 { - __be32 ipv6_src[4]; - __be32 ipv6_dst[4]; - __be32 ipv6_label; /* 20-bits in least-significant bits. */ - __u8 ipv6_proto; - __u8 ipv6_tclass; - __u8 ipv6_hlimit; - __u8 ipv6_frag; /* One of OVS_FRAG_TYPE_*. */ -}; - -struct ovs_key_tcp { - __be16 tcp_src; - __be16 tcp_dst; -}; - -struct ovs_key_udp { - __be16 udp_src; - __be16 udp_dst; -}; - -struct ovs_key_icmp { - __u8 icmp_type; - __u8 icmp_code; -}; - -struct ovs_key_icmpv6 { - __u8 icmpv6_type; - __u8 icmpv6_code; -}; - -struct ovs_key_arp { - __be32 arp_sip; - __be32 arp_tip; - __be16 arp_op; - __u8 arp_sha[ETH_ALEN]; - __u8 arp_tha[ETH_ALEN]; -}; - -struct ovs_key_nd { - __u32 nd_target[4]; - __u8 nd_sll[ETH_ALEN]; - __u8 nd_tll[ETH_ALEN]; -}; - -/** - * enum ovs_flow_attr - attributes for %OVS_FLOW_* commands. - * @OVS_FLOW_ATTR_KEY: Nested %OVS_KEY_ATTR_* attributes specifying the flow - * key. Always present in notifications. Required for all requests (except - * dumps). - * @OVS_FLOW_ATTR_ACTIONS: Nested %OVS_ACTION_ATTR_* attributes specifying - * the actions to take for packets that match the key. Always present in - * notifications. Required for %OVS_FLOW_CMD_NEW requests, optional for - * %OVS_FLOW_CMD_SET requests. - * @OVS_FLOW_ATTR_STATS: &struct ovs_flow_stats giving statistics for this - * flow. Present in notifications if the stats would be nonzero. Ignored in - * requests. - * @OVS_FLOW_ATTR_TCP_FLAGS: An 8-bit value giving the OR'd value of all of the - * TCP flags seen on packets in this flow. Only present in notifications for - * TCP flows, and only if it would be nonzero. Ignored in requests. - * @OVS_FLOW_ATTR_USED: A 64-bit integer giving the time, in milliseconds on - * the system monotonic clock, at which a packet was last processed for this - * flow. Only present in notifications if a packet has been processed for this - * flow. Ignored in requests. - * @OVS_FLOW_ATTR_CLEAR: If present in a %OVS_FLOW_CMD_SET request, clears the - * last-used time, accumulated TCP flags, and statistics for this flow. - * Otherwise ignored in requests. Never present in notifications. - * - * These attributes follow the &struct ovs_header within the Generic Netlink - * payload for %OVS_FLOW_* commands. - */ -enum ovs_flow_attr { - OVS_FLOW_ATTR_UNSPEC, - OVS_FLOW_ATTR_KEY, /* Sequence of OVS_KEY_ATTR_* attributes. */ - OVS_FLOW_ATTR_ACTIONS, /* Nested OVS_ACTION_ATTR_* attributes. */ - OVS_FLOW_ATTR_STATS, /* struct ovs_flow_stats. */ - OVS_FLOW_ATTR_TCP_FLAGS, /* 8-bit OR'd TCP flags. */ - OVS_FLOW_ATTR_USED, /* u64 msecs last used in monotonic time. */ - OVS_FLOW_ATTR_CLEAR, /* Flag to clear stats, tcp_flags, used. */ - __OVS_FLOW_ATTR_MAX -}; - -#define OVS_FLOW_ATTR_MAX (__OVS_FLOW_ATTR_MAX - 1) - -/** - * enum ovs_sample_attr - Attributes for %OVS_ACTION_ATTR_SAMPLE action. - * @OVS_SAMPLE_ATTR_PROBABILITY: 32-bit fraction of packets to sample with - * @OVS_ACTION_ATTR_SAMPLE. A value of 0 samples no packets, a value of - * %UINT32_MAX samples all packets and intermediate values sample intermediate - * fractions of packets. - * @OVS_SAMPLE_ATTR_ACTIONS: Set of actions to execute in sampling event. - * Actions are passed as nested attributes. - * - * Executes the specified actions with the given probability on a per-packet - * basis. - */ -enum ovs_sample_attr { - OVS_SAMPLE_ATTR_UNSPEC, - OVS_SAMPLE_ATTR_PROBABILITY, /* u32 number */ - OVS_SAMPLE_ATTR_ACTIONS, /* Nested OVS_ACTION_ATTR_* attributes. */ - __OVS_SAMPLE_ATTR_MAX, -}; - -#define OVS_SAMPLE_ATTR_MAX (__OVS_SAMPLE_ATTR_MAX - 1) - -/** - * enum ovs_userspace_attr - Attributes for %OVS_ACTION_ATTR_USERSPACE action. - * @OVS_USERSPACE_ATTR_PID: u32 Netlink PID to which the %OVS_PACKET_CMD_ACTION - * message should be sent. Required. - * @OVS_USERSPACE_ATTR_USERDATA: If present, its variable-length argument is - * copied to the %OVS_PACKET_CMD_ACTION message as %OVS_PACKET_ATTR_USERDATA. - */ -enum ovs_userspace_attr { - OVS_USERSPACE_ATTR_UNSPEC, - OVS_USERSPACE_ATTR_PID, /* u32 Netlink PID to receive upcalls. */ - OVS_USERSPACE_ATTR_USERDATA, /* Optional user-specified cookie. */ - __OVS_USERSPACE_ATTR_MAX -}; - -#define OVS_USERSPACE_ATTR_MAX (__OVS_USERSPACE_ATTR_MAX - 1) - -/** - * struct ovs_action_push_vlan - %OVS_ACTION_ATTR_PUSH_VLAN action argument. - * @vlan_tpid: Tag protocol identifier (TPID) to push. - * @vlan_tci: Tag control identifier (TCI) to push. The CFI bit must be set - * (but it will not be set in the 802.1Q header that is pushed). - * - * The @vlan_tpid value is typically %ETH_P_8021Q. The only acceptable TPID - * values are those that the kernel module also parses as 802.1Q headers, to - * prevent %OVS_ACTION_ATTR_PUSH_VLAN followed by %OVS_ACTION_ATTR_POP_VLAN - * from having surprising results. - */ -struct ovs_action_push_vlan { - __be16 vlan_tpid; /* 802.1Q TPID. */ - __be16 vlan_tci; /* 802.1Q TCI (VLAN ID and priority). */ -}; - -/** - * enum ovs_action_attr - Action types. - * - * @OVS_ACTION_ATTR_OUTPUT: Output packet to port. - * @OVS_ACTION_ATTR_USERSPACE: Send packet to userspace according to nested - * %OVS_USERSPACE_ATTR_* attributes. - * @OVS_ACTION_ATTR_SET: Replaces the contents of an existing header. The - * single nested %OVS_KEY_ATTR_* attribute specifies a header to modify and its - * value. - * @OVS_ACTION_ATTR_PUSH_VLAN: Push a new outermost 802.1Q header onto the - * packet. - * @OVS_ACTION_ATTR_POP_VLAN: Pop the outermost 802.1Q header off the packet. - * @OVS_ACTION_ATTR_SAMPLE: Probabilitically executes actions, as specified in - * the nested %OVS_SAMPLE_ATTR_* attributes. - * - * Only a single header can be set with a single %OVS_ACTION_ATTR_SET. Not all - * fields within a header are modifiable, e.g. the IPv4 protocol and fragment - * type may not be changed. - */ - -enum ovs_action_attr { - OVS_ACTION_ATTR_UNSPEC, - OVS_ACTION_ATTR_OUTPUT, /* u32 port number. */ - OVS_ACTION_ATTR_USERSPACE, /* Nested OVS_USERSPACE_ATTR_*. */ - OVS_ACTION_ATTR_SET, /* One nested OVS_KEY_ATTR_*. */ - OVS_ACTION_ATTR_PUSH_VLAN, /* struct ovs_action_push_vlan. */ - OVS_ACTION_ATTR_POP_VLAN, /* No argument. */ - OVS_ACTION_ATTR_SAMPLE, /* Nested OVS_SAMPLE_ATTR_*. */ - __OVS_ACTION_ATTR_MAX -}; - -#define OVS_ACTION_ATTR_MAX (__OVS_ACTION_ATTR_MAX - 1) +#include <uapi/linux/openvswitch.h> #endif /* _LINUX_OPENVSWITCH_H */ diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild index 5c8a1d2..d8fbc6a 100644 --- a/include/uapi/linux/Kbuild +++ b/include/uapi/linux/Kbuild @@ -285,6 +285,7 @@ header-y += nvram.h header-y += omap3isp.h header-y += omapfb.h header-y += oom.h +header-y += openvswitch.h header-y += packet_diag.h header-y += param.h header-y += parport.h diff --git a/include/uapi/linux/openvswitch.h b/include/uapi/linux/openvswitch.h new file mode 100644 index 0000000..405918d --- /dev/null +++ b/include/uapi/linux/openvswitch.h @@ -0,0 +1,456 @@ + +/* + * Copyright (c) 2007-2011 Nicira Networks. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA + */ + +#ifndef _UAPI__LINUX_OPENVSWITCH_H +#define _UAPI__LINUX_OPENVSWITCH_H 1 + +#include <linux/types.h> +#include <linux/if_ether.h> + +/** + * struct ovs_header - header for OVS Generic Netlink messages. + * @dp_ifindex: ifindex of local port for datapath (0 to make a request not + * specific to a datapath). + * + * Attributes following the header are specific to a particular OVS Generic + * Netlink family, but all of the OVS families use this header. + */ + +struct ovs_header { + int dp_ifindex; +}; + +/* Datapaths. */ + +#define OVS_DATAPATH_FAMILY "ovs_datapath" +#define OVS_DATAPATH_MCGROUP "ovs_datapath" +#define OVS_DATAPATH_VERSION 0x1 + +enum ovs_datapath_cmd { + OVS_DP_CMD_UNSPEC, + OVS_DP_CMD_NEW, + OVS_DP_CMD_DEL, + OVS_DP_CMD_GET, + OVS_DP_CMD_SET +}; + +/** + * enum ovs_datapath_attr - attributes for %OVS_DP_* commands. + * @OVS_DP_ATTR_NAME: Name of the network device that serves as the "local + * port". This is the name of the network device whose dp_ifindex is given in + * the &struct ovs_header. Always present in notifications. Required in + * %OVS_DP_NEW requests. May be used as an alternative to specifying + * dp_ifindex in other requests (with a dp_ifindex of 0). + * @OVS_DP_ATTR_UPCALL_PID: The Netlink socket in userspace that is initially + * set on the datapath port (for OVS_ACTION_ATTR_MISS). Only valid on + * %OVS_DP_CMD_NEW requests. A value of zero indicates that upcalls should + * not be sent. + * @OVS_DP_ATTR_STATS: Statistics about packets that have passed through the + * datapath. Always present in notifications. + * + * These attributes follow the &struct ovs_header within the Generic Netlink + * payload for %OVS_DP_* commands. + */ +enum ovs_datapath_attr { + OVS_DP_ATTR_UNSPEC, + OVS_DP_ATTR_NAME, /* name of dp_ifindex netdev */ + OVS_DP_ATTR_UPCALL_PID, /* Netlink PID to receive upcalls */ + OVS_DP_ATTR_STATS, /* struct ovs_dp_stats */ + __OVS_DP_ATTR_MAX +}; + +#define OVS_DP_ATTR_MAX (__OVS_DP_ATTR_MAX - 1) + +struct ovs_dp_stats { + __u64 n_hit; /* Number of flow table matches. */ + __u64 n_missed; /* Number of flow table misses. */ + __u64 n_lost; /* Number of misses not sent to userspace. */ + __u64 n_flows; /* Number of flows present */ +}; + +struct ovs_vport_stats { + __u64 rx_packets; /* total packets received */ + __u64 tx_packets; /* total packets transmitted */ + __u64 rx_bytes; /* total bytes received */ + __u64 tx_bytes; /* total bytes transmitted */ + __u64 rx_errors; /* bad packets received */ + __u64 tx_errors; /* packet transmit problems */ + __u64 rx_dropped; /* no space in linux buffers */ + __u64 tx_dropped; /* no space available in linux */ +}; + +/* Fixed logical ports. */ +#define OVSP_LOCAL ((__u32)0) + +/* Packet transfer. */ + +#define OVS_PACKET_FAMILY "ovs_packet" +#define OVS_PACKET_VERSION 0x1 + +enum ovs_packet_cmd { + OVS_PACKET_CMD_UNSPEC, + + /* Kernel-to-user notifications. */ + OVS_PACKET_CMD_MISS, /* Flow table miss. */ + OVS_PACKET_CMD_ACTION, /* OVS_ACTION_ATTR_USERSPACE action. */ + + /* Userspace commands. */ + OVS_PACKET_CMD_EXECUTE /* Apply actions to a packet. */ +}; + +/** + * enum ovs_packet_attr - attributes for %OVS_PACKET_* commands. + * @OVS_PACKET_ATTR_PACKET: Present for all notifications. Contains the entire + * packet as received, from the start of the Ethernet header onward. For + * %OVS_PACKET_CMD_ACTION, %OVS_PACKET_ATTR_PACKET reflects changes made by + * actions preceding %OVS_ACTION_ATTR_USERSPACE, but %OVS_PACKET_ATTR_KEY is + * the flow key extracted from the packet as originally received. + * @OVS_PACKET_ATTR_KEY: Present for all notifications. Contains the flow key + * extracted from the packet as nested %OVS_KEY_ATTR_* attributes. This allows + * userspace to adapt its flow setup strategy by comparing its notion of the + * flow key against the kernel's. + * @OVS_PACKET_ATTR_ACTIONS: Contains actions for the packet. Used + * for %OVS_PACKET_CMD_EXECUTE. It has nested %OVS_ACTION_ATTR_* attributes. + * @OVS_PACKET_ATTR_USERDATA: Present for an %OVS_PACKET_CMD_ACTION + * notification if the %OVS_ACTION_ATTR_USERSPACE action specified an + * %OVS_USERSPACE_ATTR_USERDATA attribute, with the same length and content + * specified there. + * + * These attributes follow the &struct ovs_header within the Generic Netlink + * payload for %OVS_PACKET_* commands. + */ +enum ovs_packet_attr { + OVS_PACKET_ATTR_UNSPEC, + OVS_PACKET_ATTR_PACKET, /* Packet data. */ + OVS_PACKET_ATTR_KEY, /* Nested OVS_KEY_ATTR_* attributes. */ + OVS_PACKET_ATTR_ACTIONS, /* Nested OVS_ACTION_ATTR_* attributes. */ + OVS_PACKET_ATTR_USERDATA, /* OVS_ACTION_ATTR_USERSPACE arg. */ + __OVS_PACKET_ATTR_MAX +}; + +#define OVS_PACKET_ATTR_MAX (__OVS_PACKET_ATTR_MAX - 1) + +/* Virtual ports. */ + +#define OVS_VPORT_FAMILY "ovs_vport" +#define OVS_VPORT_MCGROUP "ovs_vport" +#define OVS_VPORT_VERSION 0x1 + +enum ovs_vport_cmd { + OVS_VPORT_CMD_UNSPEC, + OVS_VPORT_CMD_NEW, + OVS_VPORT_CMD_DEL, + OVS_VPORT_CMD_GET, + OVS_VPORT_CMD_SET +}; + +enum ovs_vport_type { + OVS_VPORT_TYPE_UNSPEC, + OVS_VPORT_TYPE_NETDEV, /* network device */ + OVS_VPORT_TYPE_INTERNAL, /* network device implemented by datapath */ + __OVS_VPORT_TYPE_MAX +}; + +#define OVS_VPORT_TYPE_MAX (__OVS_VPORT_TYPE_MAX - 1) + +/** + * enum ovs_vport_attr - attributes for %OVS_VPORT_* commands. + * @OVS_VPORT_ATTR_PORT_NO: 32-bit port number within datapath. + * @OVS_VPORT_ATTR_TYPE: 32-bit %OVS_VPORT_TYPE_* constant describing the type + * of vport. + * @OVS_VPORT_ATTR_NAME: Name of vport. For a vport based on a network device + * this is the name of the network device. Maximum length %IFNAMSIZ-1 bytes + * plus a null terminator. + * @OVS_VPORT_ATTR_OPTIONS: Vport-specific configuration information. + * @OVS_VPORT_ATTR_UPCALL_PID: The Netlink socket in userspace that + * OVS_PACKET_CMD_MISS upcalls will be directed to for packets received on + * this port. A value of zero indicates that upcalls should not be sent. + * @OVS_VPORT_ATTR_STATS: A &struct ovs_vport_stats giving statistics for + * packets sent or received through the vport. + * + * These attributes follow the &struct ovs_header within the Generic Netlink + * payload for %OVS_VPORT_* commands. + * + * For %OVS_VPORT_CMD_NEW requests, the %OVS_VPORT_ATTR_TYPE and + * %OVS_VPORT_ATTR_NAME attributes are required. %OVS_VPORT_ATTR_PORT_NO is + * optional; if not specified a free port number is automatically selected. + * Whether %OVS_VPORT_ATTR_OPTIONS is required or optional depends on the type + * of vport. + * and other attributes are ignored. + * + * For other requests, if %OVS_VPORT_ATTR_NAME is specified then it is used to + * look up the vport to operate on; otherwise dp_idx from the &struct + * ovs_header plus %OVS_VPORT_ATTR_PORT_NO determine the vport. + */ +enum ovs_vport_attr { + OVS_VPORT_ATTR_UNSPEC, + OVS_VPORT_ATTR_PORT_NO, /* u32 port number within datapath */ + OVS_VPORT_ATTR_TYPE, /* u32 OVS_VPORT_TYPE_* constant. */ + OVS_VPORT_ATTR_NAME, /* string name, up to IFNAMSIZ bytes long */ + OVS_VPORT_ATTR_OPTIONS, /* nested attributes, varies by vport type */ + OVS_VPORT_ATTR_UPCALL_PID, /* u32 Netlink PID to receive upcalls */ + OVS_VPORT_ATTR_STATS, /* struct ovs_vport_stats */ + __OVS_VPORT_ATTR_MAX +}; + +#define OVS_VPORT_ATTR_MAX (__OVS_VPORT_ATTR_MAX - 1) + +/* Flows. */ + +#define OVS_FLOW_FAMILY "ovs_flow" +#define OVS_FLOW_MCGROUP "ovs_flow" +#define OVS_FLOW_VERSION 0x1 + +enum ovs_flow_cmd { + OVS_FLOW_CMD_UNSPEC, + OVS_FLOW_CMD_NEW, + OVS_FLOW_CMD_DEL, + OVS_FLOW_CMD_GET, + OVS_FLOW_CMD_SET +}; + +struct ovs_flow_stats { + __u64 n_packets; /* Number of matched packets. */ + __u64 n_bytes; /* Number of matched bytes. */ +}; + +enum ovs_key_attr { + OVS_KEY_ATTR_UNSPEC, + OVS_KEY_ATTR_ENCAP, /* Nested set of encapsulated attributes. */ + OVS_KEY_ATTR_PRIORITY, /* u32 skb->priority */ + OVS_KEY_ATTR_IN_PORT, /* u32 OVS dp port number */ + OVS_KEY_ATTR_ETHERNET, /* struct ovs_key_ethernet */ + OVS_KEY_ATTR_VLAN, /* be16 VLAN TCI */ + OVS_KEY_ATTR_ETHERTYPE, /* be16 Ethernet type */ + OVS_KEY_ATTR_IPV4, /* struct ovs_key_ipv4 */ + OVS_KEY_ATTR_IPV6, /* struct ovs_key_ipv6 */ + OVS_KEY_ATTR_TCP, /* struct ovs_key_tcp */ + OVS_KEY_ATTR_UDP, /* struct ovs_key_udp */ + OVS_KEY_ATTR_ICMP, /* struct ovs_key_icmp */ + OVS_KEY_ATTR_ICMPV6, /* struct ovs_key_icmpv6 */ + OVS_KEY_ATTR_ARP, /* struct ovs_key_arp */ + OVS_KEY_ATTR_ND, /* struct ovs_key_nd */ + OVS_KEY_ATTR_SKB_MARK, /* u32 skb mark */ + __OVS_KEY_ATTR_MAX +}; + +#define OVS_KEY_ATTR_MAX (__OVS_KEY_ATTR_MAX - 1) + +/** + * enum ovs_frag_type - IPv4 and IPv6 fragment type + * @OVS_FRAG_TYPE_NONE: Packet is not a fragment. + * @OVS_FRAG_TYPE_FIRST: Packet is a fragment with offset 0. + * @OVS_FRAG_TYPE_LATER: Packet is a fragment with nonzero offset. + * + * Used as the @ipv4_frag in &struct ovs_key_ipv4 and as @ipv6_frag &struct + * ovs_key_ipv6. + */ +enum ovs_frag_type { + OVS_FRAG_TYPE_NONE, + OVS_FRAG_TYPE_FIRST, + OVS_FRAG_TYPE_LATER, + __OVS_FRAG_TYPE_MAX +}; + +#define OVS_FRAG_TYPE_MAX (__OVS_FRAG_TYPE_MAX - 1) + +struct ovs_key_ethernet { + __u8 eth_src[ETH_ALEN]; + __u8 eth_dst[ETH_ALEN]; +}; + +struct ovs_key_ipv4 { + __be32 ipv4_src; + __be32 ipv4_dst; + __u8 ipv4_proto; + __u8 ipv4_tos; + __u8 ipv4_ttl; + __u8 ipv4_frag; /* One of OVS_FRAG_TYPE_*. */ +}; + +struct ovs_key_ipv6 { + __be32 ipv6_src[4]; + __be32 ipv6_dst[4]; + __be32 ipv6_label; /* 20-bits in least-significant bits. */ + __u8 ipv6_proto; + __u8 ipv6_tclass; + __u8 ipv6_hlimit; + __u8 ipv6_frag; /* One of OVS_FRAG_TYPE_*. */ +}; + +struct ovs_key_tcp { + __be16 tcp_src; + __be16 tcp_dst; +}; + +struct ovs_key_udp { + __be16 udp_src; + __be16 udp_dst; +}; + +struct ovs_key_icmp { + __u8 icmp_type; + __u8 icmp_code; +}; + +struct ovs_key_icmpv6 { + __u8 icmpv6_type; + __u8 icmpv6_code; +}; + +struct ovs_key_arp { + __be32 arp_sip; + __be32 arp_tip; + __be16 arp_op; + __u8 arp_sha[ETH_ALEN]; + __u8 arp_tha[ETH_ALEN]; +}; + +struct ovs_key_nd { + __u32 nd_target[4]; + __u8 nd_sll[ETH_ALEN]; + __u8 nd_tll[ETH_ALEN]; +}; + +/** + * enum ovs_flow_attr - attributes for %OVS_FLOW_* commands. + * @OVS_FLOW_ATTR_KEY: Nested %OVS_KEY_ATTR_* attributes specifying the flow + * key. Always present in notifications. Required for all requests (except + * dumps). + * @OVS_FLOW_ATTR_ACTIONS: Nested %OVS_ACTION_ATTR_* attributes specifying + * the actions to take for packets that match the key. Always present in + * notifications. Required for %OVS_FLOW_CMD_NEW requests, optional for + * %OVS_FLOW_CMD_SET requests. + * @OVS_FLOW_ATTR_STATS: &struct ovs_flow_stats giving statistics for this + * flow. Present in notifications if the stats would be nonzero. Ignored in + * requests. + * @OVS_FLOW_ATTR_TCP_FLAGS: An 8-bit value giving the OR'd value of all of the + * TCP flags seen on packets in this flow. Only present in notifications for + * TCP flows, and only if it would be nonzero. Ignored in requests. + * @OVS_FLOW_ATTR_USED: A 64-bit integer giving the time, in milliseconds on + * the system monotonic clock, at which a packet was last processed for this + * flow. Only present in notifications if a packet has been processed for this + * flow. Ignored in requests. + * @OVS_FLOW_ATTR_CLEAR: If present in a %OVS_FLOW_CMD_SET request, clears the + * last-used time, accumulated TCP flags, and statistics for this flow. + * Otherwise ignored in requests. Never present in notifications. + * + * These attributes follow the &struct ovs_header within the Generic Netlink + * payload for %OVS_FLOW_* commands. + */ +enum ovs_flow_attr { + OVS_FLOW_ATTR_UNSPEC, + OVS_FLOW_ATTR_KEY, /* Sequence of OVS_KEY_ATTR_* attributes. */ + OVS_FLOW_ATTR_ACTIONS, /* Nested OVS_ACTION_ATTR_* attributes. */ + OVS_FLOW_ATTR_STATS, /* struct ovs_flow_stats. */ + OVS_FLOW_ATTR_TCP_FLAGS, /* 8-bit OR'd TCP flags. */ + OVS_FLOW_ATTR_USED, /* u64 msecs last used in monotonic time. */ + OVS_FLOW_ATTR_CLEAR, /* Flag to clear stats, tcp_flags, used. */ + __OVS_FLOW_ATTR_MAX +}; + +#define OVS_FLOW_ATTR_MAX (__OVS_FLOW_ATTR_MAX - 1) + +/** + * enum ovs_sample_attr - Attributes for %OVS_ACTION_ATTR_SAMPLE action. + * @OVS_SAMPLE_ATTR_PROBABILITY: 32-bit fraction of packets to sample with + * @OVS_ACTION_ATTR_SAMPLE. A value of 0 samples no packets, a value of + * %UINT32_MAX samples all packets and intermediate values sample intermediate + * fractions of packets. + * @OVS_SAMPLE_ATTR_ACTIONS: Set of actions to execute in sampling event. + * Actions are passed as nested attributes. + * + * Executes the specified actions with the given probability on a per-packet + * basis. + */ +enum ovs_sample_attr { + OVS_SAMPLE_ATTR_UNSPEC, + OVS_SAMPLE_ATTR_PROBABILITY, /* u32 number */ + OVS_SAMPLE_ATTR_ACTIONS, /* Nested OVS_ACTION_ATTR_* attributes. */ + __OVS_SAMPLE_ATTR_MAX, +}; + +#define OVS_SAMPLE_ATTR_MAX (__OVS_SAMPLE_ATTR_MAX - 1) + +/** + * enum ovs_userspace_attr - Attributes for %OVS_ACTION_ATTR_USERSPACE action. + * @OVS_USERSPACE_ATTR_PID: u32 Netlink PID to which the %OVS_PACKET_CMD_ACTION + * message should be sent. Required. + * @OVS_USERSPACE_ATTR_USERDATA: If present, its variable-length argument is + * copied to the %OVS_PACKET_CMD_ACTION message as %OVS_PACKET_ATTR_USERDATA. + */ +enum ovs_userspace_attr { + OVS_USERSPACE_ATTR_UNSPEC, + OVS_USERSPACE_ATTR_PID, /* u32 Netlink PID to receive upcalls. */ + OVS_USERSPACE_ATTR_USERDATA, /* Optional user-specified cookie. */ + __OVS_USERSPACE_ATTR_MAX +}; + +#define OVS_USERSPACE_ATTR_MAX (__OVS_USERSPACE_ATTR_MAX - 1) + +/** + * struct ovs_action_push_vlan - %OVS_ACTION_ATTR_PUSH_VLAN action argument. + * @vlan_tpid: Tag protocol identifier (TPID) to push. + * @vlan_tci: Tag control identifier (TCI) to push. The CFI bit must be set + * (but it will not be set in the 802.1Q header that is pushed). + * + * The @vlan_tpid value is typically %ETH_P_8021Q. The only acceptable TPID + * values are those that the kernel module also parses as 802.1Q headers, to + * prevent %OVS_ACTION_ATTR_PUSH_VLAN followed by %OVS_ACTION_ATTR_POP_VLAN + * from having surprising results. + */ +struct ovs_action_push_vlan { + __be16 vlan_tpid; /* 802.1Q TPID. */ + __be16 vlan_tci; /* 802.1Q TCI (VLAN ID and priority). */ +}; + +/** + * enum ovs_action_attr - Action types. + * + * @OVS_ACTION_ATTR_OUTPUT: Output packet to port. + * @OVS_ACTION_ATTR_USERSPACE: Send packet to userspace according to nested + * %OVS_USERSPACE_ATTR_* attributes. + * @OVS_ACTION_ATTR_SET: Replaces the contents of an existing header. The + * single nested %OVS_KEY_ATTR_* attribute specifies a header to modify and its + * value. + * @OVS_ACTION_ATTR_PUSH_VLAN: Push a new outermost 802.1Q header onto the + * packet. + * @OVS_ACTION_ATTR_POP_VLAN: Pop the outermost 802.1Q header off the packet. + * @OVS_ACTION_ATTR_SAMPLE: Probabilitically executes actions, as specified in + * the nested %OVS_SAMPLE_ATTR_* attributes. + * + * Only a single header can be set with a single %OVS_ACTION_ATTR_SET. Not all + * fields within a header are modifiable, e.g. the IPv4 protocol and fragment + * type may not be changed. + */ + +enum ovs_action_attr { + OVS_ACTION_ATTR_UNSPEC, + OVS_ACTION_ATTR_OUTPUT, /* u32 port number. */ + OVS_ACTION_ATTR_USERSPACE, /* Nested OVS_USERSPACE_ATTR_*. */ + OVS_ACTION_ATTR_SET, /* One nested OVS_KEY_ATTR_*. */ + OVS_ACTION_ATTR_PUSH_VLAN, /* struct ovs_action_push_vlan. */ + OVS_ACTION_ATTR_POP_VLAN, /* No argument. */ + OVS_ACTION_ATTR_SAMPLE, /* Nested OVS_SAMPLE_ATTR_*. */ + __OVS_ACTION_ATTR_MAX +}; + +#define OVS_ACTION_ATTR_MAX (__OVS_ACTION_ATTR_MAX - 1) + +#endif /* _LINUX_OPENVSWITCH_H */ -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* [PATCH net-next 07/10] openvswitch: Don't insert empty OVS_VPORT_ATTR_OPTIONS attribute 2013-04-16 21:00 [GIT net-next] Open vSwitch Jesse Gross ` (3 preceding siblings ...) 2013-04-16 21:00 ` [PATCH net-next 06/10] openvswitch: Expose <linux/openvswitch.h> to userspace Jesse Gross @ 2013-04-16 21:00 ` Jesse Gross 2013-04-16 21:00 ` [PATCH net-next 08/10] openvswitch: datapath.h: Fix a stale comment Jesse Gross ` (3 subsequent siblings) 8 siblings, 0 replies; 54+ messages in thread From: Jesse Gross @ 2013-04-16 21:00 UTC (permalink / raw) To: David Miller; +Cc: netdev, dev, Thomas Graf, Jesse Gross From: Thomas Graf <tgraf@suug.ch> The port specific options are currently unused resulting in an empty OVS_VPORT_ATTR_OPTIONS nested attribute being inserted into every OVS_VPORT_CMD_GET message. Don't insert OVS_VPORT_ATTR_OPTIONS if no options are present. Signed-off-by: Thomas Graf <tgraf@suug.ch> Signed-off-by: Jesse Gross <jesse@nicira.com> --- net/openvswitch/vport.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/net/openvswitch/vport.c b/net/openvswitch/vport.c index f6b8132..71a2de8 100644 --- a/net/openvswitch/vport.c +++ b/net/openvswitch/vport.c @@ -301,17 +301,19 @@ void ovs_vport_get_stats(struct vport *vport, struct ovs_vport_stats *stats) int ovs_vport_get_options(const struct vport *vport, struct sk_buff *skb) { struct nlattr *nla; + int err; + + if (!vport->ops->get_options) + return 0; nla = nla_nest_start(skb, OVS_VPORT_ATTR_OPTIONS); if (!nla) return -EMSGSIZE; - if (vport->ops->get_options) { - int err = vport->ops->get_options(vport, skb); - if (err) { - nla_nest_cancel(skb, nla); - return err; - } + err = vport->ops->get_options(vport, skb); + if (err) { + nla_nest_cancel(skb, nla); + return err; } nla_nest_end(skb, nla); -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* [PATCH net-next 08/10] openvswitch: datapath.h: Fix a stale comment. 2013-04-16 21:00 [GIT net-next] Open vSwitch Jesse Gross ` (4 preceding siblings ...) 2013-04-16 21:00 ` [PATCH net-next 07/10] openvswitch: Don't insert empty OVS_VPORT_ATTR_OPTIONS attribute Jesse Gross @ 2013-04-16 21:00 ` Jesse Gross 2013-04-16 21:00 ` [PATCH net-next 09/10] openvswitch: Simplify datapath locking Jesse Gross ` (2 subsequent siblings) 8 siblings, 0 replies; 54+ messages in thread From: Jesse Gross @ 2013-04-16 21:00 UTC (permalink / raw) To: David Miller; +Cc: netdev, dev, Andy Zhou, Jesse Gross From: Andy Zhou <azhou@nicira.com> Signed-off-by: Andy Zhou <azhou@nicira.com> Signed-off-by: Jesse Gross <jesse@nicira.com> --- net/openvswitch/datapath.h | 1 - 1 file changed, 1 deletion(-) diff --git a/net/openvswitch/datapath.h b/net/openvswitch/datapath.h index 9125ad5..655beb1 100644 --- a/net/openvswitch/datapath.h +++ b/net/openvswitch/datapath.h @@ -57,7 +57,6 @@ struct dp_stats_percpu { * struct datapath - datapath for flow-based packet switching * @rcu: RCU callback head for deferred destruction. * @list_node: Element in global 'dps' list. - * @n_flows: Number of flows currently in flow table. * @table: Current flow table. Protected by genl_lock and RCU. * @ports: Hash table for ports. %OVSP_LOCAL port always exists. Protected by * RTNL and RCU. -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* [PATCH net-next 09/10] openvswitch: Simplify datapath locking. 2013-04-16 21:00 [GIT net-next] Open vSwitch Jesse Gross ` (5 preceding siblings ...) 2013-04-16 21:00 ` [PATCH net-next 08/10] openvswitch: datapath.h: Fix a stale comment Jesse Gross @ 2013-04-16 21:00 ` Jesse Gross 2013-04-16 21:00 ` [PATCH net-next 10/10] openvswitch: Use generic struct pcpu_tstats Jesse Gross 2013-04-17 17:31 ` [GIT net-next] Open vSwitch David Miller 8 siblings, 0 replies; 54+ messages in thread From: Jesse Gross @ 2013-04-16 21:00 UTC (permalink / raw) To: David Miller; +Cc: netdev, dev, Pravin B Shelar, Jesse Gross From: Pravin B Shelar <pshelar@nicira.com> Currently OVS uses combination of genl and rtnl lock to protect datapath state. This was done due to networking stack locking. But this has complicated locking and there are few lock ordering issues with new tunneling protocols. Following patch simplifies locking by introducing new ovs mutex and now this lock is used to protect entire ovs state. Signed-off-by: Pravin B Shelar <pshelar@nicira.com> Signed-off-by: Jesse Gross <jesse@nicira.com> --- net/openvswitch/datapath.c | 274 +++++++++++++++++++++------------- net/openvswitch/datapath.h | 69 ++++++--- net/openvswitch/dp_notify.c | 82 ++++++---- net/openvswitch/vport-internal_dev.c | 6 + net/openvswitch/vport-netdev.c | 8 +- net/openvswitch/vport.c | 22 ++- net/openvswitch/vport.h | 4 +- 7 files changed, 298 insertions(+), 167 deletions(-) diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index d406503..b7d0b7c 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c @@ -44,6 +44,7 @@ #include <linux/netfilter_ipv4.h> #include <linux/inetdevice.h> #include <linux/list.h> +#include <linux/lockdep.h> #include <linux/openvswitch.h> #include <linux/rculist.h> #include <linux/dmi.h> @@ -56,21 +57,13 @@ #include "flow.h" #include "vport-internal_dev.h" -/** - * struct ovs_net - Per net-namespace data for ovs. - * @dps: List of datapaths to enable dumping them all out. - * Protected by genl_mutex. - */ -struct ovs_net { - struct list_head dps; -}; - -static int ovs_net_id __read_mostly; #define REHASH_FLOW_INTERVAL (10 * 60 * HZ) static void rehash_flow_table(struct work_struct *work); static DECLARE_DELAYED_WORK(rehash_flow_wq, rehash_flow_table); +int ovs_net_id __read_mostly; + static void ovs_notify(struct sk_buff *skb, struct genl_info *info, struct genl_multicast_group *grp) { @@ -81,20 +74,42 @@ static void ovs_notify(struct sk_buff *skb, struct genl_info *info, /** * DOC: Locking: * - * Writes to device state (add/remove datapath, port, set operations on vports, - * etc.) are protected by RTNL. - * - * Writes to other state (flow table modifications, set miscellaneous datapath - * parameters, etc.) are protected by genl_mutex. The RTNL lock nests inside - * genl_mutex. + * All writes e.g. Writes to device state (add/remove datapath, port, set + * operations on vports, etc.), Writes to other state (flow table + * modifications, set miscellaneous datapath parameters, etc.) are protected + * by ovs_lock. * * Reads are protected by RCU. * * There are a few special cases (mostly stats) that have their own * synchronization but they nest under all of above and don't interact with * each other. + * + * The RTNL lock nests inside ovs_mutex. */ +static DEFINE_MUTEX(ovs_mutex); + +void ovs_lock(void) +{ + mutex_lock(&ovs_mutex); +} + +void ovs_unlock(void) +{ + mutex_unlock(&ovs_mutex); +} + +#ifdef CONFIG_LOCKDEP +int lockdep_ovsl_is_held(void) +{ + if (debug_locks) + return lockdep_is_held(&ovs_mutex); + else + return 1; +} +#endif + static struct vport *new_vport(const struct vport_parms *); static int queue_gso_packets(struct net *, int dp_ifindex, struct sk_buff *, const struct dp_upcall_info *); @@ -102,7 +117,7 @@ static int queue_userspace_packet(struct net *, int dp_ifindex, struct sk_buff *, const struct dp_upcall_info *); -/* Must be called with rcu_read_lock, genl_mutex, or RTNL lock. */ +/* Must be called with rcu_read_lock or ovs_mutex. */ static struct datapath *get_dp(struct net *net, int dp_ifindex) { struct datapath *dp = NULL; @@ -120,10 +135,10 @@ static struct datapath *get_dp(struct net *net, int dp_ifindex) return dp; } -/* Must be called with rcu_read_lock or RTNL lock. */ +/* Must be called with rcu_read_lock or ovs_mutex. */ const char *ovs_dp_name(const struct datapath *dp) { - struct vport *vport = ovs_vport_rtnl_rcu(dp, OVSP_LOCAL); + struct vport *vport = ovs_vport_ovsl_rcu(dp, OVSP_LOCAL); return vport->ops->get_name(vport); } @@ -175,7 +190,7 @@ struct vport *ovs_lookup_vport(const struct datapath *dp, u16 port_no) return NULL; } -/* Called with RTNL lock and genl_lock. */ +/* Called with ovs_mutex. */ static struct vport *new_vport(const struct vport_parms *parms) { struct vport *vport; @@ -187,14 +202,12 @@ static struct vport *new_vport(const struct vport_parms *parms) hlist_add_head_rcu(&vport->dp_hash_node, head); } - return vport; } -/* Called with RTNL lock. */ void ovs_dp_detach_port(struct vport *p) { - ASSERT_RTNL(); + ASSERT_OVSL(); /* First drop references to device. */ hlist_del_rcu(&p->dp_hash_node); @@ -432,13 +445,13 @@ out: return err; } -/* Called with genl_mutex. */ +/* Called with ovs_mutex. */ static int flush_flows(struct datapath *dp) { struct flow_table *old_table; struct flow_table *new_table; - old_table = genl_dereference(dp->table); + old_table = ovsl_dereference(dp->table); new_table = ovs_flow_tbl_alloc(TBL_MIN_BUCKETS); if (!new_table) return -ENOMEM; @@ -788,7 +801,7 @@ static struct genl_ops dp_packet_genl_ops[] = { static void get_dp_stats(struct datapath *dp, struct ovs_dp_stats *stats) { int i; - struct flow_table *table = genl_dereference(dp->table); + struct flow_table *table = ovsl_dereference(dp->table); stats->n_flows = ovs_flow_tbl_count(table); @@ -840,7 +853,7 @@ static size_t ovs_flow_cmd_msg_size(const struct sw_flow_actions *acts) + nla_total_size(acts->actions_len); /* OVS_FLOW_ATTR_ACTIONS */ } -/* Called with genl_lock. */ +/* Called with ovs_mutex. */ static int ovs_flow_cmd_fill_info(struct sw_flow *flow, struct datapath *dp, struct sk_buff *skb, u32 portid, u32 seq, u32 flags, u8 cmd) @@ -854,8 +867,7 @@ static int ovs_flow_cmd_fill_info(struct sw_flow *flow, struct datapath *dp, u8 tcp_flags; int err; - sf_acts = rcu_dereference_protected(flow->sf_acts, - lockdep_genl_is_held()); + sf_acts = ovsl_dereference(flow->sf_acts); ovs_header = genlmsg_put(skb, portid, seq, &dp_flow_genl_family, flags, cmd); if (!ovs_header) @@ -919,8 +931,7 @@ static struct sk_buff *ovs_flow_cmd_alloc_info(struct sw_flow *flow) { const struct sw_flow_actions *sf_acts; - sf_acts = rcu_dereference_protected(flow->sf_acts, - lockdep_genl_is_held()); + sf_acts = ovsl_dereference(flow->sf_acts); return genlmsg_new(ovs_flow_cmd_msg_size(sf_acts), GFP_KERNEL); } @@ -971,12 +982,13 @@ static int ovs_flow_cmd_new_or_set(struct sk_buff *skb, struct genl_info *info) goto error; } + ovs_lock(); dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex); error = -ENODEV; if (!dp) - goto error; + goto err_unlock_ovs; - table = genl_dereference(dp->table); + table = ovsl_dereference(dp->table); flow = ovs_flow_tbl_lookup(table, &key, key_len); if (!flow) { struct sw_flow_actions *acts; @@ -984,7 +996,7 @@ static int ovs_flow_cmd_new_or_set(struct sk_buff *skb, struct genl_info *info) /* Bail out if we're not allowed to create a new flow. */ error = -ENOENT; if (info->genlhdr->cmd == OVS_FLOW_CMD_SET) - goto error; + goto err_unlock_ovs; /* Expand table, if necessary, to make room. */ if (ovs_flow_tbl_need_to_expand(table)) { @@ -994,7 +1006,7 @@ static int ovs_flow_cmd_new_or_set(struct sk_buff *skb, struct genl_info *info) if (!IS_ERR(new_table)) { rcu_assign_pointer(dp->table, new_table); ovs_flow_tbl_deferred_destroy(table); - table = genl_dereference(dp->table); + table = ovsl_dereference(dp->table); } } @@ -1002,7 +1014,7 @@ static int ovs_flow_cmd_new_or_set(struct sk_buff *skb, struct genl_info *info) flow = ovs_flow_alloc(); if (IS_ERR(flow)) { error = PTR_ERR(flow); - goto error; + goto err_unlock_ovs; } flow->key = key; clear_stats(flow); @@ -1035,11 +1047,10 @@ static int ovs_flow_cmd_new_or_set(struct sk_buff *skb, struct genl_info *info) error = -EEXIST; if (info->genlhdr->cmd == OVS_FLOW_CMD_NEW && info->nlhdr->nlmsg_flags & (NLM_F_CREATE | NLM_F_EXCL)) - goto error; + goto err_unlock_ovs; /* Update actions. */ - old_acts = rcu_dereference_protected(flow->sf_acts, - lockdep_genl_is_held()); + old_acts = ovsl_dereference(flow->sf_acts); acts_attrs = a[OVS_FLOW_ATTR_ACTIONS]; if (acts_attrs && (old_acts->actions_len != nla_len(acts_attrs) || @@ -1050,7 +1061,7 @@ static int ovs_flow_cmd_new_or_set(struct sk_buff *skb, struct genl_info *info) new_acts = ovs_flow_actions_alloc(acts_attrs); error = PTR_ERR(new_acts); if (IS_ERR(new_acts)) - goto error; + goto err_unlock_ovs; rcu_assign_pointer(flow->sf_acts, new_acts); ovs_flow_deferred_free_acts(old_acts); @@ -1066,6 +1077,7 @@ static int ovs_flow_cmd_new_or_set(struct sk_buff *skb, struct genl_info *info) spin_unlock_bh(&flow->lock); } } + ovs_unlock(); if (!IS_ERR(reply)) ovs_notify(reply, info, &ovs_dp_flow_multicast_group); @@ -1076,6 +1088,8 @@ static int ovs_flow_cmd_new_or_set(struct sk_buff *skb, struct genl_info *info) error_free_flow: ovs_flow_free(flow); +err_unlock_ovs: + ovs_unlock(); error: return error; } @@ -1098,21 +1112,32 @@ static int ovs_flow_cmd_get(struct sk_buff *skb, struct genl_info *info) if (err) return err; + ovs_lock(); dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex); - if (!dp) - return -ENODEV; + if (!dp) { + err = -ENODEV; + goto unlock; + } - table = genl_dereference(dp->table); + table = ovsl_dereference(dp->table); flow = ovs_flow_tbl_lookup(table, &key, key_len); - if (!flow) - return -ENOENT; + if (!flow) { + err = -ENOENT; + goto unlock; + } reply = ovs_flow_cmd_build_info(flow, dp, info->snd_portid, info->snd_seq, OVS_FLOW_CMD_NEW); - if (IS_ERR(reply)) - return PTR_ERR(reply); + if (IS_ERR(reply)) { + err = PTR_ERR(reply); + goto unlock; + } + ovs_unlock(); return genlmsg_reply(reply, info); +unlock: + ovs_unlock(); + return err; } static int ovs_flow_cmd_del(struct sk_buff *skb, struct genl_info *info) @@ -1127,25 +1152,33 @@ static int ovs_flow_cmd_del(struct sk_buff *skb, struct genl_info *info) int err; int key_len; + ovs_lock(); dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex); - if (!dp) - return -ENODEV; - - if (!a[OVS_FLOW_ATTR_KEY]) - return flush_flows(dp); + if (!dp) { + err = -ENODEV; + goto unlock; + } + if (!a[OVS_FLOW_ATTR_KEY]) { + err = flush_flows(dp); + goto unlock; + } err = ovs_flow_from_nlattrs(&key, &key_len, a[OVS_FLOW_ATTR_KEY]); if (err) - return err; + goto unlock; - table = genl_dereference(dp->table); + table = ovsl_dereference(dp->table); flow = ovs_flow_tbl_lookup(table, &key, key_len); - if (!flow) - return -ENOENT; + if (!flow) { + err = -ENOENT; + goto unlock; + } reply = ovs_flow_cmd_alloc_info(flow); - if (!reply) - return -ENOMEM; + if (!reply) { + err = -ENOMEM; + goto unlock; + } ovs_flow_tbl_remove(table, flow); @@ -1154,9 +1187,13 @@ static int ovs_flow_cmd_del(struct sk_buff *skb, struct genl_info *info) BUG_ON(err < 0); ovs_flow_deferred_free(flow); + ovs_unlock(); ovs_notify(reply, info, &ovs_dp_flow_multicast_group); return 0; +unlock: + ovs_unlock(); + return err; } static int ovs_flow_cmd_dump(struct sk_buff *skb, struct netlink_callback *cb) @@ -1165,11 +1202,14 @@ static int ovs_flow_cmd_dump(struct sk_buff *skb, struct netlink_callback *cb) struct datapath *dp; struct flow_table *table; + ovs_lock(); dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex); - if (!dp) + if (!dp) { + ovs_unlock(); return -ENODEV; + } - table = genl_dereference(dp->table); + table = ovsl_dereference(dp->table); for (;;) { struct sw_flow *flow; @@ -1190,6 +1230,7 @@ static int ovs_flow_cmd_dump(struct sk_buff *skb, struct netlink_callback *cb) cb->args[0] = bucket; cb->args[1] = obj; } + ovs_unlock(); return skb->len; } @@ -1295,7 +1336,7 @@ static struct sk_buff *ovs_dp_cmd_build_info(struct datapath *dp, u32 portid, return skb; } -/* Called with genl_mutex and optionally with RTNL lock also. */ +/* Called with ovs_mutex. */ static struct datapath *lookup_datapath(struct net *net, struct ovs_header *ovs_header, struct nlattr *a[OVS_DP_ATTR_MAX + 1]) @@ -1329,12 +1370,12 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info) if (!a[OVS_DP_ATTR_NAME] || !a[OVS_DP_ATTR_UPCALL_PID]) goto err; - rtnl_lock(); + ovs_lock(); err = -ENOMEM; dp = kzalloc(sizeof(*dp), GFP_KERNEL); if (dp == NULL) - goto err_unlock_rtnl; + goto err_unlock_ovs; ovs_dp_set_net(dp, hold_net(sock_net(skb->sk))); @@ -1385,35 +1426,34 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info) ovs_net = net_generic(ovs_dp_get_net(dp), ovs_net_id); list_add_tail(&dp->list_node, &ovs_net->dps); - rtnl_unlock(); + + ovs_unlock(); ovs_notify(reply, info, &ovs_dp_datapath_multicast_group); return 0; err_destroy_local_port: - ovs_dp_detach_port(ovs_vport_rtnl(dp, OVSP_LOCAL)); + ovs_dp_detach_port(ovs_vport_ovsl(dp, OVSP_LOCAL)); err_destroy_ports_array: kfree(dp->ports); err_destroy_percpu: free_percpu(dp->stats_percpu); err_destroy_table: - ovs_flow_tbl_destroy(genl_dereference(dp->table)); + ovs_flow_tbl_destroy(ovsl_dereference(dp->table)); err_free_dp: release_net(ovs_dp_get_net(dp)); kfree(dp); -err_unlock_rtnl: - rtnl_unlock(); +err_unlock_ovs: + ovs_unlock(); err: return err; } -/* Called with genl_mutex. */ +/* Called with ovs_mutex. */ static void __dp_destroy(struct datapath *dp) { int i; - rtnl_lock(); - for (i = 0; i < DP_VPORT_HASH_BUCKETS; i++) { struct vport *vport; struct hlist_node *n; @@ -1424,14 +1464,11 @@ static void __dp_destroy(struct datapath *dp) } list_del(&dp->list_node); - ovs_dp_detach_port(ovs_vport_rtnl(dp, OVSP_LOCAL)); - /* rtnl_unlock() will wait until all the references to devices that - * are pending unregistration have been dropped. We do it here to - * ensure that any internal devices (which contain DP pointers) are - * fully destroyed before freeing the datapath. + /* OVSP_LOCAL is datapath internal port. We need to make sure that + * all port in datapath are destroyed first before freeing datapath. */ - rtnl_unlock(); + ovs_dp_detach_port(ovs_vport_ovsl(dp, OVSP_LOCAL)); call_rcu(&dp->rcu, destroy_dp_rcu); } @@ -1442,22 +1479,27 @@ static int ovs_dp_cmd_del(struct sk_buff *skb, struct genl_info *info) struct datapath *dp; int err; + ovs_lock(); dp = lookup_datapath(sock_net(skb->sk), info->userhdr, info->attrs); err = PTR_ERR(dp); if (IS_ERR(dp)) - return err; + goto unlock; reply = ovs_dp_cmd_build_info(dp, info->snd_portid, info->snd_seq, OVS_DP_CMD_DEL); err = PTR_ERR(reply); if (IS_ERR(reply)) - return err; + goto unlock; __dp_destroy(dp); + ovs_unlock(); ovs_notify(reply, info, &ovs_dp_datapath_multicast_group); return 0; +unlock: + ovs_unlock(); + return err; } static int ovs_dp_cmd_set(struct sk_buff *skb, struct genl_info *info) @@ -1466,9 +1508,11 @@ static int ovs_dp_cmd_set(struct sk_buff *skb, struct genl_info *info) struct datapath *dp; int err; + ovs_lock(); dp = lookup_datapath(sock_net(skb->sk), info->userhdr, info->attrs); + err = PTR_ERR(dp); if (IS_ERR(dp)) - return PTR_ERR(dp); + goto unlock; reply = ovs_dp_cmd_build_info(dp, info->snd_portid, info->snd_seq, OVS_DP_CMD_NEW); @@ -1476,29 +1520,45 @@ static int ovs_dp_cmd_set(struct sk_buff *skb, struct genl_info *info) err = PTR_ERR(reply); netlink_set_err(sock_net(skb->sk)->genl_sock, 0, ovs_dp_datapath_multicast_group.id, err); - return 0; + err = 0; + goto unlock; } + ovs_unlock(); ovs_notify(reply, info, &ovs_dp_datapath_multicast_group); return 0; +unlock: + ovs_unlock(); + return err; } static int ovs_dp_cmd_get(struct sk_buff *skb, struct genl_info *info) { struct sk_buff *reply; struct datapath *dp; + int err; + ovs_lock(); dp = lookup_datapath(sock_net(skb->sk), info->userhdr, info->attrs); - if (IS_ERR(dp)) - return PTR_ERR(dp); + if (IS_ERR(dp)) { + err = PTR_ERR(dp); + goto unlock; + } reply = ovs_dp_cmd_build_info(dp, info->snd_portid, info->snd_seq, OVS_DP_CMD_NEW); - if (IS_ERR(reply)) - return PTR_ERR(reply); + if (IS_ERR(reply)) { + err = PTR_ERR(reply); + goto unlock; + } + ovs_unlock(); return genlmsg_reply(reply, info); + +unlock: + ovs_unlock(); + return err; } static int ovs_dp_cmd_dump(struct sk_buff *skb, struct netlink_callback *cb) @@ -1508,6 +1568,7 @@ static int ovs_dp_cmd_dump(struct sk_buff *skb, struct netlink_callback *cb) int skip = cb->args[0]; int i = 0; + ovs_lock(); list_for_each_entry(dp, &ovs_net->dps, list_node) { if (i >= skip && ovs_dp_cmd_fill_info(dp, skb, NETLINK_CB(cb->skb).portid, @@ -1516,6 +1577,7 @@ static int ovs_dp_cmd_dump(struct sk_buff *skb, struct netlink_callback *cb) break; i++; } + ovs_unlock(); cb->args[0] = i; @@ -1568,7 +1630,7 @@ struct genl_multicast_group ovs_dp_vport_multicast_group = { .name = OVS_VPORT_MCGROUP }; -/* Called with RTNL lock or RCU read lock. */ +/* Called with ovs_mutex or RCU read lock. */ static int ovs_vport_cmd_fill_info(struct vport *vport, struct sk_buff *skb, u32 portid, u32 seq, u32 flags, u8 cmd) { @@ -1607,7 +1669,7 @@ error: return err; } -/* Called with RTNL lock or RCU read lock. */ +/* Called with ovs_mutex or RCU read lock. */ struct sk_buff *ovs_vport_cmd_build_info(struct vport *vport, u32 portid, u32 seq, u8 cmd) { @@ -1626,7 +1688,7 @@ struct sk_buff *ovs_vport_cmd_build_info(struct vport *vport, u32 portid, return skb; } -/* Called with RTNL lock or RCU read lock. */ +/* Called with ovs_mutex or RCU read lock. */ static struct vport *lookup_vport(struct net *net, struct ovs_header *ovs_header, struct nlattr *a[OVS_VPORT_ATTR_MAX + 1]) @@ -1652,7 +1714,7 @@ static struct vport *lookup_vport(struct net *net, if (!dp) return ERR_PTR(-ENODEV); - vport = ovs_vport_rtnl_rcu(dp, port_no); + vport = ovs_vport_ovsl_rcu(dp, port_no); if (!vport) return ERR_PTR(-ENODEV); return vport; @@ -1676,7 +1738,7 @@ static int ovs_vport_cmd_new(struct sk_buff *skb, struct genl_info *info) !a[OVS_VPORT_ATTR_UPCALL_PID]) goto exit; - rtnl_lock(); + ovs_lock(); dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex); err = -ENODEV; if (!dp) @@ -1689,7 +1751,7 @@ static int ovs_vport_cmd_new(struct sk_buff *skb, struct genl_info *info) if (port_no >= DP_MAX_PORTS) goto exit_unlock; - vport = ovs_vport_rtnl_rcu(dp, port_no); + vport = ovs_vport_ovsl(dp, port_no); err = -EBUSY; if (vport) goto exit_unlock; @@ -1699,7 +1761,7 @@ static int ovs_vport_cmd_new(struct sk_buff *skb, struct genl_info *info) err = -EFBIG; goto exit_unlock; } - vport = ovs_vport_rtnl(dp, port_no); + vport = ovs_vport_ovsl(dp, port_no); if (!vport) break; } @@ -1729,7 +1791,7 @@ static int ovs_vport_cmd_new(struct sk_buff *skb, struct genl_info *info) ovs_notify(reply, info, &ovs_dp_vport_multicast_group); exit_unlock: - rtnl_unlock(); + ovs_unlock(); exit: return err; } @@ -1741,7 +1803,7 @@ static int ovs_vport_cmd_set(struct sk_buff *skb, struct genl_info *info) struct vport *vport; int err; - rtnl_lock(); + ovs_lock(); vport = lookup_vport(sock_net(skb->sk), info->userhdr, a); err = PTR_ERR(vport); if (IS_ERR(vport)) @@ -1767,10 +1829,12 @@ static int ovs_vport_cmd_set(struct sk_buff *skb, struct genl_info *info) goto exit_unlock; } + ovs_unlock(); ovs_notify(reply, info, &ovs_dp_vport_multicast_group); + return 0; exit_unlock: - rtnl_unlock(); + ovs_unlock(); return err; } @@ -1781,7 +1845,7 @@ static int ovs_vport_cmd_del(struct sk_buff *skb, struct genl_info *info) struct vport *vport; int err; - rtnl_lock(); + ovs_lock(); vport = lookup_vport(sock_net(skb->sk), info->userhdr, a); err = PTR_ERR(vport); if (IS_ERR(vport)) @@ -1804,7 +1868,7 @@ static int ovs_vport_cmd_del(struct sk_buff *skb, struct genl_info *info) ovs_notify(reply, info, &ovs_dp_vport_multicast_group); exit_unlock: - rtnl_unlock(); + ovs_unlock(); return err; } @@ -1964,13 +2028,13 @@ static void rehash_flow_table(struct work_struct *work) struct datapath *dp; struct net *net; - genl_lock(); + ovs_lock(); rtnl_lock(); for_each_net(net) { struct ovs_net *ovs_net = net_generic(net, ovs_net_id); list_for_each_entry(dp, &ovs_net->dps, list_node) { - struct flow_table *old_table = genl_dereference(dp->table); + struct flow_table *old_table = ovsl_dereference(dp->table); struct flow_table *new_table; new_table = ovs_flow_tbl_rehash(old_table); @@ -1981,8 +2045,7 @@ static void rehash_flow_table(struct work_struct *work) } } rtnl_unlock(); - genl_unlock(); - + ovs_unlock(); schedule_delayed_work(&rehash_flow_wq, REHASH_FLOW_INTERVAL); } @@ -1991,18 +2054,21 @@ static int __net_init ovs_init_net(struct net *net) struct ovs_net *ovs_net = net_generic(net, ovs_net_id); INIT_LIST_HEAD(&ovs_net->dps); + INIT_WORK(&ovs_net->dp_notify_work, ovs_dp_notify_wq); return 0; } static void __net_exit ovs_exit_net(struct net *net) { - struct ovs_net *ovs_net = net_generic(net, ovs_net_id); struct datapath *dp, *dp_next; + struct ovs_net *ovs_net = net_generic(net, ovs_net_id); - genl_lock(); + ovs_lock(); list_for_each_entry_safe(dp, dp_next, &ovs_net->dps, list_node) __dp_destroy(dp); - genl_unlock(); + ovs_unlock(); + + cancel_work_sync(&ovs_net->dp_notify_work); } static struct pernet_operations ovs_net_ops = { diff --git a/net/openvswitch/datapath.h b/net/openvswitch/datapath.h index 655beb1..16b8406 100644 --- a/net/openvswitch/datapath.h +++ b/net/openvswitch/datapath.h @@ -57,9 +57,9 @@ struct dp_stats_percpu { * struct datapath - datapath for flow-based packet switching * @rcu: RCU callback head for deferred destruction. * @list_node: Element in global 'dps' list. - * @table: Current flow table. Protected by genl_lock and RCU. + * @table: Current flow table. Protected by ovs_mutex and RCU. * @ports: Hash table for ports. %OVSP_LOCAL port always exists. Protected by - * RTNL and RCU. + * ovs_mutex and RCU. * @stats_percpu: Per-CPU datapath statistics. * @net: Reference to net namespace. * @@ -85,26 +85,6 @@ struct datapath { #endif }; -struct vport *ovs_lookup_vport(const struct datapath *dp, u16 port_no); - -static inline struct vport *ovs_vport_rcu(const struct datapath *dp, int port_no) -{ - WARN_ON_ONCE(!rcu_read_lock_held()); - return ovs_lookup_vport(dp, port_no); -} - -static inline struct vport *ovs_vport_rtnl_rcu(const struct datapath *dp, int port_no) -{ - WARN_ON_ONCE(!rcu_read_lock_held() && !rtnl_is_locked()); - return ovs_lookup_vport(dp, port_no); -} - -static inline struct vport *ovs_vport_rtnl(const struct datapath *dp, int port_no) -{ - ASSERT_RTNL(); - return ovs_lookup_vport(dp, port_no); -} - /** * struct ovs_skb_cb - OVS data in skb CB * @flow: The flow associated with this packet. May be %NULL if no flow. @@ -131,6 +111,30 @@ struct dp_upcall_info { u32 portid; }; +/** + * struct ovs_net - Per net-namespace data for ovs. + * @dps: List of datapaths to enable dumping them all out. + * Protected by genl_mutex. + */ +struct ovs_net { + struct list_head dps; + struct work_struct dp_notify_work; +}; + +extern int ovs_net_id; +void ovs_lock(void); +void ovs_unlock(void); + +#ifdef CONFIG_LOCKDEP +int lockdep_ovsl_is_held(void); +#else +#define lockdep_ovsl_is_held() 1 +#endif + +#define ASSERT_OVSL() WARN_ON(unlikely(!lockdep_ovsl_is_held())) +#define ovsl_dereference(p) \ + rcu_dereference_protected(p, lockdep_ovsl_is_held()) + static inline struct net *ovs_dp_get_net(struct datapath *dp) { return read_pnet(&dp->net); @@ -141,6 +145,26 @@ static inline void ovs_dp_set_net(struct datapath *dp, struct net *net) write_pnet(&dp->net, net); } +struct vport *ovs_lookup_vport(const struct datapath *dp, u16 port_no); + +static inline struct vport *ovs_vport_rcu(const struct datapath *dp, int port_no) +{ + WARN_ON_ONCE(!rcu_read_lock_held()); + return ovs_lookup_vport(dp, port_no); +} + +static inline struct vport *ovs_vport_ovsl_rcu(const struct datapath *dp, int port_no) +{ + WARN_ON_ONCE(!rcu_read_lock_held() && !lockdep_ovsl_is_held()); + return ovs_lookup_vport(dp, port_no); +} + +static inline struct vport *ovs_vport_ovsl(const struct datapath *dp, int port_no) +{ + ASSERT_OVSL(); + return ovs_lookup_vport(dp, port_no); +} + extern struct notifier_block ovs_dp_device_notifier; extern struct genl_multicast_group ovs_dp_vport_multicast_group; @@ -154,4 +178,5 @@ struct sk_buff *ovs_vport_cmd_build_info(struct vport *, u32 pid, u32 seq, u8 cmd); int ovs_execute_actions(struct datapath *dp, struct sk_buff *skb); +void ovs_dp_notify_wq(struct work_struct *work); #endif /* datapath.h */ diff --git a/net/openvswitch/dp_notify.c b/net/openvswitch/dp_notify.c index 5558350..ef4feec 100644 --- a/net/openvswitch/dp_notify.c +++ b/net/openvswitch/dp_notify.c @@ -18,46 +18,78 @@ #include <linux/netdevice.h> #include <net/genetlink.h> +#include <net/netns/generic.h> #include "datapath.h" #include "vport-internal_dev.h" #include "vport-netdev.h" +static void dp_detach_port_notify(struct vport *vport) +{ + struct sk_buff *notify; + struct datapath *dp; + + dp = vport->dp; + notify = ovs_vport_cmd_build_info(vport, 0, 0, + OVS_VPORT_CMD_DEL); + ovs_dp_detach_port(vport); + if (IS_ERR(notify)) { + netlink_set_err(ovs_dp_get_net(dp)->genl_sock, 0, + ovs_dp_vport_multicast_group.id, + PTR_ERR(notify)); + return; + } + + genlmsg_multicast_netns(ovs_dp_get_net(dp), notify, 0, + ovs_dp_vport_multicast_group.id, + GFP_KERNEL); +} + +void ovs_dp_notify_wq(struct work_struct *work) +{ + struct ovs_net *ovs_net = container_of(work, struct ovs_net, dp_notify_work); + struct datapath *dp; + + ovs_lock(); + list_for_each_entry(dp, &ovs_net->dps, list_node) { + int i; + + for (i = 0; i < DP_VPORT_HASH_BUCKETS; i++) { + struct vport *vport; + struct hlist_node *n; + + hlist_for_each_entry_safe(vport, n, &dp->ports[i], dp_hash_node) { + struct netdev_vport *netdev_vport; + + if (vport->ops->type != OVS_VPORT_TYPE_NETDEV) + continue; + + netdev_vport = netdev_vport_priv(vport); + if (netdev_vport->dev->reg_state == NETREG_UNREGISTERED || + netdev_vport->dev->reg_state == NETREG_UNREGISTERING) + dp_detach_port_notify(vport); + } + } + } + ovs_unlock(); +} + static int dp_device_event(struct notifier_block *unused, unsigned long event, void *ptr) { + struct ovs_net *ovs_net; struct net_device *dev = ptr; - struct vport *vport; + struct vport *vport = NULL; - if (ovs_is_internal_dev(dev)) - vport = ovs_internal_dev_get_vport(dev); - else + if (!ovs_is_internal_dev(dev)) vport = ovs_netdev_get_vport(dev); if (!vport) return NOTIFY_DONE; - switch (event) { - case NETDEV_UNREGISTER: - if (!ovs_is_internal_dev(dev)) { - struct sk_buff *notify; - struct datapath *dp = vport->dp; - - notify = ovs_vport_cmd_build_info(vport, 0, 0, - OVS_VPORT_CMD_DEL); - ovs_dp_detach_port(vport); - if (IS_ERR(notify)) { - netlink_set_err(ovs_dp_get_net(dp)->genl_sock, 0, - ovs_dp_vport_multicast_group.id, - PTR_ERR(notify)); - break; - } - - genlmsg_multicast_netns(ovs_dp_get_net(dp), notify, 0, - ovs_dp_vport_multicast_group.id, - GFP_KERNEL); - } - break; + if (event == NETDEV_UNREGISTER) { + ovs_net = net_generic(dev_net(dev), ovs_net_id); + queue_work(system_wq, &ovs_net->dp_notify_work); } return NOTIFY_DONE; diff --git a/net/openvswitch/vport-internal_dev.c b/net/openvswitch/vport-internal_dev.c index 40f8a24..9604760 100644 --- a/net/openvswitch/vport-internal_dev.c +++ b/net/openvswitch/vport-internal_dev.c @@ -173,16 +173,19 @@ static struct vport *internal_dev_create(const struct vport_parms *parms) if (vport->port_no == OVSP_LOCAL) netdev_vport->dev->features |= NETIF_F_NETNS_LOCAL; + rtnl_lock(); err = register_netdevice(netdev_vport->dev); if (err) goto error_free_netdev; dev_set_promiscuity(netdev_vport->dev, 1); + rtnl_unlock(); netif_start_queue(netdev_vport->dev); return vport; error_free_netdev: + rtnl_unlock(); free_netdev(netdev_vport->dev); error_free_vport: ovs_vport_free(vport); @@ -195,10 +198,13 @@ static void internal_dev_destroy(struct vport *vport) struct netdev_vport *netdev_vport = netdev_vport_priv(vport); netif_stop_queue(netdev_vport->dev); + rtnl_lock(); dev_set_promiscuity(netdev_vport->dev, -1); /* unregister_netdevice() waits for an RCU grace period. */ unregister_netdevice(netdev_vport->dev); + + rtnl_unlock(); } static int internal_dev_recv(struct vport *vport, struct sk_buff *skb) diff --git a/net/openvswitch/vport-netdev.c b/net/openvswitch/vport-netdev.c index 2130d61..40a89ae 100644 --- a/net/openvswitch/vport-netdev.c +++ b/net/openvswitch/vport-netdev.c @@ -100,16 +100,20 @@ static struct vport *netdev_create(const struct vport_parms *parms) goto error_put; } + rtnl_lock(); err = netdev_rx_handler_register(netdev_vport->dev, netdev_frame_hook, vport); if (err) - goto error_put; + goto error_unlock; dev_set_promiscuity(netdev_vport->dev, 1); netdev_vport->dev->priv_flags |= IFF_OVS_DATAPATH; + rtnl_unlock(); return vport; +error_unlock: + rtnl_unlock(); error_put: dev_put(netdev_vport->dev); error_free_vport: @@ -131,9 +135,11 @@ static void netdev_destroy(struct vport *vport) { struct netdev_vport *netdev_vport = netdev_vport_priv(vport); + rtnl_lock(); netdev_vport->dev->priv_flags &= ~IFF_OVS_DATAPATH; netdev_rx_handler_unregister(netdev_vport->dev); dev_set_promiscuity(netdev_vport->dev, -1); + rtnl_unlock(); call_rcu(&netdev_vport->rcu, free_port_rcu); } diff --git a/net/openvswitch/vport.c b/net/openvswitch/vport.c index 71a2de8..c90d856 100644 --- a/net/openvswitch/vport.c +++ b/net/openvswitch/vport.c @@ -40,7 +40,7 @@ static const struct vport_ops *vport_ops_list[] = { &ovs_internal_vport_ops, }; -/* Protected by RCU read lock for reading, RTNL lock for writing. */ +/* Protected by RCU read lock for reading, ovs_mutex for writing. */ static struct hlist_head *dev_table; #define VPORT_HASH_BUCKETS 1024 @@ -80,7 +80,7 @@ static struct hlist_head *hash_bucket(struct net *net, const char *name) * * @name: name of port to find * - * Must be called with RTNL or RCU read lock. + * Must be called with ovs or RCU read lock. */ struct vport *ovs_vport_locate(struct net *net, const char *name) { @@ -161,7 +161,7 @@ void ovs_vport_free(struct vport *vport) * @parms: Information about new vport. * * Creates a new vport with the specified configuration (which is dependent on - * device type). RTNL lock must be held. + * device type). ovs_mutex must be held. */ struct vport *ovs_vport_add(const struct vport_parms *parms) { @@ -169,8 +169,6 @@ struct vport *ovs_vport_add(const struct vport_parms *parms) int err = 0; int i; - ASSERT_RTNL(); - for (i = 0; i < ARRAY_SIZE(vport_ops_list); i++) { if (vport_ops_list[i]->type == parms->type) { struct hlist_head *bucket; @@ -201,12 +199,10 @@ out: * @port: New configuration. * * Modifies an existing device with the specified configuration (which is - * dependent on device type). RTNL lock must be held. + * dependent on device type). ovs_mutex must be held. */ int ovs_vport_set_options(struct vport *vport, struct nlattr *options) { - ASSERT_RTNL(); - if (!vport->ops->set_options) return -EOPNOTSUPP; return vport->ops->set_options(vport, options); @@ -218,11 +214,11 @@ int ovs_vport_set_options(struct vport *vport, struct nlattr *options) * @vport: vport to delete. * * Detaches @vport from its datapath and destroys it. It is possible to fail - * for reasons such as lack of memory. RTNL lock must be held. + * for reasons such as lack of memory. ovs_mutex must be held. */ void ovs_vport_del(struct vport *vport) { - ASSERT_RTNL(); + ASSERT_OVSL(); hlist_del_rcu(&vport->hash_node); @@ -237,7 +233,7 @@ void ovs_vport_del(struct vport *vport) * * Retrieves transmit, receive, and error stats for the given device. * - * Must be called with RTNL lock or rcu_read_lock. + * Must be called with ovs_mutex or rcu_read_lock. */ void ovs_vport_get_stats(struct vport *vport, struct ovs_vport_stats *stats) { @@ -296,7 +292,7 @@ void ovs_vport_get_stats(struct vport *vport, struct ovs_vport_stats *stats) * negative error code if a real error occurred. If an error occurs, @skb is * left unmodified. * - * Must be called with RTNL lock or rcu_read_lock. + * Must be called with ovs_mutex or rcu_read_lock. */ int ovs_vport_get_options(const struct vport *vport, struct sk_buff *skb) { @@ -348,7 +344,7 @@ void ovs_vport_receive(struct vport *vport, struct sk_buff *skb) * @vport: vport on which to send the packet * @skb: skb to send * - * Sends the given packet and returns the length of data sent. Either RTNL + * Sends the given packet and returns the length of data sent. Either ovs * lock or rcu_read_lock must be held. */ int ovs_vport_send(struct vport *vport, struct sk_buff *skb) diff --git a/net/openvswitch/vport.h b/net/openvswitch/vport.h index aee7d43..7282b84 100644 --- a/net/openvswitch/vport.h +++ b/net/openvswitch/vport.h @@ -138,14 +138,14 @@ struct vport_parms { struct vport_ops { enum ovs_vport_type type; - /* Called with RTNL lock. */ + /* Called with ovs_mutex. */ struct vport *(*create)(const struct vport_parms *); void (*destroy)(struct vport *); int (*set_options)(struct vport *, struct nlattr *); int (*get_options)(const struct vport *, struct sk_buff *); - /* Called with rcu_read_lock or RTNL lock. */ + /* Called with rcu_read_lock or ovs_mutex. */ const char *(*get_name)(const struct vport *); void (*get_config)(const struct vport *, void *); int (*get_ifindex)(const struct vport *); -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* [PATCH net-next 10/10] openvswitch: Use generic struct pcpu_tstats. 2013-04-16 21:00 [GIT net-next] Open vSwitch Jesse Gross ` (6 preceding siblings ...) 2013-04-16 21:00 ` [PATCH net-next 09/10] openvswitch: Simplify datapath locking Jesse Gross @ 2013-04-16 21:00 ` Jesse Gross 2013-04-17 17:31 ` [GIT net-next] Open vSwitch David Miller 8 siblings, 0 replies; 54+ messages in thread From: Jesse Gross @ 2013-04-16 21:00 UTC (permalink / raw) To: David Miller; +Cc: netdev, dev, Pravin B Shelar, Jesse Gross From: Pravin B Shelar <pshelar@nicira.com> Rather than defining ovs specific stats struct (vport_percpu_stats), we can use existing pcpu_tstats to achieve exactly same functionality. Signed-off-by: Pravin B Shelar <pshelar@nicira.com> Signed-off-by: Jesse Gross <jesse@nicira.com> --- net/openvswitch/vport.c | 22 +++++++++++----------- net/openvswitch/vport.h | 11 ++--------- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/net/openvswitch/vport.c b/net/openvswitch/vport.c index c90d856..7206231 100644 --- a/net/openvswitch/vport.c +++ b/net/openvswitch/vport.c @@ -128,7 +128,7 @@ struct vport *ovs_vport_alloc(int priv_size, const struct vport_ops *ops, vport->ops = ops; INIT_HLIST_NODE(&vport->dp_hash_node); - vport->percpu_stats = alloc_percpu(struct vport_percpu_stats); + vport->percpu_stats = alloc_percpu(struct pcpu_tstats); if (!vport->percpu_stats) { kfree(vport); return ERR_PTR(-ENOMEM); @@ -260,16 +260,16 @@ void ovs_vport_get_stats(struct vport *vport, struct ovs_vport_stats *stats) spin_unlock_bh(&vport->stats_lock); for_each_possible_cpu(i) { - const struct vport_percpu_stats *percpu_stats; - struct vport_percpu_stats local_stats; + const struct pcpu_tstats *percpu_stats; + struct pcpu_tstats local_stats; unsigned int start; percpu_stats = per_cpu_ptr(vport->percpu_stats, i); do { - start = u64_stats_fetch_begin_bh(&percpu_stats->sync); + start = u64_stats_fetch_begin_bh(&percpu_stats->syncp); local_stats = *percpu_stats; - } while (u64_stats_fetch_retry_bh(&percpu_stats->sync, start)); + } while (u64_stats_fetch_retry_bh(&percpu_stats->syncp, start)); stats->rx_bytes += local_stats.rx_bytes; stats->rx_packets += local_stats.rx_packets; @@ -327,13 +327,13 @@ int ovs_vport_get_options(const struct vport *vport, struct sk_buff *skb) */ void ovs_vport_receive(struct vport *vport, struct sk_buff *skb) { - struct vport_percpu_stats *stats; + struct pcpu_tstats *stats; stats = this_cpu_ptr(vport->percpu_stats); - u64_stats_update_begin(&stats->sync); + u64_stats_update_begin(&stats->syncp); stats->rx_packets++; stats->rx_bytes += skb->len; - u64_stats_update_end(&stats->sync); + u64_stats_update_end(&stats->syncp); ovs_dp_process_received_packet(vport, skb); } @@ -352,14 +352,14 @@ int ovs_vport_send(struct vport *vport, struct sk_buff *skb) int sent = vport->ops->send(vport, skb); if (likely(sent)) { - struct vport_percpu_stats *stats; + struct pcpu_tstats *stats; stats = this_cpu_ptr(vport->percpu_stats); - u64_stats_update_begin(&stats->sync); + u64_stats_update_begin(&stats->syncp); stats->tx_packets++; stats->tx_bytes += sent; - u64_stats_update_end(&stats->sync); + u64_stats_update_end(&stats->syncp); } return sent; } diff --git a/net/openvswitch/vport.h b/net/openvswitch/vport.h index 7282b84..7ba08c3 100644 --- a/net/openvswitch/vport.h +++ b/net/openvswitch/vport.h @@ -19,6 +19,7 @@ #ifndef VPORT_H #define VPORT_H 1 +#include <linux/if_tunnel.h> #include <linux/list.h> #include <linux/netlink.h> #include <linux/openvswitch.h> @@ -50,14 +51,6 @@ int ovs_vport_send(struct vport *, struct sk_buff *); /* The following definitions are for implementers of vport devices: */ -struct vport_percpu_stats { - u64 rx_bytes; - u64 rx_packets; - u64 tx_bytes; - u64 tx_packets; - struct u64_stats_sync sync; -}; - struct vport_err_stats { u64 rx_dropped; u64 rx_errors; @@ -89,7 +82,7 @@ struct vport { struct hlist_node dp_hash_node; const struct vport_ops *ops; - struct vport_percpu_stats __percpu *percpu_stats; + struct pcpu_tstats __percpu *percpu_stats; spinlock_t stats_lock; struct vport_err_stats err_stats; -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* Re: [GIT net-next] Open vSwitch 2013-04-16 21:00 [GIT net-next] Open vSwitch Jesse Gross ` (7 preceding siblings ...) 2013-04-16 21:00 ` [PATCH net-next 10/10] openvswitch: Use generic struct pcpu_tstats Jesse Gross @ 2013-04-17 17:31 ` David Miller 8 siblings, 0 replies; 54+ messages in thread From: David Miller @ 2013-04-17 17:31 UTC (permalink / raw) To: jesse; +Cc: netdev, dev From: Jesse Gross <jesse@nicira.com> Date: Tue, 16 Apr 2013 14:00:09 -0700 > A number of improvements for net-next/3.10. > > Highlights include: > * Properly exposing linux/openvswitch.h to userspace after the uapi changes. > * Simplification of locking. It immediately makes things simpler to reason about and avoids holding RTNL mutex for longer than necessary. In the near future it will also enable tunnel registration and more fine-grained locking. > * Miscellaneous cleanups and simplifications. Pulled, but please don't make your email look so silly with those 500 character long lines, make them not exceed 80 columns. Thanks. ^ permalink raw reply [flat|nested] 54+ messages in thread
* [GIT net-next] Open vSwitch @ 2014-11-10 3:58 Pravin B Shelar 2014-11-11 18:34 ` David Miller 0 siblings, 1 reply; 54+ messages in thread From: Pravin B Shelar @ 2014-11-10 3:58 UTC (permalink / raw) To: davem; +Cc: netdev Following batch of patches brings feature parity between upstream ovs and out of tree ovs module. Two features are added, first adds support to export egress tunnel information for a packet. This is used to improve visibility in network traffic. Second feature allows userspace vswitchd process to probe ovs module features. Other patches are optimization and code cleanup. ---------------------------------------------------------------- The following changes since commit c0560b9c523341516eabf0f3b51832256caa7bbb: dccp: Convert DCCP_WARN to net_warn_ratelimited (2014-11-08 21:22:54 -0500) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/pshelar/openvswitch.git net_next_ovs for you to fetch changes up to 05da5898a96c05e32aa9850c9cd89eef29471b13: openvswitch: Add support for OVS_FLOW_ATTR_PROBE. (2014-11-09 18:58:44 -0800) ---------------------------------------------------------------- Jarno Rajahalme (1): openvswitch: Add support for OVS_FLOW_ATTR_PROBE. Pravin B Shelar (3): openvswitch: Export symbols as GPL symbols. openvswitch: Optimize recirc action. openvswitch: Remove redundant key ref from upcall_info. Thomas Graf (1): openvswitch: Constify various function arguments Wenyu Zhang (1): openvswitch: Extend packet attribute for egress tunnel info include/uapi/linux/openvswitch.h | 15 ++ net/openvswitch/actions.c | 180 ++++++++++++++------ net/openvswitch/datapath.c | 129 ++++++++------ net/openvswitch/datapath.h | 22 +-- net/openvswitch/flow.c | 8 +- net/openvswitch/flow.h | 71 ++++++-- net/openvswitch/flow_netlink.c | 357 +++++++++++++++++++++++---------------- net/openvswitch/flow_netlink.h | 13 +- net/openvswitch/flow_table.c | 12 +- net/openvswitch/flow_table.h | 8 +- net/openvswitch/vport-geneve.c | 23 ++- net/openvswitch/vport-gre.c | 12 +- net/openvswitch/vport-netdev.c | 2 +- net/openvswitch/vport-vxlan.c | 24 ++- net/openvswitch/vport.c | 81 +++++++-- net/openvswitch/vport.h | 20 ++- 16 files changed, 664 insertions(+), 313 deletions(-) ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [GIT net-next] Open vSwitch 2014-11-10 3:58 Pravin B Shelar @ 2014-11-11 18:34 ` David Miller 0 siblings, 0 replies; 54+ messages in thread From: David Miller @ 2014-11-11 18:34 UTC (permalink / raw) To: pshelar; +Cc: netdev From: Pravin B Shelar <pshelar@nicira.com> Date: Sun, 9 Nov 2014 19:58:59 -0800 > Following batch of patches brings feature parity between upstream > ovs and out of tree ovs module. > > Two features are added, first adds support to export egress > tunnel information for a packet. This is used to improve > visibility in network traffic. Second feature allows userspace > vswitchd process to probe ovs module features. Other patches > are optimization and code cleanup. Pulled, thanks Pravin. ^ permalink raw reply [flat|nested] 54+ messages in thread
* [GIT net-next] Open vSwitch @ 2014-11-04 6:00 Pravin B Shelar 2014-11-05 20:10 ` David Miller 0 siblings, 1 reply; 54+ messages in thread From: Pravin B Shelar @ 2014-11-04 6:00 UTC (permalink / raw) To: davem; +Cc: netdev First two patches are related to OVS MPLS support. Rest of patches are various refactoring and minor improvements to openvswitch. ---------------------------------------------------------------- The following changes since commit 30349bdbc4da5ecf0efa25556e3caff9c9b8c5f7: net: phy: spi_ks8995: remove sysfs bin file by registered attribute (2014-11-04 17:18:45 -0500) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/pshelar/openvswitch.git net_next_ovs for you to fetch changes up to fb90c8d8d5169d4dfbe5896721367e1904638a91: openvswitch: Avoid NULL mask check while building mask (2014-11-04 22:20:33 -0800) ---------------------------------------------------------------- Andy Zhou (2): openvswitch: refactor do_output() to move NULL check out of fast path openvswitch: Refactor get_dp() function into multiple access APIs. Chunhe Li (1): openvswitch: Drop packets when interdev is not up Jarno Rajahalme (1): openvswitch: Fix the type of struct ovs_key_nd nd_target field. Jesse Gross (1): openvswitch: Additional logging for -EINVAL on flow setups. Joe Stringer (3): openvswitch: Remove redundant tcp_flags code. openvswitch: Refactor ovs_flow_cmd_fill_info(). openvswitch: Move key_attr_size() to flow_netlink.h. Lorand Jakab (1): openvswitch: Remove flow member from struct ovs_skb_cb Pravin B Shelar (4): net: Remove MPLS GSO feature. openvswitch: Move table destroy to dp-rcu callback. openvswitch: Refactor action alloc and copy api. openvswitch: Avoid NULL mask check while building mask Simon Horman (1): openvswitch: Add basic MPLS support to kernel include/linux/netdev_features.h | 7 +- include/linux/netdevice.h | 1 - include/linux/skbuff.h | 3 - include/net/mpls.h | 39 +++++ include/uapi/linux/openvswitch.h | 38 ++++- net/core/dev.c | 3 +- net/core/ethtool.c | 1 - net/ipv4/af_inet.c | 1 - net/ipv4/tcp_offload.c | 1 - net/ipv4/udp_offload.c | 3 +- net/ipv6/ip6_offload.c | 1 - net/ipv6/udp_offload.c | 3 +- net/mpls/mpls_gso.c | 3 +- net/openvswitch/Kconfig | 1 + net/openvswitch/actions.c | 136 ++++++++++++--- net/openvswitch/datapath.c | 215 ++++++++++++----------- net/openvswitch/datapath.h | 4 +- net/openvswitch/flow.c | 30 ++++ net/openvswitch/flow.h | 17 +- net/openvswitch/flow_netlink.c | 322 +++++++++++++++++++++++++---------- net/openvswitch/flow_netlink.h | 5 +- net/openvswitch/flow_table.c | 11 +- net/openvswitch/flow_table.h | 2 +- net/openvswitch/vport-internal_dev.c | 5 + 24 files changed, 606 insertions(+), 246 deletions(-) create mode 100644 include/net/mpls.h ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [GIT net-next] Open vSwitch 2014-11-04 6:00 Pravin B Shelar @ 2014-11-05 20:10 ` David Miller 2014-11-05 22:52 ` Pravin Shelar 0 siblings, 1 reply; 54+ messages in thread From: David Miller @ 2014-11-05 20:10 UTC (permalink / raw) To: pshelar; +Cc: netdev Please do not submit your patches such that the email Date: field is the commit's date. You're not posting these on Nov. 4th, yet that is the Date: field on all of the individual patch emails. I want them to be the date at the time you post the patch to the mailing list. Otherwise the ordering in patchwork is not cronological wrt. the list's postings and this makes my work more difficult than it needs to be. Thanks. ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [GIT net-next] Open vSwitch 2014-11-05 20:10 ` David Miller @ 2014-11-05 22:52 ` Pravin Shelar 0 siblings, 0 replies; 54+ messages in thread From: Pravin Shelar @ 2014-11-05 22:52 UTC (permalink / raw) To: David Miller; +Cc: netdev On Wed, Nov 5, 2014 at 12:10 PM, David Miller <davem@davemloft.net> wrote: > > Please do not submit your patches such that the email Date: field is > the commit's date. You're not posting these on Nov. 4th, yet that > is the Date: field on all of the individual patch emails. > > I want them to be the date at the time you post the patch to the mailing > list. > > Otherwise the ordering in patchwork is not cronological wrt. the list's > postings and this makes my work more difficult than it needs to be. > Sorry about the Date field. NTP stopped working on my machine thats why the date got messed up. ^ permalink raw reply [flat|nested] 54+ messages in thread
* [GIT net-next] Open vSwitch @ 2014-09-11 22:01 Pravin B Shelar 2014-09-11 23:09 ` Pravin Shelar 0 siblings, 1 reply; 54+ messages in thread From: Pravin B Shelar @ 2014-09-11 22:01 UTC (permalink / raw) To: davem; +Cc: netdev Following patches adds recirculation and hash action to OVS. First three patches does code restructuring which is required for last patch. Recirculation implementation is changed, according to comments from David Miller, to avoid using recursive calls in OVS. It is using queue to record recirc action and deferred recirc is executed at the end of current actions execution. ---------------------------------------------------------------- The following changes since commit b954d83421d51d822c42e5ab7b65069b25ad3005: net: bpf: only build bpf_jit_binary_{alloc, free}() when jit selected (2014-09-10 14:05:07 -0700) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/pshelar/openvswitch.git net_next_ovs for you to fetch changes up to 9b8ede54a8bd319789e8bceb19789463bb944701: openvswitch: Add recirc and hash action. (2014-09-11 13:35:29 -0700) ---------------------------------------------------------------- Andy Zhou (2): datapath: simplify sample action implementation openvswitch: Add recirc and hash action. Pravin B Shelar (2): datapath: refactor ovs flow extract API. datapath: Use tun_key only for egress tunnel path. include/uapi/linux/openvswitch.h | 26 +++++ net/openvswitch/actions.c | 247 ++++++++++++++++++++++++++++++++++----- net/openvswitch/datapath.c | 52 +++++---- net/openvswitch/datapath.h | 17 ++- net/openvswitch/flow.c | 54 +++++++-- net/openvswitch/flow.h | 10 +- net/openvswitch/flow_netlink.c | 63 +++++++--- net/openvswitch/flow_netlink.h | 4 +- net/openvswitch/vport-gre.c | 22 ++-- net/openvswitch/vport-vxlan.c | 20 ++-- net/openvswitch/vport.c | 13 ++- 11 files changed, 419 insertions(+), 109 deletions(-) ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [GIT net-next] Open vSwitch 2014-09-11 22:01 Pravin B Shelar @ 2014-09-11 23:09 ` Pravin Shelar 0 siblings, 0 replies; 54+ messages in thread From: Pravin Shelar @ 2014-09-11 23:09 UTC (permalink / raw) To: David Miller; +Cc: netdev Please ignore this series, I have used datapath as subsystem name rather than openvswitch. I will respin it shortly. On Thu, Sep 11, 2014 at 3:01 PM, Pravin B Shelar <pshelar@nicira.com> wrote: > Following patches adds recirculation and hash action to OVS. > First three patches does code restructuring which is required > for last patch. > Recirculation implementation is changed, according to comments from > David Miller, to avoid using recursive calls in OVS. It is using > queue to record recirc action and deferred recirc is executed at > the end of current actions execution. > > ---------------------------------------------------------------- > The following changes since commit b954d83421d51d822c42e5ab7b65069b25ad3005: > > net: bpf: only build bpf_jit_binary_{alloc, free}() when jit selected (2014-09-10 14:05:07 -0700) > > are available in the git repository at: > > git://git.kernel.org/pub/scm/linux/kernel/git/pshelar/openvswitch.git net_next_ovs > > for you to fetch changes up to 9b8ede54a8bd319789e8bceb19789463bb944701: > > openvswitch: Add recirc and hash action. (2014-09-11 13:35:29 -0700) > > ---------------------------------------------------------------- > Andy Zhou (2): > datapath: simplify sample action implementation > openvswitch: Add recirc and hash action. > > Pravin B Shelar (2): > datapath: refactor ovs flow extract API. > datapath: Use tun_key only for egress tunnel path. > > include/uapi/linux/openvswitch.h | 26 +++++ > net/openvswitch/actions.c | 247 ++++++++++++++++++++++++++++++++++----- > net/openvswitch/datapath.c | 52 +++++---- > net/openvswitch/datapath.h | 17 ++- > net/openvswitch/flow.c | 54 +++++++-- > net/openvswitch/flow.h | 10 +- > net/openvswitch/flow_netlink.c | 63 +++++++--- > net/openvswitch/flow_netlink.h | 4 +- > net/openvswitch/vport-gre.c | 22 ++-- > net/openvswitch/vport-vxlan.c | 20 ++-- > net/openvswitch/vport.c | 13 ++- > 11 files changed, 419 insertions(+), 109 deletions(-) ^ permalink raw reply [flat|nested] 54+ messages in thread
* [GIT net-next] Open vSwitch @ 2014-07-31 23:57 Pravin B Shelar 2014-08-02 22:16 ` David Miller 0 siblings, 1 reply; 54+ messages in thread From: Pravin B Shelar @ 2014-07-31 23:57 UTC (permalink / raw) To: davem; +Cc: netdev Following patches introduces flow mask cache. To process any packet OVS need to apply flow mask to the flow and lookup the flow in flow table. so packet processing performance is directly dependant on number of entries in mask list. Following patch adds mask cache so that we do not need to iterate over all entries in mask list on every packet. We have seen good performance improvement with this patch. Before the mask-cache, a single stream which matched the first mask got a throughput of about 900K pps. A stream which matched the 20th mask got a throughput of about 400K pps. After the mask-cache patch, all streams throughput went back up to 900K pps. ---------------------------------------------------------------- The following changes since commit 2f55daa5464e8dfc8787ec863b6d1094522dbd69: net: stmmac: Support devicetree configs for mcast and ucast filter entries (2014-07-31 15:31:02 -0700) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/pshelar/openvswitch.git net_next_ovs for you to fetch changes up to 4955f0f9cbefa73577cd30ec262538ffc73dd4c2: openvswitch: Introduce flow mask cache. (2014-07-31 15:49:55 -0700) ---------------------------------------------------------------- Pravin B Shelar (3): openvswitch: Move table destroy to dp-rcu callback. openvswitch: Convert mask list into mask array. openvswitch: Introduce flow mask cache. net/openvswitch/datapath.c | 8 +- net/openvswitch/flow.h | 1 - net/openvswitch/flow_table.c | 293 +++++++++++++++++++++++++++++++++++++------ net/openvswitch/flow_table.h | 21 +++- 4 files changed, 275 insertions(+), 48 deletions(-) ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [GIT net-next] Open vSwitch 2014-07-31 23:57 Pravin B Shelar @ 2014-08-02 22:16 ` David Miller 2014-08-03 19:20 ` Pravin Shelar 0 siblings, 1 reply; 54+ messages in thread From: David Miller @ 2014-08-02 22:16 UTC (permalink / raw) To: pshelar; +Cc: netdev From: Pravin B Shelar <pshelar@nicira.com> Date: Thu, 31 Jul 2014 16:57:37 -0700 > Following patch adds mask cache so that we do not need to iterate over > all entries in mask list on every packet. We have seen good performance > improvement with this patch. How much have you thought about the DoS'ability of openvswitch's datastructures? What are the upper bounds for performance of packet switching? To be quite honest, a lot of the openvswitch data structures adjustments that hit my inbox seem to me to only address specific situations that specific user configurations have run into. It took us two decades, but we ripped out the ipv4 routing cache because external entities could provoke unreasonable worst case behavior in routing lookups. With openvswitch you guys have a unique opportunity to try and design all of your features such that they absolutely can use scalable datastructures from the beginning that provide reasonable performance in the common case and precise upper bounds for any possible sequence of incoming packets. New features tend to blind the developer to the eventual long term ramifications on performance. Would you add a new feature if you could know ahead of time that you'll never be able to design a datastructure which supports that feature and is not DoS'able by a remote entity? ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [GIT net-next] Open vSwitch 2014-08-02 22:16 ` David Miller @ 2014-08-03 19:20 ` Pravin Shelar 2014-08-04 4:21 ` David Miller 0 siblings, 1 reply; 54+ messages in thread From: Pravin Shelar @ 2014-08-03 19:20 UTC (permalink / raw) To: David Miller; +Cc: netdev On Sat, Aug 2, 2014 at 3:16 PM, David Miller <davem@davemloft.net> wrote: > From: Pravin B Shelar <pshelar@nicira.com> > Date: Thu, 31 Jul 2014 16:57:37 -0700 > >> Following patch adds mask cache so that we do not need to iterate over >> all entries in mask list on every packet. We have seen good performance >> improvement with this patch. > > How much have you thought about the DoS'ability of openvswitch's > datastructures? > This cache is populated by flow lookup in fast path. The mask cache is fixed in size. Userspace or number of packets can not change its size. Memory is statically allocated, no garbage collection. So DoS attack can not exploit this cache to increase ovs memory footprint. > What are the upper bounds for performance of packet switching? > Cache is keyed on packet RSS. Worst case scenario this cache adds one extra flow-table lookup for the flow if RSS hash matches but packet belong to different flow (hash collision). This is designed to be lightweight, stateless cache (does not take any reference on other data structures) to have least impact on DoS'ability of Open vSwitch. > To be quite honest, a lot of the openvswitch data structures > adjustments that hit my inbox seem to me to only address specific > situations that specific user configurations have run into. > Overall OVS DoS defense has improved since introduction of mega-flow. Recently introduced OVS feature allows userspace to set multiple sockets for upcall processing for given vport. This adds fairness by separating upcall from different flows to a socket. Userspace process upcall from these sockets in round-robin fashion. This helps to avoid one port monopolize upcall communication path. I agree there is scope for improving DoS defense and we will keep working on this issue. > It took us two decades, but we ripped out the ipv4 routing cache > because external entities could provoke unreasonable worst case > behavior in routing lookups. > > With openvswitch you guys have a unique opportunity to try and design > all of your features such that they absolutely can use scalable > datastructures from the beginning that provide reasonable performance > in the common case and precise upper bounds for any possible sequence > of incoming packets. > > New features tend to blind the developer to the eventual long term > ramifications on performance. Would you add a new feature if you > could know ahead of time that you'll never be able to design a > datastructure which supports that feature and is not DoS'able by a > remote entity? > ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [GIT net-next] Open vSwitch 2014-08-03 19:20 ` Pravin Shelar @ 2014-08-04 4:21 ` David Miller 2014-08-04 19:35 ` Pravin Shelar 0 siblings, 1 reply; 54+ messages in thread From: David Miller @ 2014-08-04 4:21 UTC (permalink / raw) To: pshelar; +Cc: netdev From: Pravin Shelar <pshelar@nicira.com> Date: Sun, 3 Aug 2014 12:20:32 -0700 > On Sat, Aug 2, 2014 at 3:16 PM, David Miller <davem@davemloft.net> wrote: >> From: Pravin B Shelar <pshelar@nicira.com> >> Date: Thu, 31 Jul 2014 16:57:37 -0700 >> >>> Following patch adds mask cache so that we do not need to iterate over >>> all entries in mask list on every packet. We have seen good performance >>> improvement with this patch. >> >> How much have you thought about the DoS'ability of openvswitch's >> datastructures? >> > This cache is populated by flow lookup in fast path. The mask cache is > fixed in size. Userspace or number of packets can not change its size. > Memory is statically allocated, no garbage collection. So DoS attack > can not exploit this cache to increase ovs memory footprint. An attacker can construct a packet sequence such that every mask cache lookup misses, making the cache effectively useless. ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [GIT net-next] Open vSwitch 2014-08-04 4:21 ` David Miller @ 2014-08-04 19:35 ` Pravin Shelar 2014-08-04 19:42 ` David Miller 0 siblings, 1 reply; 54+ messages in thread From: Pravin Shelar @ 2014-08-04 19:35 UTC (permalink / raw) To: David Miller; +Cc: netdev On Sun, Aug 3, 2014 at 9:21 PM, David Miller <davem@davemloft.net> wrote: > From: Pravin Shelar <pshelar@nicira.com> > Date: Sun, 3 Aug 2014 12:20:32 -0700 > >> On Sat, Aug 2, 2014 at 3:16 PM, David Miller <davem@davemloft.net> wrote: >>> From: Pravin B Shelar <pshelar@nicira.com> >>> Date: Thu, 31 Jul 2014 16:57:37 -0700 >>> >>>> Following patch adds mask cache so that we do not need to iterate over >>>> all entries in mask list on every packet. We have seen good performance >>>> improvement with this patch. >>> >>> How much have you thought about the DoS'ability of openvswitch's >>> datastructures? >>> >> This cache is populated by flow lookup in fast path. The mask cache is >> fixed in size. Userspace or number of packets can not change its size. >> Memory is statically allocated, no garbage collection. So DoS attack >> can not exploit this cache to increase ovs memory footprint. > > An attacker can construct a packet sequence such that every mask cache > lookup misses, making the cache effectively useless. Yes, but it does work in normal traffic situations. I have posted performance numbers in the cover letter. Under DoS attack as you said attacker need to build sequence of packets to make cache ineffective. Which results in cache miss and a full in-kernel flow lookup. Therefore with this cache there is one more lookup done under DoS. But this is not very different than current OVS anyways. ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [GIT net-next] Open vSwitch 2014-08-04 19:35 ` Pravin Shelar @ 2014-08-04 19:42 ` David Miller 2014-08-06 22:55 ` Alexei Starovoitov 2014-08-13 13:34 ` Nicolas Dichtel 0 siblings, 2 replies; 54+ messages in thread From: David Miller @ 2014-08-04 19:42 UTC (permalink / raw) To: pshelar; +Cc: netdev From: Pravin Shelar <pshelar@nicira.com> Date: Mon, 4 Aug 2014 12:35:59 -0700 > On Sun, Aug 3, 2014 at 9:21 PM, David Miller <davem@davemloft.net> wrote: >> From: Pravin Shelar <pshelar@nicira.com> >> Date: Sun, 3 Aug 2014 12:20:32 -0700 >> >>> On Sat, Aug 2, 2014 at 3:16 PM, David Miller <davem@davemloft.net> wrote: >>>> From: Pravin B Shelar <pshelar@nicira.com> >>>> Date: Thu, 31 Jul 2014 16:57:37 -0700 >>>> >>>>> Following patch adds mask cache so that we do not need to iterate over >>>>> all entries in mask list on every packet. We have seen good performance >>>>> improvement with this patch. >>>> >>>> How much have you thought about the DoS'ability of openvswitch's >>>> datastructures? >>>> >>> This cache is populated by flow lookup in fast path. The mask cache is >>> fixed in size. Userspace or number of packets can not change its size. >>> Memory is statically allocated, no garbage collection. So DoS attack >>> can not exploit this cache to increase ovs memory footprint. >> >> An attacker can construct a packet sequence such that every mask cache >> lookup misses, making the cache effectively useless. > > Yes, but it does work in normal traffic situations. You're basically just reiterating the point I'm trying to make. Your caches are designed for specific configuration and packet traffic pattern cases, and can be easily duped into a worse case performance scenerio by an attacker. Caches, basically, do not work on the real internet. Make the fundamental core data structures fast and scalable enough, rather than bolting caches (which are basically hacks) on top every time they don't perform to your expectations. What if you made the full flow lookup fundamentally faster? Then an attacker can't do anything about that. That's a real performance improvement, one that sustains arbitrary traffic patterns. ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [GIT net-next] Open vSwitch 2014-08-04 19:42 ` David Miller @ 2014-08-06 22:55 ` Alexei Starovoitov 2014-08-13 13:34 ` Nicolas Dichtel 1 sibling, 0 replies; 54+ messages in thread From: Alexei Starovoitov @ 2014-08-06 22:55 UTC (permalink / raw) To: David Miller; +Cc: Pravin Shelar, netdev@vger.kernel.org On Mon, Aug 4, 2014 at 12:42 PM, David Miller <davem@davemloft.net> wrote: > From: Pravin Shelar <pshelar@nicira.com> > Date: Mon, 4 Aug 2014 12:35:59 -0700 > >> On Sun, Aug 3, 2014 at 9:21 PM, David Miller <davem@davemloft.net> wrote: >>> An attacker can construct a packet sequence such that every mask cache >>> lookup misses, making the cache effectively useless. >> >> Yes, but it does work in normal traffic situations. > > You're basically just reiterating the point I'm trying to make. > > Your caches are designed for specific configuration and packet traffic > pattern cases, and can be easily duped into a worse case performance > scenerio by an attacker. > > Caches, basically, do not work on the real internet. > > Make the fundamental core data structures fast and scalable enough, > rather than bolting caches (which are basically hacks) on top every > time they don't perform to your expectations. > > What if you made the full flow lookup fundamentally faster? Then an I suspect that the flow lookup in ovs is as fast as it can be, yet ovs is still dos-able, since kernel datapath (flow lookup and action) is considered to be first level cache for user space. By design flow miss is always punted to userspace. Therefore netperf TCP_CRR test from a VM is not cheap for host userspace component. Mega-flows and multiple upcall pids are partially addressing this fundamental problem. Consider simple distributed virtual bridge with VMs distributed across multiple hosts. Mega-flow mask that selects dmac can solve CRR case for well behaving VMs, but rogue VM that spams random dmac will keep taxing host userspace. So we'd need to add another flow mask to match the rest of traffic unconditionally and drop it. Now consider virtual bridge-router-bridge topology (two subnets and router using openstack names). Since VMs on the same host may be in different subnets their macs can be the same, so 'mega-flow mask dmac' approach won't work and CRR test again is getting costly to userspace. We can try to use 'in_port + dmac' mask, but as network topology grows the flow mask tricks get out of hand. Situation is worse when ovs works as gateway and receives internet traffic. Since flow miss goes to userspace remote attacker can find a way to saturate gateway cpu with certain traffic. I guess none of this is new to ovs and there is probably a solution that I don't know about. ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [GIT net-next] Open vSwitch 2014-08-04 19:42 ` David Miller 2014-08-06 22:55 ` Alexei Starovoitov @ 2014-08-13 13:34 ` Nicolas Dichtel 1 sibling, 0 replies; 54+ messages in thread From: Nicolas Dichtel @ 2014-08-13 13:34 UTC (permalink / raw) To: David Miller, pshelar; +Cc: netdev Le 04/08/2014 21:42, David Miller a écrit : [snip] > Caches, basically, do not work on the real internet. A bit late, but I completely agree! ^ permalink raw reply [flat|nested] 54+ messages in thread
* [GIT net-next] Open vSwitch @ 2014-07-14 0:12 Pravin B Shelar 0 siblings, 0 replies; 54+ messages in thread From: Pravin B Shelar @ 2014-07-14 0:12 UTC (permalink / raw) To: davem; +Cc: netdev Following patches adds three features to OVS 1. Add fairness to upcall processing. 2. Recirculation and Hash action. 3. Enable Tunnel GSO features. Rest of patches are bug fixes related to patches from same series. The following changes since commit 279f64b7a771d84cbdea51ac2f794becfb06bcd4: net/hsr: Remove left-over never-true conditional code. (2014-07-11 15:04:40 -0700) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/pshelar/openvswitch.git net_next_ovs for you to fetch changes up to 3dec4774b6343e5db5d346f1f05c6a883e0069db: openvswitch: Add skb_clone NULL check for the sampling action. (2014-07-13 12:02:12 -0700) ---------------------------------------------------------------- Alex Wang (1): openvswitch: Allow each vport to have an array of 'port_id's. Andy Zhou (6): openvswitch: Add hash action openvswitch: Add recirc action openvswitch: Fix key size computation in key_attr_size() openvswitch: Avoid memory corruption in queue_userspace_packet() openvswitch: Add skb_clone NULL check in the recirc action. openvswitch: Add skb_clone NULL check for the sampling action. Pravin B Shelar (2): openvswitch: Enable tunnel GSO for OVS bridge. net: Export xmit_recursion Simon Horman (2): openvswitch: Free skb(s) on recirculation error openvswitch: Sample action without side effects include/linux/netdev_features.h | 8 +++ include/linux/netdevice.h | 3 + include/uapi/linux/openvswitch.h | 39 ++++++++++-- net/core/dev.c | 10 +-- net/openvswitch/actions.c | 119 +++++++++++++++++++++++++++++++---- net/openvswitch/datapath.c | 79 ++++++++++++++++------- net/openvswitch/datapath.h | 8 ++- net/openvswitch/flow.h | 2 + net/openvswitch/flow_netlink.c | 43 ++++++++++++- net/openvswitch/vport-internal_dev.c | 5 +- net/openvswitch/vport.c | 102 +++++++++++++++++++++++++++++- net/openvswitch/vport.h | 27 ++++++-- 12 files changed, 393 insertions(+), 52 deletions(-) ^ permalink raw reply [flat|nested] 54+ messages in thread
* [GIT net-next] Open vSwitch @ 2014-05-20 8:59 Pravin B Shelar 2014-05-23 18:46 ` David Miller 0 siblings, 1 reply; 54+ messages in thread From: Pravin B Shelar @ 2014-05-20 8:59 UTC (permalink / raw) To: davem-fT/PcQaiUtIeIZ0/mPfg9Q Cc: dev-yBygre7rU0TnMu66kgdUjQ, netdev-u79uwXL29TY76Z2rM5mHXA A set of OVS changes for net-next/3.16. Most of change are related to improving performance of flow setup by minimizing critical sections. The following changes since commit 091b64868b43ed84334c6623ea6a08497529d4ff: Merge branch 'mlx4-next' (2014-05-22 17:17:34 -0400) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/pshelar/openvswitch.git master for you to fetch changes up to 0c200ef94c9492205e18a18c25650cf27939889c: openvswitch: Simplify genetlink code. (2014-05-22 16:27:37 -0700) ---------------------------------------------------------------- Jarno Rajahalme (12): openvswitch: Compact sw_flow_key. openvswitch: Avoid assigning a NULL pointer to flow actions. openvswitch: Clarify locking. openvswitch: Build flow cmd netlink reply only if needed. openvswitch: Make flow mask removal symmetric. openvswitch: Minimize dp and vport critical sections. openvswitch: Fix typo. openvswitch: Fix ovs_flow_stats_get/clear RCU dereference. openvswitch: Reduce locking requirements. openvswitch: Minimize ovs_flow_cmd_del critical section. openvswitch: Split ovs_flow_cmd_new_or_set(). openvswitch: Minimize ovs_flow_cmd_new|set critical sections. Pravin B Shelar (1): openvswitch: Simplify genetlink code. include/uapi/linux/openvswitch.h | 4 +- net/openvswitch/datapath.c | 771 +++++++++++++++++++++++---------------- net/openvswitch/flow.c | 53 ++- net/openvswitch/flow.h | 35 +- net/openvswitch/flow_netlink.c | 112 ++---- net/openvswitch/flow_table.c | 46 ++- 6 files changed, 558 insertions(+), 463 deletions(-) -- 1.9.0 ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [GIT net-next] Open vSwitch 2014-05-20 8:59 Pravin B Shelar @ 2014-05-23 18:46 ` David Miller [not found] ` <20140523.144618.48288319728715940.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org> 0 siblings, 1 reply; 54+ messages in thread From: David Miller @ 2014-05-23 18:46 UTC (permalink / raw) To: pshelar; +Cc: dev, netdev From: Pravin B Shelar <pshelar@nicira.com> Date: Tue, 20 May 2014 01:59:38 -0700 > A set of OVS changes for net-next/3.16. > > Most of change are related to improving performance of flow setup by > minimizing critical sections. Pulled, thanks Pravin. In the future please make your postings so that they have the current date and time when you make the postings, not when the commits when into your tree. Otherwise it messed up the order in which your changes appear in patchwork wrt. other submissions. ^ permalink raw reply [flat|nested] 54+ messages in thread
[parent not found: <20140523.144618.48288319728715940.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>]
* Re: [GIT net-next] Open vSwitch [not found] ` <20140523.144618.48288319728715940.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org> @ 2014-05-23 20:16 ` Pravin Shelar 0 siblings, 0 replies; 54+ messages in thread From: Pravin Shelar @ 2014-05-23 20:16 UTC (permalink / raw) To: David Miller; +Cc: dev-yBygre7rU0TnMu66kgdUjQ@public.gmane.org, netdev On Fri, May 23, 2014 at 11:46 AM, David Miller <davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org> wrote: > From: Pravin B Shelar <pshelar-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> > Date: Tue, 20 May 2014 01:59:38 -0700 > >> A set of OVS changes for net-next/3.16. >> >> Most of change are related to improving performance of flow setup by >> minimizing critical sections. > > Pulled, thanks Pravin. > > In the future please make your postings so that they have the current date > and time when you make the postings, not when the commits when into your > tree. > > Otherwise it messed up the order in which your changes appear in patchwork > wrt. other submissions. ok, I will keep it in mind. Thanks, Pravin. ^ permalink raw reply [flat|nested] 54+ messages in thread
* [GIT net-next] Open vSwitch @ 2014-05-16 21:07 Jesse Gross [not found] ` <1400274459-56304-1-git-send-email-jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> 0 siblings, 1 reply; 54+ messages in thread From: Jesse Gross @ 2014-05-16 21:07 UTC (permalink / raw) To: David Miller; +Cc: dev-yBygre7rU0TnMu66kgdUjQ, netdev-u79uwXL29TY76Z2rM5mHXA A set of OVS changes for net-next/3.16. The major change here is a switch from per-CPU to per-NUMA flow statistics. This improves scalability by reducing kernel overhead in flow setup and maintenance. The following changes since commit a188a54d11629bef2169052297e61f3767ca8ce5: macvlan: simplify the structure port (2014-05-15 23:35:16 -0400) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/jesse/openvswitch.git master for you to fetch changes up to 944df8ae84d88f5e8eb027990dad2cfa4fbe4be5: net/openvswitch: Use with RCU_INIT_POINTER(x, NULL) in vport-gre.c (2014-05-16 13:40:29 -0700) ---------------------------------------------------------------- Daniele Di Proietto (4): openvswitch: use const in some local vars and casts openvswitch: avoid warnings in vport_from_priv openvswitch: avoid cast-qual warning in vport_priv openvswitch: Added (unsigned long long) cast in printf Jarno Rajahalme (4): openvswitch: Remove 5-tuple optimization. openvswitch: Per NUMA node flow stats. openvswitch: Fix output of SCTP mask. openvswitch: Use TCP flags in the flow key for stats. Joe Perches (3): openvswitch: Use net_ratelimit in OVS_NLERR openvswitch: flow_netlink: Use pr_fmt to OVS_NLERR output openvswitch: Use ether_addr_copy Monam Agarwal (1): net/openvswitch: Use with RCU_INIT_POINTER(x, NULL) in vport-gre.c net/openvswitch/actions.c | 4 +- net/openvswitch/datapath.c | 11 ++- net/openvswitch/datapath.h | 8 ++- net/openvswitch/flow.c | 149 ++++++++++++++++++++++++----------------- net/openvswitch/flow.h | 18 +++-- net/openvswitch/flow_netlink.c | 82 +++++------------------ net/openvswitch/flow_netlink.h | 1 - net/openvswitch/flow_table.c | 75 ++++++++++++--------- net/openvswitch/flow_table.h | 4 +- net/openvswitch/vport-gre.c | 2 +- net/openvswitch/vport.h | 6 +- 11 files changed, 176 insertions(+), 184 deletions(-) ^ permalink raw reply [flat|nested] 54+ messages in thread
[parent not found: <1400274459-56304-1-git-send-email-jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org>]
* Re: [GIT net-next] Open vSwitch [not found] ` <1400274459-56304-1-git-send-email-jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> @ 2014-05-16 21:22 ` David Miller 0 siblings, 0 replies; 54+ messages in thread From: David Miller @ 2014-05-16 21:22 UTC (permalink / raw) To: jesse-l0M0P4e3n4LQT0dZR+AlfA Cc: dev-yBygre7rU0TnMu66kgdUjQ, netdev-u79uwXL29TY76Z2rM5mHXA From: Jesse Gross <jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> Date: Fri, 16 May 2014 14:07:27 -0700 > A set of OVS changes for net-next/3.16. > > The major change here is a switch from per-CPU to per-NUMA flow > statistics. This improves scalability by reducing kernel overhead > in flow setup and maintenance. Pulled, thanks Jesse. ^ permalink raw reply [flat|nested] 54+ messages in thread
* [GIT net-next] Open vSwitch @ 2014-01-07 0:15 Jesse Gross [not found] ` <1389053776-62865-1-git-send-email-jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> 2014-01-08 14:49 ` [ovs-dev] " Zoltan Kiss 0 siblings, 2 replies; 54+ messages in thread From: Jesse Gross @ 2014-01-07 0:15 UTC (permalink / raw) To: David Miller; +Cc: dev-yBygre7rU0TnMu66kgdUjQ, netdev-u79uwXL29TY76Z2rM5mHXA Open vSwitch changes for net-next/3.14. Highlights are: * Performance improvements in the mechanism to get packets to userspace using memory mapped netlink and skb zero copy where appropriate. * Per-cpu flow stats in situations where flows are likely to be shared across CPUs. Standard flow stats are used in other situations to save memory and allocation time. * A handful of code cleanups and rationalization. The following changes since commit 6ce4eac1f600b34f2f7f58f9cd8f0503d79e42ae: Linux 3.13-rc1 (2013-11-22 11:30:55 -0800) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/jesse/openvswitch.git master for you to fetch changes up to 443cd88c8a31379e95326428bbbd40af25c1d440: ovs: make functions local (2014-01-06 15:54:39 -0800) ---------------------------------------------------------------- Andy Zhou (1): openvswitch: Change ovs_flow_tbl_lookup_xx() APIs Ben Pfaff (2): openvswitch: Correct comment. openvswitch: Shrink sw_flow_mask by 8 bytes (64-bit) or 4 bytes (32-bit). Daniel Borkmann (1): net: ovs: use kfree_rcu instead of rcu_free_{sw_flow_mask_cb,acts_callback} Jesse Gross (1): openvswitch: Silence RCU lockdep checks from flow lookup. Pravin B Shelar (1): openvswitch: Per cpu flow stats. Stephen Hemminger (1): ovs: make functions local Thomas Graf (9): genl: Add genlmsg_new_unicast() for unicast message allocation netlink: Avoid netlink mmap alloc if msg size exceeds frame size openvswitch: Enable memory mapped Netlink i/o net: Export skb_zerocopy() to zerocopy from one skb to another openvswitch: Allow user space to announce ability to accept unaligned Netlink messages openvswitch: Drop user features if old user space attempted to create datapath openvswitch: Pass datapath into userspace queue functions openvswitch: Use skb_zerocopy() for upcall openvswitch: Compute checksum in skb_gso_segment() if needed Wei Yongjun (1): openvswitch: remove duplicated include from flow_table.c include/linux/skbuff.h | 3 + include/net/genetlink.h | 4 + include/uapi/linux/openvswitch.h | 14 ++- net/core/skbuff.c | 85 +++++++++++++ net/netfilter/nfnetlink_queue_core.c | 59 +-------- net/netlink/af_netlink.c | 4 + net/netlink/genetlink.c | 21 ++++ net/openvswitch/datapath.c | 231 +++++++++++++++++++---------------- net/openvswitch/datapath.h | 6 +- net/openvswitch/flow.c | 96 +++++++++++++-- net/openvswitch/flow.h | 33 +++-- net/openvswitch/flow_netlink.c | 66 ++++++++-- net/openvswitch/flow_netlink.h | 1 + net/openvswitch/flow_table.c | 60 ++++++--- net/openvswitch/flow_table.h | 6 +- net/openvswitch/vport.c | 6 +- net/openvswitch/vport.h | 1 - 17 files changed, 483 insertions(+), 213 deletions(-) ^ permalink raw reply [flat|nested] 54+ messages in thread
[parent not found: <1389053776-62865-1-git-send-email-jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org>]
* Re: [GIT net-next] Open vSwitch [not found] ` <1389053776-62865-1-git-send-email-jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> @ 2014-01-07 0:49 ` David Miller 0 siblings, 0 replies; 54+ messages in thread From: David Miller @ 2014-01-07 0:49 UTC (permalink / raw) To: jesse-l0M0P4e3n4LQT0dZR+AlfA Cc: dev-yBygre7rU0TnMu66kgdUjQ, netdev-u79uwXL29TY76Z2rM5mHXA From: Jesse Gross <jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> Date: Mon, 6 Jan 2014 16:15:59 -0800 > Open vSwitch changes for net-next/3.14. Highlights are: > * Performance improvements in the mechanism to get packets to userspace > using memory mapped netlink and skb zero copy where appropriate. > * Per-cpu flow stats in situations where flows are likely to be shared > across CPUs. Standard flow stats are used in other situations to save > memory and allocation time. > * A handful of code cleanups and rationalization. Lots of good stuff in here, pulled, thanks Jesse. ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [ovs-dev] [GIT net-next] Open vSwitch 2014-01-07 0:15 Jesse Gross [not found] ` <1389053776-62865-1-git-send-email-jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> @ 2014-01-08 14:49 ` Zoltan Kiss [not found] ` <52CD657F.7080806-Sxgqhf6Nn4DQT0dZR+AlfA@public.gmane.org> 1 sibling, 1 reply; 54+ messages in thread From: Zoltan Kiss @ 2014-01-08 14:49 UTC (permalink / raw) To: Jesse Gross, David Miller; +Cc: dev, netdev Hi, I've tried the latest net-next on a Xenserver install with 1.9.3 userspace, and it seems this patch series broke it (at least after reverting that locally it works now). I haven't went too far yet checking what's the problem, but it seems the xenbrX device doesn't really receive too much of the traffic coming through the NIC. Is it expected? Regards, Zoli On 07/01/14 00:15, Jesse Gross wrote: > Open vSwitch changes for net-next/3.14. Highlights are: > * Performance improvements in the mechanism to get packets to userspace > using memory mapped netlink and skb zero copy where appropriate. > * Per-cpu flow stats in situations where flows are likely to be shared > across CPUs. Standard flow stats are used in other situations to save > memory and allocation time. > * A handful of code cleanups and rationalization. > > The following changes since commit 6ce4eac1f600b34f2f7f58f9cd8f0503d79e42ae: > > Linux 3.13-rc1 (2013-11-22 11:30:55 -0800) > > are available in the git repository at: > > git://git.kernel.org/pub/scm/linux/kernel/git/jesse/openvswitch.git master > > for you to fetch changes up to 443cd88c8a31379e95326428bbbd40af25c1d440: > > ovs: make functions local (2014-01-06 15:54:39 -0800) > > ---------------------------------------------------------------- > Andy Zhou (1): > openvswitch: Change ovs_flow_tbl_lookup_xx() APIs > > Ben Pfaff (2): > openvswitch: Correct comment. > openvswitch: Shrink sw_flow_mask by 8 bytes (64-bit) or 4 bytes (32-bit). > > Daniel Borkmann (1): > net: ovs: use kfree_rcu instead of rcu_free_{sw_flow_mask_cb,acts_callback} > > Jesse Gross (1): > openvswitch: Silence RCU lockdep checks from flow lookup. > > Pravin B Shelar (1): > openvswitch: Per cpu flow stats. > > Stephen Hemminger (1): > ovs: make functions local > > Thomas Graf (9): > genl: Add genlmsg_new_unicast() for unicast message allocation > netlink: Avoid netlink mmap alloc if msg size exceeds frame size > openvswitch: Enable memory mapped Netlink i/o > net: Export skb_zerocopy() to zerocopy from one skb to another > openvswitch: Allow user space to announce ability to accept unaligned Netlink messages > openvswitch: Drop user features if old user space attempted to create datapath > openvswitch: Pass datapath into userspace queue functions > openvswitch: Use skb_zerocopy() for upcall > openvswitch: Compute checksum in skb_gso_segment() if needed > > Wei Yongjun (1): > openvswitch: remove duplicated include from flow_table.c > > include/linux/skbuff.h | 3 + > include/net/genetlink.h | 4 + > include/uapi/linux/openvswitch.h | 14 ++- > net/core/skbuff.c | 85 +++++++++++++ > net/netfilter/nfnetlink_queue_core.c | 59 +-------- > net/netlink/af_netlink.c | 4 + > net/netlink/genetlink.c | 21 ++++ > net/openvswitch/datapath.c | 231 +++++++++++++++++++---------------- > net/openvswitch/datapath.h | 6 +- > net/openvswitch/flow.c | 96 +++++++++++++-- > net/openvswitch/flow.h | 33 +++-- > net/openvswitch/flow_netlink.c | 66 ++++++++-- > net/openvswitch/flow_netlink.h | 1 + > net/openvswitch/flow_table.c | 60 ++++++--- > net/openvswitch/flow_table.h | 6 +- > net/openvswitch/vport.c | 6 +- > net/openvswitch/vport.h | 1 - > 17 files changed, 483 insertions(+), 213 deletions(-) > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev > ^ permalink raw reply [flat|nested] 54+ messages in thread
[parent not found: <52CD657F.7080806-Sxgqhf6Nn4DQT0dZR+AlfA@public.gmane.org>]
* Re: [GIT net-next] Open vSwitch [not found] ` <52CD657F.7080806-Sxgqhf6Nn4DQT0dZR+AlfA@public.gmane.org> @ 2014-01-08 15:10 ` Jesse Gross 2014-01-13 18:04 ` [ovs-dev] " Zoltan Kiss 0 siblings, 1 reply; 54+ messages in thread From: Jesse Gross @ 2014-01-08 15:10 UTC (permalink / raw) To: Zoltan Kiss Cc: dev-yBygre7rU0TnMu66kgdUjQ@public.gmane.org, netdev, David Miller On Wed, Jan 8, 2014 at 9:49 AM, Zoltan Kiss <zoltan.kiss-Sxgqhf6Nn4DQT0dZR+AlfA@public.gmane.org> wrote: > Hi, > > I've tried the latest net-next on a Xenserver install with 1.9.3 userspace, > and it seems this patch series broke it (at least after reverting that > locally it works now). I haven't went too far yet checking what's the > problem, but it seems the xenbrX device doesn't really receive too much of > the traffic coming through the NIC. Is it expected? What do you mean by doesn't receive too much traffic? What does it get? ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [ovs-dev] [GIT net-next] Open vSwitch 2014-01-08 15:10 ` Jesse Gross @ 2014-01-13 18:04 ` Zoltan Kiss [not found] ` <52D42A9E.1030805-Sxgqhf6Nn4DQT0dZR+AlfA@public.gmane.org> 0 siblings, 1 reply; 54+ messages in thread From: Zoltan Kiss @ 2014-01-13 18:04 UTC (permalink / raw) To: Jesse Gross; +Cc: David Miller, dev@openvswitch.org, netdev On 08/01/14 15:10, Jesse Gross wrote: > On Wed, Jan 8, 2014 at 9:49 AM, Zoltan Kiss <zoltan.kiss@citrix.com> wrote: >> Hi, >> >> I've tried the latest net-next on a Xenserver install with 1.9.3 userspace, >> and it seems this patch series broke it (at least after reverting that >> locally it works now). I haven't went too far yet checking what's the >> problem, but it seems the xenbrX device doesn't really receive too much of >> the traffic coming through the NIC. Is it expected? > > What do you mean by doesn't receive too much traffic? What does it get? > Sorry for the vague error description, now I had more time to look into this. I think the problem boils down to this: Jan 13 17:55:07 localhost ovs-vswitchd: 07890|netlink_socket|DBG|nl_sock_recv__ (Success): nl(len:274, type=29(ovs_packet), flags=0, seq=0, pid=0,genl(cmd=1,version=1) Jan 13 17:55:07 localhost ovs-vswitchd: 07891|netlink|DBG|attributes followed by garbage Jan 13 17:55:07 localhost ovs-vswitchd: 07892|dpif|WARN|system@xenbr0: recv failed (Invalid argument) That's just keep repeating. I'm keep looking. Zoli ^ permalink raw reply [flat|nested] 54+ messages in thread
[parent not found: <52D42A9E.1030805-Sxgqhf6Nn4DQT0dZR+AlfA@public.gmane.org>]
* Re: [GIT net-next] Open vSwitch [not found] ` <52D42A9E.1030805-Sxgqhf6Nn4DQT0dZR+AlfA@public.gmane.org> @ 2014-01-14 0:31 ` Zoltan Kiss [not found] ` <52D4857C.7020902-Sxgqhf6Nn4DQT0dZR+AlfA@public.gmane.org> 0 siblings, 1 reply; 54+ messages in thread From: Zoltan Kiss @ 2014-01-14 0:31 UTC (permalink / raw) To: Jesse Gross Cc: dev-yBygre7rU0TnMu66kgdUjQ@public.gmane.org, netdev, David Miller On 13/01/14 18:04, Zoltan Kiss wrote: > On 08/01/14 15:10, Jesse Gross wrote: >> On Wed, Jan 8, 2014 at 9:49 AM, Zoltan Kiss <zoltan.kiss-Sxgqhf6Nn4DQT0dZR+AlfA@public.gmane.org> >> wrote: >>> Hi, >>> >>> I've tried the latest net-next on a Xenserver install with 1.9.3 >>> userspace, >>> and it seems this patch series broke it (at least after reverting that >>> locally it works now). I haven't went too far yet checking what's the >>> problem, but it seems the xenbrX device doesn't really receive too >>> much of >>> the traffic coming through the NIC. Is it expected? >> >> What do you mean by doesn't receive too much traffic? What does it get? >> > > Sorry for the vague error description, now I had more time to look > into this. I think the problem boils down to this: > > Jan 13 17:55:07 localhost ovs-vswitchd: > 07890|netlink_socket|DBG|nl_sock_recv__ (Success): nl(len:274, > type=29(ovs_packet), flags=0, seq=0, pid=0,genl(cmd=1,version=1) > Jan 13 17:55:07 localhost ovs-vswitchd: 07891|netlink|DBG|attributes > followed by garbage > Jan 13 17:55:07 localhost ovs-vswitchd: 07892|dpif|WARN|system@xenbr0: > recv failed (Invalid argument) > > That's just keep repeating. I'm keep looking. Now I reverted these top 3 commits: ovs: make functions local openvswitch: Compute checksum in skb_gso_segment() if needed openvswitch: Use skb_zerocopy() for upcall And it works. I guess the last one causing the problem. Might be an important factor, I'm using 32 bit Dom0. Zoli ^ permalink raw reply [flat|nested] 54+ messages in thread
[parent not found: <52D4857C.7020902-Sxgqhf6Nn4DQT0dZR+AlfA@public.gmane.org>]
* Re: [GIT net-next] Open vSwitch [not found] ` <52D4857C.7020902-Sxgqhf6Nn4DQT0dZR+AlfA@public.gmane.org> @ 2014-01-14 1:30 ` Jesse Gross [not found] ` <CAEP_g=8nG6AHV9Y+5=48nPhkf5Oe=mG8EiyaKSqN4omnmGhv4A-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 0 siblings, 1 reply; 54+ messages in thread From: Jesse Gross @ 2014-01-14 1:30 UTC (permalink / raw) To: Zoltan Kiss Cc: dev-yBygre7rU0TnMu66kgdUjQ@public.gmane.org, netdev, David Miller On Mon, Jan 13, 2014 at 4:31 PM, Zoltan Kiss <zoltan.kiss-Sxgqhf6Nn4DQT0dZR+AlfA@public.gmane.org> wrote: > On 13/01/14 18:04, Zoltan Kiss wrote: >> >> On 08/01/14 15:10, Jesse Gross wrote: >>> >>> On Wed, Jan 8, 2014 at 9:49 AM, Zoltan Kiss <zoltan.kiss-Sxgqhf6Nn4DQT0dZR+AlfA@public.gmane.org> >>> wrote: >>>> >>>> Hi, >>>> >>>> I've tried the latest net-next on a Xenserver install with 1.9.3 >>>> userspace, >>>> and it seems this patch series broke it (at least after reverting that >>>> locally it works now). I haven't went too far yet checking what's the >>>> problem, but it seems the xenbrX device doesn't really receive too much >>>> of >>>> the traffic coming through the NIC. Is it expected? >>> >>> >>> What do you mean by doesn't receive too much traffic? What does it get? >>> >> >> Sorry for the vague error description, now I had more time to look into >> this. I think the problem boils down to this: >> >> Jan 13 17:55:07 localhost ovs-vswitchd: >> 07890|netlink_socket|DBG|nl_sock_recv__ (Success): nl(len:274, >> type=29(ovs_packet), flags=0, seq=0, pid=0,genl(cmd=1,version=1) >> Jan 13 17:55:07 localhost ovs-vswitchd: 07891|netlink|DBG|attributes >> followed by garbage >> Jan 13 17:55:07 localhost ovs-vswitchd: 07892|dpif|WARN|system@xenbr0: >> recv failed (Invalid argument) >> >> That's just keep repeating. I'm keep looking. > > > Now I reverted these top 3 commits: > > ovs: make functions local > > openvswitch: Compute checksum in skb_gso_segment() if needed > openvswitch: Use skb_zerocopy() for upcall > > And it works. I guess the last one causing the problem. Might be an > important factor, I'm using 32 bit Dom0. I think you're probably right. Thomas - can you take a look? We shouldn't be doing any zerocopy in this situation but it looks to me like we don't do any padding at all, even in situations where we are copying the data. ^ permalink raw reply [flat|nested] 54+ messages in thread
[parent not found: <CAEP_g=8nG6AHV9Y+5=48nPhkf5Oe=mG8EiyaKSqN4omnmGhv4A-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>]
* Re: [GIT net-next] Open vSwitch [not found] ` <CAEP_g=8nG6AHV9Y+5=48nPhkf5Oe=mG8EiyaKSqN4omnmGhv4A-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> @ 2014-01-14 9:46 ` Thomas Graf 0 siblings, 0 replies; 54+ messages in thread From: Thomas Graf @ 2014-01-14 9:46 UTC (permalink / raw) To: Jesse Gross, Zoltan Kiss Cc: dev-yBygre7rU0TnMu66kgdUjQ@public.gmane.org, netdev, David Miller On 01/14/2014 02:30 AM, Jesse Gross wrote: >> And it works. I guess the last one causing the problem. Might be an >> important factor, I'm using 32 bit Dom0. > > I think you're probably right. Thomas - can you take a look? > > We shouldn't be doing any zerocopy in this situation but it looks to > me like we don't do any padding at all, even in situations where we > are copying the data. I'm looking into this now. The zerocopy method should only be attempted if user space has announced the ability to received unaligned messages. @Zoltan: I assume you are using an unmodified OVS 1.9.3? ^ permalink raw reply [flat|nested] 54+ messages in thread
* [GIT net-next] Open vSwitch @ 2013-11-02 7:43 Jesse Gross 2013-11-04 21:26 ` David Miller 0 siblings, 1 reply; 54+ messages in thread From: Jesse Gross @ 2013-11-02 7:43 UTC (permalink / raw) To: David Miller; +Cc: dev-yBygre7rU0TnMu66kgdUjQ, netdev-u79uwXL29TY76Z2rM5mHXA A set of updates for net-next/3.13. Major changes are: * Restructure flow handling code to be more logically organized and easier to read. * Rehashing of the flow table is moved from a workqueue to flow installation time. Before, heavy load could block the workqueue for excessive periods of time. * Additional debugging information is provided to help diagnose megaflows. * It's now possible to match on TCP flags. The following changes since commit 272b98c6455f00884f0350f775c5342358ebb73f: Linux 3.12-rc1 (2013-09-16 16:17:51 -0400) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/jesse/openvswitch.git master for you to fetch changes up to 8ddd094675cfd453fc9838caa46ea108a4107183: openvswitch: Use flow hash during flow lookup operation. (2013-11-01 18:43:46 -0700) ---------------------------------------------------------------- Andy Zhou (1): openvswitch: collect mega flow mask stats Jarno Rajahalme (2): openvswitch: Widen TCP flags handling. openvswitch: TCP flags matching support. Pravin B Shelar (6): openvswitch: Move flow table rehashing to flow install. openvswitch: Restructure datapath.c and flow.c openvswitch: Move mega-flow list out of rehashing struct. openvswitch: Simplify mega-flow APIs. openvswitch: Enable all GSO features on internal port. openvswitch: Use flow hash during flow lookup operation. Wei Yongjun (2): openvswitch: remove duplicated include from vport-vxlan.c openvswitch: remove duplicated include from vport-gre.c include/uapi/linux/openvswitch.h | 18 +- net/openvswitch/Makefile | 2 + net/openvswitch/datapath.c | 668 ++------------ net/openvswitch/datapath.h | 9 +- net/openvswitch/flow.c | 1605 +-------------------------------- net/openvswitch/flow.h | 132 +-- net/openvswitch/flow_netlink.c | 1630 ++++++++++++++++++++++++++++++++++ net/openvswitch/flow_netlink.h | 60 ++ net/openvswitch/flow_table.c | 592 ++++++++++++ net/openvswitch/flow_table.h | 81 ++ net/openvswitch/vport-gre.c | 2 - net/openvswitch/vport-internal_dev.c | 2 +- net/openvswitch/vport-vxlan.c | 1 - 13 files changed, 2511 insertions(+), 2291 deletions(-) create mode 100644 net/openvswitch/flow_netlink.c create mode 100644 net/openvswitch/flow_netlink.h create mode 100644 net/openvswitch/flow_table.c create mode 100644 net/openvswitch/flow_table.h ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [GIT net-next] Open vSwitch 2013-11-02 7:43 Jesse Gross @ 2013-11-04 21:26 ` David Miller 0 siblings, 0 replies; 54+ messages in thread From: David Miller @ 2013-11-04 21:26 UTC (permalink / raw) To: jesse; +Cc: netdev, dev From: Jesse Gross <jesse@nicira.com> Date: Sat, 2 Nov 2013 00:43:39 -0700 > A set of updates for net-next/3.13. Major changes are: > * Restructure flow handling code to be more logically organized and > easier to read. > * Rehashing of the flow table is moved from a workqueue to flow > installation time. Before, heavy load could block the workqueue for > excessive periods of time. > * Additional debugging information is provided to help diagnose megaflows. > * It's now possible to match on TCP flags. Looks good, pulled, thanks Jesse. ^ permalink raw reply [flat|nested] 54+ messages in thread
* [GIT net-next] Open vSwitch @ 2013-10-30 0:22 Jesse Gross 0 siblings, 0 replies; 54+ messages in thread From: Jesse Gross @ 2013-10-30 0:22 UTC (permalink / raw) To: David Miller; +Cc: netdev, dev A set of updates for net-next/3.13. Major changes are: * Restructure flow handling code to be more logically organized and easier to read. * Previously flow state was effectively per-CPU but this is no longer true with the addition of wildcarded flows (megaflows). While good for flow setup rates, it is bad for stats updates. Stats are now per-CPU again to get the best of both worlds. * Rehashing of the flow table is moved from a workqueue to flow installation time. Before, heavy load could block the workqueue for excessive periods of time. * Additional debugging information is provided to help diagnose megaflows. * It's now possible to match on TCP flags. The following changes since commit 272b98c6455f00884f0350f775c5342358ebb73f: Linux 3.12-rc1 (2013-09-16 16:17:51 -0400) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/jesse/openvswitch.git master for you to fetch changes up to c7e8b9659587449b21ee68d7aee0cacadf650cce: openvswitch: TCP flags matching support. (2013-10-23 02:19:50 -0700) ---------------------------------------------------------------- Andy Zhou (1): openvswitch: collect mega flow mask stats Jarno Rajahalme (2): openvswitch: Widen TCP flags handling. openvswitch: TCP flags matching support. Pravin B Shelar (6): openvswitch: Move flow table rehashing to flow install. openvswitch: Restructure datapath.c and flow.c openvswitch: Move mega-flow list out of rehashing struct. openvswitch: Simplify mega-flow APIs. openvswitch: Per cpu flow stats. openvswitch: Enable all GSO features on internal port. Wei Yongjun (2): openvswitch: remove duplicated include from vport-vxlan.c openvswitch: remove duplicated include from vport-gre.c include/uapi/linux/openvswitch.h | 18 +- net/openvswitch/Makefile | 2 + net/openvswitch/datapath.c | 721 ++------------- net/openvswitch/datapath.h | 9 +- net/openvswitch/flow.c | 1631 ++-------------------------------- net/openvswitch/flow.h | 148 +-- net/openvswitch/flow_netlink.c | 1630 +++++++++++++++++++++++++++++++++ net/openvswitch/flow_netlink.h | 60 ++ net/openvswitch/flow_table.c | 600 +++++++++++++ net/openvswitch/flow_table.h | 81 ++ net/openvswitch/vport-gre.c | 2 - net/openvswitch/vport-internal_dev.c | 2 +- net/openvswitch/vport-vxlan.c | 1 - 13 files changed, 2590 insertions(+), 2315 deletions(-) create mode 100644 net/openvswitch/flow_netlink.c create mode 100644 net/openvswitch/flow_netlink.h create mode 100644 net/openvswitch/flow_table.c create mode 100644 net/openvswitch/flow_table.h ^ permalink raw reply [flat|nested] 54+ messages in thread
* [GIT net-next] Open vSwitch @ 2013-08-27 20:20 Jesse Gross 2013-08-28 2:11 ` David Miller 0 siblings, 1 reply; 54+ messages in thread From: Jesse Gross @ 2013-08-27 20:20 UTC (permalink / raw) To: David Miller; +Cc: netdev, dev A number of significant new features and optimizations for net-next/3.12. Highlights are: * "Megaflows", an optimization that allows userspace to specify which flow fields were used to compute the results of the flow lookup. This allows for a major reduction in flow setups (the major performance bottleneck in Open vSwitch) without reducing flexibility. * Converting netlink dump operations to use RCU, allowing for additional parallelism in userspace. * Matching and modifying SCTP protocol fields. The following changes since commit 2771399ac9986c75437a83b1c723493cfcdfa439: fs_enet: cleanup clock API use (2013-08-22 22:13:54 -0700) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/jesse/openvswitch.git master for you to fetch changes up to 5828cd9a68873df1340b420371c02c47647878fb: openvswitch: optimize flow compare and mask functions (2013-08-27 13:13:09 -0700) ---------------------------------------------------------------- Andy Zhou (3): openvswitch: Mega flow implementation openvswitch: Rename key_len to key_end openvswitch: optimize flow compare and mask functions Cong Wang (1): openvswitch: check CONFIG_OPENVSWITCH_GRE in makefile Jiri Pirko (1): openvswitch:: link upper device for port devices Joe Stringer (2): net: Add NEXTHDR_SCTP to ipv6.h openvswitch: Add SCTP support Justin Pettit (1): openvswitch: Fix argument descriptions in vport.c. Pravin B Shelar (3): openvswitch: Use RCU lock for flow dump operation. openvswitch: Use RCU lock for dp dump operation. openvswitch: Use non rcu hlist_del() flow table entry. Documentation/networking/openvswitch.txt | 40 + include/net/ipv6.h | 1 + include/uapi/linux/openvswitch.h | 15 +- net/openvswitch/Kconfig | 1 + net/openvswitch/Makefile | 5 +- net/openvswitch/actions.c | 45 +- net/openvswitch/datapath.c | 176 ++-- net/openvswitch/datapath.h | 6 + net/openvswitch/flow.c | 1485 +++++++++++++++++++++--------- net/openvswitch/flow.h | 89 +- net/openvswitch/vport-gre.c | 3 - net/openvswitch/vport-netdev.c | 20 +- net/openvswitch/vport.c | 3 +- 13 files changed, 1346 insertions(+), 543 deletions(-) ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [GIT net-next] Open vSwitch 2013-08-27 20:20 Jesse Gross @ 2013-08-28 2:11 ` David Miller 0 siblings, 0 replies; 54+ messages in thread From: David Miller @ 2013-08-28 2:11 UTC (permalink / raw) To: jesse; +Cc: netdev, dev From: Jesse Gross <jesse@nicira.com> Date: Tue, 27 Aug 2013 13:20:37 -0700 > A number of significant new features and optimizations for net-next/3.12. > Highlights are: > * "Megaflows", an optimization that allows userspace to specify which > flow fields were used to compute the results of the flow lookup. > This allows for a major reduction in flow setups (the major > performance bottleneck in Open vSwitch) without reducing flexibility. > * Converting netlink dump operations to use RCU, allowing for > additional parallelism in userspace. > * Matching and modifying SCTP protocol fields. Pulled, thanks Jesse. ^ permalink raw reply [flat|nested] 54+ messages in thread
* [GIT net-next] Open vSwitch @ 2013-06-14 22:28 Jesse Gross 2013-06-14 22:34 ` David Miller 0 siblings, 1 reply; 54+ messages in thread From: Jesse Gross @ 2013-06-14 22:28 UTC (permalink / raw) To: David Miller; +Cc: dev-yBygre7rU0TnMu66kgdUjQ, netdev A few miscellaneous improvements and cleanups before the GRE tunnel integration series. Intended for net-next/3.11. The following changes since commit f722406faae2d073cc1d01063d1123c35425939e: Linux 3.10-rc1 (2013-05-11 17:14:08 -0700) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/jesse/openvswitch.git master for you to fetch changes up to 93d8fd1514b6862c3370ea92be3f3b4216e0bf8f: openvswitch: Simplify interface ovs_flow_metadata_from_nlattrs() (2013-06-14 15:09:12 -0700) ---------------------------------------------------------------- Andy Hill (1): openvswitch: Fix misspellings in comments and docs. Jesse Gross (2): openvswitch: Immediately exit on error in ovs_vport_cmd_set(). openvswitch: Remove unused get_config vport op. Lorand Jakab (1): openvswitch: fix variable names in comment Pravin B Shelar (4): openvswitch: Unify vport error stats handling. openvswitch: Fix struct comment. openvswitch: make skb->csum consistent with rest of networking stack. openvswitch: Simplify interface ovs_flow_metadata_from_nlattrs() include/uapi/linux/openvswitch.h | 1 - net/openvswitch/actions.c | 4 ++++ net/openvswitch/datapath.c | 17 ++++++++--------- net/openvswitch/flow.c | 29 +++++++++++++++-------------- net/openvswitch/flow.h | 4 ++-- net/openvswitch/vport-internal_dev.c | 1 + net/openvswitch/vport-netdev.c | 7 ++++--- net/openvswitch/vport-netdev.h | 1 - net/openvswitch/vport.c | 11 ++++++++--- net/openvswitch/vport.h | 13 +++++++++---- 10 files changed, 51 insertions(+), 37 deletions(-) ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [GIT net-next] Open vSwitch 2013-06-14 22:28 Jesse Gross @ 2013-06-14 22:34 ` David Miller 0 siblings, 0 replies; 54+ messages in thread From: David Miller @ 2013-06-14 22:34 UTC (permalink / raw) To: jesse; +Cc: netdev, dev From: Jesse Gross <jesse@nicira.com> Date: Fri, 14 Jun 2013 15:28:49 -0700 > A few miscellaneous improvements and cleanups before the GRE tunnel > integration series. Intended for net-next/3.11. ... > git://git.kernel.org/pub/scm/linux/kernel/git/jesse/openvswitch.git master Pulled, thanks Jesse. ^ permalink raw reply [flat|nested] 54+ messages in thread
* [GIT net-next] Open vSwitch @ 2013-03-15 17:38 Jesse Gross 2013-03-17 16:59 ` David Miller 0 siblings, 1 reply; 54+ messages in thread From: Jesse Gross @ 2013-03-15 17:38 UTC (permalink / raw) To: David Miller; +Cc: dev-yBygre7rU0TnMu66kgdUjQ, netdev-u79uwXL29TY76Z2rM5mHXA A couple of minor enhancements for net-next/3.10. The largest is an extension to allow variable length metadata to be passed to userspace with packets. There is a merge conflict in net/openvswitch/vport-internal_dev.c: A existing commit modifies internal_dev_mac_addr() and a new commit deletes it. The new one is correct, so you can just remove that function. The following changes since commit a5a81f0b9025867efb999d14a8dfc1907c5a4c3b: ipv6: Fix default route failover when CONFIG_IPV6_ROUTER_PREF=n (2012-12-03 15:34:47 -0500) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/jesse/openvswitch.git master for you to fetch changes up to 4490108b4a5ada14c7be712260829faecc814ae5: openvswitch: Allow OVS_USERSPACE_ATTR_USERDATA to be variable length. (2013-02-22 16:29:22 -0800) ---------------------------------------------------------------- Ben Pfaff (1): openvswitch: Allow OVS_USERSPACE_ATTR_USERDATA to be variable length. Jarno Rajahalme (2): linux/openvswitch.h: Make OVSP_LOCAL 32-bit. openvswitch: Change ENOENT return value to ENODEV in lookup_vport(). Thomas Graf (2): openvswitch: Use eth_mac_addr() instead of duplicating it openvswitch: Avoid useless holes in struct vport include/linux/openvswitch.h | 13 +++++++------ net/openvswitch/datapath.c | 13 +++++++------ net/openvswitch/datapath.h | 2 +- net/openvswitch/vport-internal_dev.c | 14 ++------------ net/openvswitch/vport.h | 4 ++-- 5 files changed, 19 insertions(+), 27 deletions(-) ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [GIT net-next] Open vSwitch 2013-03-15 17:38 Jesse Gross @ 2013-03-17 16:59 ` David Miller 0 siblings, 0 replies; 54+ messages in thread From: David Miller @ 2013-03-17 16:59 UTC (permalink / raw) To: jesse; +Cc: netdev, dev From: Jesse Gross <jesse@nicira.com> Date: Fri, 15 Mar 2013 10:38:46 -0700 > A couple of minor enhancements for net-next/3.10. The largest is an > extension to allow variable length metadata to be passed to userspace > with packets. > > There is a merge conflict in net/openvswitch/vport-internal_dev.c: > A existing commit modifies internal_dev_mac_addr() and a new commit > deletes it. The new one is correct, so you can just remove that function. Pulled, thanks Jesse. Thanks, in particular, for the heads up about the merge conflict. ^ permalink raw reply [flat|nested] 54+ messages in thread
* [GIT net-next] Open vSwitch @ 2012-11-29 18:35 Jesse Gross 2012-11-30 17:03 ` David Miller 0 siblings, 1 reply; 54+ messages in thread From: Jesse Gross @ 2012-11-29 18:35 UTC (permalink / raw) To: David Miller; +Cc: netdev, dev This series of improvements for 3.8/net-next contains four components: * Support for modifying IPv6 headers * Support for matching and setting skb->mark for better integration with things like iptables * Ability to recognize the EtherType for RARP packets * Two small performance enhancements The movement of ipv6_find_hdr() into exthdrs_core.c causes two small merge conflicts. I left it as is but can do the merge if you want. The conflicts are: * ipv6_find_hdr() and ipv6_find_tlv() were both moved to the bottom of exthdrs_core.c. Both should stay. * A new use of ipv6_find_hdr() was added to net/netfilter/ipvs/ip_vs_core.c after this patch. The IPVS user has two instances of the old constant name IP6T_FH_F_FRAG which has been renamed to IP6_FH_F_FRAG. The following changes since commit d04d382980c86bdee9960c3eb157a73f8ed230cc: openvswitch: Store flow key len if ARP opcode is not request or reply. (2012-10-30 17:17:09 -0700) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/jesse/openvswitch.git master for you to fetch changes up to 92eb1d477145b2e7780b5002e856f70b8c3d74da: openvswitch: Use RCU callback when detaching netdevices. (2012-11-28 14:04:34 -0800) ---------------------------------------------------------------- Ansis Atteka (3): ipv6: improve ipv6_find_hdr() to skip empty routing headers openvswitch: add ipv6 'set' action openvswitch: add skb mark matching and set action Jesse Gross (2): ipv6: Move ipv6_find_hdr() out of Netfilter code. openvswitch: Use RCU callback when detaching netdevices. Mehak Mahajan (1): openvswitch: Process RARP packets with ethertype 0x8035 similar to ARP packets. Shan Wei (1): net: openvswitch: use this_cpu_ptr per-cpu helper include/linux/netfilter_ipv6/ip6_tables.h | 9 --- include/linux/openvswitch.h | 1 + include/net/ipv6.h | 10 +++ net/ipv6/exthdrs_core.c | 123 +++++++++++++++++++++++++++++ net/ipv6/netfilter/ip6_tables.c | 103 ------------------------ net/netfilter/xt_HMARK.c | 8 +- net/openvswitch/actions.c | 97 +++++++++++++++++++++++ net/openvswitch/datapath.c | 27 ++++++- net/openvswitch/flow.c | 28 ++++++- net/openvswitch/flow.h | 8 +- net/openvswitch/vport-netdev.c | 14 +++- net/openvswitch/vport-netdev.h | 3 + net/openvswitch/vport.c | 5 +- 13 files changed, 304 insertions(+), 132 deletions(-) ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [GIT net-next] Open vSwitch 2012-11-29 18:35 Jesse Gross @ 2012-11-30 17:03 ` David Miller 0 siblings, 0 replies; 54+ messages in thread From: David Miller @ 2012-11-30 17:03 UTC (permalink / raw) To: jesse; +Cc: netdev, dev From: Jesse Gross <jesse@nicira.com> Date: Thu, 29 Nov 2012 10:35:42 -0800 > This series of improvements for 3.8/net-next contains four components: > * Support for modifying IPv6 headers > * Support for matching and setting skb->mark for better integration with > things like iptables > * Ability to recognize the EtherType for RARP packets > * Two small performance enhancements > > The movement of ipv6_find_hdr() into exthdrs_core.c causes two small merge > conflicts. I left it as is but can do the merge if you want. The conflicts > are: > * ipv6_find_hdr() and ipv6_find_tlv() were both moved to the bottom of > exthdrs_core.c. Both should stay. > * A new use of ipv6_find_hdr() was added to net/netfilter/ipvs/ip_vs_core.c > after this patch. The IPVS user has two instances of the old constant > name IP6T_FH_F_FRAG which has been renamed to IP6_FH_F_FRAG. Pulled, thanks Jesse. The merge conflict directions were particularly helpful. If you ever do the merge yourself (I'm ambivalent about where you or I do it), make sure you force the merge commit message to have a description of the conflict resolution similarly to what you provided here. Thanks again. ^ permalink raw reply [flat|nested] 54+ messages in thread
* [GIT net-next] Open vSwitch @ 2012-09-04 19:14 Jesse Gross [not found] ` <1346786049-3100-1-git-send-email-jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> 0 siblings, 1 reply; 54+ messages in thread From: Jesse Gross @ 2012-09-04 19:14 UTC (permalink / raw) To: David Miller; +Cc: dev-yBygre7rU0TnMu66kgdUjQ, netdev-u79uwXL29TY76Z2rM5mHXA Two feature additions to Open vSwitch for net-next/3.7. The following changes since commit 0d7614f09c1ebdbaa1599a5aba7593f147bf96ee: Linux 3.6-rc1 (2012-08-02 16:38:10 -0700) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/jesse/openvswitch.git master for you to fetch changes up to 15eac2a74277bc7de68a7c2a64a7c91b4b6f5961: openvswitch: Increase maximum number of datapath ports. (2012-09-03 19:20:49 -0700) ---------------------------------------------------------------- Pravin B Shelar (2): openvswitch: Add support for network namespaces. openvswitch: Increase maximum number of datapath ports. net/openvswitch/actions.c | 2 +- net/openvswitch/datapath.c | 375 +++++++++++++++++++++------------- net/openvswitch/datapath.h | 50 ++++- net/openvswitch/dp_notify.c | 8 +- net/openvswitch/flow.c | 11 +- net/openvswitch/flow.h | 3 +- net/openvswitch/vport-internal_dev.c | 7 +- net/openvswitch/vport-netdev.c | 2 +- net/openvswitch/vport.c | 23 ++- net/openvswitch/vport.h | 7 +- 10 files changed, 317 insertions(+), 171 deletions(-) ^ permalink raw reply [flat|nested] 54+ messages in thread
[parent not found: <1346786049-3100-1-git-send-email-jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org>]
* Re: [GIT net-next] Open vSwitch [not found] ` <1346786049-3100-1-git-send-email-jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> @ 2012-09-04 19:26 ` David Miller 0 siblings, 0 replies; 54+ messages in thread From: David Miller @ 2012-09-04 19:26 UTC (permalink / raw) To: jesse-l0M0P4e3n4LQT0dZR+AlfA Cc: dev-yBygre7rU0TnMu66kgdUjQ, netdev-u79uwXL29TY76Z2rM5mHXA From: Jesse Gross <jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> Date: Tue, 4 Sep 2012 12:14:07 -0700 > Two feature additions to Open vSwitch for net-next/3.7. > > The following changes since commit 0d7614f09c1ebdbaa1599a5aba7593f147bf96ee: > > Linux 3.6-rc1 (2012-08-02 16:38:10 -0700) > > are available in the git repository at: > > git://git.kernel.org/pub/scm/linux/kernel/git/jesse/openvswitch.git master > > for you to fetch changes up to 15eac2a74277bc7de68a7c2a64a7c91b4b6f5961: > > openvswitch: Increase maximum number of datapath ports. (2012-09-03 19:20:49 -0700) Pulled, thanks Jesse. ^ permalink raw reply [flat|nested] 54+ messages in thread
* [GIT net-next] Open vSwitch @ 2012-07-20 22:26 Jesse Gross [not found] ` <1342823210-3308-1-git-send-email-jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> 0 siblings, 1 reply; 54+ messages in thread From: Jesse Gross @ 2012-07-20 22:26 UTC (permalink / raw) To: David Miller; +Cc: dev-yBygre7rU0TnMu66kgdUjQ, netdev-u79uwXL29TY76Z2rM5mHXA A few bug fixes and small enhancements for net-next/3.6. The following changes since commit bf32fecdc1851ad9ca960f56771b798d17c26cf1: openvswitch: Add length check when retrieving TCP flags. (2012-04-02 14:28:57 -0700) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/jesse/openvswitch.git master for you to fetch changes up to efaac3bf087b1a6cec28f2a041e01c874d65390c: openvswitch: Fix typo in documentation. (2012-07-20 14:51:07 -0700) ---------------------------------------------------------------- Ansis Atteka (1): openvswitch: Do not send notification if ovs_vport_set_options() failed Ben Pfaff (1): openvswitch: Check gso_type for correct sk_buff in queue_gso_packets(). Jesse Gross (2): openvswitch: Enable retrieval of TCP flags from IPv6 traffic. openvswitch: Reset upper layer protocol info on internal devices. Leo Alterman (1): openvswitch: Fix typo in documentation. Pravin B Shelar (1): openvswitch: Check currect return value from skb_gso_segment() Raju Subramanian (1): openvswitch: Replace Nicira Networks. Documentation/networking/openvswitch.txt | 2 +- net/openvswitch/actions.c | 2 +- net/openvswitch/datapath.c | 13 ++++++++----- net/openvswitch/datapath.h | 2 +- net/openvswitch/dp_notify.c | 2 +- net/openvswitch/flow.c | 5 +++-- net/openvswitch/flow.h | 2 +- net/openvswitch/vport-internal_dev.c | 10 +++++++++- net/openvswitch/vport-internal_dev.h | 2 +- net/openvswitch/vport-netdev.c | 2 +- net/openvswitch/vport-netdev.h | 2 +- net/openvswitch/vport.c | 2 +- net/openvswitch/vport.h | 2 +- 13 files changed, 30 insertions(+), 18 deletions(-) ^ permalink raw reply [flat|nested] 54+ messages in thread
[parent not found: <1342823210-3308-1-git-send-email-jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org>]
* Re: [GIT net-next] Open vSwitch [not found] ` <1342823210-3308-1-git-send-email-jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> @ 2012-07-20 23:17 ` David Miller 0 siblings, 0 replies; 54+ messages in thread From: David Miller @ 2012-07-20 23:17 UTC (permalink / raw) To: jesse-l0M0P4e3n4LQT0dZR+AlfA Cc: dev-yBygre7rU0TnMu66kgdUjQ, netdev-u79uwXL29TY76Z2rM5mHXA From: Jesse Gross <jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> Date: Fri, 20 Jul 2012 15:26:43 -0700 > A few bug fixes and small enhancements for net-next/3.6. > > The following changes since commit bf32fecdc1851ad9ca960f56771b798d17c26cf1: > > openvswitch: Add length check when retrieving TCP flags. (2012-04-02 14:28:57 -0700) > > are available in the git repository at: > > git://git.kernel.org/pub/scm/linux/kernel/git/jesse/openvswitch.git master Pulled, thanks Jesse. ^ permalink raw reply [flat|nested] 54+ messages in thread
end of thread, other threads:[~2014-11-11 18:34 UTC | newest] Thread overview: 54+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-04-16 21:00 [GIT net-next] Open vSwitch Jesse Gross 2013-04-16 21:00 ` [PATCH net-next 01/10] openvswitch: Specify the minimal length of OVS_PACKET_ATTR_PACKET in the policy Jesse Gross [not found] ` <1366146019-9015-1-git-send-email-jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> 2013-04-16 21:00 ` [PATCH net-next 02/10] openvswitch: Use nla_memcpy() to memcpy() data from attributes Jesse Gross 2013-04-16 21:00 ` [PATCH net-next 03/10] openvswitch: Refine Netlink message size calculation and kill FLOW_BUFSIZE Jesse Gross 2013-04-16 21:00 ` [PATCH net-next 04/10] openvswitch: Move common genl notify code into ovs_notify() Jesse Gross 2013-04-16 21:00 ` [PATCH net-next 05/10] openvswitch: Use ETH_ALEN to define ethernet addresses Jesse Gross 2013-04-16 21:00 ` [PATCH net-next 06/10] openvswitch: Expose <linux/openvswitch.h> to userspace Jesse Gross 2013-04-16 21:00 ` [PATCH net-next 07/10] openvswitch: Don't insert empty OVS_VPORT_ATTR_OPTIONS attribute Jesse Gross 2013-04-16 21:00 ` [PATCH net-next 08/10] openvswitch: datapath.h: Fix a stale comment Jesse Gross 2013-04-16 21:00 ` [PATCH net-next 09/10] openvswitch: Simplify datapath locking Jesse Gross 2013-04-16 21:00 ` [PATCH net-next 10/10] openvswitch: Use generic struct pcpu_tstats Jesse Gross 2013-04-17 17:31 ` [GIT net-next] Open vSwitch David Miller -- strict thread matches above, loose matches on Subject: below -- 2014-11-10 3:58 Pravin B Shelar 2014-11-11 18:34 ` David Miller 2014-11-04 6:00 Pravin B Shelar 2014-11-05 20:10 ` David Miller 2014-11-05 22:52 ` Pravin Shelar 2014-09-11 22:01 Pravin B Shelar 2014-09-11 23:09 ` Pravin Shelar 2014-07-31 23:57 Pravin B Shelar 2014-08-02 22:16 ` David Miller 2014-08-03 19:20 ` Pravin Shelar 2014-08-04 4:21 ` David Miller 2014-08-04 19:35 ` Pravin Shelar 2014-08-04 19:42 ` David Miller 2014-08-06 22:55 ` Alexei Starovoitov 2014-08-13 13:34 ` Nicolas Dichtel 2014-07-14 0:12 Pravin B Shelar 2014-05-20 8:59 Pravin B Shelar 2014-05-23 18:46 ` David Miller [not found] ` <20140523.144618.48288319728715940.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org> 2014-05-23 20:16 ` Pravin Shelar 2014-05-16 21:07 Jesse Gross [not found] ` <1400274459-56304-1-git-send-email-jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> 2014-05-16 21:22 ` David Miller 2014-01-07 0:15 Jesse Gross [not found] ` <1389053776-62865-1-git-send-email-jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> 2014-01-07 0:49 ` David Miller 2014-01-08 14:49 ` [ovs-dev] " Zoltan Kiss [not found] ` <52CD657F.7080806-Sxgqhf6Nn4DQT0dZR+AlfA@public.gmane.org> 2014-01-08 15:10 ` Jesse Gross 2014-01-13 18:04 ` [ovs-dev] " Zoltan Kiss [not found] ` <52D42A9E.1030805-Sxgqhf6Nn4DQT0dZR+AlfA@public.gmane.org> 2014-01-14 0:31 ` Zoltan Kiss [not found] ` <52D4857C.7020902-Sxgqhf6Nn4DQT0dZR+AlfA@public.gmane.org> 2014-01-14 1:30 ` Jesse Gross [not found] ` <CAEP_g=8nG6AHV9Y+5=48nPhkf5Oe=mG8EiyaKSqN4omnmGhv4A-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 2014-01-14 9:46 ` Thomas Graf 2013-11-02 7:43 Jesse Gross 2013-11-04 21:26 ` David Miller 2013-10-30 0:22 Jesse Gross 2013-08-27 20:20 Jesse Gross 2013-08-28 2:11 ` David Miller 2013-06-14 22:28 Jesse Gross 2013-06-14 22:34 ` David Miller 2013-03-15 17:38 Jesse Gross 2013-03-17 16:59 ` David Miller 2012-11-29 18:35 Jesse Gross 2012-11-30 17:03 ` David Miller 2012-09-04 19:14 Jesse Gross [not found] ` <1346786049-3100-1-git-send-email-jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> 2012-09-04 19:26 ` David Miller 2012-07-20 22:26 Jesse Gross [not found] ` <1342823210-3308-1-git-send-email-jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> 2012-07-20 23:17 ` David Miller
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).