|
@@ -1822,6 +1822,9 @@ struct sk_buff *sock_alloc_send_pskb(struct sock *sk, unsigned long header_len,
|
|
|
order);
|
|
|
if (page)
|
|
|
goto fill_page;
|
|
|
+ /* Do not retry other high order allocations */
|
|
|
+ order = 1;
|
|
|
+ max_page_order = 0;
|
|
|
}
|
|
|
order--;
|
|
|
}
|
|
@@ -1869,10 +1872,8 @@ EXPORT_SYMBOL(sock_alloc_send_skb);
|
|
|
* no guarantee that allocations succeed. Therefore, @sz MUST be
|
|
|
* less or equal than PAGE_SIZE.
|
|
|
*/
|
|
|
-bool skb_page_frag_refill(unsigned int sz, struct page_frag *pfrag, gfp_t prio)
|
|
|
+bool skb_page_frag_refill(unsigned int sz, struct page_frag *pfrag, gfp_t gfp)
|
|
|
{
|
|
|
- int order;
|
|
|
-
|
|
|
if (pfrag->page) {
|
|
|
if (atomic_read(&pfrag->page->_count) == 1) {
|
|
|
pfrag->offset = 0;
|
|
@@ -1883,20 +1884,21 @@ bool skb_page_frag_refill(unsigned int sz, struct page_frag *pfrag, gfp_t prio)
|
|
|
put_page(pfrag->page);
|
|
|
}
|
|
|
|
|
|
- order = SKB_FRAG_PAGE_ORDER;
|
|
|
- do {
|
|
|
- gfp_t gfp = prio;
|
|
|
-
|
|
|
- if (order)
|
|
|
- gfp |= __GFP_COMP | __GFP_NOWARN | __GFP_NORETRY;
|
|
|
- pfrag->page = alloc_pages(gfp, order);
|
|
|
+ pfrag->offset = 0;
|
|
|
+ if (SKB_FRAG_PAGE_ORDER) {
|
|
|
+ pfrag->page = alloc_pages(gfp | __GFP_COMP |
|
|
|
+ __GFP_NOWARN | __GFP_NORETRY,
|
|
|
+ SKB_FRAG_PAGE_ORDER);
|
|
|
if (likely(pfrag->page)) {
|
|
|
- pfrag->offset = 0;
|
|
|
- pfrag->size = PAGE_SIZE << order;
|
|
|
+ pfrag->size = PAGE_SIZE << SKB_FRAG_PAGE_ORDER;
|
|
|
return true;
|
|
|
}
|
|
|
- } while (--order >= 0);
|
|
|
-
|
|
|
+ }
|
|
|
+ pfrag->page = alloc_page(gfp);
|
|
|
+ if (likely(pfrag->page)) {
|
|
|
+ pfrag->size = PAGE_SIZE;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
return false;
|
|
|
}
|
|
|
EXPORT_SYMBOL(skb_page_frag_refill);
|