diff options
| -rw-r--r-- | patches/lib-rhashtable.patch | 32 | 
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 + | 
