diff options
Diffstat (limited to 'net/core/sock.c')
-rw-r--r-- | net/core/sock.c | 36 |
1 files changed, 19 insertions, 17 deletions
diff --git a/net/core/sock.c b/net/core/sock.c index 2714811afbd8..9c3f823e76a9 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -166,7 +166,7 @@ EXPORT_SYMBOL(sk_ns_capable); | |||
166 | /** | 166 | /** |
167 | * sk_capable - Socket global capability test | 167 | * sk_capable - Socket global capability test |
168 | * @sk: Socket to use a capability on or through | 168 | * @sk: Socket to use a capability on or through |
169 | * @cap: The global capbility to use | 169 | * @cap: The global capability to use |
170 | * | 170 | * |
171 | * Test to see if the opener of the socket had when the socket was | 171 | * Test to see if the opener of the socket had when the socket was |
172 | * created and the current process has the capability @cap in all user | 172 | * created and the current process has the capability @cap in all user |
@@ -183,7 +183,7 @@ EXPORT_SYMBOL(sk_capable); | |||
183 | * @sk: Socket to use a capability on or through | 183 | * @sk: Socket to use a capability on or through |
184 | * @cap: The capability to use | 184 | * @cap: The capability to use |
185 | * | 185 | * |
186 | * Test to see if the opener of the socket had when the socke was created | 186 | * Test to see if the opener of the socket had when the socket was created |
187 | * and the current process has the capability @cap over the network namespace | 187 | * and the current process has the capability @cap over the network namespace |
188 | * the socket is a member of. | 188 | * the socket is a member of. |
189 | */ | 189 | */ |
@@ -1822,6 +1822,9 @@ struct sk_buff *sock_alloc_send_pskb(struct sock *sk, unsigned long header_len, | |||
1822 | order); | 1822 | order); |
1823 | if (page) | 1823 | if (page) |
1824 | goto fill_page; | 1824 | goto fill_page; |
1825 | /* Do not retry other high order allocations */ | ||
1826 | order = 1; | ||
1827 | max_page_order = 0; | ||
1825 | } | 1828 | } |
1826 | order--; | 1829 | order--; |
1827 | } | 1830 | } |
@@ -1863,16 +1866,14 @@ EXPORT_SYMBOL(sock_alloc_send_skb); | |||
1863 | * skb_page_frag_refill - check that a page_frag contains enough room | 1866 | * skb_page_frag_refill - check that a page_frag contains enough room |
1864 | * @sz: minimum size of the fragment we want to get | 1867 | * @sz: minimum size of the fragment we want to get |
1865 | * @pfrag: pointer to page_frag | 1868 | * @pfrag: pointer to page_frag |
1866 | * @prio: priority for memory allocation | 1869 | * @gfp: priority for memory allocation |
1867 | * | 1870 | * |
1868 | * Note: While this allocator tries to use high order pages, there is | 1871 | * Note: While this allocator tries to use high order pages, there is |
1869 | * no guarantee that allocations succeed. Therefore, @sz MUST be | 1872 | * no guarantee that allocations succeed. Therefore, @sz MUST be |
1870 | * less or equal than PAGE_SIZE. | 1873 | * less or equal than PAGE_SIZE. |
1871 | */ | 1874 | */ |
1872 | bool skb_page_frag_refill(unsigned int sz, struct page_frag *pfrag, gfp_t prio) | 1875 | bool skb_page_frag_refill(unsigned int sz, struct page_frag *pfrag, gfp_t gfp) |
1873 | { | 1876 | { |
1874 | int order; | ||
1875 | |||
1876 | if (pfrag->page) { | 1877 | if (pfrag->page) { |
1877 | if (atomic_read(&pfrag->page->_count) == 1) { | 1878 | if (atomic_read(&pfrag->page->_count) == 1) { |
1878 | pfrag->offset = 0; | 1879 | pfrag->offset = 0; |
@@ -1883,20 +1884,21 @@ bool skb_page_frag_refill(unsigned int sz, struct page_frag *pfrag, gfp_t prio) | |||
1883 | put_page(pfrag->page); | 1884 | put_page(pfrag->page); |
1884 | } | 1885 | } |
1885 | 1886 | ||
1886 | order = SKB_FRAG_PAGE_ORDER; | 1887 | pfrag->offset = 0; |
1887 | do { | 1888 | if (SKB_FRAG_PAGE_ORDER) { |
1888 | gfp_t gfp = prio; | 1889 | pfrag->page = alloc_pages(gfp | __GFP_COMP | |
1889 | 1890 | __GFP_NOWARN | __GFP_NORETRY, | |
1890 | if (order) | 1891 | SKB_FRAG_PAGE_ORDER); |
1891 | gfp |= __GFP_COMP | __GFP_NOWARN | __GFP_NORETRY; | ||
1892 | pfrag->page = alloc_pages(gfp, order); | ||
1893 | if (likely(pfrag->page)) { | 1892 | if (likely(pfrag->page)) { |
1894 | pfrag->offset = 0; | 1893 | pfrag->size = PAGE_SIZE << SKB_FRAG_PAGE_ORDER; |
1895 | pfrag->size = PAGE_SIZE << order; | ||
1896 | return true; | 1894 | return true; |
1897 | } | 1895 | } |
1898 | } while (--order >= 0); | 1896 | } |
1899 | 1897 | pfrag->page = alloc_page(gfp); | |
1898 | if (likely(pfrag->page)) { | ||
1899 | pfrag->size = PAGE_SIZE; | ||
1900 | return true; | ||
1901 | } | ||
1900 | return false; | 1902 | return false; |
1901 | } | 1903 | } |
1902 | EXPORT_SYMBOL(skb_page_frag_refill); | 1904 | EXPORT_SYMBOL(skb_page_frag_refill); |