linux-next.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: [RFC PATCH net-next] packet: fix using smp_processor_id() in preemptible code
  2013-12-12  6:10 [RFC PATCH net-next] packet: fix using smp_processor_id() in preemptible code Li Zhong
@ 2013-12-11  9:55 ` Daniel Borkmann
  2013-12-12 23:55   ` Li Zhong
  2013-12-11 21:49 ` David Miller
  1 sibling, 1 reply; 8+ messages in thread
From: Daniel Borkmann @ 2013-12-11  9:55 UTC (permalink / raw)
  To: Li Zhong; +Cc: linux-next list, brouer, davem

On 12/12/2013 07:10 AM, Li Zhong wrote:
> This patches tries to fix the following warning on next-1211 by
> replacing smp_processor_id() with raw_smp_processor_id().

I agree with that part. Please send a fix just replacing smp_processor_id()
into raw_smp_processor_id() for net-next to netdev directly.

> Also, it seems that we could move skb_set_queue_mapping() into
> packet_pick_tx_queue(), so we avoid calling it one more time
> unnecessarily if we are going into the normal dev_queue_xmit() code
> path.

I don't agree with that part, I think this can be also beneficiary for
packets without direct xmit, as in PF_PACKET we don't have a notion of
"flow" but just raw packets instead, and can keep the mapping local
depending on the current CPU as we do queue setting elsewhere in the
stack just as well.

> [   11.120893] BUG: using smp_processor_id() in preemptible [00000000] code: arping/3510
> [   11.120913] caller is .packet_sendmsg+0xc14/0xe68
> [   11.120920] CPU: 13 PID: 3510 Comm: arping Not tainted 3.13.0-rc3-next-20131211-dirty #1
> [   11.120926] Call Trace:
> [   11.120932] [c0000001f803f6f0] [c0000000000138dc] .show_stack+0x110/0x25c (unreliable)
> [   11.120942] [c0000001f803f7e0] [c00000000083dd24] .dump_stack+0xa0/0x37c
> [   11.120951] [c0000001f803f870] [c000000000493fd4] .debug_smp_processor_id+0xfc/0x12c
> [   11.120959] [c0000001f803f900] [c0000000007eba78] .packet_sendmsg+0xc14/0xe68
> [   11.120968] [c0000001f803fa80] [c000000000700968] .sock_sendmsg+0xa0/0xe0
> [   11.120975] [c0000001f803fbf0] [c0000000007014d8] .SyS_sendto+0x100/0x148
> [   11.120983] [c0000001f803fd60] [c0000000006fff10] .SyS_socketcall+0x1c4/0x2e8
> [   11.120990] [c0000001f803fe30] [c00000000000a1e4] syscall_exit+0x0/0x9c
>
> Signed-off-by: Li Zhong <zhong@linux.vnet.ibm.com>
> ---
>   net/packet/af_packet.c |   16 ++++++++--------
>   1 files changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
> index 9d70f13..20f6d56 100644
> --- a/net/packet/af_packet.c
> +++ b/net/packet/af_packet.c
> @@ -237,6 +237,13 @@ struct packet_skb_cb {
>   static void __fanout_unlink(struct sock *sk, struct packet_sock *po);
>   static void __fanout_link(struct sock *sk, struct packet_sock *po);
>
> +static u16 packet_pick_tx_queue(struct net_device *dev, struct sk_buff *skb)
> +{
> +	u16 queue_index = (u16)raw_smp_processor_id() % dev->real_num_tx_queues;
> +	skb_set_queue_mapping(skb, queue_index);
> +	return queue_index;
> +}
> +
>   static int packet_direct_xmit(struct sk_buff *skb)
>   {
>   	struct net_device *dev = skb->dev;
> @@ -259,7 +266,7 @@ static int packet_direct_xmit(struct sk_buff *skb)
>   		return NET_XMIT_DROP;
>   	}
>
> -	queue_map = skb_get_queue_mapping(skb);
> +	queue_map = packet_pick_tx_queue(dev, skb);
>   	txq = netdev_get_tx_queue(dev, queue_map);
>
>   	__netif_tx_lock_bh(txq);
> @@ -308,11 +315,6 @@ static bool packet_use_direct_xmit(const struct packet_sock *po)
>   	return po->xmit == packet_direct_xmit;
>   }
>
> -static u16 packet_pick_tx_queue(struct net_device *dev)
> -{
> -	return (u16) smp_processor_id() % dev->real_num_tx_queues;
> -}
> -
>   /* register_prot_hook must be invoked with the po->bind_lock held,
>    * or from a context in which asynchronous accesses to the packet
>    * socket is not possible (packet_create()).
> @@ -2219,7 +2221,6 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg)
>   			}
>   		}
>
> -		skb_set_queue_mapping(skb, packet_pick_tx_queue(dev));
>   		skb->destructor = tpacket_destruct_skb;
>   		__packet_set_status(po, ph, TP_STATUS_SENDING);
>   		atomic_inc(&po->tx_ring.pending);
> @@ -2429,7 +2430,6 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
>   	skb->dev = dev;
>   	skb->priority = sk->sk_priority;
>   	skb->mark = sk->sk_mark;
> -	skb_set_queue_mapping(skb, packet_pick_tx_queue(dev));
>
>   	if (po->has_vnet_hdr) {
>   		if (vnet_hdr.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) {
>
>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC PATCH net-next] packet: fix using smp_processor_id() in preemptible code
  2013-12-12  6:10 [RFC PATCH net-next] packet: fix using smp_processor_id() in preemptible code Li Zhong
  2013-12-11  9:55 ` Daniel Borkmann
@ 2013-12-11 21:49 ` David Miller
  2013-12-12 22:54   ` Li Zhong
  1 sibling, 1 reply; 8+ messages in thread
From: David Miller @ 2013-12-11 21:49 UTC (permalink / raw)
  To: zhong; +Cc: linux-next, dborkman, brouer


Please send networking patches to netdev@vger.kernel.org, otherwise they
will get lost.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [RFC PATCH net-next] packet: fix using smp_processor_id() in preemptible code
@ 2013-12-12  6:10 Li Zhong
  2013-12-11  9:55 ` Daniel Borkmann
  2013-12-11 21:49 ` David Miller
  0 siblings, 2 replies; 8+ messages in thread
From: Li Zhong @ 2013-12-12  6:10 UTC (permalink / raw)
  To: linux-next list; +Cc: dborkman, brouer, davem

This patches tries to fix the following warning on next-1211 by
replacing smp_processor_id() with raw_smp_processor_id(). 

Also, it seems that we could move skb_set_queue_mapping() into
packet_pick_tx_queue(), so we avoid calling it one more time
unnecessarily if we are going into the normal dev_queue_xmit() code
path. 

[   11.120893] BUG: using smp_processor_id() in preemptible [00000000] code: arping/3510
[   11.120913] caller is .packet_sendmsg+0xc14/0xe68
[   11.120920] CPU: 13 PID: 3510 Comm: arping Not tainted 3.13.0-rc3-next-20131211-dirty #1
[   11.120926] Call Trace:
[   11.120932] [c0000001f803f6f0] [c0000000000138dc] .show_stack+0x110/0x25c (unreliable)
[   11.120942] [c0000001f803f7e0] [c00000000083dd24] .dump_stack+0xa0/0x37c
[   11.120951] [c0000001f803f870] [c000000000493fd4] .debug_smp_processor_id+0xfc/0x12c
[   11.120959] [c0000001f803f900] [c0000000007eba78] .packet_sendmsg+0xc14/0xe68
[   11.120968] [c0000001f803fa80] [c000000000700968] .sock_sendmsg+0xa0/0xe0
[   11.120975] [c0000001f803fbf0] [c0000000007014d8] .SyS_sendto+0x100/0x148
[   11.120983] [c0000001f803fd60] [c0000000006fff10] .SyS_socketcall+0x1c4/0x2e8
[   11.120990] [c0000001f803fe30] [c00000000000a1e4] syscall_exit+0x0/0x9c

Signed-off-by: Li Zhong <zhong@linux.vnet.ibm.com>
---
 net/packet/af_packet.c |   16 ++++++++--------
 1 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index 9d70f13..20f6d56 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -237,6 +237,13 @@ struct packet_skb_cb {
 static void __fanout_unlink(struct sock *sk, struct packet_sock *po);
 static void __fanout_link(struct sock *sk, struct packet_sock *po);
 
+static u16 packet_pick_tx_queue(struct net_device *dev, struct sk_buff *skb)
+{
+	u16 queue_index = (u16)raw_smp_processor_id() % dev->real_num_tx_queues;
+	skb_set_queue_mapping(skb, queue_index);
+	return queue_index;
+}
+
 static int packet_direct_xmit(struct sk_buff *skb)
 {
 	struct net_device *dev = skb->dev;
@@ -259,7 +266,7 @@ static int packet_direct_xmit(struct sk_buff *skb)
 		return NET_XMIT_DROP;
 	}
 
-	queue_map = skb_get_queue_mapping(skb);
+	queue_map = packet_pick_tx_queue(dev, skb);
 	txq = netdev_get_tx_queue(dev, queue_map);
 
 	__netif_tx_lock_bh(txq);
@@ -308,11 +315,6 @@ static bool packet_use_direct_xmit(const struct packet_sock *po)
 	return po->xmit == packet_direct_xmit;
 }
 
-static u16 packet_pick_tx_queue(struct net_device *dev)
-{
-	return (u16) smp_processor_id() % dev->real_num_tx_queues;
-}
-
 /* register_prot_hook must be invoked with the po->bind_lock held,
  * or from a context in which asynchronous accesses to the packet
  * socket is not possible (packet_create()).
@@ -2219,7 +2221,6 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg)
 			}
 		}
 
-		skb_set_queue_mapping(skb, packet_pick_tx_queue(dev));
 		skb->destructor = tpacket_destruct_skb;
 		__packet_set_status(po, ph, TP_STATUS_SENDING);
 		atomic_inc(&po->tx_ring.pending);
@@ -2429,7 +2430,6 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
 	skb->dev = dev;
 	skb->priority = sk->sk_priority;
 	skb->mark = sk->sk_mark;
-	skb_set_queue_mapping(skb, packet_pick_tx_queue(dev));
 
 	if (po->has_vnet_hdr) {
 		if (vnet_hdr.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) {

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [RFC PATCH net-next] packet: fix using smp_processor_id() in preemptible code
  2013-12-12 23:55   ` Li Zhong
@ 2013-12-12  7:18     ` Jesper Dangaard Brouer
  2013-12-13  6:41       ` Li Zhong
  0 siblings, 1 reply; 8+ messages in thread
From: Jesper Dangaard Brouer @ 2013-12-12  7:18 UTC (permalink / raw)
  To: Li Zhong; +Cc: Daniel Borkmann, linux-next list, brouer, davem


On Fri, 13 Dec 2013 07:55:03 +0800 Li Zhong <zhong@linux.vnet.ibm.com> wrote:
> On Wed, 2013-12-11 at 10:55 +0100, Daniel Borkmann wrote:
> > On 12/12/2013 07:10 AM, Li Zhong wrote:
[...]
> > > Also, it seems that we could move skb_set_queue_mapping() into
> > > packet_pick_tx_queue(), so we avoid calling it one more time
> > > unnecessarily if we are going into the normal dev_queue_xmit() code
> > > path.
> > 
> > I don't agree with that part, I think this can be also beneficiary for
> > packets without direct xmit, as in PF_PACKET we don't have a notion of
> > "flow" but just raw packets instead, and can keep the mapping local
> > depending on the current CPU as we do queue setting elsewhere in the
> > stack just as well.
> 
> It seems to me that the newly added xmit in packet_sock is
> dev_queue_xmit() by default, and in this default case, dev_queue_xmit()
> would call netdev_pick_tx(), which would set the skb queue_mapping again
> to override the value based on the current CPU. 

Yes, I think you are right, that is also my experience with the code path.

> Or did I miss something here? 

A bit related; One thing I'm missing to understand, is why the
RAW/PF_PACKET sockets have a NULL in skb->sk when they reach
__netdev_pick_tx() ? (resulting in they cannot store/cache the queue in
sk_tx_queue_set)

-- 
Best regards,
  Jesper Dangaard Brouer
  MSc.CS, Sr. Network Kernel Developer at Red Hat
  Author of http://www.iptv-analyzer.org
  LinkedIn: http://www.linkedin.com/in/brouer

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC PATCH net-next] packet: fix using smp_processor_id() in preemptible code
  2013-12-11 21:49 ` David Miller
@ 2013-12-12 22:54   ` Li Zhong
  0 siblings, 0 replies; 8+ messages in thread
From: Li Zhong @ 2013-12-12 22:54 UTC (permalink / raw)
  To: David Miller; +Cc: linux-next, dborkman, brouer

On Wed, 2013-12-11 at 16:49 -0500, David Miller wrote:
> Please send networking patches to netdev@vger.kernel.org, otherwise they
> will get lost.
> 
Thank you for the reminder :)

Zhong

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC PATCH net-next] packet: fix using smp_processor_id() in preemptible code
  2013-12-11  9:55 ` Daniel Borkmann
@ 2013-12-12 23:55   ` Li Zhong
  2013-12-12  7:18     ` Jesper Dangaard Brouer
  0 siblings, 1 reply; 8+ messages in thread
From: Li Zhong @ 2013-12-12 23:55 UTC (permalink / raw)
  To: Daniel Borkmann; +Cc: linux-next list, brouer, davem

On Wed, 2013-12-11 at 10:55 +0100, Daniel Borkmann wrote:
> On 12/12/2013 07:10 AM, Li Zhong wrote:
> > This patches tries to fix the following warning on next-1211 by
> > replacing smp_processor_id() with raw_smp_processor_id().
> 
> I agree with that part. Please send a fix just replacing smp_processor_id()
> into raw_smp_processor_id() for net-next to netdev directly.

Thank you for the review :), patch sent as you suggested. 

> 
> > Also, it seems that we could move skb_set_queue_mapping() into
> > packet_pick_tx_queue(), so we avoid calling it one more time
> > unnecessarily if we are going into the normal dev_queue_xmit() code
> > path.
> 
> I don't agree with that part, I think this can be also beneficiary for
> packets without direct xmit, as in PF_PACKET we don't have a notion of
> "flow" but just raw packets instead, and can keep the mapping local
> depending on the current CPU as we do queue setting elsewhere in the
> stack just as well.

It seems to me that the newly added xmit in packet_sock is
dev_queue_xmit() by default, and in this default case, dev_queue_xmit()
would call netdev_pick_tx(), which would set the skb queue_mapping again
to override the value based on the current CPU. 

Or did I miss something here? 

Thanks, Zhong

> 
> > [   11.120893] BUG: using smp_processor_id() in preemptible [00000000] code: arping/3510
> > [   11.120913] caller is .packet_sendmsg+0xc14/0xe68
> > [   11.120920] CPU: 13 PID: 3510 Comm: arping Not tainted 3.13.0-rc3-next-20131211-dirty #1
> > [   11.120926] Call Trace:
> > [   11.120932] [c0000001f803f6f0] [c0000000000138dc] .show_stack+0x110/0x25c (unreliable)
> > [   11.120942] [c0000001f803f7e0] [c00000000083dd24] .dump_stack+0xa0/0x37c
> > [   11.120951] [c0000001f803f870] [c000000000493fd4] .debug_smp_processor_id+0xfc/0x12c
> > [   11.120959] [c0000001f803f900] [c0000000007eba78] .packet_sendmsg+0xc14/0xe68
> > [   11.120968] [c0000001f803fa80] [c000000000700968] .sock_sendmsg+0xa0/0xe0
> > [   11.120975] [c0000001f803fbf0] [c0000000007014d8] .SyS_sendto+0x100/0x148
> > [   11.120983] [c0000001f803fd60] [c0000000006fff10] .SyS_socketcall+0x1c4/0x2e8
> > [   11.120990] [c0000001f803fe30] [c00000000000a1e4] syscall_exit+0x0/0x9c
> >
> > Signed-off-by: Li Zhong <zhong@linux.vnet.ibm.com>
> > ---
> >   net/packet/af_packet.c |   16 ++++++++--------
> >   1 files changed, 8 insertions(+), 8 deletions(-)
> >
> > diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
> > index 9d70f13..20f6d56 100644
> > --- a/net/packet/af_packet.c
> > +++ b/net/packet/af_packet.c
> > @@ -237,6 +237,13 @@ struct packet_skb_cb {
> >   static void __fanout_unlink(struct sock *sk, struct packet_sock *po);
> >   static void __fanout_link(struct sock *sk, struct packet_sock *po);
> >
> > +static u16 packet_pick_tx_queue(struct net_device *dev, struct sk_buff *skb)
> > +{
> > +	u16 queue_index = (u16)raw_smp_processor_id() % dev->real_num_tx_queues;
> > +	skb_set_queue_mapping(skb, queue_index);
> > +	return queue_index;
> > +}
> > +
> >   static int packet_direct_xmit(struct sk_buff *skb)
> >   {
> >   	struct net_device *dev = skb->dev;
> > @@ -259,7 +266,7 @@ static int packet_direct_xmit(struct sk_buff *skb)
> >   		return NET_XMIT_DROP;
> >   	}
> >
> > -	queue_map = skb_get_queue_mapping(skb);
> > +	queue_map = packet_pick_tx_queue(dev, skb);
> >   	txq = netdev_get_tx_queue(dev, queue_map);
> >
> >   	__netif_tx_lock_bh(txq);
> > @@ -308,11 +315,6 @@ static bool packet_use_direct_xmit(const struct packet_sock *po)
> >   	return po->xmit == packet_direct_xmit;
> >   }
> >
> > -static u16 packet_pick_tx_queue(struct net_device *dev)
> > -{
> > -	return (u16) smp_processor_id() % dev->real_num_tx_queues;
> > -}
> > -
> >   /* register_prot_hook must be invoked with the po->bind_lock held,
> >    * or from a context in which asynchronous accesses to the packet
> >    * socket is not possible (packet_create()).
> > @@ -2219,7 +2221,6 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg)
> >   			}
> >   		}
> >
> > -		skb_set_queue_mapping(skb, packet_pick_tx_queue(dev));
> >   		skb->destructor = tpacket_destruct_skb;
> >   		__packet_set_status(po, ph, TP_STATUS_SENDING);
> >   		atomic_inc(&po->tx_ring.pending);
> > @@ -2429,7 +2430,6 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
> >   	skb->dev = dev;
> >   	skb->priority = sk->sk_priority;
> >   	skb->mark = sk->sk_mark;
> > -	skb_set_queue_mapping(skb, packet_pick_tx_queue(dev));
> >
> >   	if (po->has_vnet_hdr) {
> >   		if (vnet_hdr.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) {
> >
> >
> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC PATCH net-next] packet: fix using smp_processor_id() in preemptible code
  2013-12-12  7:18     ` Jesper Dangaard Brouer
@ 2013-12-13  6:41       ` Li Zhong
  2013-12-13  7:40         ` Li Zhong
  0 siblings, 1 reply; 8+ messages in thread
From: Li Zhong @ 2013-12-13  6:41 UTC (permalink / raw)
  To: Jesper Dangaard Brouer; +Cc: Daniel Borkmann, linux-next list, brouer, davem

On Thu, 2013-12-12 at 08:18 +0100, Jesper Dangaard Brouer wrote:
> On Fri, 13 Dec 2013 07:55:03 +0800 Li Zhong <zhong@linux.vnet.ibm.com> wrote:
> > On Wed, 2013-12-11 at 10:55 +0100, Daniel Borkmann wrote:
> > > On 12/12/2013 07:10 AM, Li Zhong wrote:
> [...]
> > > > Also, it seems that we could move skb_set_queue_mapping() into
> > > > packet_pick_tx_queue(), so we avoid calling it one more time
> > > > unnecessarily if we are going into the normal dev_queue_xmit() code
> > > > path.
> > > 
> > > I don't agree with that part, I think this can be also beneficiary for
> > > packets without direct xmit, as in PF_PACKET we don't have a notion of
> > > "flow" but just raw packets instead, and can keep the mapping local
> > > depending on the current CPU as we do queue setting elsewhere in the
> > > stack just as well.
> > 
> > It seems to me that the newly added xmit in packet_sock is
> > dev_queue_xmit() by default, and in this default case, dev_queue_xmit()
> > would call netdev_pick_tx(), which would set the skb queue_mapping again
> > to override the value based on the current CPU. 
> 
> Yes, I think you are right, that is also my experience with the code path.
> 
> > Or did I miss something here? 
> 
> A bit related; One thing I'm missing to understand, is why the
> RAW/PF_PACKET sockets have a NULL in skb->sk when they reach
> __netdev_pick_tx() ? (resulting in they cannot store/cache the queue in
> sk_tx_queue_set)

I checked the code, it seems skb->sk is not set in this code path (for
tcp, seems tcp_transmit_skb() sets it). 

Do you think we could set it here where skb_set_queue_mapping() is used,
so for this code path, we could also have it cached(but for devices
which define their queue selection method, it will not take effect)?
something like below: 

@@ -2219,7 +2219,7 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg)
 			}
 		}
 
-		skb_set_queue_mapping(skb, packet_pick_tx_queue(dev));
+		skb->sk = (struct sock *)po;
 		skb->destructor = tpacket_destruct_skb;
 		__packet_set_status(po, ph, TP_STATUS_SENDING);
 		atomic_inc(&po->tx_ring.pending);
@@ -2429,7 +2429,7 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
 	skb->dev = dev;
 	skb->priority = sk->sk_priority;
 	skb->mark = sk->sk_mark;
-	skb_set_queue_mapping(skb, packet_pick_tx_queue(dev));
+	skb->sk = sk;
 
 	if (po->has_vnet_hdr) {
 		if (vnet_hdr.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) {

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC PATCH net-next] packet: fix using smp_processor_id() in preemptible code
  2013-12-13  6:41       ` Li Zhong
@ 2013-12-13  7:40         ` Li Zhong
  0 siblings, 0 replies; 8+ messages in thread
From: Li Zhong @ 2013-12-13  7:40 UTC (permalink / raw)
  To: Jesper Dangaard Brouer; +Cc: Daniel Borkmann, linux-next list, brouer, davem

On Fri, 2013-12-13 at 14:41 +0800, Li Zhong wrote:
> On Thu, 2013-12-12 at 08:18 +0100, Jesper Dangaard Brouer wrote:
> > On Fri, 13 Dec 2013 07:55:03 +0800 Li Zhong <zhong@linux.vnet.ibm.com> wrote:
> > > On Wed, 2013-12-11 at 10:55 +0100, Daniel Borkmann wrote:
> > > > On 12/12/2013 07:10 AM, Li Zhong wrote:
> > [...]
> > > > > Also, it seems that we could move skb_set_queue_mapping() into
> > > > > packet_pick_tx_queue(), so we avoid calling it one more time
> > > > > unnecessarily if we are going into the normal dev_queue_xmit() code
> > > > > path.
> > > > 
> > > > I don't agree with that part, I think this can be also beneficiary for
> > > > packets without direct xmit, as in PF_PACKET we don't have a notion of
> > > > "flow" but just raw packets instead, and can keep the mapping local
> > > > depending on the current CPU as we do queue setting elsewhere in the
> > > > stack just as well.
> > > 
> > > It seems to me that the newly added xmit in packet_sock is
> > > dev_queue_xmit() by default, and in this default case, dev_queue_xmit()
> > > would call netdev_pick_tx(), which would set the skb queue_mapping again
> > > to override the value based on the current CPU. 
> > 
> > Yes, I think you are right, that is also my experience with the code path.
> > 
> > > Or did I miss something here? 
> > 
> > A bit related; One thing I'm missing to understand, is why the
> > RAW/PF_PACKET sockets have a NULL in skb->sk when they reach
> > __netdev_pick_tx() ? (resulting in they cannot store/cache the queue in
> > sk_tx_queue_set)
> 
> I checked the code, it seems skb->sk is not set in this code path (for
> tcp, seems tcp_transmit_skb() sets it). 
> 
> Do you think we could set it here where skb_set_queue_mapping() is used,
> so for this code path, we could also have it cached(but for devices
> which define their queue selection method, it will not take effect)?

Sorry, seems it will not take effect, as the sk_tx_queue_set/get logic
depends on sk->sk_dst_cache, which is used by tcp, connected udp ...

Not sure why we need this dependency ... 

Thanks, Zhong

> something like below: 
> 
> @@ -2219,7 +2219,7 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg)
>  			}
>  		}
>  
> -		skb_set_queue_mapping(skb, packet_pick_tx_queue(dev));
> +		skb->sk = (struct sock *)po;
>  		skb->destructor = tpacket_destruct_skb;
>  		__packet_set_status(po, ph, TP_STATUS_SENDING);
>  		atomic_inc(&po->tx_ring.pending);
> @@ -2429,7 +2429,7 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
>  	skb->dev = dev;
>  	skb->priority = sk->sk_priority;
>  	skb->mark = sk->sk_mark;
> -	skb_set_queue_mapping(skb, packet_pick_tx_queue(dev));
> +	skb->sk = sk;
>  
>  	if (po->has_vnet_hdr) {
>  		if (vnet_hdr.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) {
> 
> 
> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2013-12-13  7:40 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-12-12  6:10 [RFC PATCH net-next] packet: fix using smp_processor_id() in preemptible code Li Zhong
2013-12-11  9:55 ` Daniel Borkmann
2013-12-12 23:55   ` Li Zhong
2013-12-12  7:18     ` Jesper Dangaard Brouer
2013-12-13  6:41       ` Li Zhong
2013-12-13  7:40         ` Li Zhong
2013-12-11 21:49 ` David Miller
2013-12-12 22:54   ` Li Zhong

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).