Commit 29f1c1ae authored by Kent Overstreet's avatar Kent Overstreet
Browse files

closures: fix closure_sync + closure debugging



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: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 04357732
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -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
}

/**
+3 −0
Original line number Diff line number Diff line
@@ -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;