ovs_flow_cmd_alloc_info() does not need the flow, but the actions.
Taking actions directly allows further optimization in a subsequent
patch.

Signed-off-by: Jarno Rajahalme <jrajaha...@nicira.com>
---
v5: Split to a separate patch.

 datapath/datapath.c |   16 +++++++---------
 1 file changed, 7 insertions(+), 9 deletions(-)

diff --git a/datapath/datapath.c b/datapath/datapath.c
index 2901d69..0de00ad 100644
--- a/datapath/datapath.c
+++ b/datapath/datapath.c
@@ -762,22 +762,19 @@ error:
        return err;
 }
 
-/* Must be called with rcu_read_lock or ovs_mutex if 'flow' is in the flow
- * table. */
-static struct sk_buff *ovs_flow_cmd_alloc_info(const struct sw_flow *flow,
+/* Must be called with rcu_read_lock or ovs_mutex if 'acts' is in a flow
+ * that is in the flow table. */
+static struct sk_buff *ovs_flow_cmd_alloc_info(const struct sw_flow_actions 
*acts,
                                               struct genl_info *info,
                                               bool always)
 {
        struct sk_buff *skb;
-       size_t len;
 
        if (!always && !ovs_must_notify(info, &ovs_dp_flow_multicast_group))
                return NULL;
 
-       len = ovs_flow_cmd_msg_size(ovsl_dereference_flow_acts(flow));
-
-       skb = genlmsg_new_unicast(len, info, GFP_KERNEL);
-
+       skb = genlmsg_new_unicast(ovs_flow_cmd_msg_size(acts), info,
+                                 GFP_KERNEL);
        if (!skb)
                return ERR_PTR(-ENOMEM);
 
@@ -794,7 +791,8 @@ static struct sk_buff *ovs_flow_cmd_build_info(const struct 
sw_flow *flow,
        struct sk_buff *skb;
        int retval;
 
-       skb = ovs_flow_cmd_alloc_info(flow, info, always);
+       skb = ovs_flow_cmd_alloc_info(ovsl_dereference_flow_acts(flow), info,
+                                     always);
        if (!skb || IS_ERR(skb))
                return skb;
 
-- 
1.7.10.4

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to