diff options
Diffstat (limited to 'net/core/pktgen.c')
| -rw-r--r-- | net/core/pktgen.c | 37 | 
1 files changed, 9 insertions, 28 deletions
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index aeeece72b72..ff79d94b594 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -2514,7 +2514,6 @@ static int pktgen_output_ipsec(struct sk_buff *skb, struct pktgen_dev *pkt_dev)  {  	struct xfrm_state *x = pkt_dev->flows[pkt_dev->curfl].x;  	int err = 0; -	struct iphdr *iph;  	if (!x)  		return 0; @@ -2524,7 +2523,6 @@ static int pktgen_output_ipsec(struct sk_buff *skb, struct pktgen_dev *pkt_dev)  		return 0;  	spin_lock(&x->lock); -	iph = ip_hdr(skb);  	err = x->outer_mode->output(x, skb);  	if (err) @@ -2624,6 +2622,7 @@ static void pktgen_finalize_skb(struct pktgen_dev *pkt_dev, struct sk_buff *skb,  	} else {  		int frags = pkt_dev->nfrags;  		int i, len; +		int frag_len;  		if (frags > MAX_SKB_FRAGS) @@ -2635,6 +2634,8 @@ static void pktgen_finalize_skb(struct pktgen_dev *pkt_dev, struct sk_buff *skb,  		}  		i = 0; +		frag_len = (datalen/frags) < PAGE_SIZE ? +			   (datalen/frags) : PAGE_SIZE;  		while (datalen > 0) {  			if (unlikely(!pkt_dev->page)) {  				int node = numa_node_id(); @@ -2648,38 +2649,18 @@ static void pktgen_finalize_skb(struct pktgen_dev *pkt_dev, struct sk_buff *skb,  			skb_shinfo(skb)->frags[i].page = pkt_dev->page;  			get_page(pkt_dev->page);  			skb_shinfo(skb)->frags[i].page_offset = 0; -			skb_shinfo(skb)->frags[i].size = -			    (datalen < PAGE_SIZE ? datalen : PAGE_SIZE); +			/*last fragment, fill rest of data*/ +			if (i == (frags - 1)) +				skb_shinfo(skb)->frags[i].size = +				    (datalen < PAGE_SIZE ? datalen : PAGE_SIZE); +			else +				skb_shinfo(skb)->frags[i].size = frag_len;  			datalen -= skb_shinfo(skb)->frags[i].size;  			skb->len += skb_shinfo(skb)->frags[i].size;  			skb->data_len += skb_shinfo(skb)->frags[i].size;  			i++;  			skb_shinfo(skb)->nr_frags = i;  		} - -		while (i < frags) { -			int rem; - -			if (i == 0) -				break; - -			rem = skb_shinfo(skb)->frags[i - 1].size / 2; -			if (rem == 0) -				break; - -			skb_shinfo(skb)->frags[i - 1].size -= rem; - -			skb_shinfo(skb)->frags[i] = -			    skb_shinfo(skb)->frags[i - 1]; -			get_page(skb_shinfo(skb)->frags[i].page); -			skb_shinfo(skb)->frags[i].page = -			    skb_shinfo(skb)->frags[i - 1].page; -			skb_shinfo(skb)->frags[i].page_offset += -			    skb_shinfo(skb)->frags[i - 1].size; -			skb_shinfo(skb)->frags[i].size = rem; -			i++; -			skb_shinfo(skb)->nr_frags = i; -		}  	}  	/* Stamp the time, and sequence number,  |