net: core: introduce mini_Qdisc and eliminate usage of tp->q for clsact fastpath
In sch_handle_egress and sch_handle_ingress tp->q is used only in order to update stats. So stats and filter list are the only things that are needed in clsact qdisc fastpath processing. Introduce new mini_Qdisc struct to hold those items. Also, introduce a helper to swap the mini_Qdisc structures in case filter list head changes. This removes need for tp->q usage without added overhead. Signed-off-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
c7eb7d7230
commit
46209401f8
@@ -904,4 +904,36 @@ static inline void psched_ratecfg_getrate(struct tc_ratespec *res,
|
||||
res->linklayer = (r->linklayer & TC_LINKLAYER_MASK);
|
||||
}
|
||||
|
||||
/* Mini Qdisc serves for specific needs of ingress/clsact Qdisc.
|
||||
* The fast path only needs to access filter list and to update stats
|
||||
*/
|
||||
struct mini_Qdisc {
|
||||
struct tcf_proto *filter_list;
|
||||
struct gnet_stats_basic_cpu __percpu *cpu_bstats;
|
||||
struct gnet_stats_queue __percpu *cpu_qstats;
|
||||
struct rcu_head rcu;
|
||||
};
|
||||
|
||||
static inline void mini_qdisc_bstats_cpu_update(struct mini_Qdisc *miniq,
|
||||
const struct sk_buff *skb)
|
||||
{
|
||||
bstats_cpu_update(this_cpu_ptr(miniq->cpu_bstats), skb);
|
||||
}
|
||||
|
||||
static inline void mini_qdisc_qstats_cpu_drop(struct mini_Qdisc *miniq)
|
||||
{
|
||||
this_cpu_inc(miniq->cpu_qstats->drops);
|
||||
}
|
||||
|
||||
struct mini_Qdisc_pair {
|
||||
struct mini_Qdisc miniq1;
|
||||
struct mini_Qdisc miniq2;
|
||||
struct mini_Qdisc __rcu **p_miniq;
|
||||
};
|
||||
|
||||
void mini_qdisc_pair_swap(struct mini_Qdisc_pair *miniqp,
|
||||
struct tcf_proto *tp_head);
|
||||
void mini_qdisc_pair_init(struct mini_Qdisc_pair *miniqp, struct Qdisc *qdisc,
|
||||
struct mini_Qdisc __rcu **p_miniq);
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user