Message ID | F02ED76F3FCF8C468AD22A7618C05BBBB18DBFFE61@FTLPMAILBOX01.citrite.net |
---|---|
State | RFC, archived |
Delegated to: | David Miller |
Headers | show |
On Tue, 2012-05-22 at 20:01 +0100, Simon Graham wrote: > > > > > > > > int i, copy_off; > > > > > > > > > > count = DIV_ROUND_UP( > > > > > - offset_in_page(skb->data)+skb_headlen(skb), > > PAGE_SIZE); > > > > > + offset_in_page(skb->data + skb_headlen(skb)), > > PAGE_SIZE); > > > > > > > > The new version would be equivalent to: > > > > count = offset_in_page(skb->data + skb_headlen(skb)) != 0; > > > > which is not right, as netbk_gop_skb() will use one slot per page. > > > > > > Just outside the context of this patch we separately count the frag > > > pages. > > > > > > However I think you are right if skb->data covers > 1 page, since the > > > new version can only ever return 0 or 1. I expect this patch papers > > over > > > the underlying issue by not stopping often enough, rather than > > actually > > > fixing the underlying issue. > > > > Ah, any thoughts? Have you guys seen this behavior as well? > > We ran into this same problem and the fix we've been running with for > a while now (been meaning to submit it!) is: > > diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c > index c2669b8..7925bd3 100644 > --- a/drivers/net/xen-netback/netback.c > +++ b/drivers/net/xen-netback/netback.c > @@ -312,8 +312,7 @@ unsigned int xen_netbk_count_skb_slots(struct xenvif *vif, struct sk_buff *skb) > unsigned int count; > int i, copy_off; > > - count = DIV_ROUND_UP( > - offset_in_page(skb->data)+skb_headlen(skb), PAGE_SIZE); > + count = DIV_ROUND_UP(skb_headlen(skb), PAGE_SIZE); > > copy_off = skb_headlen(skb) % PAGE_SIZE; > > The rationale for this is that if the header spanned a page boundary, > you would calculate that it needs 2 slots for the header BUT > netback_gop_skb copies the header into the start of the page so only > needs one slot (and only decrements the count of inuse entries by 1). That sounds very plausible indeed! Please can format this as a commit message and resend with a Signed-off-by. many thanks, Ian. > > We found this running with a VIF bridged to a USB 3G Modem where > skb->data started near the end of a page so the header would always > span the page boundary. > > It was very easy to get the VIF to stop processing frames with the old > code and we have not seen any problems since applying this patch. > > Simon > -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
> > That sounds very plausible indeed! > > Please can format this as a commit message and resend with a > Signed-off-by. > Will do Simon > many thanks, > Ian. > > > > > We found this running with a VIF bridged to a USB 3G Modem where > > skb->data started near the end of a page so the header would always > > span the page boundary. > > > > It was very easy to get the VIF to stop processing frames with the old > > code and we have not seen any problems since applying this patch. > > > > Simon > > > -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Tue, May 22, 2012 at 03:01:55PM -0400, Simon Graham wrote: > > > > > > > > int i, copy_off; > > > > > > > > > > count = DIV_ROUND_UP( > > > > > - offset_in_page(skb->data)+skb_headlen(skb), > > PAGE_SIZE); > > > > > + offset_in_page(skb->data + skb_headlen(skb)), > > PAGE_SIZE); > > > > > > > > The new version would be equivalent to: > > > > count = offset_in_page(skb->data + skb_headlen(skb)) != 0; > > > > which is not right, as netbk_gop_skb() will use one slot per page. > > > > > > Just outside the context of this patch we separately count the frag > > > pages. > > > > > > However I think you are right if skb->data covers > 1 page, since the > > > new version can only ever return 0 or 1. I expect this patch papers > > over > > > the underlying issue by not stopping often enough, rather than > > actually > > > fixing the underlying issue. > > > > Ah, any thoughts? Have you guys seen this behavior as well? > > We ran into this same problem and the fix we've been running with for a while now (been meaning to submit it!) is: Where is the patchqueue of the patches? Is it only on the src.rpm or is it in some nice mercurial tree? Asking b/c if we run into other trouble it would be also time-saving for us (and I presume other companies too) to check that. Thanks! -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
> > We ran into this same problem and the fix we've been running with for > a while now (been meaning to submit it!) is: > > Where is the patchqueue of the patches? Is it only on the src.rpm or > is it in some nice mercurial tree? Asking b/c if we run into other > trouble > it would be also time-saving for us (and I presume other companies > too) to check that. Thanks! Currently our patchqueue is only in the source iso and not in an externally visible git tree - sorry! Simon -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index c2669b8..7925bd3 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c @@ -312,8 +312,7 @@ unsigned int xen_netbk_count_skb_slots(struct xenvif *vif, struct sk_buff *skb) unsigned int count; int i, copy_off; - count = DIV_ROUND_UP( - offset_in_page(skb->data)+skb_headlen(skb), PAGE_SIZE); + count = DIV_ROUND_UP(skb_headlen(skb), PAGE_SIZE); copy_off = skb_headlen(skb) % PAGE_SIZE;