[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <5f5a959fbe236_c295820892@john-XPS-13-9370.notmuch>
Date: Thu, 10 Sep 2020 14:07:43 -0700
From: John Fastabend <john.fastabend@...il.com>
To: Cong Wang <xiyou.wangcong@...il.com>,
John Fastabend <john.fastabend@...il.com>
Cc: Paolo Abeni <pabeni@...hat.com>,
Kehuan Feng <kehuan.feng@...il.com>,
Hillf Danton <hdanton@...a.com>,
Jike Song <albcamus@...il.com>, Josh Hunt <johunt@...mai.com>,
Jonas Bonn <jonas.bonn@...rounds.com>,
Michael Zhivich <mzhivich@...mai.com>,
David Miller <davem@...emloft.net>,
LKML <linux-kernel@...r.kernel.org>,
Netdev <netdev@...r.kernel.org>
Subject: Re: Packet gets stuck in NOLOCK pfifo_fast qdisc
Cong Wang wrote:
> On Thu, Sep 3, 2020 at 10:08 PM John Fastabend <john.fastabend@...il.com> wrote:
> > Maybe this would unlock us,
> >
> > diff --git a/net/core/dev.c b/net/core/dev.c
> > index 7df6c9617321..9b09429103f1 100644
> > --- a/net/core/dev.c
> > +++ b/net/core/dev.c
> > @@ -3749,7 +3749,7 @@ static inline int __dev_xmit_skb(struct sk_buff *skb, struct Qdisc *q,
> >
> > if (q->flags & TCQ_F_NOLOCK) {
> > rc = q->enqueue(skb, q, &to_free) & NET_XMIT_MASK;
> > - qdisc_run(q);
> > + __qdisc_run(q);
> >
> > if (unlikely(to_free))
> > kfree_skb_list(to_free);
> >
> >
> > Per other thread we also need the state deactivated check added
> > back.
>
> I guess no, because pfifo_dequeue() seems to require q->seqlock,
> according to comments in qdisc_run(), so we can not just get rid of
> qdisc_run_begin()/qdisc_run_end() here.
>
> Thanks.
Seems we would have to revert this as well then,
commit 021a17ed796b62383f7623f4fea73787abddad77
Author: Paolo Abeni <pabeni@...hat.com>
Date: Tue May 15 16:24:37 2018 +0200
pfifo_fast: drop unneeded additional lock on dequeue
After the previous patch, for NOLOCK qdiscs, q->seqlock is
always held when the dequeue() is invoked, we can drop
any additional locking to protect such operation.
Then I think it should be safe. Back when I was working on the ptr
ring implementation I opted not to do a case without the spinlock
because the performance benefit was minimal in the benchmarks I
was looking at. I assumed at some point it would be worth going
back to it, but just changing those to the __ptr_ring* cases is
not safe without a lock. I remember having a discussion with Tsirkin
about the details, but would have to go through the mail servers
to find it.
FWIW the initial perf looked like this, (https://lwn.net/Articles/698135/)
nolock pfifo_fast
1: 1417597 1407479 1418913 1439601
2: 1882009 1867799 1864374 1855950
4: 1806736 1804261 1803697 1806994
8: 1354318 1358686 1353145 1356645
12: 1331928 1333079 1333476 1335544
locked pfifo_fast
1: 1471479 1469142 1458825 1456788
2: 1746231 1749490 1753176 1753780
4: 1119626 1120515 1121478 1119220
8: 1001471 999308 1000318 1000776
12: 989269 992122 991590 986581
As you can see measurable improvement on many cores. But, actually
worse if you have enough nic queues to map 1:1 with cores.
nolock mq
1: 1417768 1438712 1449092 1426775
2: 2644099 2634961 2628939 2712867
4: 4866133 4862802 4863396 4867423
8: 9422061 9464986 9457825 9467619
12: 13854470 13213735 13664498 13213292
locked mq
1: 1448374 1444208 1437459 1437088
2: 2687963 2679221 2651059 2691630
4: 5153884 4684153 5091728 4635261
8: 9292395 9625869 9681835 9711651
12: 13553918 13682410 14084055 13946138
So only better if you have more cores than hardware queues
which was the case on some of the devices we had at the time.
Thanks,
John
Powered by blists - more mailing lists