mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	Disable FS reclaim when allocating new slabs
Allowing the spl_cache_grow_work() function to reclaim inodes allows for two unlikely deadlocks. Therefore, we clear __GFP_FS for these allocations. The two deadlocks are: * While holding the ZFS_OBJ_HOLD_ENTER(zsb, obj1) lock a function calls kmem_cache_alloc() which happens to need to allocate a new slab. To allocate the new slab we enter FS level reclaim and attempt to evict several inodes. To evict these inodes we need to take the ZFS_OBJ_HOLD_ENTER(zsb, obj2) lock and it just happens that obj1 and obj2 use the same hashed lock. * Similar to the first case however instead of getting blocked on the hash lock we block in txg_wait_open() which is waiting for the next txg which isn't coming because the txg_sync thread is blocked in kmem_cache_alloc(). Note this isn't a 100% fix because vmalloc() won't strictly honor __GFP_FS. However, it practice this is sufficient because several very unlikely things must all occur concurrently. Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Issue zfsonlinux/zfs#1101
This commit is contained in:
		
							parent
							
								
									e71a4534b3
								
							
						
					
					
						commit
						043f9b5724
					
				@ -1773,7 +1773,7 @@ spl_cache_grow(spl_kmem_cache_t *skc, int flags, void **obj)
 | 
			
		||||
 | 
			
		||||
		atomic_inc(&skc->skc_ref);
 | 
			
		||||
		ska->ska_cache = skc;
 | 
			
		||||
		ska->ska_flags = flags;
 | 
			
		||||
		ska->ska_flags = flags & ~__GFP_FS;
 | 
			
		||||
		spl_init_delayed_work(&ska->ska_work, spl_cache_grow_work, ska);
 | 
			
		||||
		schedule_delayed_work(&ska->ska_work, 0);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user