From b4ad50ac5f16de9220452f0da493e67c060d701b Mon Sep 17 00:00:00 2001 From: Chunwei Chen Date: Thu, 17 Dec 2015 18:31:58 -0800 Subject: Use spl_fstrans_mark instead of memalloc_noio_save For earlier versions of the kernel with memalloc_noio_save, it only turns off __GFP_IO but leaves __GFP_FS untouched during direct reclaim. This would cause threads to direct reclaim into ZFS and cause deadlock. Instead, we should stick to using spl_fstrans_mark. Since we would explicitly turn off both __GFP_IO and __GFP_FS before allocation, it will work on every version of the kernel. This impacts kernel versions 3.9-3.17, see upstream kernel commit torvalds/linux@934f307 for reference. Signed-off-by: Chunwei Chen Signed-off-by: Brian Behlendorf Signed-off-by: Tim Chase Closes #515 Issue zfsonlinux/zfs#4111 --- module/spl/spl-kmem-cache.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) (limited to 'module/spl/spl-kmem-cache.c') diff --git a/module/spl/spl-kmem-cache.c b/module/spl/spl-kmem-cache.c index 846d24300..e3edca5a0 100644 --- a/module/spl/spl-kmem-cache.c +++ b/module/spl/spl-kmem-cache.c @@ -201,7 +201,7 @@ kv_alloc(spl_kmem_cache_t *skc, int size, int flags) ASSERT(ISP2(size)); ptr = (void *)__get_free_pages(lflags, get_order(size)); } else { - ptr = spl_vmalloc(size, lflags | __GFP_HIGHMEM, PAGE_KERNEL); + ptr = __vmalloc(size, lflags | __GFP_HIGHMEM, PAGE_KERNEL); } /* Resulting allocated memory will be page aligned */ @@ -1156,15 +1156,10 @@ spl_cache_grow_work(void *data) spl_kmem_cache_t *skc = ska->ska_cache; spl_kmem_slab_t *sks; -#if defined(PF_MEMALLOC_NOIO) - unsigned noio_flag = memalloc_noio_save(); - sks = spl_slab_alloc(skc, ska->ska_flags); - memalloc_noio_restore(noio_flag); -#else fstrans_cookie_t cookie = spl_fstrans_mark(); sks = spl_slab_alloc(skc, ska->ska_flags); spl_fstrans_unmark(cookie); -#endif + spin_lock(&skc->skc_lock); if (sks) { skc->skc_slab_total++; -- cgit v1.2.3