diff --git a/fs/bcachefs/six.c b/fs/bcachefs/six.c index 82e8d77c3082..e2cebd3ba5fe 100644 --- a/fs/bcachefs/six.c +++ b/fs/bcachefs/six.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -466,6 +467,17 @@ static int __six_lock_type_slowpath(struct six_lock *lock, enum six_lock_type ty raw_spin_lock(&lock->wait_lock); if (!(lock->state.waiters & (1 << type))) set_bit(waitlist_bitnr(type), (unsigned long *) &lock->state.v); + wait->start_time = local_clock(); + + if (!list_empty(&lock->wait_list)) { + struct six_lock_waiter *last = + list_last_entry(&lock->wait_list, + struct six_lock_waiter, list); + + if (time_before_eq64(wait->start_time, last->start_time)) + wait->start_time = last->start_time + 1; + } + list_add_tail(&wait->list, &lock->wait_list); raw_spin_unlock(&lock->wait_lock); @@ -503,6 +515,8 @@ static int __six_lock_type_waiter(struct six_lock *lock, enum six_lock_type type { int ret; + wait->start_time = 0; + if (type != SIX_LOCK_write) six_acquire(&lock->dep_map, 0); diff --git a/fs/bcachefs/six.h b/fs/bcachefs/six.h index ab06773e8094..757f8aa4d339 100644 --- a/fs/bcachefs/six.h +++ b/fs/bcachefs/six.h @@ -126,6 +126,7 @@ struct six_lock_waiter { struct list_head list; struct task_struct *task; enum six_lock_type lock_want; + u64 start_time; }; typedef int (*six_lock_should_sleep_fn)(struct six_lock *lock, void *);