|
@@ -1726,22 +1726,18 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun,
|
|
goto err_xdp;
|
|
goto err_xdp;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ rcu_read_unlock();
|
|
|
|
+ local_bh_enable();
|
|
|
|
|
|
skb = build_skb(buf, buflen);
|
|
skb = build_skb(buf, buflen);
|
|
- if (!skb) {
|
|
|
|
- rcu_read_unlock();
|
|
|
|
- local_bh_enable();
|
|
|
|
|
|
+ if (!skb)
|
|
return ERR_PTR(-ENOMEM);
|
|
return ERR_PTR(-ENOMEM);
|
|
- }
|
|
|
|
|
|
|
|
skb_reserve(skb, pad - delta);
|
|
skb_reserve(skb, pad - delta);
|
|
skb_put(skb, len);
|
|
skb_put(skb, len);
|
|
get_page(alloc_frag->page);
|
|
get_page(alloc_frag->page);
|
|
alloc_frag->offset += buflen;
|
|
alloc_frag->offset += buflen;
|
|
|
|
|
|
- rcu_read_unlock();
|
|
|
|
- local_bh_enable();
|
|
|
|
-
|
|
|
|
return skb;
|
|
return skb;
|
|
|
|
|
|
err_redirect:
|
|
err_redirect:
|