[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <4ADE3253.10302@gmail.com>
Date: Tue, 20 Oct 2009 23:57:39 +0200
From: Eric Dumazet <eric.dumazet@...il.com>
To: Ben Greear <greearb@...delatech.com>
CC: NetDev <netdev@...r.kernel.org>, robert@...julf.net,
"David S. Miller" <davem@...emloft.net>
Subject: Re: pktgen and spin_lock_bh in xmit path
Ben Greear a écrit :
> That's definitely a nasty little issue. Using skb_set_queue_mapping
> in pktgen makes it run for me, but may just be getting lucky with the
> mac-vlan interfaces which will do the dev_queue_xmit (but, I don't so much
> care exactly what queue is used as long as things don't crash and the
> link doesn't reset).
>
> Don't worry about a quick patch on my account. I seem to have it working
> to at least some degree (no funny crashes, no link watchdog timeouts).
>
Could you try following patch ?
This makes queue_mapping invariant if set in range [0 ... real_num_tx_queues-1]
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index df7b23a..3ef2429 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -2023,17 +2023,17 @@ static inline void skb_copy_queue_mapping(struct sk_buff *to, const struct sk_bu
static inline void skb_record_rx_queue(struct sk_buff *skb, u16 rx_queue)
{
- skb->queue_mapping = rx_queue + 1;
+ skb->queue_mapping = rx_queue;
}
static inline u16 skb_get_rx_queue(const struct sk_buff *skb)
{
- return skb->queue_mapping - 1;
+ return skb->queue_mapping;
}
static inline bool skb_rx_queue_recorded(const struct sk_buff *skb)
{
- return (skb->queue_mapping != 0);
+ return (skb->queue_mapping != 0xffff);
}
extern u16 skb_tx_hash(const struct net_device *dev,
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 80a9616..5f04f00 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -198,6 +198,7 @@ struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask,
memset(skb, 0, offsetof(struct sk_buff, tail));
skb->truesize = size + sizeof(struct sk_buff);
atomic_set(&skb->users, 1);
+ skb->queue_mapping = 0xffff;
skb->head = data;
skb->data = data;
skb_reset_tail_pointer(skb);
--
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