diff options
author | John Stultz <john.stultz@linaro.org> | 2013-10-07 18:51:59 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2013-11-06 06:40:26 -0500 |
commit | 1ca7d67cf5d5a2aef26a8d9afd789006fa098347 (patch) | |
tree | 8f4f7d1f189d7a08983ab5ef522330f08f337459 /fs/dcache.c | |
parent | 827da44c61419f29ae3be198c342e2147f1a10cb (diff) |
seqcount: Add lockdep functionality to seqcount/seqlock structures
Currently seqlocks and seqcounts don't support lockdep.
After running across a seqcount related deadlock in the timekeeping
code, I used a less-refined and more focused variant of this patch
to narrow down the cause of the issue.
This is a first-pass attempt to properly enable lockdep functionality
on seqlocks and seqcounts.
Since seqcounts are used in the vdso gettimeofday code, I've provided
non-lockdep accessors for those needs.
I've also handled one case where there were nested seqlock writers
and there may be more edge cases.
Comments and feedback would be appreciated!
Signed-off-by: John Stultz <john.stultz@linaro.org>
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Cc: Eric Dumazet <eric.dumazet@gmail.com>
Cc: Li Zefan <lizefan@huawei.com>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: netdev@vger.kernel.org
Link: http://lkml.kernel.org/r/1381186321-4906-3-git-send-email-john.stultz@linaro.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'fs/dcache.c')
-rw-r--r-- | fs/dcache.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/dcache.c b/fs/dcache.c index ae6ebb88ceff..f750be22c08c 100644 --- a/fs/dcache.c +++ b/fs/dcache.c | |||
@@ -2574,7 +2574,7 @@ static void __d_move(struct dentry * dentry, struct dentry * target) | |||
2574 | dentry_lock_for_move(dentry, target); | 2574 | dentry_lock_for_move(dentry, target); |
2575 | 2575 | ||
2576 | write_seqcount_begin(&dentry->d_seq); | 2576 | write_seqcount_begin(&dentry->d_seq); |
2577 | write_seqcount_begin(&target->d_seq); | 2577 | write_seqcount_begin_nested(&target->d_seq, DENTRY_D_LOCK_NESTED); |
2578 | 2578 | ||
2579 | /* __d_drop does write_seqcount_barrier, but they're OK to nest. */ | 2579 | /* __d_drop does write_seqcount_barrier, but they're OK to nest. */ |
2580 | 2580 | ||
@@ -2706,7 +2706,7 @@ static void __d_materialise_dentry(struct dentry *dentry, struct dentry *anon) | |||
2706 | dentry_lock_for_move(anon, dentry); | 2706 | dentry_lock_for_move(anon, dentry); |
2707 | 2707 | ||
2708 | write_seqcount_begin(&dentry->d_seq); | 2708 | write_seqcount_begin(&dentry->d_seq); |
2709 | write_seqcount_begin(&anon->d_seq); | 2709 | write_seqcount_begin_nested(&anon->d_seq, DENTRY_D_LOCK_NESTED); |
2710 | 2710 | ||
2711 | dparent = dentry->d_parent; | 2711 | dparent = dentry->d_parent; |
2712 | 2712 | ||