return __pskb_pull_tail(skb, len - skb_headlen(skb)) != NULL;
 }
 
+void skb_condense(struct sk_buff *skb);
+
 /**
  *     skb_headroom - bytes at buffer head
  *     @skb: buffer to check
 
        return clone;
 }
 EXPORT_SYMBOL(pskb_extract);
+
+/**
+ * skb_condense - try to get rid of fragments/frag_list if possible
+ * @skb: buffer
+ *
+ * Can be used to save memory before skb is added to a busy queue.
+ * If packet has bytes in frags and enough tail room in skb->head,
+ * pull all of them, so that we can free the frags right now and adjust
+ * truesize.
+ * Notes:
+ *     We do not reallocate skb->head thus can not fail.
+ *     Caller must re-evaluate skb->truesize if needed.
+ */
+void skb_condense(struct sk_buff *skb)
+{
+       if (!skb->data_len ||
+           skb->data_len > skb->end - skb->tail ||
+           skb_cloned(skb))
+               return;
+
+       /* Nice, we can free page frag(s) right now */
+       __pskb_pull_tail(skb, skb->data_len);
+
+       /* Now adjust skb->truesize, since __pskb_pull_tail() does
+        * not do this.
+        */
+       skb->truesize = SKB_TRUESIZE(skb_end_offset(skb));
+}
 
 {
        struct sk_buff_head *list = &sk->sk_receive_queue;
        int rmem, delta, amt, err = -ENOMEM;
-       int size = skb->truesize;
+       int size;
 
        /* try to avoid the costly atomic add/sub pair when the receive
         * queue is full; always allow at least a packet
        if (rmem > sk->sk_rcvbuf)
                goto drop;
 
+       /* Under mem pressure, it might be helpful to help udp_recvmsg()
+        * having linear skbs :
+        * - Reduce memory overhead and thus increase receive queue capacity
+        * - Less cache line misses at copyout() time
+        * - Less work at consume_skb() (less alien page frag freeing)
+        */
+       if (rmem > (sk->sk_rcvbuf >> 1))
+               skb_condense(skb);
+       size = skb->truesize;
+
        /* we drop only if the receive buf is full and the receive
         * queue contains some other skb
         */