Fri, Apr 21, 2017 at 12:55:32PM CEST, j...@mojatatu.com wrote: >From: Jamal Hadi Salim <j...@mojatatu.com> > >This adds support for filtering based on time since last used. >When we are dumping a large number of actions it is useful to >have the option of filtering based on when the action was last >used to reduce the amount of data crossing to user space. > >With this patch the user space app sets the TCA_ROOT_TIME_DELTA >attribute with the value in milliseconds with "time of interest >since now". The kernel converts this to jiffies and does the >filtering comparison matching entries that have seen activity >since then and returns them to user space. >Old kernels and old tc continue to work in legacy mode since >they dont specify this attribute. > >Some example (we have 400 actions bound to 400 filters); at >installation time using hacked tc which sets the time of >interest to 120 seconds: > >prompt$ hackedtc actions ls action gact | grep index | wc -l >400 > >go get some coffee and wait for > 120 seconds and try again: > >prompt$ hackedtc actions ls action gact | grep index | wc -l >0 > >Lets see a filter bound to one of these actions: >.. >filter pref 10 u32 >filter pref 10 u32 fh 800: ht divisor 1 >filter pref 10 u32 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:10 (rule >hit 2 success 1) > match 7f000002/ffffffff at 12 (success 1 ) > action order 1: gact action pass > random type none pass val 0 > index 23 ref 2 bind 1 installed 1145 sec used 802 sec > Action statistics: > Sent 84 bytes 1 pkt (dropped 0, overlimits 0 requeues 0) > backlog 0b 0p requeues 0 >.... > >that coffee took long, no? It was good. > >Now lets ping -c 1 127.0.0.2, then run the actions again: > >prompt$ hackedtc actions ls action gact | grep index | wc -l >1 > >More details please: > >prompt$ hackedtc -s actions ls action gact > > action order 0: gact action pass > random type none pass val 0 > index 23 ref 2 bind 1 installed 1270 sec used 30 sec > Action statistics: > Sent 168 bytes 2 pkt (dropped 0, overlimits 0 requeues 0) > backlog 0b 0p requeues 0 > >And the filter? > >filter pref 10 u32 >filter pref 10 u32 fh 800: ht divisor 1 >filter pref 10 u32 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:10 (rule >hit 4 success 2) > match 7f000002/ffffffff at 12 (success 2 ) > action order 1: gact action pass > random type none pass val 0 > index 23 ref 2 bind 1 installed 1324 sec used 84 sec > Action statistics: > Sent 168 bytes 2 pkt (dropped 0, overlimits 0 requeues 0) > backlog 0b 0p requeues 0 > >Signed-off-by: Jamal Hadi Salim <j...@mojatatu.com> >--- > include/uapi/linux/rtnetlink.h | 1 + > net/sched/act_api.c | 20 +++++++++++++++++++- > 2 files changed, 20 insertions(+), 1 deletion(-) > >diff --git a/include/uapi/linux/rtnetlink.h b/include/uapi/linux/rtnetlink.h >index 09e7b22d..54db916 100644 >--- a/include/uapi/linux/rtnetlink.h >+++ b/include/uapi/linux/rtnetlink.h >@@ -681,6 +681,7 @@ enum { > #define TCA_ACT_TAB TCA_ROOT_TAB > TCA_ROOT_FLAGS, > TCA_ROOT_COUNT, >+ TCA_ROOT_TIME_DELTA, /* in msecs */ > __TCA_ROOT_MAX, > #define TCA_ROOT_MAX (__TCA_ROOT_MAX - 1) > }; >diff --git a/net/sched/act_api.c b/net/sched/act_api.c >index cfb3548..b97d5f0 100644 >--- a/net/sched/act_api.c >+++ b/net/sched/act_api.c >@@ -84,6 +84,7 @@ static int tcf_dump_walker(struct tcf_hashinfo *hinfo, >struct sk_buff *skb, > { > int err = 0, index = -1, i = 0, s_i = 0, n_i = 0; > u32 act_flags = cb->args[2]; >+ unsigned long jiffy_since = cb->args[3]; > struct nlattr *nest; > > spin_lock_bh(&hinfo->lock); >@@ -101,6 +102,11 @@ static int tcf_dump_walker(struct tcf_hashinfo *hinfo, >struct sk_buff *skb, > if (index < s_i) > continue; > >+ if (jiffy_since && >+ time_after(jiffy_since, >+ (unsigned long)p->tcfa_tm.lastuse)) >+ continue; >+ > nest = nla_nest_start(skb, n_i); > if (nest == NULL) > goto nla_put_failure; >@@ -118,9 +124,11 @@ static int tcf_dump_walker(struct tcf_hashinfo *hinfo, >struct sk_buff *skb, > } > } > done: >+ if (index > 0) >+ cb->args[0] = index + 1; >+ > spin_unlock_bh(&hinfo->lock); > if (n_i) { >- cb->args[0] += n_i; > if (act_flags & TCA_FLAG_LARGE_DUMP_ON) > cb->args[1] = n_i; > } >@@ -1000,6 +1008,7 @@ static int tcf_action_add(struct net *net, struct nlattr >*nla, > > static const struct nla_policy tcaa_policy[TCA_ROOT_MAX + 1] = { > [TCA_ROOT_FLAGS] = { .type = NLA_U32 }, >+ [TCA_ROOT_TIME_DELTA] = { .type = NLA_U32 },
Align these assignments please.