Message ID | 20201022211650.25045-1-dave@stgolabs.net (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | fs/dcache: optimize start_dir_add() | expand |
On Thu, Oct 22, 2020 at 02:16:50PM -0700, Davidlohr Bueso wrote: > Considering both end_dir_add() and d_alloc_parallel(), the > dir->i_dir_seq wants acquire/release semantics, therefore > micro-optimize for ll/sc archs and use finer grained barriers > to provide (load)-ACQUIRE ordering (L->S + L->L). This comes > at no additional cost for most of x86, as sane tso models will > have a nop for smp_rmb/smp_acquire__after_ctrl_dep. > > Signed-off-by: Davidlohr Bueso <dbueso@suse.de> > --- > Alternatively I guess we could just use cmpxchg_acquire(). Please us cmpxchg_acquire() so that people who have no clue what the hell smp_acquire__after_ctrl_dep() means or does have some hope of understanding of what objects the ordering semantics in the function actually apply to.... Cheers, Dave.
diff --git a/fs/dcache.c b/fs/dcache.c index ea0485861d93..22738daccb9c 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -2502,13 +2502,18 @@ EXPORT_SYMBOL(d_rehash); static inline unsigned start_dir_add(struct inode *dir) { + unsigned n; for (;;) { - unsigned n = dir->i_dir_seq; - if (!(n & 1) && cmpxchg(&dir->i_dir_seq, n, n + 1) == n) - return n; + n = READ_ONCE(dir->i_dir_seq); + if (!(n & 1) && cmpxchg_relaxed(&dir->i_dir_seq, n, n + 1) == n) + break; cpu_relax(); } + + /* create (load)-ACQUIRE ordering */ + smp_acquire__after_ctrl_dep(); + return n; } static inline void end_dir_add(struct inode *dir, unsigned n)
Considering both end_dir_add() and d_alloc_parallel(), the dir->i_dir_seq wants acquire/release semantics, therefore micro-optimize for ll/sc archs and use finer grained barriers to provide (load)-ACQUIRE ordering (L->S + L->L). This comes at no additional cost for most of x86, as sane tso models will have a nop for smp_rmb/smp_acquire__after_ctrl_dep. Signed-off-by: Davidlohr Bueso <dbueso@suse.de> --- Alternatively I guess we could just use cmpxchg_acquire(). fs/dcache.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)