mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-27 00:51:35 +00:00
net: sched: when clearing NOLOCK, clear TCQ_F_CPUSTATS, too
Since stats updating is always consistent with TCQ_F_CPUSTATS flag, we can disable it at qdisc creation time flipping such bit. In my experiments, if the NOLOCK flag is cleared, per CPU stats accounting does not give any measurable performance gain, but it waste some memory. Let's clear TCQ_F_CPUSTATS together with NOLOCK, when enslaving a NOLOCK qdisc to 'lock' one. Use stats update helper inside pfifo_fast, to cope correctly with TCQ_F_CPUSTATS flag change. As a side effect, q.qlen value for any child qdiscs is always consistent for all lock classfull qdiscs. Signed-off-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
9c01c9f1f2
commit
8a53e616de
3 changed files with 42 additions and 9 deletions
|
@ -998,6 +998,19 @@ static void notify_and_destroy(struct net *net, struct sk_buff *skb,
|
|||
qdisc_put(old);
|
||||
}
|
||||
|
||||
static void qdisc_clear_nolock(struct Qdisc *sch)
|
||||
{
|
||||
sch->flags &= ~TCQ_F_NOLOCK;
|
||||
if (!(sch->flags & TCQ_F_CPUSTATS))
|
||||
return;
|
||||
|
||||
free_percpu(sch->cpu_bstats);
|
||||
free_percpu(sch->cpu_qstats);
|
||||
sch->cpu_bstats = NULL;
|
||||
sch->cpu_qstats = NULL;
|
||||
sch->flags &= ~TCQ_F_CPUSTATS;
|
||||
}
|
||||
|
||||
/* Graft qdisc "new" to class "classid" of qdisc "parent" or
|
||||
* to device "dev".
|
||||
*
|
||||
|
@ -1076,7 +1089,7 @@ skip:
|
|||
/* Only support running class lockless if parent is lockless */
|
||||
if (new && (new->flags & TCQ_F_NOLOCK) &&
|
||||
parent && !(parent->flags & TCQ_F_NOLOCK))
|
||||
new->flags &= ~TCQ_F_NOLOCK;
|
||||
qdisc_clear_nolock(new);
|
||||
|
||||
if (!cops || !cops->graft)
|
||||
return -EOPNOTSUPP;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue