]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - linux/six.c
Update bcachefs sources to 3e93567c51 bcachefs: Switch to local_clock() for fastpath...
[bcachefs-tools-debian] / linux / six.c
index b11660af245b8fc281da7a3d3d94affb16a48de9..39f7ea79fdb17d121b5dfa3f80dffe5bf3bb041b 100644 (file)
@@ -148,6 +148,14 @@ static int __do_six_trylock_type(struct six_lock *lock,
                        atomic64_add(__SIX_VAL(write_locking, 1),
                                     &lock->state.counter);
                        smp_mb__after_atomic();
+               } else if (!(lock->state.waiters & (1 << SIX_LOCK_write))) {
+                       atomic64_add(__SIX_VAL(waiters, 1 << SIX_LOCK_write),
+                                    &lock->state.counter);
+                       /*
+                        * pairs with barrier after unlock and before checking
+                        * for readers in unlock path
+                        */
+                       smp_mb__after_atomic();
                }
 
                ret = !pcpu_read_count(lock);
@@ -162,9 +170,6 @@ static int __do_six_trylock_type(struct six_lock *lock,
                if (ret || try)
                        v -= __SIX_VAL(write_locking, 1);
 
-               if (!ret && !try && !(lock->state.waiters & (1 << SIX_LOCK_write)))
-                       v += __SIX_VAL(waiters, 1 << SIX_LOCK_write);
-
                if (try && !ret) {
                        old.v = atomic64_add_return(v, &lock->state.counter);
                        if (old.waiters & (1 << SIX_LOCK_read))