diff options
| -rw-r--r-- | drivers/net/ethernet/chelsio/cxgb4/sge.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/chelsio/cxgb4vf/sge.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igb/igb_main.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 4 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 1 | ||||
| -rw-r--r-- | drivers/net/usb/cdc-phonet.c | 2 | ||||
| -rw-r--r-- | drivers/usb/gadget/f_phonet.c | 2 | ||||
| -rw-r--r-- | include/linux/skbuff.h | 55 |
8 files changed, 62 insertions, 8 deletions
diff --git a/drivers/net/ethernet/chelsio/cxgb4/sge.c b/drivers/net/ethernet/chelsio/cxgb4/sge.c index 8596acaa402b..d49933ed551f 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/sge.c +++ b/drivers/net/ethernet/chelsio/cxgb4/sge.c | |||
| @@ -528,7 +528,7 @@ static unsigned int refill_fl(struct adapter *adap, struct sge_fl *q, int n, | |||
| 528 | #endif | 528 | #endif |
| 529 | 529 | ||
| 530 | while (n--) { | 530 | while (n--) { |
| 531 | pg = alloc_page(gfp); | 531 | pg = __skb_alloc_page(gfp, NULL); |
| 532 | if (unlikely(!pg)) { | 532 | if (unlikely(!pg)) { |
| 533 | q->alloc_failed++; | 533 | q->alloc_failed++; |
| 534 | break; | 534 | break; |
diff --git a/drivers/net/ethernet/chelsio/cxgb4vf/sge.c b/drivers/net/ethernet/chelsio/cxgb4vf/sge.c index f2d1ecdcaf98..8877fbfefb63 100644 --- a/drivers/net/ethernet/chelsio/cxgb4vf/sge.c +++ b/drivers/net/ethernet/chelsio/cxgb4vf/sge.c | |||
| @@ -653,7 +653,7 @@ static unsigned int refill_fl(struct adapter *adapter, struct sge_fl *fl, | |||
| 653 | 653 | ||
| 654 | alloc_small_pages: | 654 | alloc_small_pages: |
| 655 | while (n--) { | 655 | while (n--) { |
| 656 | page = alloc_page(gfp | __GFP_NOWARN | __GFP_COLD); | 656 | page = __skb_alloc_page(gfp | __GFP_NOWARN, NULL); |
| 657 | if (unlikely(!page)) { | 657 | if (unlikely(!page)) { |
| 658 | fl->alloc_failed++; | 658 | fl->alloc_failed++; |
| 659 | break; | 659 | break; |
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index 1050411e7ca3..b7c2d5050572 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c | |||
| @@ -6235,7 +6235,7 @@ static bool igb_alloc_mapped_page(struct igb_ring *rx_ring, | |||
| 6235 | return true; | 6235 | return true; |
| 6236 | 6236 | ||
| 6237 | if (!page) { | 6237 | if (!page) { |
| 6238 | page = alloc_page(GFP_ATOMIC | __GFP_COLD); | 6238 | page = __skb_alloc_page(GFP_ATOMIC, bi->skb); |
| 6239 | bi->page = page; | 6239 | bi->page = page; |
| 6240 | if (unlikely(!page)) { | 6240 | if (unlikely(!page)) { |
| 6241 | rx_ring->rx_stats.alloc_failed++; | 6241 | rx_ring->rx_stats.alloc_failed++; |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index c709eae58c63..4326f74f7137 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | |||
| @@ -1141,8 +1141,8 @@ static bool ixgbe_alloc_mapped_page(struct ixgbe_ring *rx_ring, | |||
| 1141 | 1141 | ||
| 1142 | /* alloc new page for storage */ | 1142 | /* alloc new page for storage */ |
| 1143 | if (likely(!page)) { | 1143 | if (likely(!page)) { |
| 1144 | page = alloc_pages(GFP_ATOMIC | __GFP_COLD | __GFP_COMP, | 1144 | page = __skb_alloc_pages(GFP_ATOMIC | __GFP_COLD | __GFP_COMP, |
| 1145 | ixgbe_rx_pg_order(rx_ring)); | 1145 | bi->skb, ixgbe_rx_pg_order(rx_ring)); |
| 1146 | if (unlikely(!page)) { | 1146 | if (unlikely(!page)) { |
| 1147 | rx_ring->rx_stats.alloc_rx_page_failed++; | 1147 | rx_ring->rx_stats.alloc_rx_page_failed++; |
| 1148 | return false; | 1148 | return false; |
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c index 3f9841d619ad..60ef64587412 100644 --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | |||
| @@ -352,7 +352,6 @@ static void ixgbevf_alloc_rx_buffers(struct ixgbevf_adapter *adapter, | |||
| 352 | adapter->alloc_rx_buff_failed++; | 352 | adapter->alloc_rx_buff_failed++; |
| 353 | goto no_buffers; | 353 | goto no_buffers; |
| 354 | } | 354 | } |
| 355 | |||
| 356 | bi->skb = skb; | 355 | bi->skb = skb; |
| 357 | } | 356 | } |
| 358 | if (!bi->dma) { | 357 | if (!bi->dma) { |
diff --git a/drivers/net/usb/cdc-phonet.c b/drivers/net/usb/cdc-phonet.c index 187c144c5e5b..64610048ce87 100644 --- a/drivers/net/usb/cdc-phonet.c +++ b/drivers/net/usb/cdc-phonet.c | |||
| @@ -130,7 +130,7 @@ static int rx_submit(struct usbpn_dev *pnd, struct urb *req, gfp_t gfp_flags) | |||
| 130 | struct page *page; | 130 | struct page *page; |
| 131 | int err; | 131 | int err; |
| 132 | 132 | ||
| 133 | page = alloc_page(gfp_flags); | 133 | page = __skb_alloc_page(gfp_flags | __GFP_NOMEMALLOC, NULL); |
| 134 | if (!page) | 134 | if (!page) |
| 135 | return -ENOMEM; | 135 | return -ENOMEM; |
| 136 | 136 | ||
diff --git a/drivers/usb/gadget/f_phonet.c b/drivers/usb/gadget/f_phonet.c index 965a6293206a..8ee9268fe253 100644 --- a/drivers/usb/gadget/f_phonet.c +++ b/drivers/usb/gadget/f_phonet.c | |||
| @@ -301,7 +301,7 @@ pn_rx_submit(struct f_phonet *fp, struct usb_request *req, gfp_t gfp_flags) | |||
| 301 | struct page *page; | 301 | struct page *page; |
| 302 | int err; | 302 | int err; |
| 303 | 303 | ||
| 304 | page = alloc_page(gfp_flags); | 304 | page = __skb_alloc_page(gfp_flags | __GFP_NOMEMALLOC, NULL); |
| 305 | if (!page) | 305 | if (!page) |
| 306 | return -ENOMEM; | 306 | return -ENOMEM; |
| 307 | 307 | ||
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index b814bb8fd5ab..7632c87da2c9 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
| @@ -1774,6 +1774,61 @@ static inline struct sk_buff *netdev_alloc_skb_ip_align(struct net_device *dev, | |||
| 1774 | return __netdev_alloc_skb_ip_align(dev, length, GFP_ATOMIC); | 1774 | return __netdev_alloc_skb_ip_align(dev, length, GFP_ATOMIC); |
| 1775 | } | 1775 | } |
| 1776 | 1776 | ||
| 1777 | /* | ||
| 1778 | * __skb_alloc_page - allocate pages for ps-rx on a skb and preserve pfmemalloc data | ||
| 1779 | * @gfp_mask: alloc_pages_node mask. Set __GFP_NOMEMALLOC if not for network packet RX | ||
| 1780 | * @skb: skb to set pfmemalloc on if __GFP_MEMALLOC is used | ||
| 1781 | * @order: size of the allocation | ||
| 1782 | * | ||
| 1783 | * Allocate a new page. | ||
| 1784 | * | ||
| 1785 | * %NULL is returned if there is no free memory. | ||
| 1786 | */ | ||
| 1787 | static inline struct page *__skb_alloc_pages(gfp_t gfp_mask, | ||
| 1788 | struct sk_buff *skb, | ||
| 1789 | unsigned int order) | ||
| 1790 | { | ||
| 1791 | struct page *page; | ||
| 1792 | |||
| 1793 | gfp_mask |= __GFP_COLD; | ||
| 1794 | |||
| 1795 | if (!(gfp_mask & __GFP_NOMEMALLOC)) | ||
| 1796 | gfp_mask |= __GFP_MEMALLOC; | ||
| 1797 | |||
| 1798 | page = alloc_pages_node(NUMA_NO_NODE, gfp_mask, order); | ||
| 1799 | if (skb && page && page->pfmemalloc) | ||
| 1800 | skb->pfmemalloc = true; | ||
| 1801 | |||
| 1802 | return page; | ||
| 1803 | } | ||
| 1804 | |||
| 1805 | /** | ||
| 1806 | * __skb_alloc_page - allocate a page for ps-rx for a given skb and preserve pfmemalloc data | ||
| 1807 | * @gfp_mask: alloc_pages_node mask. Set __GFP_NOMEMALLOC if not for network packet RX | ||
| 1808 | * @skb: skb to set pfmemalloc on if __GFP_MEMALLOC is used | ||
| 1809 | * | ||
| 1810 | * Allocate a new page. | ||
| 1811 | * | ||
| 1812 | * %NULL is returned if there is no free memory. | ||
| 1813 | */ | ||
| 1814 | static inline struct page *__skb_alloc_page(gfp_t gfp_mask, | ||
| 1815 | struct sk_buff *skb) | ||
| 1816 | { | ||
| 1817 | return __skb_alloc_pages(gfp_mask, skb, 0); | ||
| 1818 | } | ||
| 1819 | |||
| 1820 | /** | ||
| 1821 | * skb_propagate_pfmemalloc - Propagate pfmemalloc if skb is allocated after RX page | ||
| 1822 | * @page: The page that was allocated from skb_alloc_page | ||
| 1823 | * @skb: The skb that may need pfmemalloc set | ||
| 1824 | */ | ||
| 1825 | static inline void skb_propagate_pfmemalloc(struct page *page, | ||
| 1826 | struct sk_buff *skb) | ||
| 1827 | { | ||
| 1828 | if (page && page->pfmemalloc) | ||
| 1829 | skb->pfmemalloc = true; | ||
| 1830 | } | ||
| 1831 | |||
| 1777 | /** | 1832 | /** |
| 1778 | * skb_frag_page - retrieve the page refered to by a paged fragment | 1833 | * skb_frag_page - retrieve the page refered to by a paged fragment |
| 1779 | * @frag: the paged fragment | 1834 | * @frag: the paged fragment |
