[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <49C74927.7020008@cosmosbay.com>
Date: Mon, 23 Mar 2009 09:32:39 +0100
From: Eric Dumazet <dada1@...mosbay.com>
To: Jarek Poplawski <jarkao2@...il.com>
CC: Vernon Mauery <vernux@...ibm.com>, netdev <netdev@...r.kernel.org>,
LKML <linux-kernel@...r.kernel.org>,
rt-users <linux-rt-users@...r.kernel.org>
Subject: Re: High contention on the sk_buff_head.lock
Jarek Poplawski a écrit :
> Vernon Mauery wrote, On 03/18/2009 09:17 PM:
> ...
>> This patch does seem to reduce the number of contentions by about 10%. That is
>> a good start (and a good catch on the cacheline bounces). But, like I mentioned
>> above, this lock still has 2 orders of magnitude greater contention than the
>> next lock, so even a large decrease like 10% makes little difference in the
>> overall contention characteristics.
>>
>> So we will have to do something more. Whether it needs to be more complex or
>> not is still up in the air. Batched enqueueing/dequeueing are just two options
>> and the former would be a *lot* less complex than the latter.
>>
>> If anyone else has any ideas they have been holding back, now would be a great
>> time to get them out in the open.
>
> I think there would be interesting to check another idea around this
> contention: not all contenders are equal here. One thread is doing
> qdisc_run() and owning the transmit queue (even after releasing the TX
> lock). So if it waits for the qdisc lock the NIC, if not multiqueue,
> is idle. Probably some handicap like in the patch below could make
> some difference in throughput; alas I didn't test it.
>
> Jarek P.
> ---
>
> net/core/dev.c | 6 +++++-
> 1 files changed, 5 insertions(+), 1 deletions(-)
>
> diff --git a/net/core/dev.c b/net/core/dev.c
> index f112970..d5ad808 100644
> --- a/net/core/dev.c
> +++ b/net/core/dev.c
> @@ -1852,7 +1852,11 @@ gso:
> if (q->enqueue) {
> spinlock_t *root_lock = qdisc_lock(q);
>
> - spin_lock(root_lock);
> + while (!spin_trylock(root_lock)) {
> + do {
> + cpu_relax();
> + } while (spin_is_locked(root_lock));
> + }
>
> if (unlikely(test_bit(__QDISC_STATE_DEACTIVATED, &q->state))) {
> kfree_skb(skb);
>
>
I dont understand, doesnt it defeat the ticket spinlock thing and fairness ?
Thread doing __qdisc_run() already owns the __QDISC_STATE_RUNNING bit.
trying or taking spinlock has same effect, since it force a cache line ping pong,
and this is the real problem.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists