When compiling OvS-master on 4.4.0-81 kernel, there is a warning: CC [M] /root/ovs/datapath/linux/datapath.o /root/ovs/datapath/linux/datapath.c: In function ‘ovs_flow_cmd_set’: /root/ovs/datapath/linux/datapath.c:1221:1: warning: the frame size of 1040 bytes is larger than 1024 bytes [-Wframe-larger-than=]
This patch use kmalloc to malloc mem for sw_flow_mask and avoid using stack. Signed-off-by: Tonghao Zhang <xiangxia.m....@gmail.com> --- net/openvswitch/datapath.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index c85029c..da8cd68 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c @@ -1107,7 +1107,7 @@ static int ovs_flow_cmd_set(struct sk_buff *skb, struct genl_info *info) struct ovs_header *ovs_header = info->userhdr; struct sw_flow_key key; struct sw_flow *flow; - struct sw_flow_mask mask; + struct sw_flow_mask *mask; struct sk_buff *reply = NULL; struct datapath *dp; struct sw_flow_actions *old_acts = NULL, *acts = NULL; @@ -1120,7 +1120,11 @@ static int ovs_flow_cmd_set(struct sk_buff *skb, struct genl_info *info) ufid_present = ovs_nla_get_ufid(&sfid, a[OVS_FLOW_ATTR_UFID], log); if (a[OVS_FLOW_ATTR_KEY]) { - ovs_match_init(&match, &key, true, &mask); + mask = kmalloc(sizeof(struct sw_flow_mask), GFP_KERNEL); + if (!mask) + return -ENOMEM; + + ovs_match_init(&match, &key, true, mask); error = ovs_nla_get_match(net, &match, a[OVS_FLOW_ATTR_KEY], a[OVS_FLOW_ATTR_MASK], log); } else if (!ufid_present) { @@ -1141,7 +1145,7 @@ static int ovs_flow_cmd_set(struct sk_buff *skb, struct genl_info *info) } acts = get_flow_actions(net, a[OVS_FLOW_ATTR_ACTIONS], &key, - &mask, log); + mask, log); if (IS_ERR(acts)) { error = PTR_ERR(acts); goto error; @@ -1216,6 +1220,7 @@ err_unlock_ovs: err_kfree_acts: ovs_nla_free_flow_actions(acts); error: + kfree(mask); return error; } -- 1.8.3.1