|
@@ -828,6 +828,14 @@ static inline __must_check int sk_add_backlog(struct sock *sk, struct sk_buff *s
|
|
if (sk_rcvqueues_full(sk, limit))
|
|
if (sk_rcvqueues_full(sk, limit))
|
|
return -ENOBUFS;
|
|
return -ENOBUFS;
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * If the skb was allocated from pfmemalloc reserves, only
|
|
|
|
+ * allow SOCK_MEMALLOC sockets to use it as this socket is
|
|
|
|
+ * helping free memory
|
|
|
|
+ */
|
|
|
|
+ if (skb_pfmemalloc(skb) && !sock_flag(sk, SOCK_MEMALLOC))
|
|
|
|
+ return -ENOMEM;
|
|
|
|
+
|
|
__sk_add_backlog(sk, skb);
|
|
__sk_add_backlog(sk, skb);
|
|
sk->sk_backlog.len += skb->truesize;
|
|
sk->sk_backlog.len += skb->truesize;
|
|
return 0;
|
|
return 0;
|