summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHauke Mehrtens <hauke@hauke-m.de>2018-12-01 13:40:50 +0100
committerHauke Mehrtens <hauke@hauke-m.de>2018-12-06 22:54:26 +0100
commit121b7cbd22a8a01e572892da93d8d26bfc7d9e2c (patch)
treeffeba0c139bf9d1b17c1289b0bc7c9a4b38f32c5
parentdd498a8f8616c7d458a0cbb81e845d393754e7f6 (diff)
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 <hauke@hauke-m.de>
-rw-r--r--backport/backport-include/linux/gfp.h12
-rw-r--r--backport/compat/backport-4.10.c22
-rw-r--r--dependencies9
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 <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 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