From patchwork Tue Nov 4 06:01:31 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pravin B Shelar X-Patchwork-Id: 407151 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id E29481400A6 for ; Thu, 6 Nov 2014 07:02:16 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752170AbaKEUCJ (ORCPT ); Wed, 5 Nov 2014 15:02:09 -0500 Received: from na6sys009bog018.obsmtp.com ([74.125.150.76]:38140 "HELO na6sys009bog018.obsmtp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1752112AbaKEUBu (ORCPT ); Wed, 5 Nov 2014 15:01:50 -0500 Received: from mail-pa0-f51.google.com ([209.85.220.51]) (using TLSv1) by na6sys009bob018.postini.com ([74.125.148.12]) with SMTP ID DSNKVFqCLUPK7/9u9+XJfEfiXD1BWIYb2d6h@postini.com; Wed, 05 Nov 2014 12:01:49 PST Received: by mail-pa0-f51.google.com with SMTP id kq14so1430427pab.38 for ; Wed, 05 Nov 2014 12:01:49 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=B0wRq0sjgHEKnDwxYT/Soe+9qH21gKal6C4QGkBuD6s=; b=FgMmp3Lrz+ASpQaOCNLyadlRKDIoIRBwVGeAHiIlyo4c7n2ZKuSEmjyp34VWaUFsr0 jmDw3E8GUZPJh3SRAN2FcLfFTREdvc4ilU2Lh1nLSFypbl3WFvFtMIBm29e7/j9weyDh FV7x39vvOhWntCs9wuBNMFpbtnNEMdAiF4i7iVbjntDF3fi2tKWXXa8yMIA4Fd44ebrc hwR/ub+zyVzLFiEpIwdvKF1bs4lqwcfjCIyM4dZaUXmAYK9oyLbRosd/x0DqAadUwuDo iEd3i+OmOcatylcQPJ+eIJmGeORLdTqDKzwQHkw72m2eWY7tto/lwK9uFbFHo9OW4LF/ YykQ== X-Gm-Message-State: ALoCoQki8TCDQf8lcbxSfXYwxrHMUzF/hp+UFUWWy9dEQrrr35IUU6vOc/K1WxUTrJuIDosU09yY+145fR+qUUuX1kDmtXCqhq0XDW2sPDPCNjxBDSxP/wqJSBlTlIPQCAFOvYq4H9ePm79Up9TbNvpRxnAJJ0b+Jw== X-Received: by 10.68.106.66 with SMTP id gs2mr7826637pbb.76.1415217709084; Wed, 05 Nov 2014 12:01:49 -0800 (PST) X-Received: by 10.68.106.66 with SMTP id gs2mr7826631pbb.76.1415217708997; Wed, 05 Nov 2014 12:01:48 -0800 (PST) Received: from localhost ([76.126.242.203]) by mx.google.com with ESMTPSA id z9sm3895746pdp.73.2014.11.05.12.01.48 for (version=TLSv1.1 cipher=RC4-SHA bits=128/128); Wed, 05 Nov 2014 12:01:48 -0800 (PST) From: Pravin B Shelar To: davem@davemloft.net Cc: netdev@vger.kernel.org, Joe Stringer , Pravin B Shelar Subject: [PATCH net-next 07/14] openvswitch: Refactor ovs_flow_cmd_fill_info(). Date: Mon, 3 Nov 2014 22:01:31 -0800 Message-Id: <1415080891-1837-1-git-send-email-pshelar@nicira.com> X-Mailer: git-send-email 1.7.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Joe Stringer Split up ovs_flow_cmd_fill_info() to make it easier to cache parts of a dump reply. This will be used to streamline flow_dump in a future patch. Signed-off-by: Joe Stringer Acked-by: Thomas Graf Signed-off-by: Pravin B Shelar --- net/openvswitch/datapath.c | 93 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 66 insertions(+), 27 deletions(-) diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index 04a26ae..bbb920b 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c @@ -674,58 +674,67 @@ static size_t ovs_flow_cmd_msg_size(const struct sw_flow_actions *acts) } /* Called with ovs_mutex or RCU read lock. */ -static int ovs_flow_cmd_fill_info(const struct sw_flow *flow, int dp_ifindex, - struct sk_buff *skb, u32 portid, - u32 seq, u32 flags, u8 cmd) +static int ovs_flow_cmd_fill_match(const struct sw_flow *flow, + struct sk_buff *skb) { - const int skb_orig_len = skb->len; - struct nlattr *start; - struct ovs_flow_stats stats; - __be16 tcp_flags; - unsigned long used; - struct ovs_header *ovs_header; struct nlattr *nla; int err; - ovs_header = genlmsg_put(skb, portid, seq, &dp_flow_genl_family, flags, cmd); - if (!ovs_header) - return -EMSGSIZE; - - ovs_header->dp_ifindex = dp_ifindex; - /* Fill flow key. */ nla = nla_nest_start(skb, OVS_FLOW_ATTR_KEY); if (!nla) - goto nla_put_failure; + return -EMSGSIZE; err = ovs_nla_put_flow(&flow->unmasked_key, &flow->unmasked_key, skb); if (err) - goto error; + return err; + nla_nest_end(skb, nla); + /* Fill flow mask. */ nla = nla_nest_start(skb, OVS_FLOW_ATTR_MASK); if (!nla) - goto nla_put_failure; + return -EMSGSIZE; err = ovs_nla_put_flow(&flow->key, &flow->mask->key, skb); if (err) - goto error; + return err; nla_nest_end(skb, nla); + return 0; +} + +/* Called with ovs_mutex or RCU read lock. */ +static int ovs_flow_cmd_fill_stats(const struct sw_flow *flow, + struct sk_buff *skb) +{ + struct ovs_flow_stats stats; + __be16 tcp_flags; + unsigned long used; ovs_flow_stats_get(flow, &stats, &used, &tcp_flags); if (used && nla_put_u64(skb, OVS_FLOW_ATTR_USED, ovs_flow_used_time(used))) - goto nla_put_failure; + return -EMSGSIZE; if (stats.n_packets && nla_put(skb, OVS_FLOW_ATTR_STATS, sizeof(struct ovs_flow_stats), &stats)) - goto nla_put_failure; + return -EMSGSIZE; if ((u8)ntohs(tcp_flags) && nla_put_u8(skb, OVS_FLOW_ATTR_TCP_FLAGS, (u8)ntohs(tcp_flags))) - goto nla_put_failure; + return -EMSGSIZE; + + return 0; +} + +/* Called with ovs_mutex or RCU read lock. */ +static int ovs_flow_cmd_fill_actions(const struct sw_flow *flow, + struct sk_buff *skb, int skb_orig_len) +{ + struct nlattr *start; + int err; /* If OVS_FLOW_ATTR_ACTIONS doesn't fit, skip dumping the actions if * this is the first flow to be dumped into 'skb'. This is unusual for @@ -749,17 +758,47 @@ static int ovs_flow_cmd_fill_info(const struct sw_flow *flow, int dp_ifindex, nla_nest_end(skb, start); else { if (skb_orig_len) - goto error; + return err; nla_nest_cancel(skb, start); } - } else if (skb_orig_len) - goto nla_put_failure; + } else if (skb_orig_len) { + return -EMSGSIZE; + } + + return 0; +} + +/* Called with ovs_mutex or RCU read lock. */ +static int ovs_flow_cmd_fill_info(const struct sw_flow *flow, int dp_ifindex, + struct sk_buff *skb, u32 portid, + u32 seq, u32 flags, u8 cmd) +{ + const int skb_orig_len = skb->len; + struct ovs_header *ovs_header; + int err; + + ovs_header = genlmsg_put(skb, portid, seq, &dp_flow_genl_family, + flags, cmd); + if (!ovs_header) + return -EMSGSIZE; + + ovs_header->dp_ifindex = dp_ifindex; + + err = ovs_flow_cmd_fill_match(flow, skb); + if (err) + goto error; + + err = ovs_flow_cmd_fill_stats(flow, skb); + if (err) + goto error; + + err = ovs_flow_cmd_fill_actions(flow, skb, skb_orig_len); + if (err) + goto error; return genlmsg_end(skb, ovs_header); -nla_put_failure: - err = -EMSGSIZE; error: genlmsg_cancel(skb, ovs_header); return err;