diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index 7666540..8d82c02 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c @@ -1364,12 +1364,17 @@ static int xenvif_handle_frag_list(struct xenvif *vif, struct sk_buff *skb) vif->tx_zerocopy_sent += 2; vif->tx_frag_overflow++; + netdev_warn(vif->dev, "?!?!? %s 1: skb->data_len: %d, skb->len: %d, skb->truesize: %d, nskb->data_len: %d, nskb->len: %d, nskb->truesize: %d MAX_SKB_FRAGS:%d offset:%d \n",__FUNCTION__,skb->data_len, skb->len, skb->truesize, nskb->data_len, nskb->len, nskb->truesize, MAX_SKB_FRAGS, offset); + + xenvif_fill_frags(vif, nskb); /* Subtract frags size, we will correct it later */ skb->truesize -= skb->data_len; skb->len += nskb->len; skb->data_len += nskb->len; + netdev_warn(vif->dev, "?!?!? %s 2: skb->data_len: %d, skb->len: %d, skb->truesize: %d, nskb->data_len: %d, nskb->len: %d, nskb->truesize: %d MAX_SKB_FRAGS:%d offset:%d \n",__FUNCTION__,skb->data_len, skb->len, skb->truesize, nskb->data_len, nskb->len, nskb->truesize, MAX_SKB_FRAGS, offset); + /* create a brand new frags array and coalesce there */ for (i = 0; offset < skb->len; i++) { struct page *page; @@ -1396,6 +1401,7 @@ static int xenvif_handle_frag_list(struct xenvif *vif, struct sk_buff *skb) frags[i].page.p = page; frags[i].page_offset = 0; skb_frag_size_set(&frags[i], len); + netdev_warn(vif->dev, "?!?!? %s 3: i:%d, len: %d, skb->data_len: %d, skb->len: %d, skb->truesize: %d, nskb->data_len: %d, nskb->len: %d, nskb->truesize: %d MAX_SKB_FRAGS:%d offset:%d \n",__FUNCTION__,i, len, skb->data_len, skb->len, skb->truesize, nskb->data_len, nskb->len, nskb->truesize, MAX_SKB_FRAGS, offset); } /* swap out with old one */ memcpy(skb_shinfo(skb)->frags, @@ -1404,6 +1410,8 @@ static int xenvif_handle_frag_list(struct xenvif *vif, struct sk_buff *skb) skb_shinfo(skb)->nr_frags = i; skb->truesize += i * PAGE_SIZE; + netdev_warn(vif->dev, "?!?!? %s 4: i:%d, skb->data_len: %d, skb->len: %d, skb->truesize: %d, nskb->data_len: %d, nskb->len: %d, nskb->truesize: %d MAX_SKB_FRAGS:%d offset:%d \n",__FUNCTION__,i,skb->data_len, skb->len, skb->truesize, nskb->data_len, nskb->len, nskb->truesize, MAX_SKB_FRAGS, offset); + /* remove traces of mapped pages and frag_list */ skb_frag_list_init(skb); uarg = skb_shinfo(skb)->destructor_arg; @@ -1466,9 +1474,11 @@ static int xenvif_tx_submit(struct xenvif *vif) kfree_skb(skb); continue; } + if((skb_is_nonlinear(skb) && skb_headlen(skb) < PKT_PROT_LEN)) + netdev_warn(vif->dev, "?!?!? %s skb_is_nonlinear(skb): %d, skb_headlen(skb): %d, PKT_PROT_LEN: %d skb->len: %d, target:%d ", skb_is_nonlinear(skb), skb_headlen(skb), PKT_PROT_LEN, skb->len, min_t(int, skb->len, PKT_PROT_LEN)); } - if (skb_is_nonlinear(skb) && skb_headlen(skb) < PKT_PROT_LEN) { + if (skb_is_nonlinear(skb) && skb_headlen(skb) < PKT_PROT_LEN) { int target = min_t(int, skb->len, PKT_PROT_LEN); __pskb_pull_tail(skb, target - skb_headlen(skb)); }