forked from Minki/linux
net: tap: use skb_list_walk_safe helper for gso segments
This is a straight-forward conversion case for the new function, and while we're at it, we can remove a null write to skb->next by replacing it with skb_mark_not_on_list. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
dcfea72e79
commit
5643a552d3
@ -341,6 +341,7 @@ rx_handler_result_t tap_handle_frame(struct sk_buff **pskb)
|
||||
features |= tap->tap_features;
|
||||
if (netif_needs_gso(skb, features)) {
|
||||
struct sk_buff *segs = __skb_gso_segment(skb, features, false);
|
||||
struct sk_buff *next;
|
||||
|
||||
if (IS_ERR(segs))
|
||||
goto drop;
|
||||
@ -352,16 +353,13 @@ rx_handler_result_t tap_handle_frame(struct sk_buff **pskb)
|
||||
}
|
||||
|
||||
consume_skb(skb);
|
||||
while (segs) {
|
||||
struct sk_buff *nskb = segs->next;
|
||||
|
||||
segs->next = NULL;
|
||||
if (ptr_ring_produce(&q->ring, segs)) {
|
||||
kfree_skb(segs);
|
||||
kfree_skb_list(nskb);
|
||||
skb_list_walk_safe(segs, skb, next) {
|
||||
skb_mark_not_on_list(skb);
|
||||
if (ptr_ring_produce(&q->ring, skb)) {
|
||||
kfree_skb(skb);
|
||||
kfree_skb_list(next);
|
||||
break;
|
||||
}
|
||||
segs = nskb;
|
||||
}
|
||||
} else {
|
||||
/* If we receive a partial checksum and the tap side
|
||||
|
Loading…
Reference in New Issue
Block a user