All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Jan Beulich" <JBeulich@suse.com>
To: "Wei Liu" <wei.liu2@citrix.com>, <davem@davemloft.net>
Cc: "Ian Campbell" <ian.campbell@citrix.com>,
	"Dion Kant" <g.w.kant@hunenet.nl>, <xen-devel@lists.xen.org>,
	<netdev@vger.kernel.org>, <stable@vger.kernel.org>
Subject: Re: [Xen-devel] [PATCH] xen-netfront: pull on receive skb may need to happen earlier
Date: Mon, 08 Jul 2013 15:20:26 +0100	[thread overview]
Message-ID: <51DAE6CA02000078000E3566@nat28.tlf.novell.com> (raw)
In-Reply-To: <51DAA9B202000078000E3357@nat28.tlf.novell.com>

>>> On 08.07.13 at 11:59, "Jan Beulich" <JBeulich@suse.com> wrote:
>>>> On 05.07.13 at 16:53, Wei Liu <wei.liu2@citrix.com> wrote:
>> On Fri, Jul 05, 2013 at 10:32:41AM +0100, Jan Beulich wrote:
>>> --- a/drivers/net/xen-netfront.c
>>> +++ b/drivers/net/xen-netfront.c
>>> @@ -831,6 +831,15 @@ static RING_IDX xennet_fill_frags(struct
>>>  			RING_GET_RESPONSE(&np->rx, ++cons);
>>>  		skb_frag_t *nfrag = &skb_shinfo(nskb)->frags[0];
>>>  
>>> +		if (nr_frags == MAX_SKB_FRAGS) {
>>> +			unsigned int pull_to = NETFRONT_SKB_CB(skb)->pull_to;
>>> +
>>> +			BUG_ON(pull_to <= skb_headlen(skb));
>>> +			__pskb_pull_tail(skb, pull_to - skb_headlen(skb));
>> 
>> skb_headlen is in fact "skb->len - skb->data_len". Looking at the
>> caller code:
>> 
>>     while loop {
>>         skb_shinfo(skb)->frags[0].page_offset = rx->offset;
>> 	skb_frag_size_set(&skb_shinfo(skb)->frags[0], rx->status);
>> 	skb->data_len = rx->status;
>> 
>> 	i = xennet_fill_frags(np, skb, &tmpq);
>> 
>> 	/*                                                                           
> 
>>                                                                   
>> 	 * Truesize is the actual allocation size, even if the                       
> 
>>                                                                   
>> 	 * allocation is only partially used.                                        
> 
>>                                                                   
>> 	 */
>> 	skb->truesize += PAGE_SIZE * skb_shinfo(skb)->nr_frags;
>> 	skb->len += skb->data_len;
>>     }
>> 
>>     handle_incoming_packet();
>> 
>> You seem to be altering the behavior of the original code, because in
>> your patch the skb->len is incremented before use, while in the original
>> code (which calls skb_headlen in handle_incoming_packet) the skb->len is
>> correctly set.
> 
> Right. So I basically need to keep skb->len up-to-date along with
> ->data_len. Just handed a patch to Dion with that done; I'll defer
> sending a v2 for the upstream code until I know the change works
> for our kernel.

Okay, so with that done (see below) Dion is now seeing the
WARN_ON_ONCE(delta < len) in skb_try_coalesce() triggering. Of
course, with it having crashed before, it's hard to tell whether the
triggering now is an effect of the patch, or just got unmasked by it.

Looking over the ->truesize handling, I can't see how the change
here could break things: RX_COPY_THRESHOLD is already
accounted for by how alloc_skb() gets called, and the increment
right after the call to xennet_fill_frags() should now be even more
correct than before (since __pskb_pull_tail() can drop fragments,
which would then have made this an over-estimation afaict).

That all said with me knowing pretty little about the networking
code, so I'd appreciate if you could point out anything wrong with
my idea of how things work. Additionally - is my fundamental (for
this patch) assumption right that multiple __pskb_pull_tail() call
are cumulative (i.e. calling it twice with a delta of
pull_to - skb_headlen(skb) would indeed end up pulling up to
pull_to, provided there is enough data)?

Jan

--- a/drivers/net/xen-netfront.c
+++ b/drivers/net/xen-netfront.c
@@ -831,10 +831,20 @@ static RING_IDX xennet_fill_frags(struct
 			RING_GET_RESPONSE(&np->rx, ++cons);
 		skb_frag_t *nfrag = &skb_shinfo(nskb)->frags[0];
 
+		if (nr_frags == MAX_SKB_FRAGS) {
+			unsigned int pull_to = NETFRONT_SKB_CB(skb)->pull_to;
+
+			BUG_ON(pull_to <= skb_headlen(skb));
+			__pskb_pull_tail(skb, pull_to - skb_headlen(skb));
+			nr_frags = shinfo->nr_frags;
+		}
+		BUG_ON(nr_frags >= MAX_SKB_FRAGS);
+
 		__skb_fill_page_desc(skb, nr_frags,
 				     skb_frag_page(nfrag),
 				     rx->offset, rx->status);
 
+		skb->len += rx->status;
 		skb->data_len += rx->status;
 
 		skb_shinfo(nskb)->nr_frags = 0;
@@ -929,7 +939,8 @@ static int handle_incoming_queue(struct 
 	while ((skb = __skb_dequeue(rxq)) != NULL) {
 		int pull_to = NETFRONT_SKB_CB(skb)->pull_to;
 
-		__pskb_pull_tail(skb, pull_to - skb_headlen(skb));
+		if (pull_to > skb_headlen(skb))
+			__pskb_pull_tail(skb, pull_to - skb_headlen(skb));
 
 		/* Ethernet work: Delayed to here as it peeks the header. */
 		skb->protocol = eth_type_trans(skb, dev);
@@ -1014,7 +1025,7 @@ err:
 
 		skb_shinfo(skb)->frags[0].page_offset = rx->offset;
 		skb_frag_size_set(&skb_shinfo(skb)->frags[0], rx->status);
-		skb->data_len = rx->status;
+		skb->len = skb->data_len = rx->status;
 
 		i = xennet_fill_frags(np, skb, &tmpq);
 
@@ -1023,7 +1034,6 @@ err:
                  * allocation is only partially used.
                  */
 		skb->truesize += PAGE_SIZE * skb_shinfo(skb)->nr_frags;
-		skb->len += skb->data_len;
 
 		if (rx->flags & XEN_NETRXF_csum_blank)
 			skb->ip_summed = CHECKSUM_PARTIAL;

  parent reply	other threads:[~2013-07-08 14:20 UTC|newest]

Thread overview: 85+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <8511913.uMAmUdIO30@eistomin.edss.local>
2013-05-17  8:59 ` [Xen-users] kernel 3.9.2 - xen 4.2.2/4.3rc1 => BUG unable to handle kernel paging request netif_poll+0x49c/0xe8 Wei Liu
2013-05-17  9:08   ` Jan Beulich
2013-05-17  9:37   ` Eugene Istomin
2013-05-17  9:40     ` Eugene Istomin
2013-05-17 10:45     ` Jan Beulich
2013-05-17 12:03       ` Eugene Istomin
2013-05-17 12:25         ` Jan Beulich
2013-05-17 12:30           ` Eugene Istomin
2013-05-17 12:36             ` Jan Beulich
2013-05-17 12:52               ` Eugene Istomin
2013-05-17 13:00                 ` Eugene Istomin
2013-05-18 10:06                   ` Eugene Istomin
2013-05-20  6:52                     ` Eugene Istomin
2013-05-20  8:58                       ` Ian Campbell
2013-05-20  9:06                       ` Wei Liu
2013-05-20  9:17                         ` Eugene Istomin
2013-05-20  9:24                           ` Wei Liu
2013-05-21  9:55                   ` Jan Beulich
2013-05-21 11:09                     ` Eugene Istomin
2013-05-21 11:49                       ` Jan Beulich
2013-05-21 16:19                         ` Eugene Istomin
2013-05-31  3:37                           ` Eugene Istomin
2013-05-31  6:19                             ` Jan Beulich
2013-05-31  6:22                               ` Eugene Istomin
2013-05-31  8:20                               ` Wei Liu
2013-05-21 15:28                     ` Wei Liu
2013-05-31 15:47                       ` Wei Liu
2013-05-31 16:00                         ` Jan Beulich
2013-05-31 16:05                           ` Wei Liu
2013-07-04 13:43   ` Dion Kant
2013-07-04 14:18     ` Jan Beulich
2013-07-04 15:01     ` Wei Liu
2013-07-05  9:32       ` [PATCH] xen-netfront: pull on receive skb may need to happen earlier Jan Beulich
2013-07-05 14:53         ` Wei Liu
2013-07-05 14:53         ` Wei Liu
2013-07-07  1:10           ` David Miller
2013-07-07  1:10           ` David Miller
2013-07-08  9:59           ` Jan Beulich
2013-07-08 12:16             ` Dion Kant
2013-07-08 12:41               ` Jan Beulich
2013-07-08 12:41               ` Jan Beulich
2013-07-08 14:20             ` Jan Beulich [this message]
2013-07-08 15:22               ` Eric Dumazet
2013-07-08 15:22               ` [Xen-devel] " Eric Dumazet
2013-07-09  7:47                 ` Jan Beulich
2013-07-09  7:47                 ` Jan Beulich
2013-07-08 15:48               ` [Xen-devel] " Wei Liu
2013-07-09  6:52                 ` Jan Beulich
2013-07-09  6:52                 ` [Xen-devel] " Jan Beulich
2013-07-09 16:51                   ` Wei Liu
2013-07-09 16:51                   ` [Xen-devel] " Wei Liu
2013-07-10  6:58                     ` Jan Beulich
2013-07-10  6:58                     ` [Xen-devel] " Jan Beulich
2013-07-10 10:04                       ` Wei Liu
2013-07-10 10:04                       ` [Xen-devel] " Wei Liu
2013-07-10 10:46                         ` Jan Beulich
2013-07-10 12:50                           ` Ian Campbell
2013-07-10 12:53                             ` Wei Liu
2013-07-10 12:53                             ` Wei Liu
2013-07-10 13:58                             ` Jan Beulich
2013-07-10 13:58                             ` [Xen-devel] " Jan Beulich
2013-07-10 12:50                           ` Ian Campbell
2013-07-10 10:46                         ` Jan Beulich
2013-07-10 13:19                       ` [Xen-devel] " Eric Dumazet
2013-07-10 13:19                       ` Eric Dumazet
2013-07-08 15:48               ` Wei Liu
2013-07-12  8:32               ` [Xen-devel] " Wei Liu
2013-07-12  8:56                 ` Jan Beulich
2013-07-13 11:26                   ` Dion Kant
2013-07-13 11:26                   ` [Xen-devel] " Dion Kant
2013-07-13 20:17                     ` Dion Kant
2013-07-15  6:37                       ` Jan Beulich
2013-07-12  8:56                 ` Jan Beulich
2013-07-12  8:32               ` Wei Liu
2013-07-08 14:20             ` Jan Beulich
2013-07-08  9:59           ` Jan Beulich
2013-07-05  9:32       ` Jan Beulich
2013-07-05  9:36       ` kernel 3.9.2 - xen 4.2.2/4.3rc1 => BUG unable to handle kernel paging request netif_poll+0x49c/0xe8 Jan Beulich
2013-07-05 10:40       ` [Xen-users] " Dion Kant
2013-07-05 10:54         ` Wei Liu
2013-07-05 19:11           ` Dion Kant
2013-07-05 10:56         ` Jan Beulich
2013-07-05 19:46           ` Dion Kant
2013-07-06 13:36             ` Wei Liu
2013-07-08  8:25             ` Jan Beulich

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=51DAE6CA02000078000E3566@nat28.tlf.novell.com \
    --to=jbeulich@suse.com \
    --cc=davem@davemloft.net \
    --cc=g.w.kant@hunenet.nl \
    --cc=ian.campbell@citrix.com \
    --cc=netdev@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=wei.liu2@citrix.com \
    --cc=xen-devel@lists.xen.org \
    /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.