pvops: update the SKB slots patch (#560)

This commit is contained in:
Marek Marczykowski 2012-05-30 11:18:33 +02:00
parent e929164e52
commit 0ebad7661f

View File

@ -1,60 +1,42 @@
Subject: [Xen-devel] [PATCH] xen/netback: calculate correctly the SKB slots. From: Simon Graham <simon.graham@citrix.com>
Date: Mon, 21 May 2012 13:36:33 -0400 To: Ian Campbell <Ian.Campbell@citrix.com>, "konrad.wilk@oracle.com"
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> <konrad.wilk@oracle.com>, "xen-devel@lists.xensource.com"
To: xen-devel@lists.xensource.com, ian.campbell@citrix.com, <xen-devel@lists.xensource.com>, "netdev@vger.kernel.org"
netdev@vger.kernel.org, davem@davemloft.net, linux-kernel@vger.kernel.org <netdev@vger.kernel.org>
CC: Adnan Misherfi <adnan.misherfi@oracle.com>, Konrad Rzeszutek Wilk Date: Thu, 24 May 2012 12:26:07 -0400
<konrad.wilk@oracle.com> Cc: "bhutchings@solarflare.com" <bhutchings@solarflare.com>,
Simon Graham <simon.graham@citrix.com>,
"davem@davemloft.net" <davem@davemloft.net>,
"adnan.misherfi@oracle.com" <adnan.misherfi@oracle.com>
Subject: [Xen-devel] [PATCH] xen/netback: Calculate the number of SKB slots
required correctly
From: Adnan Misherfi <adnan.misherfi@oracle.com> When calculating the number of slots required for a packet header, the code
was reserving too many slots if the header crossed a page boundary. Since
netbk_gop_skb copies the header to the start of the page, the count of
slots required for the header should be based solely on the header size.
A programming error cause the calculation of receive SKB slots to be This problem is easy to reproduce if a VIF is bridged to a USB 3G modem
wrong, which caused the RX ring to be erroneously declared full, device as the skb->data value always starts near the end of the first page.
and the receive queue to be stopped. The problem shows up when two
guest running on the same server tries to communicates using large
MTUs. Each guest is connected to a bridge with VLAN over bond
interface, so traffic from one guest leaves the server on one bridge
and comes back to the second guest on the second bridge. This can be
reproduces using ping, and one guest as follow:
- Create active-back bond (bond0) Signed-off-by: Simon Graham <simon.graham@citrix.com>
- Set up VLAN 5 on bond0 (bond0.5)
- Create a bridge (br1)
- Add bond0.5 to a bridge (br1)
- Start a guest and connect it to br1
- Set MTU of 9000 across the link
Ping the guest from an external host using packet sizes of 3991, and
4054; ping -s 3991 -c 128 "Guest-IP-Address"
At the beginning ping works fine, but after a while ping packets do
not reach the guest because the RX ring becomes full, and the queue
get stopped. Once the problem accrued, the only way to get out of it
is to reboot the guest, or use xm network-detach/network-attach.
ping works for packets sizes 3990,3992, and many other sizes including
4000,5000,9000, and 1500 ..etc. MTU size of 3991,4054 are the sizes
that quickly reproduce this problem.
Signed-off-by: Adnan Misherfi <adnan.misherfi@oracle.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
--- ---
drivers/net/xen-netback/netback.c | 2 +- drivers/net/xen-netback/netback.c | 3 +--
1 files changed, 1 insertions(+), 1 deletions(-) 1 files changed, 1 insertions(+), 2 deletions(-)
diff --git a/drivers/net/xen-netback/netback.c diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
b/drivers/net/xen-netback/netback.c index 2596401..f4a6fca 100644
index 957cf9d..e382e5b 100644
--- a/drivers/net/xen-netback/netback.c --- a/drivers/net/xen-netback/netback.c
+++ b/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c
@@ -212,7 +212,7 @@ unsigned int xenvif_count_skb_slots(struct xenvif *vif, struct sk_buff *skb) @@ -325,8 +325,7 @@ unsigned int xen_netbk_count_skb_slots(struct xenvif *vif, struct sk_buff *skb)
unsigned int count;
int i, copy_off; int i, copy_off;
count = DIV_ROUND_UP( - count = DIV_ROUND_UP(
- offset_in_page(skb->data)+skb_headlen(skb), PAGE_SIZE); - offset_in_page(skb->data)+skb_headlen(skb), PAGE_SIZE);
+ 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; copy_off = skb_headlen(skb) % PAGE_SIZE;
-- --
1.7.7.5 1.7.9.1