From 121b7cbd22a8a01e572892da93d8d26bfc7d9e2c Mon Sep 17 00:00:00 2001 From: Hauke Mehrtens Date: Sat, 1 Dec 2018 13:40:50 +0100 Subject: backports: Add page_frag_alloc() and __page_frag_cache_drain() This was introduced in kernel commit 8c2dd3e4a4b ("mm: rename __alloc_page_frag to page_frag_alloc and __free_page_frag to page_frag_free") and commit 44fdffd7050 ("mm: add support for releasing multiple instances of a page") and is used by the mt76 driver. Backporting it to kernel older than 4.2 is harder so just do it till that version. Signed-off-by: Hauke Mehrtens --- backport/backport-include/linux/gfp.h | 12 ++++++++++++ backport/compat/backport-4.10.c | 22 ++++++++++++++++++++++ dependencies | 9 +++++---- 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/backport/backport-include/linux/gfp.h b/backport/backport-include/linux/gfp.h index 42f818f1..d41d4277 100644 --- a/backport/backport-include/linux/gfp.h +++ b/backport/backport-include/linux/gfp.h @@ -10,4 +10,16 @@ #define __GFP_KSWAPD_RECLAIM ((__force gfp_t)___GFP_KSWAPD_RECLAIM) /* kswapd can wake */ #endif +#if LINUX_VERSION_IS_LESS(4,10,0) && LINUX_VERSION_IS_GEQ(4,2,0) +#define page_frag_alloc LINUX_BACKPORT(page_frag_alloc) +static inline void *page_frag_alloc(struct page_frag_cache *nc, + unsigned int fragsz, gfp_t gfp_mask) +{ + return __alloc_page_frag(nc, fragsz, gfp_mask); +} + +#define __page_frag_cache_drain LINUX_BACKPORT(__page_frag_cache_drain) +void __page_frag_cache_drain(struct page *page, unsigned int count); +#endif /* < 4.10 && >= 4.2 */ + #endif /* __BACKPORT_LINUX_GFP_H */ diff --git a/backport/compat/backport-4.10.c b/backport/compat/backport-4.10.c index 44e02dd7..a35c699e 100644 --- a/backport/compat/backport-4.10.c +++ b/backport/compat/backport-4.10.c @@ -12,6 +12,8 @@ #include #include #include +#include +#include #if LINUX_VERSION_IS_GEQ(4,6,0) #if LINUX_VERSION_IS_LESS(4,7,0) @@ -252,3 +254,23 @@ int mii_ethtool_get_link_ksettings(struct mii_if_info *mii, } EXPORT_SYMBOL(mii_ethtool_get_link_ksettings); #endif /* LINUX_VERSION_IS_GEQ(4,6,0) */ + +#if LINUX_VERSION_IS_GEQ(4,2,0) +void __page_frag_cache_drain(struct page *page, unsigned int count) +{ + VM_BUG_ON_PAGE(page_ref_count(page) == 0, page); + + if (page_ref_sub_and_test(page, count)) { + unsigned int order = compound_order(page); + + /* + * __free_pages_ok() is not exported so call + * __free_pages() which decrements the ref counter + * and increment the ref counter before. + */ + page_ref_inc(page); + __free_pages(page, order); + } +} +EXPORT_SYMBOL_GPL(__page_frag_cache_drain); +#endif diff --git a/dependencies b/dependencies index 0fecb720..1972ac7e 100644 --- a/dependencies +++ b/dependencies @@ -71,11 +71,12 @@ RSI_SDIO 3.13 # For Coexsitence the BT driver has to export rsi_bt_ops RSI_COEX 4.17 -# depends on devm_led_classdev_register() +# depends on devm_led_classdev_register() and struct page_frag_cache # (can't use MT76_CORE for this as it's selected) -MT76x0U 4.1 -MT76x2E 4.1 -MT76x2U 4.1 +MT76x0U 4.2 +MT76x0E 4.2 +MT76x2E 4.2 +MT76x2U 4.2 # select_queue_fallback_t is missing RTL8723BS 3.14 -- cgit v1.2.3