diff options
author | David S. Miller <davem@davemloft.net> | 2018-07-29 23:42:53 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-09-10 13:06:54 -0400 |
commit | a8305bff685252e80b7c60f4f5e7dd2e63e38218 (patch) | |
tree | 3f8f073a642ad27c0921917e3b9e1622b9956478 | |
parent | 776f07ee303a5e13970cbfaed767e28cbab4002f (diff) |
net: Add and use skb_mark_not_on_list().
An SKB is not on a list if skb->next is NULL.
Codify this convention into a helper function and use it
where we are dequeueing an SKB and need to mark it as such.
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | include/linux/skbuff.h | 5 | ||||
-rw-r--r-- | net/core/dev.c | 8 | ||||
-rw-r--r-- | net/core/sock.c | 2 | ||||
-rw-r--r-- | net/ieee802154/6lowpan/reassembly.c | 2 | ||||
-rw-r--r-- | net/ipv4/ip_fragment.c | 2 | ||||
-rw-r--r-- | net/ipv4/ip_input.c | 2 | ||||
-rw-r--r-- | net/ipv4/ip_output.c | 4 | ||||
-rw-r--r-- | net/ipv6/ip6_output.c | 2 | ||||
-rw-r--r-- | net/ipv6/netfilter/nf_conntrack_reasm.c | 2 | ||||
-rw-r--r-- | net/ipv6/reassembly.c | 2 | ||||
-rw-r--r-- | net/netfilter/nfnetlink_queue.c | 2 | ||||
-rw-r--r-- | net/rxrpc/input.c | 2 | ||||
-rw-r--r-- | net/sched/sch_cake.c | 6 | ||||
-rw-r--r-- | net/sched/sch_fq.c | 2 | ||||
-rw-r--r-- | net/sched/sch_fq_codel.c | 2 | ||||
-rw-r--r-- | net/sched/sch_generic.c | 4 | ||||
-rw-r--r-- | net/sched/sch_hhf.c | 2 | ||||
-rw-r--r-- | net/sched/sch_netem.c | 2 | ||||
-rw-r--r-- | net/sched/sch_tbf.c | 2 | ||||
-rw-r--r-- | net/tipc/bearer.c | 2 | ||||
-rw-r--r-- | net/xfrm/xfrm_device.c | 2 | ||||
-rw-r--r-- | net/xfrm/xfrm_output.c | 2 |
22 files changed, 33 insertions, 28 deletions
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 89283b77294d..c4c9e3f5cd9a 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
@@ -1339,6 +1339,11 @@ static inline void skb_zcopy_abort(struct sk_buff *skb) | |||
1339 | } | 1339 | } |
1340 | } | 1340 | } |
1341 | 1341 | ||
1342 | static inline void skb_mark_not_on_list(struct sk_buff *skb) | ||
1343 | { | ||
1344 | skb->next = NULL; | ||
1345 | } | ||
1346 | |||
1342 | /** | 1347 | /** |
1343 | * skb_queue_empty - check if a queue is empty | 1348 | * skb_queue_empty - check if a queue is empty |
1344 | * @list: queue head | 1349 | * @list: queue head |
diff --git a/net/core/dev.c b/net/core/dev.c index ca78dc5a79a3..f76dd7e14dd6 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -3231,7 +3231,7 @@ struct sk_buff *dev_hard_start_xmit(struct sk_buff *first, struct net_device *de | |||
3231 | while (skb) { | 3231 | while (skb) { |
3232 | struct sk_buff *next = skb->next; | 3232 | struct sk_buff *next = skb->next; |
3233 | 3233 | ||
3234 | skb->next = NULL; | 3234 | skb_mark_not_on_list(skb); |
3235 | rc = xmit_one(skb, dev, txq, next != NULL); | 3235 | rc = xmit_one(skb, dev, txq, next != NULL); |
3236 | if (unlikely(!dev_xmit_complete(rc))) { | 3236 | if (unlikely(!dev_xmit_complete(rc))) { |
3237 | skb->next = next; | 3237 | skb->next = next; |
@@ -3331,7 +3331,7 @@ struct sk_buff *validate_xmit_skb_list(struct sk_buff *skb, struct net_device *d | |||
3331 | 3331 | ||
3332 | for (; skb != NULL; skb = next) { | 3332 | for (; skb != NULL; skb = next) { |
3333 | next = skb->next; | 3333 | next = skb->next; |
3334 | skb->next = NULL; | 3334 | skb_mark_not_on_list(skb); |
3335 | 3335 | ||
3336 | /* in case skb wont be segmented, point to itself */ | 3336 | /* in case skb wont be segmented, point to itself */ |
3337 | skb->prev = skb; | 3337 | skb->prev = skb; |
@@ -5296,7 +5296,7 @@ static void __napi_gro_flush_chain(struct napi_struct *napi, u32 index, | |||
5296 | if (flush_old && NAPI_GRO_CB(skb)->age == jiffies) | 5296 | if (flush_old && NAPI_GRO_CB(skb)->age == jiffies) |
5297 | return; | 5297 | return; |
5298 | list_del(&skb->list); | 5298 | list_del(&skb->list); |
5299 | skb->next = NULL; | 5299 | skb_mark_not_on_list(skb); |
5300 | napi_gro_complete(skb); | 5300 | napi_gro_complete(skb); |
5301 | napi->gro_hash[index].count--; | 5301 | napi->gro_hash[index].count--; |
5302 | } | 5302 | } |
@@ -5482,7 +5482,7 @@ static enum gro_result dev_gro_receive(struct napi_struct *napi, struct sk_buff | |||
5482 | 5482 | ||
5483 | if (pp) { | 5483 | if (pp) { |
5484 | list_del(&pp->list); | 5484 | list_del(&pp->list); |
5485 | pp->next = NULL; | 5485 | skb_mark_not_on_list(pp); |
5486 | napi_gro_complete(pp); | 5486 | napi_gro_complete(pp); |
5487 | napi->gro_hash[hash].count--; | 5487 | napi->gro_hash[hash].count--; |
5488 | } | 5488 | } |
diff --git a/net/core/sock.c b/net/core/sock.c index 3730eb855095..8537b6ca72c5 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -2332,7 +2332,7 @@ static void __release_sock(struct sock *sk) | |||
2332 | next = skb->next; | 2332 | next = skb->next; |
2333 | prefetch(next); | 2333 | prefetch(next); |
2334 | WARN_ON_ONCE(skb_dst_is_noref(skb)); | 2334 | WARN_ON_ONCE(skb_dst_is_noref(skb)); |
2335 | skb->next = NULL; | 2335 | skb_mark_not_on_list(skb); |
2336 | sk_backlog_rcv(sk, skb); | 2336 | sk_backlog_rcv(sk, skb); |
2337 | 2337 | ||
2338 | cond_resched(); | 2338 | cond_resched(); |
diff --git a/net/ieee802154/6lowpan/reassembly.c b/net/ieee802154/6lowpan/reassembly.c index e7857a8ac86d..09ffbf5ce8fa 100644 --- a/net/ieee802154/6lowpan/reassembly.c +++ b/net/ieee802154/6lowpan/reassembly.c | |||
@@ -260,7 +260,7 @@ static int lowpan_frag_reasm(struct lowpan_frag_queue *fq, struct sk_buff *prev, | |||
260 | } | 260 | } |
261 | sub_frag_mem_limit(fq->q.net, sum_truesize); | 261 | sub_frag_mem_limit(fq->q.net, sum_truesize); |
262 | 262 | ||
263 | head->next = NULL; | 263 | skb_mark_not_on_list(head); |
264 | head->dev = ldev; | 264 | head->dev = ldev; |
265 | head->tstamp = fq->q.stamp; | 265 | head->tstamp = fq->q.stamp; |
266 | 266 | ||
diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c index 330f62353b11..cab3e4a5124b 100644 --- a/net/ipv4/ip_fragment.c +++ b/net/ipv4/ip_fragment.c | |||
@@ -623,7 +623,7 @@ static int ip_frag_reasm(struct ipq *qp, struct sk_buff *skb, | |||
623 | sub_frag_mem_limit(qp->q.net, head->truesize); | 623 | sub_frag_mem_limit(qp->q.net, head->truesize); |
624 | 624 | ||
625 | *nextp = NULL; | 625 | *nextp = NULL; |
626 | head->next = NULL; | 626 | skb_mark_not_on_list(head); |
627 | head->prev = NULL; | 627 | head->prev = NULL; |
628 | head->dev = dev; | 628 | head->dev = dev; |
629 | head->tstamp = qp->q.stamp; | 629 | head->tstamp = qp->q.stamp; |
diff --git a/net/ipv4/ip_input.c b/net/ipv4/ip_input.c index 3196cf58f418..eba7f3883230 100644 --- a/net/ipv4/ip_input.c +++ b/net/ipv4/ip_input.c | |||
@@ -535,7 +535,7 @@ static void ip_sublist_rcv_finish(struct list_head *head) | |||
535 | /* Handle ip{6}_forward case, as sch_direct_xmit have | 535 | /* Handle ip{6}_forward case, as sch_direct_xmit have |
536 | * another kind of SKB-list usage (see validate_xmit_skb_list) | 536 | * another kind of SKB-list usage (see validate_xmit_skb_list) |
537 | */ | 537 | */ |
538 | skb->next = NULL; | 538 | skb_mark_not_on_list(skb); |
539 | dst_input(skb); | 539 | dst_input(skb); |
540 | } | 540 | } |
541 | } | 541 | } |
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 9c4e72e9c60a..c09219e7f230 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
@@ -278,7 +278,7 @@ static int ip_finish_output_gso(struct net *net, struct sock *sk, | |||
278 | struct sk_buff *nskb = segs->next; | 278 | struct sk_buff *nskb = segs->next; |
279 | int err; | 279 | int err; |
280 | 280 | ||
281 | segs->next = NULL; | 281 | skb_mark_not_on_list(segs); |
282 | err = ip_fragment(net, sk, segs, mtu, ip_finish_output2); | 282 | err = ip_fragment(net, sk, segs, mtu, ip_finish_output2); |
283 | 283 | ||
284 | if (err && ret == 0) | 284 | if (err && ret == 0) |
@@ -684,7 +684,7 @@ int ip_do_fragment(struct net *net, struct sock *sk, struct sk_buff *skb, | |||
684 | 684 | ||
685 | skb = frag; | 685 | skb = frag; |
686 | frag = skb->next; | 686 | frag = skb->next; |
687 | skb->next = NULL; | 687 | skb_mark_not_on_list(skb); |
688 | } | 688 | } |
689 | 689 | ||
690 | if (err == 0) { | 690 | if (err == 0) { |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 16f200f06500..9a8934ac053b 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -727,7 +727,7 @@ int ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb, | |||
727 | 727 | ||
728 | skb = frag; | 728 | skb = frag; |
729 | frag = skb->next; | 729 | frag = skb->next; |
730 | skb->next = NULL; | 730 | skb_mark_not_on_list(skb); |
731 | } | 731 | } |
732 | 732 | ||
733 | kfree(tmp_hdr); | 733 | kfree(tmp_hdr); |
diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c index 2a14d8b65924..00e20004d241 100644 --- a/net/ipv6/netfilter/nf_conntrack_reasm.c +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c | |||
@@ -449,7 +449,7 @@ nf_ct_frag6_reasm(struct frag_queue *fq, struct sk_buff *prev, struct net_devic | |||
449 | sub_frag_mem_limit(fq->q.net, head->truesize); | 449 | sub_frag_mem_limit(fq->q.net, head->truesize); |
450 | 450 | ||
451 | head->ignore_df = 1; | 451 | head->ignore_df = 1; |
452 | head->next = NULL; | 452 | skb_mark_not_on_list(head); |
453 | head->dev = dev; | 453 | head->dev = dev; |
454 | head->tstamp = fq->q.stamp; | 454 | head->tstamp = fq->q.stamp; |
455 | ipv6_hdr(head)->payload_len = htons(payload_len); | 455 | ipv6_hdr(head)->payload_len = htons(payload_len); |
diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c index 5c5b4f79296e..f1b1ff30fe5b 100644 --- a/net/ipv6/reassembly.c +++ b/net/ipv6/reassembly.c | |||
@@ -388,7 +388,7 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *prev, | |||
388 | } | 388 | } |
389 | sub_frag_mem_limit(fq->q.net, sum_truesize); | 389 | sub_frag_mem_limit(fq->q.net, sum_truesize); |
390 | 390 | ||
391 | head->next = NULL; | 391 | skb_mark_not_on_list(head); |
392 | head->dev = dev; | 392 | head->dev = dev; |
393 | head->tstamp = fq->q.stamp; | 393 | head->tstamp = fq->q.stamp; |
394 | ipv6_hdr(head)->payload_len = htons(payload_len); | 394 | ipv6_hdr(head)->payload_len = htons(payload_len); |
diff --git a/net/netfilter/nfnetlink_queue.c b/net/netfilter/nfnetlink_queue.c index ea4ba551abb2..5207eb8a5864 100644 --- a/net/netfilter/nfnetlink_queue.c +++ b/net/netfilter/nfnetlink_queue.c | |||
@@ -764,7 +764,7 @@ __nfqnl_enqueue_packet_gso(struct net *net, struct nfqnl_instance *queue, | |||
764 | return ret; | 764 | return ret; |
765 | } | 765 | } |
766 | 766 | ||
767 | skb->next = NULL; | 767 | skb_mark_not_on_list(skb); |
768 | 768 | ||
769 | entry_seg = nf_queue_entry_dup(entry); | 769 | entry_seg = nf_queue_entry_dup(entry); |
770 | if (entry_seg) { | 770 | if (entry_seg) { |
diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c index cfdc199c6351..ee8e7e1d5c0f 100644 --- a/net/rxrpc/input.c +++ b/net/rxrpc/input.c | |||
@@ -259,7 +259,7 @@ static void rxrpc_rotate_tx_window(struct rxrpc_call *call, rxrpc_seq_t to, | |||
259 | while (list) { | 259 | while (list) { |
260 | skb = list; | 260 | skb = list; |
261 | list = skb->next; | 261 | list = skb->next; |
262 | skb->next = NULL; | 262 | skb_mark_not_on_list(skb); |
263 | rxrpc_free_skb(skb, rxrpc_skb_tx_freed); | 263 | rxrpc_free_skb(skb, rxrpc_skb_tx_freed); |
264 | } | 264 | } |
265 | } | 265 | } |
diff --git a/net/sched/sch_cake.c b/net/sched/sch_cake.c index c07c30b916d5..dc539295ae65 100644 --- a/net/sched/sch_cake.c +++ b/net/sched/sch_cake.c | |||
@@ -812,7 +812,7 @@ static struct sk_buff *dequeue_head(struct cake_flow *flow) | |||
812 | 812 | ||
813 | if (skb) { | 813 | if (skb) { |
814 | flow->head = skb->next; | 814 | flow->head = skb->next; |
815 | skb->next = NULL; | 815 | skb_mark_not_on_list(skb); |
816 | } | 816 | } |
817 | 817 | ||
818 | return skb; | 818 | return skb; |
@@ -1252,7 +1252,7 @@ found: | |||
1252 | else | 1252 | else |
1253 | flow->head = elig_ack->next; | 1253 | flow->head = elig_ack->next; |
1254 | 1254 | ||
1255 | elig_ack->next = NULL; | 1255 | skb_mark_not_on_list(elig_ack); |
1256 | 1256 | ||
1257 | return elig_ack; | 1257 | return elig_ack; |
1258 | } | 1258 | } |
@@ -1675,7 +1675,7 @@ static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch, | |||
1675 | 1675 | ||
1676 | while (segs) { | 1676 | while (segs) { |
1677 | nskb = segs->next; | 1677 | nskb = segs->next; |
1678 | segs->next = NULL; | 1678 | skb_mark_not_on_list(segs); |
1679 | qdisc_skb_cb(segs)->pkt_len = segs->len; | 1679 | qdisc_skb_cb(segs)->pkt_len = segs->len; |
1680 | cobalt_set_enqueue_time(segs, now); | 1680 | cobalt_set_enqueue_time(segs, now); |
1681 | get_cobalt_cb(segs)->adjusted_len = cake_overhead(q, | 1681 | get_cobalt_cb(segs)->adjusted_len = cake_overhead(q, |
diff --git a/net/sched/sch_fq.c b/net/sched/sch_fq.c index 4808713c73b9..b27ba36a269c 100644 --- a/net/sched/sch_fq.c +++ b/net/sched/sch_fq.c | |||
@@ -319,7 +319,7 @@ static struct sk_buff *fq_dequeue_head(struct Qdisc *sch, struct fq_flow *flow) | |||
319 | 319 | ||
320 | if (skb) { | 320 | if (skb) { |
321 | flow->head = skb->next; | 321 | flow->head = skb->next; |
322 | skb->next = NULL; | 322 | skb_mark_not_on_list(skb); |
323 | flow->qlen--; | 323 | flow->qlen--; |
324 | qdisc_qstats_backlog_dec(sch, skb); | 324 | qdisc_qstats_backlog_dec(sch, skb); |
325 | sch->q.qlen--; | 325 | sch->q.qlen--; |
diff --git a/net/sched/sch_fq_codel.c b/net/sched/sch_fq_codel.c index 6c0a9d5dbf94..cd04d40c30b6 100644 --- a/net/sched/sch_fq_codel.c +++ b/net/sched/sch_fq_codel.c | |||
@@ -124,7 +124,7 @@ static inline struct sk_buff *dequeue_head(struct fq_codel_flow *flow) | |||
124 | struct sk_buff *skb = flow->head; | 124 | struct sk_buff *skb = flow->head; |
125 | 125 | ||
126 | flow->head = skb->next; | 126 | flow->head = skb->next; |
127 | skb->next = NULL; | 127 | skb_mark_not_on_list(skb); |
128 | return skb; | 128 | return skb; |
129 | } | 129 | } |
130 | 130 | ||
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index 69078c82963e..a64132a5db36 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c | |||
@@ -184,7 +184,7 @@ static void try_bulk_dequeue_skb(struct Qdisc *q, | |||
184 | skb = nskb; | 184 | skb = nskb; |
185 | (*packets)++; /* GSO counts as one pkt */ | 185 | (*packets)++; /* GSO counts as one pkt */ |
186 | } | 186 | } |
187 | skb->next = NULL; | 187 | skb_mark_not_on_list(skb); |
188 | } | 188 | } |
189 | 189 | ||
190 | /* This variant of try_bulk_dequeue_skb() makes sure | 190 | /* This variant of try_bulk_dequeue_skb() makes sure |
@@ -210,7 +210,7 @@ static void try_bulk_dequeue_skb_slow(struct Qdisc *q, | |||
210 | skb = nskb; | 210 | skb = nskb; |
211 | } while (++cnt < 8); | 211 | } while (++cnt < 8); |
212 | (*packets) += cnt; | 212 | (*packets) += cnt; |
213 | skb->next = NULL; | 213 | skb_mark_not_on_list(skb); |
214 | } | 214 | } |
215 | 215 | ||
216 | /* Note that dequeue_skb can possibly return a SKB list (via skb->next). | 216 | /* Note that dequeue_skb can possibly return a SKB list (via skb->next). |
diff --git a/net/sched/sch_hhf.c b/net/sched/sch_hhf.c index c3a8388dcdf6..9d6a47697406 100644 --- a/net/sched/sch_hhf.c +++ b/net/sched/sch_hhf.c | |||
@@ -330,7 +330,7 @@ static struct sk_buff *dequeue_head(struct wdrr_bucket *bucket) | |||
330 | struct sk_buff *skb = bucket->head; | 330 | struct sk_buff *skb = bucket->head; |
331 | 331 | ||
332 | bucket->head = skb->next; | 332 | bucket->head = skb->next; |
333 | skb->next = NULL; | 333 | skb_mark_not_on_list(skb); |
334 | return skb; | 334 | return skb; |
335 | } | 335 | } |
336 | 336 | ||
diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c index b9541ce4d672..506e1960ed7f 100644 --- a/net/sched/sch_netem.c +++ b/net/sched/sch_netem.c | |||
@@ -568,7 +568,7 @@ finish_segs: | |||
568 | if (segs) { | 568 | if (segs) { |
569 | while (segs) { | 569 | while (segs) { |
570 | skb2 = segs->next; | 570 | skb2 = segs->next; |
571 | segs->next = NULL; | 571 | skb_mark_not_on_list(segs); |
572 | qdisc_skb_cb(segs)->pkt_len = segs->len; | 572 | qdisc_skb_cb(segs)->pkt_len = segs->len; |
573 | last_len = segs->len; | 573 | last_len = segs->len; |
574 | rc = qdisc_enqueue(segs, sch, to_free); | 574 | rc = qdisc_enqueue(segs, sch, to_free); |
diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c index 6f74a426f159..a4530e85bd02 100644 --- a/net/sched/sch_tbf.c +++ b/net/sched/sch_tbf.c | |||
@@ -162,7 +162,7 @@ static int tbf_segment(struct sk_buff *skb, struct Qdisc *sch, | |||
162 | nb = 0; | 162 | nb = 0; |
163 | while (segs) { | 163 | while (segs) { |
164 | nskb = segs->next; | 164 | nskb = segs->next; |
165 | segs->next = NULL; | 165 | skb_mark_not_on_list(segs); |
166 | qdisc_skb_cb(segs)->pkt_len = segs->len; | 166 | qdisc_skb_cb(segs)->pkt_len = segs->len; |
167 | len += segs->len; | 167 | len += segs->len; |
168 | ret = qdisc_enqueue(segs, q->qdisc, to_free); | 168 | ret = qdisc_enqueue(segs, q->qdisc, to_free); |
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c index 418f03d0be90..91891041e5e1 100644 --- a/net/tipc/bearer.c +++ b/net/tipc/bearer.c | |||
@@ -577,7 +577,7 @@ static int tipc_l2_rcv_msg(struct sk_buff *skb, struct net_device *dev, | |||
577 | rcu_dereference_rtnl(orig_dev->tipc_ptr); | 577 | rcu_dereference_rtnl(orig_dev->tipc_ptr); |
578 | if (likely(b && test_bit(0, &b->up) && | 578 | if (likely(b && test_bit(0, &b->up) && |
579 | (skb->pkt_type <= PACKET_MULTICAST))) { | 579 | (skb->pkt_type <= PACKET_MULTICAST))) { |
580 | skb->next = NULL; | 580 | skb_mark_not_on_list(skb); |
581 | tipc_rcv(dev_net(b->pt.dev), skb, b); | 581 | tipc_rcv(dev_net(b->pt.dev), skb, b); |
582 | rcu_read_unlock(); | 582 | rcu_read_unlock(); |
583 | return NET_RX_SUCCESS; | 583 | return NET_RX_SUCCESS; |
diff --git a/net/xfrm/xfrm_device.c b/net/xfrm/xfrm_device.c index 5611b7521020..260fbba4f03e 100644 --- a/net/xfrm/xfrm_device.c +++ b/net/xfrm/xfrm_device.c | |||
@@ -99,7 +99,7 @@ struct sk_buff *validate_xmit_xfrm(struct sk_buff *skb, netdev_features_t featur | |||
99 | 99 | ||
100 | do { | 100 | do { |
101 | struct sk_buff *nskb = skb2->next; | 101 | struct sk_buff *nskb = skb2->next; |
102 | skb2->next = NULL; | 102 | skb_mark_not_on_list(skb2); |
103 | 103 | ||
104 | xo = xfrm_offload(skb2); | 104 | xo = xfrm_offload(skb2); |
105 | xo->flags |= XFRM_DEV_RESUME; | 105 | xo->flags |= XFRM_DEV_RESUME; |
diff --git a/net/xfrm/xfrm_output.c b/net/xfrm/xfrm_output.c index 45ba07ab3e4f..2d42cb0c94b8 100644 --- a/net/xfrm/xfrm_output.c +++ b/net/xfrm/xfrm_output.c | |||
@@ -189,7 +189,7 @@ static int xfrm_output_gso(struct net *net, struct sock *sk, struct sk_buff *skb | |||
189 | struct sk_buff *nskb = segs->next; | 189 | struct sk_buff *nskb = segs->next; |
190 | int err; | 190 | int err; |
191 | 191 | ||
192 | segs->next = NULL; | 192 | skb_mark_not_on_list(segs); |
193 | err = xfrm_output2(net, sk, segs); | 193 | err = xfrm_output2(net, sk, segs); |
194 | 194 | ||
195 | if (unlikely(err)) { | 195 | if (unlikely(err)) { |