From: Eric Dumazet <eric.dumazet@gmail.com>
To: Ben Greear <greearb@candelatech.com>
Cc: NetDev <netdev@vger.kernel.org>,
robert@herjulf.net, "David S. Miller" <davem@davemloft.net>
Subject: Re: pktgen and spin_lock_bh in xmit path
Date: Wed, 21 Oct 2009 07:14:02 +0200 [thread overview]
Message-ID: <4ADE989A.90209@gmail.com> (raw)
In-Reply-To: <4ADE9560.5050500@candelatech.com>
Ben Greear a écrit :
> Eric Dumazet wrote:
>> pktgen should not use "clone XXX" pkts if macvlan is used (or any
>> other driver
>> that ultimatly calls dev_queue_xmit() and queue packet), since skb
>> queue anchor
>> is shared and would be overwritten.
>> After some thoughts, I believe user is in error :)
> I tried to explain in my original post: The problem arises when
> when the hard-start-xmit fails with NETDEV_TX_BUSY. Part of the
> hard-start-xmit logic for virtual devices can call dev_queue_xmit, which
> can ultimately
> change the queue mapping and yet may still return NETDEV_TX_BUSY.
>
> pktgen would try to resend this skb next loop, and this is where it would
> blow up.
>
> I have a patched macvlan logic and a patched dev queue xmit logic that
> allows
> me to return NETDEV_TX_BUSY when underlying device fails to transmit.
>
> It may be that my hacked macvlan is the only virtual device that could ever
> return NETDEV_TX_BUSY, and if that is the case, I don't think the bug
> could ever be hit in official kernel code. My opinion is that the
> current pktgen code makes
> too many assumptions, so unless there is a performance penalty, I still
> think it should be cleaned up. But, I may be too paranoid.
If a virtual device changes skb->queue_map, it must consume skb,
or it breaks caller.
Alternative would be to restore queue_map to its initial value in
your hacked macvlan when it wants to return NETDEV_TX_BUSY status.
We could add a WARN_ON(skb_get_queue_mapping(pkt_dev->skb) != queue_map);
in pktgen, to catch driver errors but pktgen assumption is right IMHO
@@ -3466,6 +3471,7 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev)
/* fallthru */
case NETDEV_TX_LOCKED:
case NETDEV_TX_BUSY:
+ WARN_ON(skb_get_queue_mapping(pkt_dev->skb) != queue_map);
/* Retry it next time */
atomic_dec(&(pkt_dev->skb->users));
pkt_dev->last_ok = 0;
next prev parent reply other threads:[~2009-10-21 5:14 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-10-20 3:38 pktgen and spin_lock_bh in xmit path Ben Greear
2009-10-20 3:48 ` Eric Dumazet
2009-10-20 4:52 ` Ben Greear
2009-10-20 17:37 ` Ben Greear
2009-10-20 17:44 ` Eric Dumazet
2009-10-20 17:54 ` Ben Greear
2009-10-20 18:35 ` Eric Dumazet
2009-10-20 18:54 ` Eric Dumazet
2009-10-20 20:16 ` Ben Greear
2009-10-20 21:10 ` Ben Greear
2009-10-20 21:22 ` Eric Dumazet
2009-10-20 21:30 ` Ben Greear
2009-10-20 21:57 ` Eric Dumazet
2009-10-20 23:17 ` Ben Greear
2009-10-21 3:05 ` Ben Greear
2009-10-21 3:12 ` Eric Dumazet
2009-10-21 3:59 ` Eric Dumazet
2009-10-21 5:00 ` Ben Greear
2009-10-21 5:14 ` Eric Dumazet [this message]
2009-10-21 5:40 ` Ben Greear
2009-10-21 5:12 ` Krishna Kumar2
2009-10-21 5:32 ` Ben Greear
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4ADE989A.90209@gmail.com \
--to=eric.dumazet@gmail.com \
--cc=davem@davemloft.net \
--cc=greearb@candelatech.com \
--cc=netdev@vger.kernel.org \
--cc=robert@herjulf.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.