summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2018-07-29 23:42:53 -0400
committerDavid S. Miller <davem@davemloft.net>2018-09-10 13:06:54 -0400
commita8305bff685252e80b7c60f4f5e7dd2e63e38218 (patch)
tree3f8f073a642ad27c0921917e3b9e1622b9956478
parent776f07ee303a5e13970cbfaed767e28cbab4002f (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.h5
-rw-r--r--net/core/dev.c8
-rw-r--r--net/core/sock.c2
-rw-r--r--net/ieee802154/6lowpan/reassembly.c2
-rw-r--r--net/ipv4/ip_fragment.c2
-rw-r--r--net/ipv4/ip_input.c2
-rw-r--r--net/ipv4/ip_output.c4
-rw-r--r--net/ipv6/ip6_output.c2
-rw-r--r--net/ipv6/netfilter/nf_conntrack_reasm.c2
-rw-r--r--net/ipv6/reassembly.c2
-rw-r--r--net/netfilter/nfnetlink_queue.c2
-rw-r--r--net/rxrpc/input.c2
-rw-r--r--net/sched/sch_cake.c6
-rw-r--r--net/sched/sch_fq.c2
-rw-r--r--net/sched/sch_fq_codel.c2
-rw-r--r--net/sched/sch_generic.c4
-rw-r--r--net/sched/sch_hhf.c2
-rw-r--r--net/sched/sch_netem.c2
-rw-r--r--net/sched/sch_tbf.c2
-rw-r--r--net/tipc/bearer.c2
-rw-r--r--net/xfrm/xfrm_device.c2
-rw-r--r--net/xfrm/xfrm_output.c2
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
1342static 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)) {