|
@@ -2185,46 +2185,51 @@ static inline struct sk_buff *netdev_alloc_skb_ip_align(struct net_device *dev,
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * __skb_alloc_pages - 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
|
|
|
|
|
|
+ * __dev_alloc_pages - allocate page for network Rx
|
|
|
|
+ * @gfp_mask: allocation priority. Set __GFP_NOMEMALLOC if not for network Rx
|
|
|
|
+ * @order: size of the allocation
|
|
*
|
|
*
|
|
- * Allocate a new page.
|
|
|
|
|
|
+ * Allocate a new page.
|
|
*
|
|
*
|
|
- * %NULL is returned if there is no free memory.
|
|
|
|
|
|
+ * %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;
|
|
|
|
|
|
+static inline struct page *__dev_alloc_pages(gfp_t gfp_mask,
|
|
|
|
+ unsigned int order)
|
|
|
|
+{
|
|
|
|
+ /* This piece of code contains several assumptions.
|
|
|
|
+ * 1. This is for device Rx, therefor a cold page is preferred.
|
|
|
|
+ * 2. The expectation is the user wants a compound page.
|
|
|
|
+ * 3. If requesting a order 0 page it will not be compound
|
|
|
|
+ * due to the check to see if order has a value in prep_new_page
|
|
|
|
+ * 4. __GFP_MEMALLOC is ignored if __GFP_NOMEMALLOC is set due to
|
|
|
|
+ * code in gfp_to_alloc_flags that should be enforcing this.
|
|
|
|
+ */
|
|
|
|
+ gfp_mask |= __GFP_COLD | __GFP_COMP | __GFP_MEMALLOC;
|
|
|
|
|
|
- page = alloc_pages_node(NUMA_NO_NODE, gfp_mask, order);
|
|
|
|
- if (skb && page && page->pfmemalloc)
|
|
|
|
- skb->pfmemalloc = true;
|
|
|
|
|
|
+ return alloc_pages_node(NUMA_NO_NODE, gfp_mask, order);
|
|
|
|
+}
|
|
|
|
|
|
- return page;
|
|
|
|
|
|
+static inline struct page *dev_alloc_pages(unsigned int order)
|
|
|
|
+{
|
|
|
|
+ return __dev_alloc_pages(GFP_ATOMIC, order);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * __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
|
|
|
|
|
|
+ * __dev_alloc_page - allocate a page for network Rx
|
|
|
|
+ * @gfp_mask: allocation priority. Set __GFP_NOMEMALLOC if not for network Rx
|
|
*
|
|
*
|
|
- * Allocate a new page.
|
|
|
|
|
|
+ * Allocate a new page.
|
|
*
|
|
*
|
|
- * %NULL is returned if there is no free memory.
|
|
|
|
|
|
+ * %NULL is returned if there is no free memory.
|
|
*/
|
|
*/
|
|
-static inline struct page *__skb_alloc_page(gfp_t gfp_mask,
|
|
|
|
- struct sk_buff *skb)
|
|
|
|
|
|
+static inline struct page *__dev_alloc_page(gfp_t gfp_mask)
|
|
|
|
+{
|
|
|
|
+ return __dev_alloc_pages(gfp_mask, 0);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static inline struct page *dev_alloc_page(void)
|
|
{
|
|
{
|
|
- return __skb_alloc_pages(gfp_mask, skb, 0);
|
|
|
|
|
|
+ return __dev_alloc_page(GFP_ATOMIC);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|