diff options
Diffstat (limited to 'net/core/pktgen.c')
-rw-r--r-- | net/core/pktgen.c | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index e35a6fbb8110..0001c243b35c 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
@@ -2145,9 +2145,12 @@ static void spin(struct pktgen_dev *pkt_dev, ktime_t spin_until) | |||
2145 | } | 2145 | } |
2146 | 2146 | ||
2147 | start_time = ktime_now(); | 2147 | start_time = ktime_now(); |
2148 | if (remaining < 100000) | 2148 | if (remaining < 100000) { |
2149 | ndelay(remaining); /* really small just spin */ | 2149 | /* for small delays (<100us), just loop until limit is reached */ |
2150 | else { | 2150 | do { |
2151 | end_time = ktime_now(); | ||
2152 | } while (ktime_lt(end_time, spin_until)); | ||
2153 | } else { | ||
2151 | /* see do_nanosleep */ | 2154 | /* see do_nanosleep */ |
2152 | hrtimer_init_sleeper(&t, current); | 2155 | hrtimer_init_sleeper(&t, current); |
2153 | do { | 2156 | do { |
@@ -2162,8 +2165,8 @@ static void spin(struct pktgen_dev *pkt_dev, ktime_t spin_until) | |||
2162 | hrtimer_cancel(&t.timer); | 2165 | hrtimer_cancel(&t.timer); |
2163 | } while (t.task && pkt_dev->running && !signal_pending(current)); | 2166 | } while (t.task && pkt_dev->running && !signal_pending(current)); |
2164 | __set_current_state(TASK_RUNNING); | 2167 | __set_current_state(TASK_RUNNING); |
2168 | end_time = ktime_now(); | ||
2165 | } | 2169 | } |
2166 | end_time = ktime_now(); | ||
2167 | 2170 | ||
2168 | pkt_dev->idle_acc += ktime_to_ns(ktime_sub(end_time, start_time)); | 2171 | pkt_dev->idle_acc += ktime_to_ns(ktime_sub(end_time, start_time)); |
2169 | pkt_dev->next_tx = ktime_add_ns(spin_until, pkt_dev->delay); | 2172 | pkt_dev->next_tx = ktime_add_ns(spin_until, pkt_dev->delay); |
@@ -2602,18 +2605,18 @@ static void pktgen_finalize_skb(struct pktgen_dev *pkt_dev, struct sk_buff *skb, | |||
2602 | if (!pkt_dev->page) | 2605 | if (!pkt_dev->page) |
2603 | break; | 2606 | break; |
2604 | } | 2607 | } |
2605 | skb_shinfo(skb)->frags[i].page = pkt_dev->page; | ||
2606 | get_page(pkt_dev->page); | 2608 | get_page(pkt_dev->page); |
2609 | skb_frag_set_page(skb, i, pkt_dev->page); | ||
2607 | skb_shinfo(skb)->frags[i].page_offset = 0; | 2610 | skb_shinfo(skb)->frags[i].page_offset = 0; |
2608 | /*last fragment, fill rest of data*/ | 2611 | /*last fragment, fill rest of data*/ |
2609 | if (i == (frags - 1)) | 2612 | if (i == (frags - 1)) |
2610 | skb_shinfo(skb)->frags[i].size = | 2613 | skb_frag_size_set(&skb_shinfo(skb)->frags[i], |
2611 | (datalen < PAGE_SIZE ? datalen : PAGE_SIZE); | 2614 | (datalen < PAGE_SIZE ? datalen : PAGE_SIZE)); |
2612 | else | 2615 | else |
2613 | skb_shinfo(skb)->frags[i].size = frag_len; | 2616 | skb_frag_size_set(&skb_shinfo(skb)->frags[i], frag_len); |
2614 | datalen -= skb_shinfo(skb)->frags[i].size; | 2617 | datalen -= skb_frag_size(&skb_shinfo(skb)->frags[i]); |
2615 | skb->len += skb_shinfo(skb)->frags[i].size; | 2618 | skb->len += skb_frag_size(&skb_shinfo(skb)->frags[i]); |
2616 | skb->data_len += skb_shinfo(skb)->frags[i].size; | 2619 | skb->data_len += skb_frag_size(&skb_shinfo(skb)->frags[i]); |
2617 | i++; | 2620 | i++; |
2618 | skb_shinfo(skb)->nr_frags = i; | 2621 | skb_shinfo(skb)->nr_frags = i; |
2619 | } | 2622 | } |