Skip to content

Commit

Permalink
lockdep: fix deadlock in lockdep_trace_alloc
Browse files Browse the repository at this point in the history
Heiko reported that we grab the graph lock with irqs enabled.

Fix this by providng the same wrapper as all other lockdep entry
functions have.

Reported-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Nick Piggin <npiggin@suse.de>
LKML-Reference: <1237544000.24626.52.camel@twins>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
Peter Zijlstra authored and Ingo Molnar committed Mar 30, 2009
1 parent 19cefdf commit 2f85018
Showing 1 changed file with 19 additions and 2 deletions.
21 changes: 19 additions & 2 deletions kernel/lockdep.c
Original file line number Diff line number Diff line change
Expand Up @@ -2260,7 +2260,7 @@ void trace_softirqs_off(unsigned long ip)
debug_atomic_inc(&redundant_softirqs_off);
}

void lockdep_trace_alloc(gfp_t gfp_mask)
static void __lockdep_trace_alloc(gfp_t gfp_mask, unsigned long flags)
{
struct task_struct *curr = current;

Expand All @@ -2279,12 +2279,29 @@ void lockdep_trace_alloc(gfp_t gfp_mask)
if (!(gfp_mask & __GFP_FS))
return;

if (DEBUG_LOCKS_WARN_ON(irqs_disabled()))
if (DEBUG_LOCKS_WARN_ON(irqs_disabled_flags(flags)))
return;

mark_held_locks(curr, RECLAIM_FS);
}

static void check_flags(unsigned long flags);

void lockdep_trace_alloc(gfp_t gfp_mask)
{
unsigned long flags;

if (unlikely(current->lockdep_recursion))
return;

raw_local_irq_save(flags);
check_flags(flags);
current->lockdep_recursion = 1;
__lockdep_trace_alloc(gfp_mask, flags);
current->lockdep_recursion = 0;
raw_local_irq_restore(flags);
}

static int mark_irqflags(struct task_struct *curr, struct held_lock *hlock)
{
/*
Expand Down

0 comments on commit 2f85018

Please sign in to comment.