diff options
| author | David S. Miller <davem@davemloft.net> | 2018-03-09 19:25:12 +0300 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2018-03-09 19:25:12 +0300 |
| commit | 0623951eb87ce1e3aba41d27cadbb9f49398de66 (patch) | |
| tree | 16d9d4201c14a4b1ecab57f22eaa653272b3852b /include | |
| parent | 79134e6ce2c9d1a00eab4d98cb48f975dd2474cb (diff) | |
| parent | 9c5c9c573700a0a4a4afa431da3e7d21f2992627 (diff) | |
| download | linux-0623951eb87ce1e3aba41d27cadbb9f49398de66.tar.xz | |
Merge branch 'sched-action-events'
Roman Mashak says:
====================
Fix event generation for actions batch Add/Delete mode
When adding or deleting a batch of entries, the kernel sends upto
TCA_ACT_MAX_PRIO entries in an event to user space. However it does not
consider that the action sizes may vary and require different skb sizes.
For example :
% cat tc-batch.sh
TC="sudo /mnt/iproute2.git/tc/tc"
$TC actions flush action gact
for i in `seq 1 $1`;
do
cmd="action pass index $i "
args=$args$cmd
done
$TC actions add $args
%
% ./tc-batch.sh 32
Error: Failed to fill netlink attributes while adding TC action.
We have an error talking to the kernel
%
This patchset introduces new callback in tc_action_ops, which calculates
the action size, and passes size to tcf_add_notify()/tcf_del_notify(). The
patch fixes act_gact, and the rest of actions will be updated in the
follow-up patches.
v3:
Fixed tcf_action_fill_size() to return shared attrs length when
action ->get_fill_size() isn't implemented.
v2:
Restructured patches to make them bisectable.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
| -rw-r--r-- | include/net/act_api.h | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/include/net/act_api.h b/include/net/act_api.h index 9c2f22695025..e0a9c2003b24 100644 --- a/include/net/act_api.h +++ b/include/net/act_api.h @@ -97,6 +97,7 @@ struct tc_action_ops { const struct tc_action_ops *, struct netlink_ext_ack *); void (*stats_update)(struct tc_action *, u64, u32, u64); + size_t (*get_fill_size)(const struct tc_action *act); struct net_device *(*get_dev)(const struct tc_action *a); }; @@ -166,7 +167,8 @@ int tcf_action_exec(struct sk_buff *skb, struct tc_action **actions, int nr_actions, struct tcf_result *res); int tcf_action_init(struct net *net, struct tcf_proto *tp, struct nlattr *nla, struct nlattr *est, char *name, int ovr, int bind, - struct list_head *actions, struct netlink_ext_ack *extack); + struct list_head *actions, size_t *attr_size, + struct netlink_ext_ack *extack); struct tc_action *tcf_action_init_1(struct net *net, struct tcf_proto *tp, struct nlattr *nla, struct nlattr *est, char *name, int ovr, int bind, |
