summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--qdf/linux/src/qdf_nbuf.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/qdf/linux/src/qdf_nbuf.c b/qdf/linux/src/qdf_nbuf.c
index 6606df6a4cbf..2b2690785109 100644
--- a/qdf/linux/src/qdf_nbuf.c
+++ b/qdf/linux/src/qdf_nbuf.c
@@ -286,8 +286,18 @@ struct sk_buff *__qdf_nbuf_alloc(qdf_device_t osdev, size_t size, int reserve,
if (align)
size += (align - 1);
- if (in_interrupt() || irqs_disabled() || in_atomic())
+ if (in_interrupt() || irqs_disabled() || in_atomic()) {
flags = GFP_ATOMIC;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0)
+ /*
+ * Observed that kcompactd burns out CPU to make order-3 page.
+ *__netdev_alloc_skb has 4k page fallback option just in case of
+ * failing high order page allocation so we don't need to be
+ * hard. Make kcompactd rest in piece.
+ */
+ flags = flags & ~__GFP_KSWAPD_RECLAIM;
+#endif
+ }
skb = __netdev_alloc_skb(NULL, size, flags);