Skip to contentSkip to conversation

XFS deadlock fixed?

DISCUSSION Felipe Wilhelms Damasio - Taghos 2 participants 3 messages May 10, 2011 – May 11, 2011 XFS filesystem

lore
Share & tools
lore
#0 lore raw

Hi Mr. Hellwig,

I saw the XFS deadlock thread regarding 2.6.38:

http://www.linux.sgi.com/archives/xfs/2011-03/msg00185.html

    I'm seeing too in 2.6.38.4. A lot of

XFS: possible memory allocation deadlock in kmem_alloc (mode:0x250)

I checked the changelog for 2.6.38.6 and can't be sure if the fix got
in...could you tell me if it did?

Thanks,

Signature · 10 lines
Felipe Wilhelms Damasio


TAGHOS - Tecnologia

Rua Prof. Alvaro Alvim, 211

Porto Alegre - RS - (51) 3239-3180

www.taghos.com.br <http://www.taghos.com.br/>
#1 lore raw
Quoted 9 lines · Felipe Wilhelms Damasio - Taghos

Hi Mr. Hellwig,

I saw the XFS deadlock thread regarding 2.6.38:

http://www.linux.sgi.com/archives/xfs/2011-03/msg00185.html

    I'm seeing too in 2.6.38.4. A lot of

XFS: possible memory allocation deadlock in kmem_alloc (mode:0x250)

You're probably running into a different issue. Any chance you can try the attached patch to see where you're stuck exactly?

Also in case you're using slub (CONFIG_SLUB) can you check if it still happens when using slab (CONFIG_SLAB) instead?

#2 lore raw

And here's the actual patch, sorry:

fs/xfs/linux-2.6/kmem.c +6 -2
Index: linux-2.6/fs/xfs/linux-2.6/kmem.c
===================================================================
@@ -56,10 +56,12 @@ kmem_alloc(size_t size, unsigned int __n
 		ptr = kmalloc(size, lflags);
 		if (ptr || (flags & (KM_MAYFAIL|KM_NOSLEEP)))
 			return ptr;
-		if (!(++retries % 100))
+		if (!(++retries % 100)) {
 			xfs_err(NULL,
 		"possible memory allocation deadlock in %s (mode:0x%x)",
 					__func__, lflags);
+			dump_stack();
+		}
 		congestion_wait(BLK_RW_ASYNC, HZ/50);
 	} while (1);
 }
@@ -112,10 +114,12 @@ kmem_zone_alloc(kmem_zone_t *zone, unsig
 		ptr = kmem_cache_alloc(zone, lflags);
 		if (ptr || (flags & (KM_MAYFAIL|KM_NOSLEEP)))
 			return ptr;
-		if (!(++retries % 100))
+		if (!(++retries % 100)) {
 			xfs_err(NULL,
 		"possible memory allocation deadlock in %s (mode:0x%x)",
 					__func__, lflags);
+			dump_stack();
+		}
 		congestion_wait(BLK_RW_ASYNC, HZ/50);
 	} while (1);
 }