]> www.infradead.org Git - users/hch/xfs.git/commitdiff
closures: fix closure_sync + closure debugging
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 30 Jun 2024 02:12:09 +0000 (22:12 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Wed, 10 Jul 2024 13:53:39 +0000 (09:53 -0400)
originally, stack closures were only used synchronously, and with the
original implementation of closure_sync() the ref never hit 0; thus,
closure_put_after_sub() assumes that if the ref hits 0 it's on the debug
list, in debug mode.

that's no longer true with the current implementation of closure_sync,
so we need a new magic so closure_debug_destroy() doesn't pop an assert.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
include/linux/closure.h
lib/closure.c

index 59b8c06b11ff332e361e38212c4efd43e1c9b15e..2af44427107de9d7a9102f577e8d343e8b1afcfe 100644 (file)
@@ -159,6 +159,7 @@ struct closure {
 #ifdef CONFIG_DEBUG_CLOSURES
 #define CLOSURE_MAGIC_DEAD     0xc054dead
 #define CLOSURE_MAGIC_ALIVE    0xc054a11e
+#define CLOSURE_MAGIC_STACK    0xc05451cc
 
        unsigned int            magic;
        struct list_head        all;
@@ -323,12 +324,18 @@ static inline void closure_init_stack(struct closure *cl)
 {
        memset(cl, 0, sizeof(struct closure));
        atomic_set(&cl->remaining, CLOSURE_REMAINING_INITIALIZER);
+#ifdef CONFIG_DEBUG_CLOSURES
+       cl->magic = CLOSURE_MAGIC_STACK;
+#endif
 }
 
 static inline void closure_init_stack_release(struct closure *cl)
 {
        memset(cl, 0, sizeof(struct closure));
        atomic_set_release(&cl->remaining, CLOSURE_REMAINING_INITIALIZER);
+#ifdef CONFIG_DEBUG_CLOSURES
+       cl->magic = CLOSURE_MAGIC_STACK;
+#endif
 }
 
 /**
index c971216d9d7742231258e51c1e822084513f07d9..116afae2eed9698425ddff4c352ce788f416075b 100644 (file)
@@ -244,6 +244,9 @@ void closure_debug_destroy(struct closure *cl)
 {
        unsigned long flags;
 
+       if (cl->magic == CLOSURE_MAGIC_STACK)
+               return;
+
        BUG_ON(cl->magic != CLOSURE_MAGIC_ALIVE);
        cl->magic = CLOSURE_MAGIC_DEAD;