diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/core/pktgen.c | 35 |
1 files changed, 9 insertions, 26 deletions
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 2fa6fee1b46f..ff79d94b5944 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
@@ -2622,6 +2622,7 @@ static void pktgen_finalize_skb(struct pktgen_dev *pkt_dev, struct sk_buff *skb, | |||
2622 | } else { | 2622 | } else { |
2623 | int frags = pkt_dev->nfrags; | 2623 | int frags = pkt_dev->nfrags; |
2624 | int i, len; | 2624 | int i, len; |
2625 | int frag_len; | ||
2625 | 2626 | ||
2626 | 2627 | ||
2627 | if (frags > MAX_SKB_FRAGS) | 2628 | if (frags > MAX_SKB_FRAGS) |
@@ -2633,6 +2634,8 @@ static void pktgen_finalize_skb(struct pktgen_dev *pkt_dev, struct sk_buff *skb, | |||
2633 | } | 2634 | } |
2634 | 2635 | ||
2635 | i = 0; | 2636 | i = 0; |
2637 | frag_len = (datalen/frags) < PAGE_SIZE ? | ||
2638 | (datalen/frags) : PAGE_SIZE; | ||
2636 | while (datalen > 0) { | 2639 | while (datalen > 0) { |
2637 | if (unlikely(!pkt_dev->page)) { | 2640 | if (unlikely(!pkt_dev->page)) { |
2638 | int node = numa_node_id(); | 2641 | int node = numa_node_id(); |
@@ -2646,38 +2649,18 @@ static void pktgen_finalize_skb(struct pktgen_dev *pkt_dev, struct sk_buff *skb, | |||
2646 | skb_shinfo(skb)->frags[i].page = pkt_dev->page; | 2649 | skb_shinfo(skb)->frags[i].page = pkt_dev->page; |
2647 | get_page(pkt_dev->page); | 2650 | get_page(pkt_dev->page); |
2648 | skb_shinfo(skb)->frags[i].page_offset = 0; | 2651 | skb_shinfo(skb)->frags[i].page_offset = 0; |
2649 | skb_shinfo(skb)->frags[i].size = | 2652 | /*last fragment, fill rest of data*/ |
2650 | (datalen < PAGE_SIZE ? datalen : PAGE_SIZE); | 2653 | if (i == (frags - 1)) |
2654 | skb_shinfo(skb)->frags[i].size = | ||
2655 | (datalen < PAGE_SIZE ? datalen : PAGE_SIZE); | ||
2656 | else | ||
2657 | skb_shinfo(skb)->frags[i].size = frag_len; | ||
2651 | datalen -= skb_shinfo(skb)->frags[i].size; | 2658 | datalen -= skb_shinfo(skb)->frags[i].size; |
2652 | skb->len += skb_shinfo(skb)->frags[i].size; | 2659 | skb->len += skb_shinfo(skb)->frags[i].size; |
2653 | skb->data_len += skb_shinfo(skb)->frags[i].size; | 2660 | skb->data_len += skb_shinfo(skb)->frags[i].size; |
2654 | i++; | 2661 | i++; |
2655 | skb_shinfo(skb)->nr_frags = i; | 2662 | skb_shinfo(skb)->nr_frags = i; |
2656 | } | 2663 | } |
2657 | |||
2658 | while (i < frags) { | ||
2659 | int rem; | ||
2660 | |||
2661 | if (i == 0) | ||
2662 | break; | ||
2663 | |||
2664 | rem = skb_shinfo(skb)->frags[i - 1].size / 2; | ||
2665 | if (rem == 0) | ||
2666 | break; | ||
2667 | |||
2668 | skb_shinfo(skb)->frags[i - 1].size -= rem; | ||
2669 | |||
2670 | skb_shinfo(skb)->frags[i] = | ||
2671 | skb_shinfo(skb)->frags[i - 1]; | ||
2672 | get_page(skb_shinfo(skb)->frags[i].page); | ||
2673 | skb_shinfo(skb)->frags[i].page = | ||
2674 | skb_shinfo(skb)->frags[i - 1].page; | ||
2675 | skb_shinfo(skb)->frags[i].page_offset += | ||
2676 | skb_shinfo(skb)->frags[i - 1].size; | ||
2677 | skb_shinfo(skb)->frags[i].size = rem; | ||
2678 | i++; | ||
2679 | skb_shinfo(skb)->nr_frags = i; | ||
2680 | } | ||
2681 | } | 2664 | } |
2682 | 2665 | ||
2683 | /* Stamp the time, and sequence number, | 2666 | /* Stamp the time, and sequence number, |