From patchwork Mon Dec 11 21:50:22 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gregory Rose X-Patchwork-Id: 847245 X-Patchwork-Delegate: jpettit@nicira.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="UoA5yoxo"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3ywc9J5686z9sxR for ; Tue, 12 Dec 2017 08:51:32 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 0E625D6C; Mon, 11 Dec 2017 21:50:59 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id D92C4D62 for ; Mon, 11 Dec 2017 21:50:57 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-pg0-f46.google.com (mail-pg0-f46.google.com [74.125.83.46]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 7012E4FF for ; Mon, 11 Dec 2017 21:50:57 +0000 (UTC) Received: by mail-pg0-f46.google.com with SMTP id b11so11874346pgu.13 for ; Mon, 11 Dec 2017 13:50:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=/Sg+92lJcLhFphPXeiMpZ04uha4XABF7n8tJa8BBxCc=; b=UoA5yoxom8jDzsNFCHnc4H8HqPQXwE1BvvGNxEALaw0FFMEH7bxzEblYksX9GToSWN kAtRls/3pEQcn1nrXXoVSXyh2IAbkWE8QHmswF+7P0L5HxnI6hjKlBP1a+WrIL8voUvs pLEDDT58BdZpBfmTLnIupR+X6RMBTzAxJoPrnm6r88lI31FlA8+EMo1//XE4jeqNVOru FDuAMkjyz90X5MnLQR5CH7f7ZpwIsVAf95EsT6s2o40Hpxs2OqLwl/aoCGQnCxnEviAi xXVKp1fwOHNavmyCQrfM50JaXxuw8+f0AwCgeLxN2rvJKNt7vbphSlsqzYdWFusYe+uk vMoA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=/Sg+92lJcLhFphPXeiMpZ04uha4XABF7n8tJa8BBxCc=; b=ksXSTecxO2PbYo2C9/uJuBf7Efceh3Ue4N20cfGBwM90hN1cRQEv6miP13fcBkPUOH aTNv4PkQ6Efol0jPRS5eqFWoSAiqwMRlct+RXVJ00rGii6GIxMQcBaCYjkJ7sFaoSePh NLn4VJHVqlIA9tCUkGoa7rhVNDjes5G6mzeAgl24fWxjb1zE4l4TjYbIxGDxltW+PmR/ kYLnCt1iVJJ/icaW6CyrFRb7pHc2u2n0qq59ofuvYisnYv3VuYwaTzyMzhjjJQlf4zU8 rtsSC+Q5tKbUfgoFJQOFoB47avRWFNvzud9WS0sfftk84QjJIPuWGE6USWdAGx49B0eJ BYkA== X-Gm-Message-State: AKGB3mK8e1/ECGTcKHwu7FqlqFyZdhS4GClK/sgvVoW1nByvAnoQu0or 4UsJjaVuDQ6kMUArF5kiQBJhWsyL X-Google-Smtp-Source: ACJfBovTmvRj6XTMGvkxW/6F1TAKQaPbW1u+jokWYVCL44zcwHfwcka3bRZs9wiEY5i9CkMUX5aV4w== X-Received: by 10.84.240.70 with SMTP id h6mr1715980plt.349.1513029056660; Mon, 11 Dec 2017 13:50:56 -0800 (PST) Received: from gizo.domain (67-5-143-47.ptld.qwest.net. [67.5.143.47]) by smtp.gmail.com with ESMTPSA id c185sm25572799pfb.48.2017.12.11.13.50.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 13:50:55 -0800 (PST) From: Greg Rose To: dev@openvswitch.org Date: Mon, 11 Dec 2017 13:50:22 -0800 Message-Id: <1513029033-9087-2-git-send-email-gvrose8192@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1513029033-9087-1-git-send-email-gvrose8192@gmail.com> References: <1513029033-9087-1-git-send-email-gvrose8192@gmail.com> X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE autolearn=no version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: Christophe JAILLET Subject: [ovs-dev] [PATCH 01/12] datapath: Fix an error handling path in 'ovs_nla_init_match_and_action() X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org From: Christophe JAILLET Upstream commit: commit 5829e62ac17a40ab08c1b905565604a4b5fa7af6 Author: Christophe JAILLET Date: Mon Sep 11 21:56:20 2017 +0200 openvswitch: Fix an error handling path in 'ovs_nla_init_match_and_action()' All other error handling paths in this function go through the 'error' label. This one should do the same. Fixes: 9cc9a5cb176c ("datapath: Avoid using stack larger than 1024.") Signed-off-by: Christophe JAILLET Acked-by: Pravin B Shelar Signed-off-by: David S. Miller Cc: Christophe JAILLET Fixes: 850c2a4d1a ("datapath: Avoid using stack larger than 1024.") Signed-off-by: Greg Rose Reviewed-by: Yifeng Sun --- datapath/datapath.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/datapath/datapath.c b/datapath/datapath.c index 1780819..eeab72a 100644 --- a/datapath/datapath.c +++ b/datapath/datapath.c @@ -1136,7 +1136,8 @@ static int ovs_nla_init_match_and_action(struct net *net, if (!a[OVS_FLOW_ATTR_KEY]) { OVS_NLERR(log, "Flow key attribute not present in set flow."); - return -EINVAL; + error = -EINVAL; + goto error; } *acts = get_flow_actions(net, a[OVS_FLOW_ATTR_ACTIONS], key, From patchwork Mon Dec 11 21:50:23 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gregory Rose X-Patchwork-Id: 847247 X-Patchwork-Delegate: jpettit@nicira.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Uf2lLz1s"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3ywc9z21jJz9sxR for ; Tue, 12 Dec 2017 08:52:07 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id E26F2D74; Mon, 11 Dec 2017 21:51:00 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 39EFED63 for ; Mon, 11 Dec 2017 21:51:00 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-pf0-f195.google.com (mail-pf0-f195.google.com [209.85.192.195]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 9A8234FF for ; Mon, 11 Dec 2017 21:50:59 +0000 (UTC) Received: by mail-pf0-f195.google.com with SMTP id a90so12578413pfk.1 for ; Mon, 11 Dec 2017 13:50:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=gID9+aaywzRd6qnQlsKxBh2go0BAJWvzEbObftscqzg=; b=Uf2lLz1sY+3kydRQtu6pg8PjlEbDncIrV/gGq4dvTbLXApSSLnvAIy8q3A7yOBgldm nyuBS113tVQOQ4ZALp4e0iv3eu0q5FT2JoDMIeYomxbS2sr1CN5TTSalkKWvG0s/S+N7 +JKzrHrvZWJPBqnp/VUOWlPA3g6E0BbTHrqts9dkO96/4Y6vcDUHUHOIRQlH5lI4JxAi zE0MSrF87aPKpxWR680p1dGIE6rlKOZaxGsqvoljatooF45ourA7Rspm4RBR/38CASDS 1/Dt8SOB/Yv65BAdxZaHP02ROZ0CLc1puzERXT3wUWVr2AQnZjGapfIrFdc5fC1WmYd1 yxSQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=gID9+aaywzRd6qnQlsKxBh2go0BAJWvzEbObftscqzg=; b=M/PcTyWXnY3jwWMOqUB06ImeJfAjFmDGBQJhG8xcg4PRXuHAzhMEVvEpXcUFCuiHwr 9LmBnbT7kfuypV6lUSWIfROSup0AZXAInpAt7xiBwi8pIknfzHAldBX11UIVDNozaJ4P dclAhaRH304uwfFSZeOF/JQrPNbfk9ebnMy97byoBX/Z2BF08h/NtPDV871mwjqXeZb7 6uxLO2tgM+1JteZqUuKLRkvD4cAPXhcxoYASHsam5P2b5t5ZyadKxCmfSe6G3IIkdtYi bVVy0FO2fwP6RSmrqk7h5l4dXY/FyL5zWSzXymnqffPhkBZgYtpPnHAofuwgEE0FgIxw SeIg== X-Gm-Message-State: AKGB3mLbr4nRdZmQ9UsmHhuSzsX/g8OLXCyQ/4s0vwsD/XA8KBaUZD1r rXhwHNDaL2cc8m2PWY2HR5iVZJ09 X-Google-Smtp-Source: ACJfBotYbpflW30lNVggvC9NmHGItN6IMrGEE2HgU/4kNLMd4yHULC/JPpPbPfrhI/lFM7pwTGkN8Q== X-Received: by 10.159.244.14 with SMTP id x14mr1680021plr.412.1513029058662; Mon, 11 Dec 2017 13:50:58 -0800 (PST) Received: from gizo.domain (67-5-143-47.ptld.qwest.net. [67.5.143.47]) by smtp.gmail.com with ESMTPSA id c185sm25572799pfb.48.2017.12.11.13.50.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 13:50:57 -0800 (PST) From: Greg Rose To: dev@openvswitch.org Date: Mon, 11 Dec 2017 13:50:23 -0800 Message-Id: <1513029033-9087-3-git-send-email-gvrose8192@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1513029033-9087-1-git-send-email-gvrose8192@gmail.com> References: <1513029033-9087-1-git-send-email-gvrose8192@gmail.com> X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE autolearn=no version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: Jiri Benc Subject: [ovs-dev] [PATCH 02/12] datapath: reliable interface indentification in port dumps X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org From: Jiri Benc Upstream commit: commit 9354d452034273a50a4fd703bea31e5d6b1fc20b Author: Jiri Benc Date: Thu Nov 2 17:04:37 2017 -0200 openvswitch: reliable interface indentification in port dumps This patch allows reliable identification of netdevice interfaces connected to openvswitch bridges. In particular, user space queries the netdev interfaces belonging to the ports for statistics, up/down state, etc. Datapath dump needs to provide enough information for the user space to be able to do that. Currently, only interface names are returned. This is not sufficient, as openvswitch allows its ports to be in different name spaces and the interface name is valid only in its name space. What is needed and generally used in other netlink APIs, is the pair ifindex+netnsid. The solution is addition of the ifindex+netnsid pair (or only ifindex if in the same name space) to vport get/dump operation. On request side, ideally the ifindex+netnsid pair could be used to get/set/del the corresponding vport. This is not implemented by this patch and can be added later if needed. Signed-off-by: Jiri Benc Signed-off-by: David S. Miller Cc: Jiri Benc Signed-off-by: Greg Rose --- acinclude.m4 | 3 ++ datapath/datapath.c | 49 +++++++++++++++++------ datapath/datapath.h | 4 +- datapath/dp_notify.c | 3 +- datapath/linux/compat/include/linux/openvswitch.h | 2 + 5 files changed, 45 insertions(+), 16 deletions(-) diff --git a/acinclude.m4 b/acinclude.m4 index 1179a40..30a2103 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -785,6 +785,9 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [ OVS_FIND_FIELD_IFELSE([$KSRC/include/linux/netfilter.h], [nf_hook_ops], [list], [OVS_DEFINE([HAVE_LIST_IN_NF_HOOK_OPS])]) + OVS_GREP_IFELSE([$KSRC/include/net/net_namespace.h], + [EXPORT_SYMBOL_GPL(peernet2id_alloc)], + [OVS_DEFINE([HAVE_PEERNET2ID_ALLOC])]) if cmp -s datapath/linux/kcompat.h.new \ datapath/linux/kcompat.h >/dev/null 2>&1; then diff --git a/datapath/datapath.c b/datapath/datapath.c index eeab72a..6a795b1 100644 --- a/datapath/datapath.c +++ b/datapath/datapath.c @@ -1873,7 +1873,8 @@ static struct genl_family dp_datapath_genl_family __ro_after_init = { /* 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) + struct net *net, u32 portid, u32 seq, + u32 flags, u8 cmd) { struct ovs_header *ovs_header; struct ovs_vport_stats vport_stats; @@ -1889,9 +1890,19 @@ static int ovs_vport_cmd_fill_info(struct vport *vport, struct sk_buff *skb, if (nla_put_u32(skb, OVS_VPORT_ATTR_PORT_NO, vport->port_no) || nla_put_u32(skb, OVS_VPORT_ATTR_TYPE, vport->ops->type) || nla_put_string(skb, OVS_VPORT_ATTR_NAME, - ovs_vport_name(vport))) + ovs_vport_name(vport)) || + nla_put_u32(skb, OVS_VPORT_ATTR_IFINDEX, vport->dev->ifindex)) goto nla_put_failure; +#ifdef HAVE_PEERNET2ID_ALLOC + if (!net_eq(net, dev_net(vport->dev))) { + int id = peernet2id_alloc(net, dev_net(vport->dev)); + + if (nla_put_s32(skb, OVS_VPORT_ATTR_NETNSID, id)) + goto nla_put_failure; + } + +#endif ovs_vport_get_stats(vport, &vport_stats); if (nla_put_64bit(skb, OVS_VPORT_ATTR_STATS, sizeof(struct ovs_vport_stats), &vport_stats, @@ -1921,8 +1932,8 @@ static struct sk_buff *ovs_vport_cmd_alloc_info(void) } /* Called with ovs_mutex, only via ovs_dp_notify_wq(). */ -struct sk_buff *ovs_vport_cmd_build_info(struct vport *vport, u32 portid, - u32 seq, u8 cmd) +struct sk_buff *ovs_vport_cmd_build_info(struct vport *vport, struct net *net, + u32 portid, u32 seq, u8 cmd) { struct sk_buff *skb; int retval; @@ -1931,7 +1942,7 @@ struct sk_buff *ovs_vport_cmd_build_info(struct vport *vport, u32 portid, if (!skb) return ERR_PTR(-ENOMEM); - retval = ovs_vport_cmd_fill_info(vport, skb, portid, seq, 0, cmd); + retval = ovs_vport_cmd_fill_info(vport, skb, net, portid, seq, 0, cmd); BUG_ON(retval < 0); return skb; @@ -1945,6 +1956,8 @@ static struct vport *lookup_vport(struct net *net, struct datapath *dp; struct vport *vport; + if (a[OVS_VPORT_ATTR_IFINDEX]) + return ERR_PTR(-EOPNOTSUPP); if (a[OVS_VPORT_ATTR_NAME]) { vport = ovs_vport_locate(net, nla_data(a[OVS_VPORT_ATTR_NAME])); if (!vport) @@ -1969,6 +1982,7 @@ static struct vport *lookup_vport(struct net *net, return vport; } else return ERR_PTR(-EINVAL); + } /* Called with ovs_mutex */ @@ -2008,6 +2022,8 @@ static int ovs_vport_cmd_new(struct sk_buff *skb, struct genl_info *info) if (!a[OVS_VPORT_ATTR_NAME] || !a[OVS_VPORT_ATTR_TYPE] || !a[OVS_VPORT_ATTR_UPCALL_PID]) return -EINVAL; + if (a[OVS_VPORT_ATTR_IFINDEX]) + return -EOPNOTSUPP; port_no = a[OVS_VPORT_ATTR_PORT_NO] ? nla_get_u32(a[OVS_VPORT_ATTR_PORT_NO]) : 0; @@ -2057,8 +2073,9 @@ restart: goto exit_unlock_free; } - err = ovs_vport_cmd_fill_info(vport, reply, info->snd_portid, - info->snd_seq, 0, OVS_VPORT_CMD_NEW); + err = ovs_vport_cmd_fill_info(vport, reply, genl_info_net(info), + info->snd_portid, info->snd_seq, 0, + OVS_VPORT_CMD_NEW); BUG_ON(err < 0); if (netdev_get_fwd_headroom(vport->dev) > dp->max_headroom) @@ -2114,8 +2131,9 @@ static int ovs_vport_cmd_set(struct sk_buff *skb, struct genl_info *info) goto exit_unlock_free; } - err = ovs_vport_cmd_fill_info(vport, reply, info->snd_portid, - info->snd_seq, 0, OVS_VPORT_CMD_NEW); + err = ovs_vport_cmd_fill_info(vport, reply, genl_info_net(info), + info->snd_portid, info->snd_seq, 0, + OVS_VPORT_CMD_NEW); BUG_ON(err < 0); ovs_unlock(); @@ -2152,8 +2170,9 @@ static int ovs_vport_cmd_del(struct sk_buff *skb, struct genl_info *info) goto exit_unlock_free; } - err = ovs_vport_cmd_fill_info(vport, reply, info->snd_portid, - info->snd_seq, 0, OVS_VPORT_CMD_DEL); + err = ovs_vport_cmd_fill_info(vport, reply, genl_info_net(info), + info->snd_portid, info->snd_seq, 0, + OVS_VPORT_CMD_DEL); BUG_ON(err < 0); /* the vport deletion may trigger dp headroom update */ @@ -2194,8 +2213,9 @@ static int ovs_vport_cmd_get(struct sk_buff *skb, struct genl_info *info) err = PTR_ERR(vport); if (IS_ERR(vport)) goto exit_unlock_free; - err = ovs_vport_cmd_fill_info(vport, reply, info->snd_portid, - info->snd_seq, 0, OVS_VPORT_CMD_NEW); + err = ovs_vport_cmd_fill_info(vport, reply, genl_info_net(info), + info->snd_portid, info->snd_seq, 0, + OVS_VPORT_CMD_NEW); BUG_ON(err < 0); rcu_read_unlock(); @@ -2227,6 +2247,7 @@ static int ovs_vport_cmd_dump(struct sk_buff *skb, struct netlink_callback *cb) hlist_for_each_entry_rcu(vport, &dp->ports[i], dp_hash_node) { if (j >= skip && ovs_vport_cmd_fill_info(vport, skb, + sock_net(skb->sk), NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq, NLM_F_MULTI, @@ -2253,6 +2274,8 @@ static const struct nla_policy vport_policy[OVS_VPORT_ATTR_MAX + 1] = { [OVS_VPORT_ATTR_TYPE] = { .type = NLA_U32 }, [OVS_VPORT_ATTR_UPCALL_PID] = { .type = NLA_U32 }, [OVS_VPORT_ATTR_OPTIONS] = { .type = NLA_NESTED }, + [OVS_VPORT_ATTR_IFINDEX] = { .type = NLA_U32 }, + [OVS_VPORT_ATTR_NETNSID] = { .type = NLA_S32 }, }; static struct genl_ops dp_vport_genl_ops[] = { diff --git a/datapath/datapath.h b/datapath/datapath.h index 70ad0ac..1c73fb4 100644 --- a/datapath/datapath.h +++ b/datapath/datapath.h @@ -208,8 +208,8 @@ int ovs_dp_upcall(struct datapath *, struct sk_buff *, uint32_t cutlen); const char *ovs_dp_name(const struct datapath *dp); -struct sk_buff *ovs_vport_cmd_build_info(struct vport *, u32 pid, u32 seq, - u8 cmd); +struct sk_buff *ovs_vport_cmd_build_info(struct vport *vport, struct net *net, + u32 portid, u32 seq, u8 cmd); int ovs_execute_actions(struct datapath *dp, struct sk_buff *skb, const struct sw_flow_actions *, struct sw_flow_key *); diff --git a/datapath/dp_notify.c b/datapath/dp_notify.c index 424f35d..932a37e 100644 --- a/datapath/dp_notify.c +++ b/datapath/dp_notify.c @@ -31,7 +31,8 @@ static void dp_detach_port_notify(struct vport *vport) struct datapath *dp; dp = vport->dp; - notify = ovs_vport_cmd_build_info(vport, 0, 0, OVS_VPORT_CMD_DEL); + notify = ovs_vport_cmd_build_info(vport, ovs_dp_get_net(dp), + 0, 0, OVS_VPORT_CMD_DEL); ovs_dp_detach_port(vport); if (IS_ERR(notify)) { genl_set_err(&dp_vport_genl_family, ovs_dp_get_net(dp), 0, diff --git a/datapath/linux/compat/include/linux/openvswitch.h b/datapath/linux/compat/include/linux/openvswitch.h index 561f895..f28d140 100644 --- a/datapath/linux/compat/include/linux/openvswitch.h +++ b/datapath/linux/compat/include/linux/openvswitch.h @@ -283,6 +283,8 @@ enum ovs_vport_attr { /* receiving upcalls */ OVS_VPORT_ATTR_STATS, /* struct ovs_vport_stats */ OVS_VPORT_ATTR_PAD, + OVS_VPORT_ATTR_IFINDEX, + OVS_VPORT_ATTR_NETNSID, __OVS_VPORT_ATTR_MAX }; From patchwork Mon Dec 11 21:50:24 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gregory Rose X-Patchwork-Id: 847248 X-Patchwork-Delegate: jpettit@nicira.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="UqBv/HU9"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3ywcBh5mPZz9sxR for ; Tue, 12 Dec 2017 08:52:44 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id DA927D73; Mon, 11 Dec 2017 21:51:01 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 73EA5D7C for ; Mon, 11 Dec 2017 21:51:01 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-pf0-f193.google.com (mail-pf0-f193.google.com [209.85.192.193]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 10C5C4FF for ; Mon, 11 Dec 2017 21:51:00 +0000 (UTC) Received: by mail-pf0-f193.google.com with SMTP id e3so12557378pfi.10 for ; Mon, 11 Dec 2017 13:51:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ZraNeFGgwhHEZ6n0UaiNhizw6qB901k1RT1KnVH/5RY=; b=UqBv/HU9adXe3/6b9lslm3EiL7YHxxmRYDL/hRQxp93pWjh+E0u0BtJmQ1V+o50ES4 75YPyg/hLPP7yiQ2rQ0hu+LZ0NkwsNsgzDKrCPywX6qFLg9Ew3ThcLqCPo4X/eRESgat PBQ5GJ6z0sGeqQ5wn5s+pRUYgdXeTGI+D9p/PAt1kDAlkixrSMbotgm0DztBf+M++yLx gU0I+8a9FC9RwC7WVE7CdR6ovjaRU1jLw59vnTIb+9tJ+B7qhj33hPH6fArFXD+pbdQn gIiwUWXr4HLhjHq/I6d19qticymLcPieWCZR+Dt9GdJDMY0sxKjPUrjivQvnnVZN6dWq 8azA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ZraNeFGgwhHEZ6n0UaiNhizw6qB901k1RT1KnVH/5RY=; b=ofk8a4DUGRoqc5A1yEXhBMDVZrvFk8sFo2+7Dbu8yPP9GApSxYdUZSprIXozoPfBV/ j9ZQZrf9XWsesARBn46OFaw4gsVT8JI+zlsMNoAIwecSe+86HTbnoeJiXRTFc0gKV/28 6du9L6wabaS71oQNUFZl1ZYkJRclipbg4MFdWWpzKvsBJ4IULEMF8sTe4LJiSXCB7zUf 9AivzZfCx5LtG6n1qka4C4ziZHLCpXStmrVyqeQWVAJwZYO6hQIhbfi/+Nj/gtl3aqxI IPb0MDB+NbX+5lMQChiz7Yr8V2D5Oy95Dwo7s0rcOi4A1w0spTezq1yjyQBH7DCdK8y5 oiiQ== X-Gm-Message-State: AKGB3mKAtEw9dyKDMwG7O8E/jxpmn4FBE2mZXQVIPFf5z8zOUOFEUPN7 D5O8EWKZx8hn3gDvvEckaHmgHkX8 X-Google-Smtp-Source: ACJfBouotQBW+lwxxR7DEYC5/4I525eTBZerrQmGiVvGc3fcbO0C1D1Oi/z9Jliyxmte15WuXOsPvg== X-Received: by 10.99.171.13 with SMTP id p13mr4911pgf.30.1513029060254; Mon, 11 Dec 2017 13:51:00 -0800 (PST) Received: from gizo.domain (67-5-143-47.ptld.qwest.net. [67.5.143.47]) by smtp.gmail.com with ESMTPSA id c185sm25572799pfb.48.2017.12.11.13.50.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 13:50:59 -0800 (PST) From: Greg Rose To: dev@openvswitch.org Date: Mon, 11 Dec 2017 13:50:24 -0800 Message-Id: <1513029033-9087-4-git-send-email-gvrose8192@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1513029033-9087-1-git-send-email-gvrose8192@gmail.com> References: <1513029033-9087-1-git-send-email-gvrose8192@gmail.com> X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE autolearn=no version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Subject: [ovs-dev] [PATCH 03/12] datapath: export get_dp() API X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org From: Andy Zhou Upstream commit: commit 9602c01e57f7b868d748c2ba2aef0efa64b71ffc Author: Andy Zhou Date: Fri Nov 10 12:09:41 2017 -0800 openvswitch: export get_dp() API. Later patches will invoke get_dp() outside of datapath.c. Export it. Signed-off-by: Andy Zhou Signed-off-by: David S. Miller Cc: Andy Zhou Signed-off-by: Greg Rose --- datapath/datapath.c | 29 ----------------------------- datapath/datapath.h | 31 +++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 29 deletions(-) diff --git a/datapath/datapath.c b/datapath/datapath.c index 6a795b1..884df02 100644 --- a/datapath/datapath.c +++ b/datapath/datapath.c @@ -145,35 +145,6 @@ static int queue_userspace_packet(struct datapath *dp, struct sk_buff *, const struct dp_upcall_info *, uint32_t cutlen); -/* Must be called with rcu_read_lock. */ -static struct datapath *get_dp_rcu(struct net *net, int dp_ifindex) -{ - struct net_device *dev = dev_get_by_index_rcu(net, dp_ifindex); - - if (dev) { - struct vport *vport = ovs_internal_dev_get_vport(dev); - if (vport) - return vport->dp; - } - - return NULL; -} - -/* The caller must hold either ovs_mutex or rcu_read_lock to keep the - * returned dp pointer valid. - */ -static inline struct datapath *get_dp(struct net *net, int dp_ifindex) -{ - struct datapath *dp; - - WARN_ON_ONCE(!rcu_read_lock_held() && !lockdep_ovsl_is_held()); - rcu_read_lock(); - dp = get_dp_rcu(net, dp_ifindex); - rcu_read_unlock(); - - return dp; -} - /* Must be called with rcu_read_lock or ovs_mutex. */ const char *ovs_dp_name(const struct datapath *dp) { diff --git a/datapath/datapath.h b/datapath/datapath.h index 1c73fb4..7481d6d 100644 --- a/datapath/datapath.h +++ b/datapath/datapath.h @@ -31,6 +31,7 @@ #include "compat.h" #include "flow.h" #include "flow_table.h" +#include "vport-internal_dev.h" #define DP_MAX_PORTS USHRT_MAX #define DP_VPORT_HASH_BUCKETS 1024 @@ -197,6 +198,36 @@ static inline struct vport *ovs_vport_ovsl(const struct datapath *dp, int port_n return ovs_lookup_vport(dp, port_no); } +/* Must be called with rcu_read_lock. */ +static inline struct datapath *get_dp_rcu(struct net *net, int dp_ifindex) +{ + struct net_device *dev = dev_get_by_index_rcu(net, dp_ifindex); + + if (dev) { + struct vport *vport = ovs_internal_dev_get_vport(dev); + + if (vport) + return vport->dp; + } + + return NULL; +} + +/* The caller must hold either ovs_mutex or rcu_read_lock to keep the + * returned dp pointer valid. + */ +static inline struct datapath *get_dp(struct net *net, int dp_ifindex) +{ + struct datapath *dp; + + WARN_ON_ONCE(!rcu_read_lock_held() && !lockdep_ovsl_is_held()); + rcu_read_lock(); + dp = get_dp_rcu(net, dp_ifindex); + rcu_read_unlock(); + + return dp; +} + extern struct notifier_block ovs_dp_device_notifier; extern struct genl_family dp_vport_genl_family; extern struct genl_multicast_group ovs_dp_vport_multicast_group; From patchwork Mon Dec 11 21:50:25 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gregory Rose X-Patchwork-Id: 847249 X-Patchwork-Delegate: jpettit@nicira.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="nxrLnqES"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3ywcCM28nxz9sxR for ; Tue, 12 Dec 2017 08:53:19 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id B3EB8D84; Mon, 11 Dec 2017 21:51:04 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 0EC34D7C for ; Mon, 11 Dec 2017 21:51:03 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-pf0-f195.google.com (mail-pf0-f195.google.com [209.85.192.195]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id BAE4D50A for ; Mon, 11 Dec 2017 21:51:02 +0000 (UTC) Received: by mail-pf0-f195.google.com with SMTP id m26so12562971pfj.11 for ; Mon, 11 Dec 2017 13:51:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ueK7LHu3xVmRWozp6sLVFQ9tqdRbOP4NVAUCxMUPe8U=; b=nxrLnqESJ7Gobqfc/khRQRGzGa56gt4ABPkJuajnhfuhqQjBR2E2aipBc76hbMbpRH JjUh1QZNuz13qeRJtopX5aPeHKMHmaJ1vHzXuYNzJfapTmofofy4gKieUBOtAKI/8d2V LRDsfv5P5fCFlyqZOv35Oiyc9bW/EyudYb2iF9awBLrz9VnOH8c8FUFrntblYrUnZWLp +bChlNOJQVHiRbYyancMTclhiwsYGAMHFMdIiCuQro4ruKNO0ljR6hKnb2fqw6XrSsaq fey+0Qggn5Is+NbM1AKR/TIkVZ77T3agAWL5TCV8iLSbh6CqCIkLyuljM76SUZeqoDA/ cBAQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ueK7LHu3xVmRWozp6sLVFQ9tqdRbOP4NVAUCxMUPe8U=; b=G5jS/EzCauj7zlk1bgUkToGX45KnVCCnF4xongeHhmY60qfqHf3CPLBwN/sLEkTItb sj7pRhoJwk3KCkJvd7Sewss/B4VTTK9zgOCRwAbUSMZuf3Urc0umazaD2ubsEU8Sr6pz e7PRHLISNMv135yxrcMdjPJjvZPpBfr/Zts4Ts0Z/VjkI9girwba8AOf7tUzC1GjvizJ ANt0dvYfxbtgRykDspS6Z84IhmIkfGNY+5KgzfGO7Sr2+Zlu+VEIXWCvGRbI9uDEvOdj 2RdvU6HAF9dJ8tc5t2jswqBpzqU2+LA7oiqR3s1UFQ2UbyimgihCnzhrQo7H8uM+toXb Ljtg== X-Gm-Message-State: AKGB3mJo0uputpKIBbXgFRVE9dL4rA36qNQe8R+wQToVK0RTSW+nERoC 7eZBB2Uo3MtKa20E1nL2dflUSVpV X-Google-Smtp-Source: ACJfBosQV/JeQYc71vdUrOKDXqk7Y8rwhrFLPvAVf+IlwbUrAPXcGp777FXjz5/jkuT6v2Z5j/QCgA== X-Received: by 10.99.189.65 with SMTP id d1mr203pgp.104.1513029061948; Mon, 11 Dec 2017 13:51:01 -0800 (PST) Received: from gizo.domain (67-5-143-47.ptld.qwest.net. [67.5.143.47]) by smtp.gmail.com with ESMTPSA id c185sm25572799pfb.48.2017.12.11.13.51.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 13:51:00 -0800 (PST) From: Greg Rose To: dev@openvswitch.org Date: Mon, 11 Dec 2017 13:50:25 -0800 Message-Id: <1513029033-9087-5-git-send-email-gvrose8192@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1513029033-9087-1-git-send-email-gvrose8192@gmail.com> References: <1513029033-9087-1-git-send-email-gvrose8192@gmail.com> X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE autolearn=no version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Subject: [ovs-dev] [PATCH 04/12] datapath: Add meter netlink definitions X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org From: Andy Zhou Upstream commit: commit 5794040647de4011598a6d005fdad95d24fd385b Author: Andy Zhou Date: Fri Nov 10 12:09:40 2017 -0800 openvswitch: Add meter netlink definitions Meter has its own netlink family. Define netlink messages and attributes for communicating with the user space programs. Signed-off-by: Andy Zhou Signed-off-by: David S. Miller Cc: Andy Zhou Signed-off-by: Greg Rose --- datapath/linux/compat/include/linux/openvswitch.h | 51 +++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/datapath/linux/compat/include/linux/openvswitch.h b/datapath/linux/compat/include/linux/openvswitch.h index f28d140..58d888f 100644 --- a/datapath/linux/compat/include/linux/openvswitch.h +++ b/datapath/linux/compat/include/linux/openvswitch.h @@ -947,4 +947,55 @@ enum ovs_action_attr { #define OVS_ACTION_ATTR_MAX (__OVS_ACTION_ATTR_MAX - 1) +/* Meters. */ +#define OVS_METER_FAMILY "ovs_meter" +#define OVS_METER_MCGROUP "ovs_meter" +#define OVS_METER_VERSION 0x1 + +enum ovs_meter_cmd { + OVS_METER_CMD_UNSPEC, + OVS_METER_CMD_FEATURES, /* Get features supported by the datapath. */ + OVS_METER_CMD_SET, /* Add or modify a meter. */ + OVS_METER_CMD_DEL, /* Delete a meter. */ + OVS_METER_CMD_GET /* Get meter stats. */ +}; + +enum ovs_meter_attr { + OVS_METER_ATTR_UNSPEC, + OVS_METER_ATTR_ID, /* u32 meter ID within datapath. */ + OVS_METER_ATTR_KBPS, /* No argument. If set, units in kilobits + * per second. Otherwise, units in + * packets per second. + */ + OVS_METER_ATTR_STATS, /* struct ovs_flow_stats for the meter. */ + OVS_METER_ATTR_BANDS, /* Nested attributes for meter bands. */ + OVS_METER_ATTR_USED, /* u64 msecs last used in monotonic time. */ + OVS_METER_ATTR_CLEAR, /* Flag to clear stats, used. */ + OVS_METER_ATTR_MAX_METERS, /* u32 number of meters supported. */ + OVS_METER_ATTR_MAX_BANDS, /* u32 max number of bands per meter. */ + OVS_METER_ATTR_PAD, + __OVS_METER_ATTR_MAX +}; + +#define OVS_METER_ATTR_MAX (__OVS_METER_ATTR_MAX - 1) + +enum ovs_band_attr { + OVS_BAND_ATTR_UNSPEC, + OVS_BAND_ATTR_TYPE, /* u32 OVS_METER_BAND_TYPE_* constant. */ + OVS_BAND_ATTR_RATE, /* u32 band rate in meter units (see above). */ + OVS_BAND_ATTR_BURST, /* u32 burst size in meter units. */ + OVS_BAND_ATTR_STATS, /* struct ovs_flow_stats for the band. */ + __OVS_BAND_ATTR_MAX +}; + +#define OVS_BAND_ATTR_MAX (__OVS_BAND_ATTR_MAX - 1) + +enum ovs_meter_band_type { + OVS_METER_BAND_TYPE_UNSPEC, + OVS_METER_BAND_TYPE_DROP, /* Drop exceeding packets. */ + __OVS_METER_BAND_TYPE_MAX +}; + +#define OVS_METER_BAND_TYPE_MAX (__OVS_METER_BAND_TYPE_MAX - 1) + #endif /* _LINUX_OPENVSWITCH_H */ From patchwork Mon Dec 11 21:50:26 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gregory Rose X-Patchwork-Id: 847250 X-Patchwork-Delegate: jpettit@nicira.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="JNC4sdwJ"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3ywcD871mcz9sxR for ; Tue, 12 Dec 2017 08:54:00 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id CD006D93; Mon, 11 Dec 2017 21:51:07 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 0AE9ED7D for ; Mon, 11 Dec 2017 21:51:06 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-pf0-f193.google.com (mail-pf0-f193.google.com [209.85.192.193]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id B6C504FF for ; Mon, 11 Dec 2017 21:51:04 +0000 (UTC) Received: by mail-pf0-f193.google.com with SMTP id c204so12560906pfc.13 for ; Mon, 11 Dec 2017 13:51:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=/wukl7t9nRh9lNjkJu+mb/7xZK622fdx3SR/9gUR08E=; b=JNC4sdwJLpZL3Jnucj6o0LYPxPvyN6Z4yCYK2v9HPeK1ez2FT6wHU1QdJCp+soQVlN d8pGhe31r8rXbdtLefv6708MYHynitg3JYzXN/KKWnRWe6XECWMA+WNRczzTJnX398wc d93CEPFf/wlhYmNA2TeQosc3lxSvj+hHG7oAyfD6pdusZfuJQ6Zg1LC67RBVUGdGnWBr 2mO+A7n/oWi92XijpUNqPFvO+16rSeUM3HMdiJJn0ZHrvTElqymfth8L61h07r3lEWb9 aUPVcvhBUpulX03owFkFjcmgpHOV8tRlz3Cwx/vDDDWnCZhO943A9xQAcPTd1YSHMjA6 e1hQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=/wukl7t9nRh9lNjkJu+mb/7xZK622fdx3SR/9gUR08E=; b=EVMS1cAD0z9mIv14eLU0k7WTxmytxBb03pC8HGcrWGfgOuxSJugGdTmwght+as4OwO tXK1d8PGH9VyBUa9gxa/Tzf9qmsMmlrjkbGAIUGG61yTURaMk6tvp0ZdjBrEr66x7R7K wwLLXXp4K71/Fa629khH7OTiAvxrqGQYhaBpD5HWzeBfliBvjdL0DCG9Hrhmkww4Hy7m rSKSWnCi3hivnlTFgKQFDWpEiIYVbO6y565c5XCPE+NuC/xRJl5nJen1rwnHCwz6qzfZ 3Dj+9enFTxGkR9UAlWqq688ugUHHMu93y5vQl3t41lNrJOXm5wA1fbkBlb4lC0a4nDG4 HGAQ== X-Gm-Message-State: AKGB3mKAxKtJwAH5O3Z6eLBLBvhpJ4qIwhEoxZ1ll8z/QF5CH0WqkYDb Lb4bHXZtDs4JXf9i9aPIeClJGdOd X-Google-Smtp-Source: ACJfBot3h1d7I+P6IcDRE8TTPEvPKLUPODSee3Abjk6GueEsaAmB/+Rk7O06LuV1Prz4eYWLbbJ9yA== X-Received: by 10.99.51.196 with SMTP id z187mr1526019pgz.178.1513029063562; Mon, 11 Dec 2017 13:51:03 -0800 (PST) Received: from gizo.domain (67-5-143-47.ptld.qwest.net. [67.5.143.47]) by smtp.gmail.com with ESMTPSA id c185sm25572799pfb.48.2017.12.11.13.51.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 13:51:02 -0800 (PST) From: Greg Rose To: dev@openvswitch.org Date: Mon, 11 Dec 2017 13:50:26 -0800 Message-Id: <1513029033-9087-6-git-send-email-gvrose8192@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1513029033-9087-1-git-send-email-gvrose8192@gmail.com> References: <1513029033-9087-1-git-send-email-gvrose8192@gmail.com> X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE autolearn=no version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Subject: [ovs-dev] [PATCH 05/12] datapath: Add meter infrastructure X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org From: Andy Zhou Upstream commit: commit 96fbc13d7e770b542d2d1fcf700d0baadc6e8063 Author: Andy Zhou Date: Fri Nov 10 12:09:42 2017 -0800 openvswitch: Add meter infrastructure OVS kernel datapath so far does not support Openflow meter action. This is the first stab at adding kernel datapath meter support. This implementation supports only drop band type. Signed-off-by: Andy Zhou Signed-off-by: David S. Miller Added a compat layer fixup for nla_parse. Cc: Andy Zhou Signed-off-by: Greg Rose --- datapath/Modules.mk | 6 +- datapath/datapath.c | 14 +- datapath/datapath.h | 3 + datapath/linux/compat/include/net/netlink.h | 9 + datapath/meter.c | 604 ++++++++++++++++++++++++++++ datapath/meter.h | 54 +++ 6 files changed, 686 insertions(+), 4 deletions(-) create mode 100644 datapath/meter.c create mode 100644 datapath/meter.h diff --git a/datapath/Modules.mk b/datapath/Modules.mk index 21f04a0..a9e2880 100644 --- a/datapath/Modules.mk +++ b/datapath/Modules.mk @@ -26,7 +26,8 @@ openvswitch_sources = \ flow_table.c \ vport.c \ vport-internal_dev.c \ - vport-netdev.c + vport-netdev.c \ + meter.c vport_geneve_sources = vport-geneve.c vport_vxlan_sources = vport-vxlan.c @@ -43,7 +44,8 @@ openvswitch_headers = \ flow_table.h \ vport.h \ vport-internal_dev.h \ - vport-netdev.h + vport-netdev.h \ + meter.h dist_sources = $(foreach module,$(dist_modules),$($(module)_sources)) dist_headers = $(foreach module,$(dist_modules),$($(module)_headers)) diff --git a/datapath/datapath.c b/datapath/datapath.c index 884df02..eff9f85 100644 --- a/datapath/datapath.c +++ b/datapath/datapath.c @@ -57,6 +57,7 @@ #include "flow.h" #include "flow_table.h" #include "flow_netlink.h" +#include "meter.h" #include "gso.h" #include "vport-internal_dev.h" #include "vport-netdev.h" @@ -177,6 +178,7 @@ static void destroy_dp_rcu(struct rcu_head *rcu) ovs_flow_tbl_destroy(&dp->table); free_percpu(dp->stats_percpu); kfree(dp->ports); + ovs_meters_exit(dp); kfree(dp); } @@ -1598,6 +1600,10 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info) for (i = 0; i < DP_VPORT_HASH_BUCKETS; i++) INIT_HLIST_HEAD(&dp->ports[i]); + err = ovs_meters_init(dp); + if (err) + goto err_destroy_ports_array; + /* Set up our datapath device. */ parms.name = nla_data(a[OVS_DP_ATTR_NAME]); parms.type = OVS_VPORT_TYPE_INTERNAL; @@ -1626,7 +1632,7 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info) ovs_dp_reset_user_features(skb, info); } - goto err_destroy_ports_array; + goto err_destroy_meters; } err = ovs_dp_cmd_fill_info(dp, reply, info->snd_portid, @@ -1641,8 +1647,10 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info) ovs_notify(&dp_datapath_genl_family, &ovs_dp_datapath_multicast_group, reply, info); return 0; -err_destroy_ports_array: +err_destroy_meters: ovs_unlock(); + ovs_meters_exit(dp); +err_destroy_ports_array: kfree(dp->ports); err_destroy_percpu: free_percpu(dp->stats_percpu); @@ -2292,6 +2300,7 @@ static struct genl_family *dp_genl_families[] = { &dp_vport_genl_family, &dp_flow_genl_family, &dp_packet_genl_family, + &dp_meter_genl_family, }; static void dp_unregister_genl(int n_families) @@ -2485,3 +2494,4 @@ MODULE_ALIAS_GENL_FAMILY(OVS_DATAPATH_FAMILY); MODULE_ALIAS_GENL_FAMILY(OVS_VPORT_FAMILY); MODULE_ALIAS_GENL_FAMILY(OVS_FLOW_FAMILY); MODULE_ALIAS_GENL_FAMILY(OVS_PACKET_FAMILY); +MODULE_ALIAS_GENL_FAMILY(OVS_METER_FAMILY); diff --git a/datapath/datapath.h b/datapath/datapath.h index 7481d6d..93c9ed5 100644 --- a/datapath/datapath.h +++ b/datapath/datapath.h @@ -93,6 +93,9 @@ struct datapath { u32 user_features; u32 max_headroom; + + /* Switch meters. */ + struct hlist_head *meters; }; /** diff --git a/datapath/linux/compat/include/net/netlink.h b/datapath/linux/compat/include/net/netlink.h index 4325b9b..ba24a34 100644 --- a/datapath/linux/compat/include/net/netlink.h +++ b/datapath/linux/compat/include/net/netlink.h @@ -169,6 +169,15 @@ static inline int rpl_nla_parse_nested(struct nlattr *tb[], int maxtype, return nla_parse_nested(tb, maxtype, nla, policy); } #define nla_parse_nested rpl_nla_parse_nested + +static inline int rpl_nla_parse(struct nlattr **tb, int maxtype, + const struct nlattr *head, int len, + const struct nla_policy *policy, + struct netlink_ext_ack *extack) +{ + return nla_parse(tb, maxtype, head, len, policy); +} +#define nla_parse rpl_nla_parse #endif #endif /* net/netlink.h */ diff --git a/datapath/meter.c b/datapath/meter.c new file mode 100644 index 0000000..2a5ba35 --- /dev/null +++ b/datapath/meter.c @@ -0,0 +1,604 @@ +/* + * Copyright (c) 2017 Nicira, Inc. + * + * 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. + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "datapath.h" +#include "meter.h" + +#define METER_HASH_BUCKETS 1024 + +static const struct nla_policy meter_policy[OVS_METER_ATTR_MAX + 1] = { + [OVS_METER_ATTR_ID] = { .type = NLA_U32, }, + [OVS_METER_ATTR_KBPS] = { .type = NLA_FLAG }, + [OVS_METER_ATTR_STATS] = { .len = sizeof(struct ovs_flow_stats) }, + [OVS_METER_ATTR_BANDS] = { .type = NLA_NESTED }, + [OVS_METER_ATTR_USED] = { .type = NLA_U64 }, + [OVS_METER_ATTR_CLEAR] = { .type = NLA_FLAG }, + [OVS_METER_ATTR_MAX_METERS] = { .type = NLA_U32 }, + [OVS_METER_ATTR_MAX_BANDS] = { .type = NLA_U32 }, +}; + +static const struct nla_policy band_policy[OVS_BAND_ATTR_MAX + 1] = { + [OVS_BAND_ATTR_TYPE] = { .type = NLA_U32, }, + [OVS_BAND_ATTR_RATE] = { .type = NLA_U32, }, + [OVS_BAND_ATTR_BURST] = { .type = NLA_U32, }, + [OVS_BAND_ATTR_STATS] = { .len = sizeof(struct ovs_flow_stats) }, +}; + +static void rcu_free_ovs_meter_callback(struct rcu_head *rcu) +{ + struct dp_meter *meter = container_of(rcu, struct dp_meter, rcu); + + kfree(meter); +} + +static void ovs_meter_free(struct dp_meter *meter) +{ + if (!meter) + return; + + call_rcu(&meter->rcu, rcu_free_ovs_meter_callback); +} + +static struct hlist_head *meter_hash_bucket(const struct datapath *dp, + u32 meter_id) +{ + return &dp->meters[meter_id & (METER_HASH_BUCKETS - 1)]; +} + +/* Call with ovs_mutex or RCU read lock. */ +static struct dp_meter *lookup_meter(const struct datapath *dp, + u32 meter_id) +{ + struct dp_meter *meter; + struct hlist_head *head; + + head = meter_hash_bucket(dp, meter_id); + hlist_for_each_entry_rcu(meter, head, dp_hash_node) { + if (meter->id == meter_id) + return meter; + } + return NULL; +} + +static void attach_meter(struct datapath *dp, struct dp_meter *meter) +{ + struct hlist_head *head = meter_hash_bucket(dp, meter->id); + + hlist_add_head_rcu(&meter->dp_hash_node, head); +} + +static void detach_meter(struct dp_meter *meter) +{ + ASSERT_OVSL(); + if (meter) + hlist_del_rcu(&meter->dp_hash_node); +} + +static struct sk_buff * +ovs_meter_cmd_reply_start(struct genl_info *info, u8 cmd, + struct ovs_header **ovs_reply_header) +{ + struct sk_buff *skb; + struct ovs_header *ovs_header = info->userhdr; + + skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC); + if (!skb) + return ERR_PTR(-ENOMEM); + + *ovs_reply_header = genlmsg_put(skb, info->snd_portid, + info->snd_seq, + &dp_meter_genl_family, 0, cmd); + if (!ovs_reply_header) { + nlmsg_free(skb); + return ERR_PTR(-EMSGSIZE); + } + (*ovs_reply_header)->dp_ifindex = ovs_header->dp_ifindex; + + return skb; +} + +static int ovs_meter_cmd_reply_stats(struct sk_buff *reply, u32 meter_id, + struct dp_meter *meter) +{ + struct nlattr *nla; + struct dp_meter_band *band; + u16 i; + + if (nla_put_u32(reply, OVS_METER_ATTR_ID, meter_id)) + goto error; + + if (!meter) + return 0; + + if (nla_put(reply, OVS_METER_ATTR_STATS, + sizeof(struct ovs_flow_stats), &meter->stats) || + nla_put_u64_64bit(reply, OVS_METER_ATTR_USED, meter->used, + OVS_METER_ATTR_PAD)) + goto error; + + nla = nla_nest_start(reply, OVS_METER_ATTR_BANDS); + if (!nla) + goto error; + + band = meter->bands; + + for (i = 0; i < meter->n_bands; ++i, ++band) { + struct nlattr *band_nla; + + band_nla = nla_nest_start(reply, OVS_BAND_ATTR_UNSPEC); + if (!band_nla || nla_put(reply, OVS_BAND_ATTR_STATS, + sizeof(struct ovs_flow_stats), + &band->stats)) + goto error; + nla_nest_end(reply, band_nla); + } + nla_nest_end(reply, nla); + + return 0; +error: + return -EMSGSIZE; +} + +static int ovs_meter_cmd_features(struct sk_buff *skb, struct genl_info *info) +{ + struct sk_buff *reply; + struct ovs_header *ovs_reply_header; + struct nlattr *nla, *band_nla; + int err; + + reply = ovs_meter_cmd_reply_start(info, OVS_METER_CMD_FEATURES, + &ovs_reply_header); + if (!reply) + return PTR_ERR(reply); + + if (nla_put_u32(reply, OVS_METER_ATTR_MAX_METERS, U32_MAX) || + nla_put_u32(reply, OVS_METER_ATTR_MAX_BANDS, DP_MAX_BANDS)) + goto nla_put_failure; + + nla = nla_nest_start(reply, OVS_METER_ATTR_BANDS); + if (!nla) + goto nla_put_failure; + + band_nla = nla_nest_start(reply, OVS_BAND_ATTR_UNSPEC); + if (!band_nla) + goto nla_put_failure; + /* Currently only DROP band type is supported. */ + if (nla_put_u32(reply, OVS_BAND_ATTR_TYPE, OVS_METER_BAND_TYPE_DROP)) + goto nla_put_failure; + nla_nest_end(reply, band_nla); + nla_nest_end(reply, nla); + + genlmsg_end(reply, ovs_reply_header); + return genlmsg_reply(reply, info); + +nla_put_failure: + nlmsg_free(reply); + err = -EMSGSIZE; + return err; +} + +static struct dp_meter *dp_meter_create(struct nlattr **a) +{ + struct nlattr *nla; + int rem; + u16 n_bands = 0; + struct dp_meter *meter; + struct dp_meter_band *band; + int err; + + /* Validate attributes, count the bands. */ + if (!a[OVS_METER_ATTR_BANDS]) + return ERR_PTR(-EINVAL); + + nla_for_each_nested(nla, a[OVS_METER_ATTR_BANDS], rem) + if (++n_bands > DP_MAX_BANDS) + return ERR_PTR(-EINVAL); + + /* Allocate and set up the meter before locking anything. */ + meter = kzalloc(n_bands * sizeof(struct dp_meter_band) + + sizeof(*meter), GFP_KERNEL); + if (!meter) + return ERR_PTR(-ENOMEM); + + meter->used = div_u64(ktime_get_ns(), 1000 * 1000); + meter->kbps = a[OVS_METER_ATTR_KBPS] ? 1 : 0; + meter->keep_stats = !a[OVS_METER_ATTR_CLEAR]; + spin_lock_init(&meter->lock); + if (meter->keep_stats && a[OVS_METER_ATTR_STATS]) { + meter->stats = *(struct ovs_flow_stats *) + nla_data(a[OVS_METER_ATTR_STATS]); + } + meter->n_bands = n_bands; + + /* Set up meter bands. */ + band = meter->bands; + nla_for_each_nested(nla, a[OVS_METER_ATTR_BANDS], rem) { + struct nlattr *attr[OVS_BAND_ATTR_MAX + 1]; + u32 band_max_delta_t; + + err = nla_parse((struct nlattr **)&attr, OVS_BAND_ATTR_MAX, + nla_data(nla), nla_len(nla), band_policy, + NULL); + if (err) + goto exit_free_meter; + + if (!attr[OVS_BAND_ATTR_TYPE] || + !attr[OVS_BAND_ATTR_RATE] || + !attr[OVS_BAND_ATTR_BURST]) { + err = -EINVAL; + goto exit_free_meter; + } + + band->type = nla_get_u32(attr[OVS_BAND_ATTR_TYPE]); + band->rate = nla_get_u32(attr[OVS_BAND_ATTR_RATE]); + band->burst_size = nla_get_u32(attr[OVS_BAND_ATTR_BURST]); + /* Figure out max delta_t that is enough to fill any bucket. + * Keep max_delta_t size to the bucket units: + * pkts => 1/1000 packets, kilobits => bits. + */ + band_max_delta_t = (band->burst_size + band->rate) * 1000; + /* Start with a full bucket. */ + band->bucket = band_max_delta_t; + if (band_max_delta_t > meter->max_delta_t) + meter->max_delta_t = band_max_delta_t; + band++; + } + + return meter; + +exit_free_meter: + kfree(meter); + return ERR_PTR(err); +} + +static int ovs_meter_cmd_set(struct sk_buff *skb, struct genl_info *info) +{ + struct nlattr **a = info->attrs; + struct dp_meter *meter, *old_meter; + struct sk_buff *reply; + struct ovs_header *ovs_reply_header; + struct ovs_header *ovs_header = info->userhdr; + struct datapath *dp; + int err; + u32 meter_id; + bool failed; + + meter = dp_meter_create(a); + if (IS_ERR_OR_NULL(meter)) + return PTR_ERR(meter); + + reply = ovs_meter_cmd_reply_start(info, OVS_METER_CMD_SET, + &ovs_reply_header); + if (IS_ERR(reply)) { + err = PTR_ERR(reply); + goto exit_free_meter; + } + + ovs_lock(); + dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex); + if (!dp) { + err = -ENODEV; + goto exit_unlock; + } + + if (!a[OVS_METER_ATTR_ID]) { + err = -ENODEV; + goto exit_unlock; + } + + meter_id = nla_get_u32(a[OVS_METER_ATTR_ID]); + + /* Cannot fail after this. */ + old_meter = lookup_meter(dp, meter_id); + detach_meter(old_meter); + attach_meter(dp, meter); + ovs_unlock(); + + /* Build response with the meter_id and stats from + * the old meter, if any. + */ + failed = nla_put_u32(reply, OVS_METER_ATTR_ID, meter_id); + WARN_ON(failed); + if (old_meter) { + spin_lock_bh(&old_meter->lock); + if (old_meter->keep_stats) { + err = ovs_meter_cmd_reply_stats(reply, meter_id, + old_meter); + WARN_ON(err); + } + spin_unlock_bh(&old_meter->lock); + ovs_meter_free(old_meter); + } + + genlmsg_end(reply, ovs_reply_header); + return genlmsg_reply(reply, info); + +exit_unlock: + ovs_unlock(); + nlmsg_free(reply); +exit_free_meter: + kfree(meter); + return err; +} + +static int ovs_meter_cmd_get(struct sk_buff *skb, struct genl_info *info) +{ + struct nlattr **a = info->attrs; + u32 meter_id; + struct ovs_header *ovs_header = info->userhdr; + struct ovs_header *ovs_reply_header; + struct datapath *dp; + int err; + struct sk_buff *reply; + struct dp_meter *meter; + + if (!a[OVS_METER_ATTR_ID]) + return -EINVAL; + + meter_id = nla_get_u32(a[OVS_METER_ATTR_ID]); + + reply = ovs_meter_cmd_reply_start(info, OVS_METER_CMD_GET, + &ovs_reply_header); + if (IS_ERR(reply)) + return PTR_ERR(reply); + + ovs_lock(); + + dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex); + if (!dp) { + err = -ENODEV; + goto exit_unlock; + } + + /* Locate meter, copy stats. */ + meter = lookup_meter(dp, meter_id); + if (!meter) { + err = -ENOENT; + goto exit_unlock; + } + + spin_lock_bh(&meter->lock); + err = ovs_meter_cmd_reply_stats(reply, meter_id, meter); + spin_unlock_bh(&meter->lock); + if (err) + goto exit_unlock; + + ovs_unlock(); + + genlmsg_end(reply, ovs_reply_header); + return genlmsg_reply(reply, info); + +exit_unlock: + ovs_unlock(); + nlmsg_free(reply); + return err; +} + +static int ovs_meter_cmd_del(struct sk_buff *skb, struct genl_info *info) +{ + struct nlattr **a = info->attrs; + u32 meter_id; + struct ovs_header *ovs_header = info->userhdr; + struct ovs_header *ovs_reply_header; + struct datapath *dp; + int err; + struct sk_buff *reply; + struct dp_meter *old_meter; + + if (!a[OVS_METER_ATTR_ID]) + return -EINVAL; + meter_id = nla_get_u32(a[OVS_METER_ATTR_ID]); + + reply = ovs_meter_cmd_reply_start(info, OVS_METER_CMD_DEL, + &ovs_reply_header); + if (IS_ERR(reply)) + return PTR_ERR(reply); + + ovs_lock(); + + dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex); + if (!dp) { + err = -ENODEV; + goto exit_unlock; + } + + old_meter = lookup_meter(dp, meter_id); + if (old_meter) { + spin_lock_bh(&old_meter->lock); + err = ovs_meter_cmd_reply_stats(reply, meter_id, old_meter); + WARN_ON(err); + spin_unlock_bh(&old_meter->lock); + detach_meter(old_meter); + } + ovs_unlock(); + ovs_meter_free(old_meter); + genlmsg_end(reply, ovs_reply_header); + return genlmsg_reply(reply, info); + +exit_unlock: + ovs_unlock(); + nlmsg_free(reply); + return err; +} + +/* Meter action execution. + * + * Return true 'meter_id' drop band is triggered. The 'skb' should be + * dropped by the caller'. + */ +bool ovs_meter_execute(struct datapath *dp, struct sk_buff *skb, + struct sw_flow_key *key, u32 meter_id) +{ + struct dp_meter *meter; + struct dp_meter_band *band; + long long int now_ms = div_u64(ktime_get_ns(), 1000 * 1000); + long long int long_delta_ms; + u32 delta_ms; + u32 cost; + int i, band_exceeded_max = -1; + u32 band_exceeded_rate = 0; + + meter = lookup_meter(dp, meter_id); + /* Do not drop the packet when there is no meter. */ + if (!meter) + return false; + + /* Lock the meter while using it. */ + spin_lock(&meter->lock); + + long_delta_ms = (now_ms - meter->used); /* ms */ + + /* Make sure delta_ms will not be too large, so that bucket will not + * wrap around below. + */ + delta_ms = (long_delta_ms > (long long int)meter->max_delta_t) + ? meter->max_delta_t : (u32)long_delta_ms; + + /* Update meter statistics. + */ + meter->used = now_ms; + meter->stats.n_packets += 1; + meter->stats.n_bytes += skb->len; + + /* Bucket rate is either in kilobits per second, or in packets per + * second. We maintain the bucket in the units of either bits or + * 1/1000th of a packet, correspondingly. + * Then, when rate is multiplied with milliseconds, we get the + * bucket units: + * msec * kbps = bits, and + * msec * packets/sec = 1/1000 packets. + * + * 'cost' is the number of bucket units in this packet. + */ + cost = (meter->kbps) ? skb->len * 8 : 1000; + + /* Update all bands and find the one hit with the highest rate. */ + for (i = 0; i < meter->n_bands; ++i) { + long long int max_bucket_size; + + band = &meter->bands[i]; + max_bucket_size = (band->burst_size + band->rate) * 1000; + + band->bucket += delta_ms * band->rate; + if (band->bucket > max_bucket_size) + band->bucket = max_bucket_size; + + if (band->bucket >= cost) { + band->bucket -= cost; + } else if (band->rate > band_exceeded_rate) { + band_exceeded_rate = band->rate; + band_exceeded_max = i; + } + } + + if (band_exceeded_max >= 0) { + /* Update band statistics. */ + band = &meter->bands[band_exceeded_max]; + band->stats.n_packets += 1; + band->stats.n_bytes += skb->len; + + /* Drop band triggered, let the caller drop the 'skb'. */ + if (band->type == OVS_METER_BAND_TYPE_DROP) { + spin_unlock(&meter->lock); + return true; + } + } + + spin_unlock(&meter->lock); + return false; +} + +static struct genl_ops dp_meter_genl_ops[] = { + { .cmd = OVS_METER_CMD_FEATURES, + .flags = 0, /* OK for unprivileged users. */ + .policy = meter_policy, + .doit = ovs_meter_cmd_features + }, + { .cmd = OVS_METER_CMD_SET, + .flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN + * privilege. + */ + .policy = meter_policy, + .doit = ovs_meter_cmd_set, + }, + { .cmd = OVS_METER_CMD_GET, + .flags = 0, /* OK for unprivileged users. */ + .policy = meter_policy, + .doit = ovs_meter_cmd_get, + }, + { .cmd = OVS_METER_CMD_DEL, + .flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN + * privilege. + */ + .policy = meter_policy, + .doit = ovs_meter_cmd_del + }, +}; + +static const struct genl_multicast_group ovs_meter_multicast_group = { + .name = OVS_METER_MCGROUP, +}; + +struct genl_family dp_meter_genl_family __ro_after_init = { + .hdrsize = sizeof(struct ovs_header), + .name = OVS_METER_FAMILY, + .version = OVS_METER_VERSION, + .maxattr = OVS_METER_ATTR_MAX, + .netnsok = true, + .parallel_ops = true, + .ops = dp_meter_genl_ops, + .n_ops = ARRAY_SIZE(dp_meter_genl_ops), + .mcgrps = &ovs_meter_multicast_group, + .n_mcgrps = 1, + .module = THIS_MODULE, +}; + +int ovs_meters_init(struct datapath *dp) +{ + int i; + + dp->meters = kmalloc_array(METER_HASH_BUCKETS, + sizeof(struct hlist_head), GFP_KERNEL); + + if (!dp->meters) + return -ENOMEM; + + for (i = 0; i < METER_HASH_BUCKETS; i++) + INIT_HLIST_HEAD(&dp->meters[i]); + + return 0; +} + +void ovs_meters_exit(struct datapath *dp) +{ + int i; + + for (i = 0; i < METER_HASH_BUCKETS; i++) { + struct hlist_head *head = &dp->meters[i]; + struct dp_meter *meter; + struct hlist_node *n; + + hlist_for_each_entry_safe(meter, n, head, dp_hash_node) + kfree(meter); + } + + kfree(dp->meters); +} diff --git a/datapath/meter.h b/datapath/meter.h new file mode 100644 index 0000000..964ace2 --- /dev/null +++ b/datapath/meter.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2017 Nicira, Inc. + * + * 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. + */ + +#ifndef METER_H +#define METER_H 1 + +#include +#include +#include +#include +#include +#include +#include + +#include "flow.h" +struct datapath; + +#define DP_MAX_BANDS 1 + +struct dp_meter_band { + u32 type; + u32 rate; + u32 burst_size; + u32 bucket; /* 1/1000 packets, or in bits */ + struct ovs_flow_stats stats; +}; + +struct dp_meter { + spinlock_t lock; /* Per meter lock */ + struct rcu_head rcu; + struct hlist_node dp_hash_node; /*Element in datapath->meters + * hash table. + */ + u32 id; + u16 kbps:1, keep_stats:1; + u16 n_bands; + u32 max_delta_t; + u64 used; + struct ovs_flow_stats stats; + struct dp_meter_band bands[]; +}; + +extern struct genl_family dp_meter_genl_family; +int ovs_meters_init(struct datapath *dp); +void ovs_meters_exit(struct datapath *dp); +bool ovs_meter_execute(struct datapath *dp, struct sk_buff *skb, + struct sw_flow_key *key, u32 meter_id); + +#endif /* meter.h */ From patchwork Mon Dec 11 21:50:27 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gregory Rose X-Patchwork-Id: 847251 X-Patchwork-Delegate: jpettit@nicira.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="bvwQ2QrE"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3ywcDv70zSz9t2M for ; Tue, 12 Dec 2017 08:54:39 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id C3F7CD8F; Mon, 11 Dec 2017 21:51:08 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 1D862D6F for ; Mon, 11 Dec 2017 21:51:06 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-pg0-f66.google.com (mail-pg0-f66.google.com [74.125.83.66]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id AF9F250A for ; Mon, 11 Dec 2017 21:51:05 +0000 (UTC) Received: by mail-pg0-f66.google.com with SMTP id e14so11886755pgr.9 for ; Mon, 11 Dec 2017 13:51:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=EkJRPr45AgT2QFG0iaRVkV2C4tB2A4v25S1S9bNtU+A=; b=bvwQ2QrEQp8FjdgaJe7xDD8N1duAhFyS5OOXmvvYOFt18Ny4t6sGlm7qXKW2cumGz7 0/eSyigR+Johcb0YU5b/LDhLmP+qNbMYX3K8PZTxjgvdSUlkLTFHY4D+/cizEL4mOjSx V1KuCDJ0wU/9u0kZFopN/iv6yc+kANTAPuwQdIRFJBHcbcRMDGqb/zO04BmMJ0QSDaYo yJoqaFntfbGYLNVYeiy5u/dYLOewDhoIKMlf6JF5eM4iTlCDyirCDDBZWMghrREfz2Ma gPLOaulXE/vwKeqi5OINVOd9uzWJX2IRtlm/z85F4ft3N/S7IEubDOiyb3p9jjKOL5cC oVZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=EkJRPr45AgT2QFG0iaRVkV2C4tB2A4v25S1S9bNtU+A=; b=iewb/h4ta/496hXrbeotWhlT0VWn2Mu5AVtZna8X/CU/zc/jDYOI34LDcIEJu0jlSk 4EUys6UZLsO46nfP1J4CoKhXqRh4Pyo2748061zqIpNz5K205kvgR9wXb0dWFt9+/vJK SmC6mDP/wnRpjo1zk+YVzxSZltRT0PLTSp4c4j/zK3UZbf64ZpNUQM96AfZ217iXWBqn dAEwg5zro2YPGbwUMLWid1M8vVW69GdNas+OHymgpeADPoAi3xShyKixBQh2gW8KEL9f 6wW3glOiHz3oQ+37ykO8/KYy7LPTqbJ7tViBIehIpBsgqrizEJ23eOYVlA0uZgWdhj9k cq7g== X-Gm-Message-State: AKGB3mJ/jkBDTw3wEqLtDwLR876mh1lupyPVxULwc4BVn4JKbtf7KAik UOf0IY3s//H2RNpvYUMEahMp88ZS X-Google-Smtp-Source: ACJfBouwiLHA1lnQrdPfpli80a0VcNK/TpEiV/d+oDn0q1NecSJQXWEiWG2dHuZMTCeKv/eHXm98dg== X-Received: by 10.101.100.199 with SMTP id t7mr1598756pgv.316.1513029064978; Mon, 11 Dec 2017 13:51:04 -0800 (PST) Received: from gizo.domain (67-5-143-47.ptld.qwest.net. [67.5.143.47]) by smtp.gmail.com with ESMTPSA id c185sm25572799pfb.48.2017.12.11.13.51.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 13:51:04 -0800 (PST) From: Greg Rose To: dev@openvswitch.org Date: Mon, 11 Dec 2017 13:50:27 -0800 Message-Id: <1513029033-9087-7-git-send-email-gvrose8192@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1513029033-9087-1-git-send-email-gvrose8192@gmail.com> References: <1513029033-9087-1-git-send-email-gvrose8192@gmail.com> X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE autolearn=no version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: Wei Yongjun Subject: [ovs-dev] [PATCH 06/12] datapath: Fix return value check in ovs_meter_cmd_features() X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org From: Wei Yongjun Upstream commit: commit 8a860c2bcc84a8e4fbcabb928cd97e4c51b17d93 Author: Wei Yongjun Date: Tue Nov 14 06:20:16 2017 +0000 openvswitch: Fix return value check in ovs_meter_cmd_features() In case of error, the function ovs_meter_cmd_reply_start() returns ERR_PTR() not NULL. The NULL test in the return value check should be replaced with IS_ERR(). Fixes: 96fbc13d7e77 ("openvswitch: Add meter infrastructure") Signed-off-by: Wei Yongjun Acked-by: Pravin B Shelar Signed-off-by: David S. Miller Cc: Wei Yongjun Signed-off-by: Greg Rose --- datapath/meter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datapath/meter.c b/datapath/meter.c index 2a5ba35..2e58b6c 100644 --- a/datapath/meter.c +++ b/datapath/meter.c @@ -166,7 +166,7 @@ static int ovs_meter_cmd_features(struct sk_buff *skb, struct genl_info *info) reply = ovs_meter_cmd_reply_start(info, OVS_METER_CMD_FEATURES, &ovs_reply_header); - if (!reply) + if (IS_ERR(reply)) return PTR_ERR(reply); if (nla_put_u32(reply, OVS_METER_ATTR_MAX_METERS, U32_MAX) || From patchwork Mon Dec 11 21:50:28 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gregory Rose X-Patchwork-Id: 847252 X-Patchwork-Delegate: jpettit@nicira.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="YzWKmnea"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3ywcFk4Ytxz9sxR for ; Tue, 12 Dec 2017 08:55:22 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 1EFB4D9D; Mon, 11 Dec 2017 21:51:10 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 9229DD8D for ; Mon, 11 Dec 2017 21:51:07 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-pf0-f196.google.com (mail-pf0-f196.google.com [209.85.192.196]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 40A1250E for ; Mon, 11 Dec 2017 21:51:07 +0000 (UTC) Received: by mail-pf0-f196.google.com with SMTP id l24so12574051pfj.6 for ; Mon, 11 Dec 2017 13:51:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=4riKLc+vI245wKLcNKErQTQgY7gnFILMfkoHO7sKWgs=; b=YzWKmneaoDhjEzDIGrvojS2/hkpt1ay63/oB1Gnd0WBSDJz9FtiKaAN/E6Q5wxP7lo h3rSeUCjZwFnSf9dqO1Nruv5DeQKhpWX6zByH7dFZ0rbocPoPgSjeEAegx8WKc7VAqpS D11WbhujZY2IPcTn2QjBXsIOxZ8pHfwaTSv1GrHNkSDAMgxpxOSoRqNS3cPFgLig6SqK NQfOVLhpvvrErj0s2NgEU+CahlQ98umr6a+7cUhgN1eSLYWT5RwAaTAXEf8iyRdkAueY 3wF3HEoxtokB9PfkNV0U2thlXE6XaABSHEJ9EDxpWTRHhY7aiO8qDffwS05F+O84e2Jl JcFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=4riKLc+vI245wKLcNKErQTQgY7gnFILMfkoHO7sKWgs=; b=QQxqHHqr3u0ffuxW95As6TCoxA6Sj127xtn8N0GQ2szgpJkRq6oZC9jh18Os0Flpcp gvhrlItCEXNUgCKl39bhl60vZDMc2xsPoT4PkL6WvsPREvynKZUg/4+aWbvbHsQMC0J2 mYY5nzhHCYKgvMydUg9WF3o29BuYUP+O09KGoKKC6SAwgHStOtaAjho+Q0SAQaFSsHUL x7rAs0T7x3t0bki4mtQpJJtTxADs/ksaYqfwSkdrD8Cv0KkHR212Brx1qyalH+aOtZBL 2CVKzYf+7xj3XteamEJEoISZ1Oq2z7krH+btXuccB5cTX7E5T6Oqz6kyB8y6xfE0CPLp SUYg== X-Gm-Message-State: AKGB3mLgaUADJUe8LPrV/oGcnKaSLDpAVNvcUrSjrM8jr6car/uijZ0F se7n2zmgCQA4alptG5EZTnA7E4c7 X-Google-Smtp-Source: ACJfBotBV/AHQKAj+L7oFPhaIEOTGSSnQrK6/lQUK9psKSC4XNyB8Djgx96XbkHfSkDE/1bGp2zEYw== X-Received: by 10.98.159.135 with SMTP id v7mr1693612pfk.162.1513029066531; Mon, 11 Dec 2017 13:51:06 -0800 (PST) Received: from gizo.domain (67-5-143-47.ptld.qwest.net. [67.5.143.47]) by smtp.gmail.com with ESMTPSA id c185sm25572799pfb.48.2017.12.11.13.51.05 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 13:51:05 -0800 (PST) From: Greg Rose To: dev@openvswitch.org Date: Mon, 11 Dec 2017 13:50:28 -0800 Message-Id: <1513029033-9087-8-git-send-email-gvrose8192@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1513029033-9087-1-git-send-email-gvrose8192@gmail.com> References: <1513029033-9087-1-git-send-email-gvrose8192@gmail.com> X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE autolearn=no version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: Wei Yongjun Subject: [ovs-dev] [PATCH 07/12] datapath: Using kfree_rcu() to simplify the code X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org From: Wei Yongjun Upstream commit: commit 6dc14dc40a1d1dafd8491c349b5f3e15aabc4edb Author: Wei Yongjun Date: Tue Nov 14 06:27:12 2017 +0000 openvswitch: Using kfree_rcu() to simplify the code The callback function of call_rcu() just calls a kfree(), so we can use kfree_rcu() instead of call_rcu() + callback function. Signed-off-by: Wei Yongjun Acked-by: Pravin B Shelar Signed-off-by: David S. Miller Cc: Wei Yongjun Signed-off-by: Greg Rose --- datapath/meter.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/datapath/meter.c b/datapath/meter.c index 2e58b6c..52ddd6c 100644 --- a/datapath/meter.c +++ b/datapath/meter.c @@ -42,19 +42,12 @@ static const struct nla_policy band_policy[OVS_BAND_ATTR_MAX + 1] = { [OVS_BAND_ATTR_STATS] = { .len = sizeof(struct ovs_flow_stats) }, }; -static void rcu_free_ovs_meter_callback(struct rcu_head *rcu) -{ - struct dp_meter *meter = container_of(rcu, struct dp_meter, rcu); - - kfree(meter); -} - static void ovs_meter_free(struct dp_meter *meter) { if (!meter) return; - call_rcu(&meter->rcu, rcu_free_ovs_meter_callback); + kfree_rcu(meter, rcu); } static struct hlist_head *meter_hash_bucket(const struct datapath *dp, From patchwork Mon Dec 11 21:50:29 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gregory Rose X-Patchwork-Id: 847254 X-Patchwork-Delegate: jpettit@nicira.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="i1+ASp8+"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3ywcGM0s0Xz9sxR for ; Tue, 12 Dec 2017 08:55:55 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 3DC15DAD; Mon, 11 Dec 2017 21:51:11 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 44703D9B for ; Mon, 11 Dec 2017 21:51:09 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-pg0-f66.google.com (mail-pg0-f66.google.com [74.125.83.66]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id B27D5515 for ; Mon, 11 Dec 2017 21:51:08 +0000 (UTC) Received: by mail-pg0-f66.google.com with SMTP id q20so11894723pgv.2 for ; Mon, 11 Dec 2017 13:51:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=PLKuuZJ5j6YBFE2Q3lYJlpfGcS+rx73GzEucZQl3MRI=; b=i1+ASp8+tXl5XjZF+QLtTTIZqK0HUPdsZ8bEHRMVyXerngk4eez3ec5OaJqLyHGRss 4BfPtfK2wmNDF1RCIN++EH9EqWVnpXbA1Di5I5+zPn8wJR0t0CKKQUbCnLlYBuiD833i Xsf0xAFHUIHHkLA6n3D1QqaAPIba/+Lw5WiQA6II+kJNtY2DOSPGCrPQMWHC5oAe39lV DeAKF4oIx6PgrQEZvD71EzujbjPYkxWtqmIzaloIlcKbvi+E7XxQ6nZnZu5trnnWNPxG Fhd7CzPqmIxi6CRUUIyIP2JPSYxGGosfove9ttb1QOE+J76EEyqqMhSkh5iV6TO/OdOW w1LQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=PLKuuZJ5j6YBFE2Q3lYJlpfGcS+rx73GzEucZQl3MRI=; b=l7x2CGxxu0gkliSUOrZnCNiC96/Z/ome6D8RKzC557LD7L9JtTE7H8M4pWpPBF82EB DyBuEz/LEaXQb5rj+PakEXkqxq3MBJ4+ItGOg7xcz+Z1LYz6spIjsUpKuwG4JKtpXJbt n97jZ6f82XXHtzL0HZAgQOYI4QSKa+DEZhbVTGIt39CTSr9Ls4w0eNaBhYVSjrlRSfnc Ob2VWIWPcwSAM8iKfggucd9baXhcUUsWMtxVGC1249MyPAClHFb7b+Yc4FkBowC2khmb 0Nhfudi6a4/uVUZU6Y/27Sm3a5mxO35C6JyGH1/v4juuo5HLm2pG3oeZDG4OznWEKsFV y+Hg== X-Gm-Message-State: AKGB3mK/jE+PzR5ZX95nPuEOIpJ13wc4Flc6pzXK0a3iJwsVcAS00tVV 1XJlbwpOq8Cb4HaflHZ6OGCpIKBu X-Google-Smtp-Source: ACJfBouZiaGgUjbqQL+gHvRqw2M803UWD3jHAPtmtcMuZhlqQkqeIqNU9Ou/O3zrzx+VZ2QJKE6T5Q== X-Received: by 10.99.117.83 with SMTP id f19mr1489866pgn.255.1513029067976; Mon, 11 Dec 2017 13:51:07 -0800 (PST) Received: from gizo.domain (67-5-143-47.ptld.qwest.net. [67.5.143.47]) by smtp.gmail.com with ESMTPSA id c185sm25572799pfb.48.2017.12.11.13.51.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 13:51:06 -0800 (PST) From: Greg Rose To: dev@openvswitch.org Date: Mon, 11 Dec 2017 13:50:29 -0800 Message-Id: <1513029033-9087-9-git-send-email-gvrose8192@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1513029033-9087-1-git-send-email-gvrose8192@gmail.com> References: <1513029033-9087-1-git-send-email-gvrose8192@gmail.com> X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE autolearn=no version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: "Gustavo A. R. Silva" Subject: [ovs-dev] [PATCH 08/12] datapath: meter: fix NULL pointer dereference in ovs_meter_cmd_reply_start X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org From: "Gustavo A. R. Silva" Upstream commit: commit b74912a2fdae9aadd20da502644aa8848c861954 Author: Gustavo A. R. Silva Date: Tue Nov 14 14:26:16 2017 -0600 openvswitch: meter: fix NULL pointer dereference in ovs_meter_cmd_reply_star It seems that the intention of the code is to null check the value returned by function genlmsg_put. But the current code is null checking the address of the pointer that holds the value returned by genlmsg_put. Fix this by properly null checking the value returned by function genlmsg_put in order to avoid a pontential null pointer dereference. Addresses-Coverity-ID: 1461561 ("Dereference before null check") Addresses-Coverity-ID: 1461562 ("Dereference null return value") Fixes: 96fbc13d7e77 ("openvswitch: Add meter infrastructure") Signed-off-by: Gustavo A. R. Silva Signed-off-by: David S. Miller Cc: Gustavo A. R. Silva Signed-off-by: Greg Rose --- datapath/meter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datapath/meter.c b/datapath/meter.c index 52ddd6c..3fbfc78 100644 --- a/datapath/meter.c +++ b/datapath/meter.c @@ -99,7 +99,7 @@ ovs_meter_cmd_reply_start(struct genl_info *info, u8 cmd, *ovs_reply_header = genlmsg_put(skb, info->snd_portid, info->snd_seq, &dp_meter_genl_family, 0, cmd); - if (!ovs_reply_header) { + if (!*ovs_reply_header) { nlmsg_free(skb); return ERR_PTR(-EMSGSIZE); } From patchwork Mon Dec 11 21:50:30 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gregory Rose X-Patchwork-Id: 847255 X-Patchwork-Delegate: jpettit@nicira.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="kZJiBOgp"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3ywcGq4lMZz9t2M for ; Tue, 12 Dec 2017 08:56:19 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 55A11DBE; Mon, 11 Dec 2017 21:51:12 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 86772D96 for ; Mon, 11 Dec 2017 21:51:10 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-pg0-f66.google.com (mail-pg0-f66.google.com [74.125.83.66]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 4A08E524 for ; Mon, 11 Dec 2017 21:51:10 +0000 (UTC) Received: by mail-pg0-f66.google.com with SMTP id o2so11882986pgc.8 for ; Mon, 11 Dec 2017 13:51:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=DxHfTi2xZrSAa8TyxaWx1y1f5neAmfGOxlw8Yddt0hY=; b=kZJiBOgpWXnalSAN2sEiT5DGkngBTU22RVagAmIj4LHHXI5462VOO/av5i9RXNHLoR cG0StR4inlhgPKVPsya7rWML/XTXTjB4y28yiJDLLUed/KrEdrMjDWdpmcm2ralp96U0 ARSC6qEZrDH6bgeaiGXVIAvaBbSznHwlHwh/dGujAs/K0vLhcMo1WpjPKbmi+XqJsAfk 4pbUW5469mr5q/6iEqZ61IRgOV5KpyIDPAWlggCLOoQYOuzTXrV27sc6pBQcDZIGdkR7 NBeLxZJCMpK9l4R4VVjrQFyo5V6YXGyKuUnJBcUYL4hbCO7Cmvy7nsSLFzCRP64okaFS QyJw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=DxHfTi2xZrSAa8TyxaWx1y1f5neAmfGOxlw8Yddt0hY=; b=ffIvbYV3z+1dusRt3xpik9Ak1zxtNHxHD+WylrS8MjWwULgDhPeXij3WZib9Me5DVM 7L5TW0ye/IqCK+9K78cFHBVIcE9FIU+uiFNjkixyzaFZNGcfGy80Ar8mUBqH/Ot/So00 kt6+b/YsThNTp6f7UU6kbjApjpYdQJN2VUcSXUfktb/jDv4pzXNS0gD+O2+9bT54PvmV J2u4p3iDYqWq9Zax2t3U8HcMxrBhgqXRbqt2Dw8SGNBuQ2U4xplBzPj5j2Z85+KZh/px GzMOhoO31omR7PNj/OWFwRGmnX+0svBpOaWkrUCHZxzLrz/1BtkKAGmeY7mUf79gMnXS AHHw== X-Gm-Message-State: AKGB3mKkrwTIony+31HSE1fwrvTc+NN93x7EShuLzoqbMnH67mueE1PV VW0L5GEgG7Cb5CUvFHMuaWkYPCUi X-Google-Smtp-Source: ACJfBovs5OK10mLfEjPnEP4tz7Ve6h8zFKKAf4CnDTG1zuvqCubaBXX4DPIGxpDDxGfoGhjpR5rWrQ== X-Received: by 10.101.93.66 with SMTP id e2mr4872pgt.50.1513029069519; Mon, 11 Dec 2017 13:51:09 -0800 (PST) Received: from gizo.domain (67-5-143-47.ptld.qwest.net. [67.5.143.47]) by smtp.gmail.com with ESMTPSA id c185sm25572799pfb.48.2017.12.11.13.51.08 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 13:51:08 -0800 (PST) From: Greg Rose To: dev@openvswitch.org Date: Mon, 11 Dec 2017 13:50:30 -0800 Message-Id: <1513029033-9087-10-git-send-email-gvrose8192@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1513029033-9087-1-git-send-email-gvrose8192@gmail.com> References: <1513029033-9087-1-git-send-email-gvrose8192@gmail.com> X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE autolearn=no version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: "Gustavo A. R. Silva" Subject: [ovs-dev] [PATCH 09/12] datapath: fix data type in queue_gso_packets X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org From: "Gustavo A. R. Silva" Upstream commit: commit 2734166e89639c973c6e125ac8bcfc2d9db72b70 Author: Gustavo A. R. Silva Date: Sat Nov 25 13:14:40 2017 -0600 net: openvswitch: datapath: fix data type in queue_gso_packets gso_type is being used in binary AND operations together with SKB_GSO_UDP. The issue is that variable gso_type is of type unsigned short and SKB_GSO_UDP expands to more than 16 bits: SKB_GSO_UDP = 1 << 16 this makes any binary AND operation between gso_type and SKB_GSO_UDP to be always zero, hence making some code unreachable and likely causing undesired behavior. Fix this by changing the data type of variable gso_type to unsigned int. Addresses-Coverity-ID: 1462223 Fixes: 0c19f846d582 ("net: accept UFO datagrams from tuntap and packet") Signed-off-by: Gustavo A. R. Silva Acked-by: Willem de Bruijn Signed-off-by: David S. Miller Cc: Gustavo A. R. Silva Signed-off-by: Greg Rose --- datapath/datapath.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datapath/datapath.c b/datapath/datapath.c index eff9f85..9baa52e 100644 --- a/datapath/datapath.c +++ b/datapath/datapath.c @@ -312,7 +312,7 @@ static int queue_gso_packets(struct datapath *dp, struct sk_buff *skb, const struct dp_upcall_info *upcall_info, uint32_t cutlen) { - unsigned short gso_type = skb_shinfo(skb)->gso_type; + unsigned int gso_type = skb_shinfo(skb)->gso_type; struct sw_flow_key later_key; struct sk_buff *segs, *nskb; struct ovs_skb_cb ovs_cb; From patchwork Mon Dec 11 21:50:31 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gregory Rose X-Patchwork-Id: 847256 X-Patchwork-Delegate: jpettit@nicira.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="uitn3WD9"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3ywcHj1990z9sxR for ; Tue, 12 Dec 2017 08:57:05 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 812FDDB1; Mon, 11 Dec 2017 21:51:15 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 3E704DBA for ; Mon, 11 Dec 2017 21:51:12 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-pg0-f65.google.com (mail-pg0-f65.google.com [74.125.83.65]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id DEE7C515 for ; Mon, 11 Dec 2017 21:51:11 +0000 (UTC) Received: by mail-pg0-f65.google.com with SMTP id w7so11879853pgv.6 for ; Mon, 11 Dec 2017 13:51:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=9v5ihxyrVTq+kz+DX/SSfSqHUW466Hk25nJWF+8I7xU=; b=uitn3WD9hvCqxzqQ5W4Gfy+C31csVldVEvUitrKMqKavT2wFzE0vbGD3ul1EbS6Tne VKehYyTImyBw5Z3U0VeHrvllnJ5zo/HTEetQuvjEPqLT73jBjtuQSm+bSv35H4aLV53T nLdkj/ntBMM9DmkZOh6c4dSQ84rkF4gh0s1DEGSjmsSFA8DDRsMycExs/xlU+/+ynA0Y VecWCEsUblGBmgpX0VhfeC6/hUEMfm6XwSfI6ACws0H5ZNOD0SNrvrJcQF84hLR+d9FK LrshzWWAAKpT4suPavlW6e08W9mZ2Rwp6rqiN1n0iWYNCL71TybkGtvTIDobf7noYsQX Gt0Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=9v5ihxyrVTq+kz+DX/SSfSqHUW466Hk25nJWF+8I7xU=; b=NfwHVQWNYnM/Kf8xu+GDCy0+G6YaJlOUeeBR2hzoeffgZ13oLxM2uD37QSXMGL0XXB HWfQNwTLDZT42hHBcuOzHKpfRDEYwtzxf/c7BngJ0AQwO1Bl2aKlYIWP3EAzmpw5HvW9 ia6cRjRPbgHMxcmxuqdbtNzH06TndmPdvKw9Q5tfvN3kr4ksEFe4j/7AbgaOVnoyAtnH r/9laphgDxJj9GRb5dOSmDSMGhX4QrJp/yW/4LSJ2E1Y5Qjzenf06YRC0WYFMDTzHJSS InUmxIlYdMiuJMhvPZEqada4AVDyel1HN4GByLQ5tzekDVCXS5GRmxsCywiop0Kt6VTv 9YUw== X-Gm-Message-State: AKGB3mIUvzKKpqA3yB2gBbcnblOA3Grv81INmVRVKtd5+tMXbiiUYaMX 0ESZVghm8IQ7zg2YL6U6cGRVixrm X-Google-Smtp-Source: ACJfBouteiUe5Zh3wd68RByerNUCf7cwr8ayM18H6xp1T0vXT6iv2ZpnxWn3YNO3PEH49Z7LqaCyuA== X-Received: by 10.84.174.129 with SMTP id r1mr1699557plb.337.1513029071044; Mon, 11 Dec 2017 13:51:11 -0800 (PST) Received: from gizo.domain (67-5-143-47.ptld.qwest.net. [67.5.143.47]) by smtp.gmail.com with ESMTPSA id c185sm25572799pfb.48.2017.12.11.13.51.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 13:51:09 -0800 (PST) From: Greg Rose To: dev@openvswitch.org Date: Mon, 11 Dec 2017 13:50:31 -0800 Message-Id: <1513029033-9087-11-git-send-email-gvrose8192@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1513029033-9087-1-git-send-email-gvrose8192@gmail.com> References: <1513029033-9087-1-git-send-email-gvrose8192@gmail.com> X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE autolearn=no version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: zhangliping Subject: [ovs-dev] [PATCH 10/12] datapath: fix the incorrect flow action alloc size X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org From: zhangliping Upstream commit: commit 67c8d22a73128ff910e2287567132530abcf5b71 Author: zhangliping Date: Sat Nov 25 22:02:12 2017 +0800 openvswitch: fix the incorrect flow action alloc size If we want to add a datapath flow, which has more than 500 vxlan outputs' action, we will get the following error reports: openvswitch: netlink: Flow action size 32832 bytes exceeds max openvswitch: netlink: Flow action size 32832 bytes exceeds max openvswitch: netlink: Actions may not be safe on all matching packets ... ... It seems that we can simply enlarge the MAX_ACTIONS_BUFSIZE to fix it, but this is not the root cause. For example, for a vxlan output action, we need about 60 bytes for the nlattr, but after it is converted to the flow action, it only occupies 24 bytes. This means that we can still support more than 1000 vxlan output actions for a single datapath flow under the the current 32k max limitation. So even if the nla_len(attr) is larger than MAX_ACTIONS_BUFSIZE, we shouldn't report EINVAL and keep it move on, as the judgement can be done by the reserve_sfa_size. Signed-off-by: zhangliping Acked-by: Pravin B Shelar Signed-off-by: David S. Miller Cc: zhangliping Signed-off-by: Greg Rose --- datapath/flow_netlink.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/datapath/flow_netlink.c b/datapath/flow_netlink.c index b3b2092..f687153 100644 --- a/datapath/flow_netlink.c +++ b/datapath/flow_netlink.c @@ -1908,14 +1908,11 @@ int ovs_nla_put_mask(const struct sw_flow *flow, struct sk_buff *skb) #define MAX_ACTIONS_BUFSIZE (32 * 1024) #endif -static struct sw_flow_actions *nla_alloc_flow_actions(int size, bool log) +static struct sw_flow_actions *nla_alloc_flow_actions(int size) { struct sw_flow_actions *sfa; - if (size > MAX_ACTIONS_BUFSIZE) { - OVS_NLERR(log, "Flow action size %u bytes exceeds max", size); - return ERR_PTR(-EINVAL); - } + WARN_ON_ONCE(size > MAX_ACTIONS_BUFSIZE); sfa = kmalloc(sizeof(*sfa) + size, GFP_KERNEL); if (!sfa) @@ -1988,12 +1985,15 @@ static struct nlattr *reserve_sfa_size(struct sw_flow_actions **sfa, new_acts_size = ksize(*sfa) * 2; if (new_acts_size > MAX_ACTIONS_BUFSIZE) { - if ((MAX_ACTIONS_BUFSIZE - next_offset) < req_size) + if ((MAX_ACTIONS_BUFSIZE - next_offset) < req_size) { + OVS_NLERR(log, "Flow action size exceeds max %u", + MAX_ACTIONS_BUFSIZE); return ERR_PTR(-EMSGSIZE); + } new_acts_size = MAX_ACTIONS_BUFSIZE; } - acts = nla_alloc_flow_actions(new_acts_size, log); + acts = nla_alloc_flow_actions(new_acts_size); if (IS_ERR(acts)) return (void *)acts; @@ -2668,7 +2668,7 @@ int ovs_nla_copy_actions(struct net *net, const struct nlattr *attr, { int err; - *sfa = nla_alloc_flow_actions(nla_len(attr), log); + *sfa = nla_alloc_flow_actions(min(nla_len(attr), MAX_ACTIONS_BUFSIZE)); if (IS_ERR(*sfa)) return PTR_ERR(*sfa); From patchwork Mon Dec 11 21:50:32 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gregory Rose X-Patchwork-Id: 847258 X-Patchwork-Delegate: jpettit@nicira.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="c5mW5VqF"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3ywcJH0XSLz9t34 for ; Tue, 12 Dec 2017 08:57:35 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 7A2B3DAF; Mon, 11 Dec 2017 21:51:16 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 1204FD85 for ; Mon, 11 Dec 2017 21:51:14 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-pf0-f193.google.com (mail-pf0-f193.google.com [209.85.192.193]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 9E40F4FF for ; Mon, 11 Dec 2017 21:51:13 +0000 (UTC) Received: by mail-pf0-f193.google.com with SMTP id u19so12562382pfa.12 for ; Mon, 11 Dec 2017 13:51:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=4PWXyY7aQDa6DajnWVDtT/pwTd611nrPHYBgqPb/Dv4=; b=c5mW5VqF2jAvRW9E2UacU3vHBtaGp3tfwd7naJMSoWVfTJBmTDs4ddNugNqVNIVZGo zP7Rxv6VSs7sQ+6zq1RbKrAo2u4L6MjOgA4waD7C9vkO0+YPslPrqc787YJJ8orolQcW mHnyAyKeLzisauX6SXCZ3dMj1QKKlK/POrSCZ0EnhRf0mWQpPlTbfhzvAHvaL6aYl5Rr CHnrKHm2+deVIo+950CAKS7wkq7Zx2Ums/0hHaan1V27bEJd79f9zZ4o++U1m0lmKkNY /rSrANZeRuvz6xxGD2fGl8jpOEUULNlmkj5bUAtJ2xLF8gqYWN88kQGFpGSuYWTSVDSm F3EQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=4PWXyY7aQDa6DajnWVDtT/pwTd611nrPHYBgqPb/Dv4=; b=b99thQLf7IIiD0LM03KBWqTUsKFQHsXn5QDKkDGJtjA8ej2gmq7JSYpMi3zhn9r6st WWZjgXo3wRV3wis9irSPV0xLhqjAW9Fcfz3/fv+S9o3c+tS9tSSy76hi4AbuuA3l3Mxk 0QPeq1xVeSxez6ItwzUZg9NkbYY752w+LFYtOPYqGQuh7zfcToXI6W1K9iaz9aoCJsHZ a2aM5+ME+eUavPsA0I7gZHM89f7ITQD94rgObvJMpBFvwr9wNblOtQvW2bzvEWxCOx6w uYCK9NcInJDbh62T009eplXMMNEffb9Iw5Cg4+J2+lik38JcLE+8X4Cwm1x0TAM31lnU VVDg== X-Gm-Message-State: AKGB3mKTdg9YiY7y8Wv5JHrlLIqgLkdIxQmMA7SEzaxEsimkzvUT4ZEs K3DqJH5B+GjFp7R4NVshtwdbyBul X-Google-Smtp-Source: ACJfBotbdviPXbMKq8UWyH6rswvfb7g42NNs05vL8nJft8ZZvNe4GTbQEjeqAYVEV9kGkWYBfYOL3w== X-Received: by 10.84.195.36 with SMTP id i33mr1710426pld.189.1513029072847; Mon, 11 Dec 2017 13:51:12 -0800 (PST) Received: from gizo.domain (67-5-143-47.ptld.qwest.net. [67.5.143.47]) by smtp.gmail.com with ESMTPSA id c185sm25572799pfb.48.2017.12.11.13.51.11 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 13:51:11 -0800 (PST) From: Greg Rose To: dev@openvswitch.org Date: Mon, 11 Dec 2017 13:50:32 -0800 Message-Id: <1513029033-9087-12-git-send-email-gvrose8192@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1513029033-9087-1-git-send-email-gvrose8192@gmail.com> References: <1513029033-9087-1-git-send-email-gvrose8192@gmail.com> X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE autolearn=no version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: Arnd Bergmann Subject: [ovs-dev] [PATCH 11/12] datapath: use ktime_get_ts64() instead of ktime_get_ts() X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org From: Arnd Bergmann Upstream commit: commit 311af51dcb5629f04976a8e451673f77e3301041 Author: Arnd Bergmann Date: Mon Nov 27 12:41:38 2017 +0100 openvswitch: use ktime_get_ts64() instead of ktime_get_ts() timespec is deprecated because of the y2038 overflow, so let's convert this one to ktime_get_ts64(). The code is already safe even on 32-bit architectures, since it uses monotonic times. On 64-bit architectures, nothing changes, while on 32-bit architectures this avoids one type conversion. Signed-off-by: Arnd Bergmann Signed-off-by: David S. Miller Cc: Arnd Bergmann Signed-off-by: Greg Rose --- datapath/flow.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/datapath/flow.c b/datapath/flow.c index 5da7e3e..c119df2 100644 --- a/datapath/flow.c +++ b/datapath/flow.c @@ -54,12 +54,12 @@ u64 ovs_flow_used_time(unsigned long flow_jiffies) { - struct timespec cur_ts; + struct timespec64 cur_ts; u64 cur_ms, idle_ms; - ktime_get_ts(&cur_ts); + ktime_get_ts64(&cur_ts); idle_ms = jiffies_to_msecs(jiffies - flow_jiffies); - cur_ms = (u64)cur_ts.tv_sec * MSEC_PER_SEC + + cur_ms = (u64)(u32)cur_ts.tv_sec * MSEC_PER_SEC + cur_ts.tv_nsec / NSEC_PER_MSEC; return cur_ms - idle_ms; From patchwork Mon Dec 11 21:50:33 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gregory Rose X-Patchwork-Id: 847259 X-Patchwork-Delegate: jpettit@nicira.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="UJYkyEMP"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3ywcK12lV4z9sxR for ; Tue, 12 Dec 2017 08:58:13 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id A6841DC8; Mon, 11 Dec 2017 21:51:17 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 0987EDA2 for ; Mon, 11 Dec 2017 21:51:16 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-pg0-f65.google.com (mail-pg0-f65.google.com [74.125.83.65]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 996A750A for ; Mon, 11 Dec 2017 21:51:15 +0000 (UTC) Received: by mail-pg0-f65.google.com with SMTP id j4so11896434pgp.1 for ; Mon, 11 Dec 2017 13:51:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=lpfifrILEHH32ydV1Zc34Xfugup9U+HxlnCBt35mRcE=; b=UJYkyEMPKjgyUF87MzC/Don83LCLP2bRMljhtM1CoW3i6+MIFKQjdJRXMS0a/8KX3z 4XsQZ/8zlKGmNyNmNyH1Ov+CPWcqbmE9RGxt4XbU8e8NJBn56rDrjKh4nyHYkIbpb+LR 5e0UzFZt6HqbEaEMOAD4XYaPa7DC676IS/nZycd+Pj0iyuzot5rrjKuYOkPOL3cx6VWU m0xtUT7YtMdC4wE6JScbq9QiNB3Q3lOVZlPq5sP6FxsFFkpvsd9n/2xYIjCMbu+hA9Ov Ep9PHxll9ge1th9Ysz8Q3K3+AV5b5DLABuCE3ePDwhdgslYL6jv8g31bUlNzbiS9XSGO aQcQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=lpfifrILEHH32ydV1Zc34Xfugup9U+HxlnCBt35mRcE=; b=fN4Qz0lVVjMR8+AK/OeNdrOXZXnBTQZOxy06aCoXwvyNLq4PpK98WB88jKnTG6s6UC 9z0tiISIZi53+h1YICblJZjVsF4nlTnghpatXO8fluZuDHbhOE7q41HQ1eGfi55RnQ9a gURefyIULZHh0HOBFoLX3iRoOLhPqgrw2Un9KbwAg6b0WqixHcm6PVNEWw3qTzPCPMds QfaL7HK35W+4Ek1mTLLbAnky5J/z4gTrs0SyYJc0/tKteu4TzZzPix4wK7U2+mGPP91n w7gKfZCJj88d+vTkxjzTrKack3TCNkxUqhBMlDwKHpf+CAq45YS5vS0yFgX20NAJorzn n/VA== X-Gm-Message-State: AKGB3mLuESLCzdQwZ5GMq7GZh4hKR4zWrDUaAxoIm+iF2XD85eSooyvR 6+mB0pQX7MFnMgHVJag0P6/CQxjZ X-Google-Smtp-Source: ACJfBovx9k6yQT5eR4QbjrZuzep94JutBlXu1XUFElKEo6QPOrfWBhgdrSrdE3Y1YqsrFnUhmlJVFA== X-Received: by 10.159.244.14 with SMTP id x14mr1680652plr.412.1513029074766; Mon, 11 Dec 2017 13:51:14 -0800 (PST) Received: from gizo.domain (67-5-143-47.ptld.qwest.net. [67.5.143.47]) by smtp.gmail.com with ESMTPSA id c185sm25572799pfb.48.2017.12.11.13.51.12 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 13:51:13 -0800 (PST) From: Greg Rose To: dev@openvswitch.org Date: Mon, 11 Dec 2017 13:50:33 -0800 Message-Id: <1513029033-9087-13-git-send-email-gvrose8192@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1513029033-9087-1-git-send-email-gvrose8192@gmail.com> References: <1513029033-9087-1-git-send-email-gvrose8192@gmail.com> X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE autolearn=no version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: Paolo Abeni Subject: [ovs-dev] [PATCH 12/12] datapath: do not propagate headroom updates to internal port X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org From: Paolo Abeni Upstream commit: commit 183dea5818315c0a172d21ecbcd2554894bf01e3 Author: Paolo Abeni Date: Thu Nov 30 15:35:33 2017 +0100 openvswitch: do not propagate headroom updates to internal port After commit 3a927bc7cf9d ("ovs: propagate per dp max headroom to all vports") the need_headroom for the internal vport is updated accordingly to the max needed headroom in its datapath. That avoids the pskb_expand_head() costs when sending/forwarding packets towards tunnel devices, at least for some scenarios. We still require such copy when using the ovs-preferred configuration for vxlan tunnels: br_int / \ tap vxlan (remote_ip:X) br_phy \ NIC where the route towards the IP 'X' is via 'br_phy'. When forwarding traffic from the tap towards the vxlan device, we will call pskb_expand_head() in vxlan_build_skb() because br-phy->needed_headroom is equal to tun->needed_headroom. With this change we avoid updating the internal vport needed_headroom, so that in the above scenario no head copy is needed, giving 5% performance improvement in UDP throughput test. As a trade-off, packets sent from the internal port towards a tunnel device will now experience the head copy overhead. The rationale is that the latter use-case is less relevant performance-wise. Signed-off-by: Paolo Abeni Acked-by: Pravin B Shelar Signed-off-by: David S. Miller Also removed related compat layer changes. Cc: Paolo Abeni Signed-off-by: Greg Rose --- acinclude.m4 | 1 - datapath/linux/compat/include/linux/netdevice.h | 19 ------------------- datapath/vport-internal_dev.c | 19 +------------------ 3 files changed, 1 insertion(+), 38 deletions(-) diff --git a/acinclude.m4 b/acinclude.m4 index 30a2103..0cf41d3 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -553,7 +553,6 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [ OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [udp_offload.*uoff], [OVS_DEFINE([HAVE_UDP_OFFLOAD_ARG_UOFF])]) OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [gro_remcsum]) - OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [IFF_PHONY_HEADROOM]) OVS_FIND_FIELD_IFELSE([$KSRC/include/linux/netdevice.h], [net_device_ops], [extended]) OVS_FIND_PARAM_IFELSE([$KSRC/include/linux/netdevice.h], diff --git a/datapath/linux/compat/include/linux/netdevice.h b/datapath/linux/compat/include/linux/netdevice.h index 3c3cf42..87f8469 100644 --- a/datapath/linux/compat/include/linux/netdevice.h +++ b/datapath/linux/compat/include/linux/netdevice.h @@ -244,25 +244,6 @@ int ovs_dev_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb); #define NETDEV_OFFLOAD_PUSH_GENEVE 0x001D #endif -#ifndef HAVE_IFF_PHONY_HEADROOM - -#define IFF_PHONY_HEADROOM 0 -static inline unsigned netdev_get_fwd_headroom(struct net_device *dev) -{ - return 0; -} - -static inline void netdev_set_rx_headroom(struct net_device *dev, int new_hr) -{ -} - -/* set the device rx headroom to the dev's default */ -static inline void netdev_reset_rx_headroom(struct net_device *dev) -{ -} - -#endif - #ifdef IFF_NO_QUEUE #define HAVE_IFF_NO_QUEUE #else diff --git a/datapath/vport-internal_dev.c b/datapath/vport-internal_dev.c index 0aa331a..9bb8751 100644 --- a/datapath/vport-internal_dev.c +++ b/datapath/vport-internal_dev.c @@ -149,13 +149,6 @@ internal_get_stats(struct net_device *dev, struct rtnl_link_stats64 *stats) } } -#ifdef HAVE_IFF_PHONY_HEADROOM -static void internal_set_rx_headroom(struct net_device *dev, int new_hr) -{ - dev->needed_headroom = new_hr < 0 ? 0 : new_hr; -} -#endif - static const struct net_device_ops internal_dev_netdev_ops = { .ndo_open = internal_dev_open, .ndo_stop = internal_dev_stop, @@ -165,13 +158,6 @@ static const struct net_device_ops internal_dev_netdev_ops = { .ndo_change_mtu = internal_dev_change_mtu, #endif .ndo_get_stats64 = (void *)internal_get_stats, -#ifdef HAVE_IFF_PHONY_HEADROOM -#ifndef HAVE_NET_DEVICE_OPS_WITH_EXTENDED - .ndo_set_rx_headroom = internal_set_rx_headroom, -#else - .extended.ndo_set_rx_headroom = internal_set_rx_headroom, -#endif -#endif }; static struct rtnl_link_ops internal_dev_link_ops __read_mostly = { @@ -189,7 +175,7 @@ static void do_setup(struct net_device *netdev) netdev->priv_flags &= ~IFF_TX_SKB_SHARING; netdev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_OPENVSWITCH | - IFF_PHONY_HEADROOM | IFF_NO_QUEUE; + IFF_NO_QUEUE; #ifndef HAVE_NEEDS_FREE_NETDEV netdev->destructor = internal_dev_destructor; #else @@ -239,9 +225,6 @@ static struct vport *internal_dev_create(const struct vport_parms *parms) goto error_free_netdev; } -#ifdef HAVE_IFF_PHONY_HEADROOM - vport->dev->needed_headroom = vport->dp->max_headroom; -#endif dev_net_set(vport->dev, ovs_dp_get_net(vport->dp)); internal_dev = internal_dev_priv(vport->dev); internal_dev->vport = vport;