net: Add device Rx page allocation function
This patch implements __dev_alloc_pages and __dev_alloc_page. These are meant to replace the __skb_alloc_pages and __skb_alloc_page functions. The reason for doing this is that it occurred to me that __skb_alloc_page is supposed to be passed an sk_buff pointer, but it is NULL in all cases where it is used. Worse is that in the case of ixgbe it is passed NULL via the sk_buff pointer in the rx_buffer info structure which means the compiler is not correctly stripping it out. The naming for these functions is based on dev_alloc_skb and __dev_alloc_skb. There was originally a netdev_alloc_page, however that was passed a net_device pointer and this function is not so I thought it best to follow that naming scheme since that is the same difference between dev_alloc_skb and netdev_alloc_skb. In the case of anything greater than order 0 it is assumed that we want a compound page so __GFP_COMP is set for all allocations as we expect a compound page when assigning a page frag. The other change in this patch is to exploit the behaviors of the page allocator in how it handles flags. So for example we can always set __GFP_COMP and __GFP_MEMALLOC since they are ignored if they are not applicable or are overridden by another flag. Signed-off-by: Alexander Duyck <alexander.h.duyck@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
6c91023dc3
commit
71dfda58aa
|
@ -2184,6 +2184,54 @@ static inline struct sk_buff *netdev_alloc_skb_ip_align(struct net_device *dev,
|
|||
return __netdev_alloc_skb_ip_align(dev, length, GFP_ATOMIC);
|
||||
}
|
||||
|
||||
/**
|
||||
* __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.
|
||||
*
|
||||
* %NULL is returned if there is no free memory.
|
||||
*/
|
||||
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;
|
||||
|
||||
return alloc_pages_node(NUMA_NO_NODE, gfp_mask, order);
|
||||
}
|
||||
|
||||
static inline struct page *dev_alloc_pages(unsigned int order)
|
||||
{
|
||||
return __dev_alloc_pages(GFP_ATOMIC, order);
|
||||
}
|
||||
|
||||
/**
|
||||
* __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.
|
||||
*
|
||||
* %NULL is returned if there is no free memory.
|
||||
*/
|
||||
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 __dev_alloc_page(GFP_ATOMIC);
|
||||
}
|
||||
|
||||
/**
|
||||
* __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
|
||||
|
|
Loading…
Reference in New Issue