six locks: Centralize setting of waiting bit
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 21 May 2023 00:37:53 +0000 (20:37 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:10:02 +0000 (17:10 -0400)
Originally, the waiting bit was always set by trylock() on failure:
however, it's now set by __six_lock_type_slowpath(), with wait_lock held
- which is the more correct place to do it.

That made setting the waiting bit in trylock redundant, so this patch
deletes that.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/six.c

index 32ad545ba570cd7e32598d89aba6d585f77758f5..d8f1d20f5ece5e71fb3100047a8e05ae29cbaaf4 100644 (file)
@@ -151,14 +151,6 @@ 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);
@@ -190,10 +182,9 @@ static int __do_six_trylock_type(struct six_lock *lock,
 
                                if (type == SIX_LOCK_write)
                                        new.write_locking = 0;
-                       } else if (!try && !(new.waiters & (1 << type)))
-                               new.waiters |= 1 << type;
-                       else
-                               break; /* waiting bit already set */
+                       } else {
+                               break;
+                       }
                } while ((v = atomic64_cmpxchg_acquire(&lock->state.counter,
                                        old.v, new.v)) != old.v);