|
@@ -1774,6 +1774,61 @@ static inline struct sk_buff *netdev_alloc_skb_ip_align(struct net_device *dev,
|
|
|
return __netdev_alloc_skb_ip_align(dev, length, GFP_ATOMIC);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * __skb_alloc_page - allocate pages for ps-rx on a skb and preserve pfmemalloc data
|
|
|
+ * @gfp_mask: alloc_pages_node mask. Set __GFP_NOMEMALLOC if not for network packet RX
|
|
|
+ * @skb: skb to set pfmemalloc on if __GFP_MEMALLOC is used
|
|
|
+ * @order: size of the allocation
|
|
|
+ *
|
|
|
+ * Allocate a new page.
|
|
|
+ *
|
|
|
+ * %NULL is returned if there is no free memory.
|
|
|
+*/
|
|
|
+static inline struct page *__skb_alloc_pages(gfp_t gfp_mask,
|
|
|
+ struct sk_buff *skb,
|
|
|
+ unsigned int order)
|
|
|
+{
|
|
|
+ struct page *page;
|
|
|
+
|
|
|
+ gfp_mask |= __GFP_COLD;
|
|
|
+
|
|
|
+ if (!(gfp_mask & __GFP_NOMEMALLOC))
|
|
|
+ gfp_mask |= __GFP_MEMALLOC;
|
|
|
+
|
|
|
+ page = alloc_pages_node(NUMA_NO_NODE, gfp_mask, order);
|
|
|
+ if (skb && page && page->pfmemalloc)
|
|
|
+ skb->pfmemalloc = true;
|
|
|
+
|
|
|
+ return page;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * __skb_alloc_page - allocate a page for ps-rx for a given skb and preserve pfmemalloc data
|
|
|
+ * @gfp_mask: alloc_pages_node mask. Set __GFP_NOMEMALLOC if not for network packet RX
|
|
|
+ * @skb: skb to set pfmemalloc on if __GFP_MEMALLOC is used
|
|
|
+ *
|
|
|
+ * Allocate a new page.
|
|
|
+ *
|
|
|
+ * %NULL is returned if there is no free memory.
|
|
|
+ */
|
|
|
+static inline struct page *__skb_alloc_page(gfp_t gfp_mask,
|
|
|
+ struct sk_buff *skb)
|
|
|
+{
|
|
|
+ return __skb_alloc_pages(gfp_mask, skb, 0);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * skb_propagate_pfmemalloc - Propagate pfmemalloc if skb is allocated after RX page
|
|
|
+ * @page: The page that was allocated from skb_alloc_page
|
|
|
+ * @skb: The skb that may need pfmemalloc set
|
|
|
+ */
|
|
|
+static inline void skb_propagate_pfmemalloc(struct page *page,
|
|
|
+ struct sk_buff *skb)
|
|
|
+{
|
|
|
+ if (page && page->pfmemalloc)
|
|
|
+ skb->pfmemalloc = true;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* skb_frag_page - retrieve the page refered to by a paged fragment
|
|
|
* @frag: the paged fragment
|