summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--patches/lib-rhashtable.patch32
1 files changed, 32 insertions, 0 deletions
diff --git a/patches/lib-rhashtable.patch b/patches/lib-rhashtable.patch
new file mode 100644
index 00000000..9c262b02
--- /dev/null
+++ b/patches/lib-rhashtable.patch
@@ -0,0 +1,32 @@
+--- a/compat/lib-rhashtable.c
++++ b/compat/lib-rhashtable.c
+@@ -86,11 +86,26 @@ static int alloc_bucket_locks(struct rhashtable *ht, struct bucket_table *tbl,
+ size = min(size, 1U << tbl->nest);
+
+ if (sizeof(spinlock_t) != 0) {
++#if LINUX_VERSION_IS_LESS(4,12,0)
++ tbl->locks = NULL;
++#ifdef CONFIG_NUMA
++ if (size * sizeof(spinlock_t) > PAGE_SIZE &&
++ gfp == GFP_KERNEL)
++ tbl->locks = vmalloc(size * sizeof(spinlock_t));
++#endif
++ if (gfp != GFP_KERNEL)
++ gfp |= __GFP_NOWARN | __GFP_NORETRY;
++
++ if (!tbl->locks)
++ tbl->locks = kmalloc_array(size, sizeof(spinlock_t),
++ gfp);
++#else
+ if (gfpflags_allow_blocking(gfp))
+ tbl->locks = kvmalloc(size * sizeof(spinlock_t), gfp);
+ else
+ tbl->locks = kmalloc_array(size, sizeof(spinlock_t),
+ gfp);
++#endif
+ if (!tbl->locks)
+ return -ENOMEM;
+ for (i = 0; i < size; i++)
+--
+1.9.1
+