[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] xennet: skb rides the rocket: 20 slots
Tuesday, January 8, 2013, 3:12:33 AM, you wrote: > On 2013-1-7 18:55, Ian Campbell wrote: >> On Fri, 2013-01-04 at 16:28 +0000, Sander Eikelenboom wrote: >>> Hi Ian, >> I'm not actually the netfront maintainer. Adding Konrad. Annie too since >> IIRC she was at one point looking at various buffer coalescing schemes. >> >>> Today i fired up an old VM with a bittorrent client, trying to >>> download some torrents. >> How old? Which kernel? >> >>> I seem to be hitting the unlikely case of "xennet: skb rides the >>> rocket: xx slots" and this results in some dropped packets in domU, I >>> don't see any warnings in dom0. > If debug is enabled, following netback code should print out messages in > netbk_count_requests. > if (unlikely(frags >= MAX_SKB_FRAGS)) { > netdev_dbg(vif->dev, "Too many frags\n"); > return -frags; > } I have added some rate limited warns in this function. However none seems to be triggered while the pv-guest reports the "skb rides the rocket" .. diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index f2d6b78..2f02da9 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c @@ -902,11 +902,13 @@ static int netbk_count_requests(struct xenvif *vif, do { if (frags >= work_to_do) { netdev_dbg(vif->dev, "Need more frags\n"); + net_warn_ratelimited("%s: Need more frags:%d, work_to_do:%d \n",vif->dev->name, frags, work_to_do); return -frags; } if (unlikely(frags >= MAX_SKB_FRAGS)) { netdev_dbg(vif->dev, "Too many frags\n"); + net_warn_ratelimited("%s: Too many frags:%d, MAX_SKB_FRAGS:%d \n",vif->dev->name, frags, MAX_SKB_FRAGS); return -frags; } @@ -914,6 +916,7 @@ static int netbk_count_requests(struct xenvif *vif, sizeof(*txp)); if (txp->size > first->size) { netdev_dbg(vif->dev, "Frags galore\n"); + net_warn_ratelimited("%s: Frags galore:%d, txp->size:%d first->size:%d\n",vif->dev->name, frags, txp->size , first->size); return -frags; } @@ -923,6 +926,7 @@ static int netbk_count_requests(struct xenvif *vif, if (unlikely((txp->offset + txp->size) > PAGE_SIZE)) { netdev_dbg(vif->dev, "txp->offset: %x, size: %u\n", txp->offset, txp->size); + net_warn_ratelimited("%s: Hmm:%d, (txp->offset + txp->size):%d PAGE_SIZE:%d\n",vif->dev->name, frags, (txp->offset + txp->size) ,PAGE_SIZE); return -frags; } } while ((txp++)->flags & XEN_NETTXF_more_data); >>> >>> I have added some extra info, but i don't have enough knowledge if >>> this could/should be prevented from happening ? >> MAX_SKB_FRAGS has never, AFAIK, been as big as 19 or 20 so I'm not sure >> this can have ever worked. >> >> These SKBs seem to be pretty big (not quite 64KB), seemingly most of the >> data is contained in a smallish number of frags, which suggests compound >> pages and therefore a reasonably modern kernel? >> >> This probably relates somewhat to the issues described in the >> "netchannel vs MAX_SKB_FRAGS" thread last year, or at least the solution >> to that would necessarily involve fixing this issue. > If netback complains about "Too many frags", then it should be > MAX_SKB_FRAGS limitation in netback results in dropping packets in > netfront. It is possible that other netfronts(windows?) also hit this. > Thanks > Annie >> >> In the meantime you could try disabling sg and/or various offloads for >> that domain's vif. >> >>> [16798.629141] xennet: skb rides the rocket: 19 slots MAX_SKB_FRAGS: 17 >>> div_roundup:1 xennet_count_skb_frag_slots:18 offset:106 skb_headlen:1622 >>> skb->len:64294, skb->data_len:62672 skb->truesize:64976 nr_frags:4 >>> page_size:4096 prot:0800 >>> [16800.575182] xennet: skb rides the rocket: 19 slots MAX_SKB_FRAGS: 17 >>> div_roundup:1 xennet_count_skb_frag_slots:18 offset:2154 skb_headlen:1622 >>> skb->len:64294, skb->data_len:62672 skb->truesize:64976 nr_frags:4 >>> page_size:4096 prot:0800 >>> [16801.589166] xennet: skb rides the rocket: 20 slots MAX_SKB_FRAGS: 17 >>> div_roundup:1 xennet_count_skb_frag_slots:19 offset:2154 skb_headlen:1622 >>> skb->len:64294, skb->data_len:62672 skb->truesize:64976 nr_frags:5 >>> page_size:4096 prot:0800 >>> [16803.279039] xennet: skb rides the rocket: 19 slots MAX_SKB_FRAGS: 17 >>> div_roundup:1 xennet_count_skb_frag_slots:18 offset:106 skb_headlen:1622 >>> skb->len:64294, skb->data_len:62672 skb->truesize:64976 nr_frags:3 >>> page_size:4096 prot:0800 >>> [16809.973268] xennet: skb rides the rocket: 19 slots MAX_SKB_FRAGS: 17 >>> div_roundup:1 xennet_count_skb_frag_slots:18 offset:2154 skb_headlen:1622 >>> skb->len:64294, skb->data_len:62672 skb->truesize:64976 nr_frags:4 >>> page_size:4096 prot:0800 >>> [16811.420048] xennet: skb rides the rocket: 19 slots MAX_SKB_FRAGS: 17 >>> div_roundup:1 xennet_count_skb_frag_slots:18 offset:2154 skb_headlen:1622 >>> skb->len:64294, skb->data_len:62672 skb->truesize:64976 nr_frags:6 >>> page_size:4096 prot:0800 >>> [16814.872686] xennet: skb rides the rocket: 19 slots MAX_SKB_FRAGS: 17 >>> div_roundup:1 xennet_count_skb_frag_slots:18 offset:106 skb_headlen:1622 >>> skb->len:64294, skb->data_len:62672 skb->truesize:64976 nr_frags:5 >>> page_size:4096 prot:0800 >>> [16815.359099] xennet: skb rides the rocket: 21 slots MAX_SKB_FRAGS: 17 >>> div_roundup:1 xennet_count_skb_frag_slots:20 offset:2154 skb_headlen:1622 >>> skb->len:64294, skb->data_len:62672 skb->truesize:64976 nr_frags:5 >>> page_size:4096 prot:0800 >>> [16825.851906] xennet: skb rides the rocket: 20 slots MAX_SKB_FRAGS: 17 >>> div_roundup:1 xennet_count_skb_frag_slots:19 offset:106 skb_headlen:1622 >>> skb->len:64294, skb->data_len:62672 skb->truesize:64976 nr_frags:4 >>> page_size:4096 prot:0800 >>> [16828.295083] xennet: skb rides the rocket: 19 slots MAX_SKB_FRAGS: 17 >>> div_roundup:1 xennet_count_skb_frag_slots:18 offset:2154 skb_headlen:1622 >>> skb->len:64294, skb->data_len:62672 skb->truesize:64976 nr_frags:5 >>> page_size:4096 prot:0800 >>> [16837.386684] xennet: skb rides the rocket: 19 slots MAX_SKB_FRAGS: 17 >>> div_roundup:1 xennet_count_skb_frag_slots:18 offset:106 skb_headlen:1622 >>> skb->len:64294, skb->data_len:62672 skb->truesize:64976 nr_frags:4 >>> page_size:4096 prot:0800 >>> [16838.609683] xennet: skb rides the rocket: 20 slots MAX_SKB_FRAGS: 17 >>> div_roundup:1 xennet_count_skb_frag_slots:19 offset:106 skb_headlen:1622 >>> skb->len:64294, skb->data_len:62672 skb->truesize:64976 nr_frags:4 >>> page_size:4096 prot:0800 >>> [16841.783729] xennet: skb rides the rocket: 19 slots MAX_SKB_FRAGS: 17 >>> div_roundup:1 xennet_count_skb_frag_slots:18 offset:106 skb_headlen:1622 >>> skb->len:64294, skb->data_len:62672 skb->truesize:64976 nr_frags:6 >>> page_size:4096 prot:0800 >>> [16843.841678] xennet: skb rides the rocket: 20 slots MAX_SKB_FRAGS: 17 >>> div_roundup:1 xennet_count_skb_frag_slots:19 offset:2154 skb_headlen:1622 >>> skb->len:64294, skb->data_len:62672 skb->truesize:64976 nr_frags:4 >>> page_size:4096 prot:0800 >>> [16849.847614] xennet: skb rides the rocket: 19 slots MAX_SKB_FRAGS: 17 >>> div_roundup:1 xennet_count_skb_frag_slots:18 offset:3690 skb_headlen:54 >>> skb->len:64294, skb->data_len:64240 skb->truesize:65008 nr_frags:4 >>> page_size:4096 prot:0800 >>> [16853.787128] xennet: skb rides the rocket: 20 slots MAX_SKB_FRAGS: 17 >>> div_roundup:1 xennet_count_skb_frag_slots:19 offset:2154 skb_headlen:1622 >>> skb->len:64294, skb->data_len:62672 skb->truesize:64976 nr_frags:4 >>> page_size:4096 prot:0800 >>> >>> # ifconfig >>> eth0 Link encap:Ethernet HWaddr 00:16:3e:c4:20:46 >>> inet addr:192.168.1.12 Bcast:192.168.1.255 Mask:255.255.255.0 >>> UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 >>> RX packets:9090214 errors:0 dropped:0 overruns:0 frame:0 >>> TX packets:5902090 errors:0 dropped:304 overruns:0 carrier:0 >>> collisions:0 txqueuelen:1000 >>> RX bytes:19757934770 (18.4 GiB) TX bytes:16855238200 (15.6 GiB) >>> Interrupt:25 >>> >>> >>> >>> >>> diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c >>> index c26e28b..50ac403 100644 >>> --- a/drivers/net/xen-netfront.c >>> +++ b/drivers/net/xen-netfront.c >>> @@ -552,7 +552,11 @@ static int xennet_start_xmit(struct sk_buff *skb, >>> struct net_device *dev) >>> xennet_count_skb_frag_slots(skb); >>> if (unlikely(slots> MAX_SKB_FRAGS + 1)) { >>> net_alert_ratelimited( >>> - "xennet: skb rides the rocket: %d slots\n", slots); >>> + "xennet: skb rides the rocket: %d slots >>> MAX_SKB_FRAGS: %d div_roundup:%d xennet_count_skb_frag_slots:%d offset:%d >>> skb_headlen:%d skb->len:%d, skb->data_len:%d skb->truesize:%d nr_frags:%d >>> page_size:%d prot:%04x \n >>> + slots, MAX_SKB_FRAGS,DIV_ROUND_UP(offset + >>> len, PAGE_SIZE), >>> + xennet_count_skb_frag_slots(skb), offset, >>> len, skb->len, >>> + skb->data_len, skb->truesize, >>> skb_shinfo(skb)->nr_frags, >>> + PAGE_SIZE, ntohs(skb->protocol)); >>> goto drop; >>> } >>> >> _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |