diff mbox series

[03/12] backports: Add page_frag_alloc() and __page_frag_cache_drain()

Message ID 20181202115226.3594-4-hauke@hauke-m.de (mailing list archive)
State Accepted
Headers show
Series backports: Multiple fixes for kernel 4.20 | expand

Commit Message

Hauke Mehrtens Dec. 2, 2018, 11:52 a.m. UTC
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 <hauke@hauke-m.de>
---
 backport/backport-include/linux/gfp.h | 12 ++++++++++++
 backport/compat/backport-4.10.c       | 22 ++++++++++++++++++++++
 dependencies                          |  9 +++++----
 3 files changed, 39 insertions(+), 4 deletions(-)
diff mbox series

Patch

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 <linux/netdevice.h>
 #include <linux/ethtool.h>
 #include <linux/mii.h>
+#include <linux/page_ref.h>
+#include <linux/gfp.h>
 
 #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 84bffd77..7d483a28 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