On Thu, 22 Aug 2024, Christian Brauner wrote: > Port the __I_LRU_ISOLATING mechanism to use the new var event mechanism. > > Signed-off-by: Christian Brauner <brauner@xxxxxxxxxx> > --- > fs/inode.c | 26 +++++++++++++++++--------- > 1 file changed, 17 insertions(+), 9 deletions(-) > > diff --git a/fs/inode.c b/fs/inode.c > index d18e1567c487..c8a5c63dc980 100644 > --- a/fs/inode.c > +++ b/fs/inode.c > @@ -510,8 +510,7 @@ static void inode_unpin_lru_isolating(struct inode *inode) > spin_lock(&inode->i_lock); > WARN_ON(!(inode->i_state & I_LRU_ISOLATING)); > inode->i_state &= ~I_LRU_ISOLATING; > - smp_mb(); > - wake_up_bit(&inode->i_state, __I_LRU_ISOLATING); > + inode_wake_up_bit(inode, __I_LRU_ISOLATING); > spin_unlock(&inode->i_lock); > } > > @@ -519,13 +518,22 @@ static void inode_wait_for_lru_isolating(struct inode *inode) > { > lockdep_assert_held(&inode->i_lock); > if (inode->i_state & I_LRU_ISOLATING) { > - DEFINE_WAIT_BIT(wq, &inode->i_state, __I_LRU_ISOLATING); > - wait_queue_head_t *wqh; > - > - wqh = bit_waitqueue(&inode->i_state, __I_LRU_ISOLATING); > - spin_unlock(&inode->i_lock); > - __wait_on_bit(wqh, &wq, bit_wait, TASK_UNINTERRUPTIBLE); > - spin_lock(&inode->i_lock); > + struct wait_bit_queue_entry wqe; > + struct wait_queue_head *wq_head; > + > + wq_head = inode_bit_waitqueue(&wqe, inode, __I_LRU_ISOLATING); > + for (;;) { > + prepare_to_wait_event(wq_head, &wqe.wq_entry, > + TASK_UNINTERRUPTIBLE); > + if (inode->i_state & I_LRU_ISOLATING) { > + spin_unlock(&inode->i_lock); > + schedule(); > + spin_lock(&inode->i_lock); > + continue; > + } > + break; > + } > + finish_wait(wq_head, &wqe.wq_entry); I would really like to add wait_var_event_locked(variable, conditon, spinlock) so that above would be one or two lines. #define wait_var_event_locked(var, condition, lock) \ do { \ might_sleep(); \ if (condition) \ break; \ ___wait_var_event(var, condition, TASK_UNINTERRUPTIBLE, \ 0, 0, \ spin_unlock(lock);schedule();spin_lock(lock)); \ } while(0) That can happen after you series lands though. The wake_up here don't need a memory barrier either. NeilBrown > WARN_ON(inode->i_state & I_LRU_ISOLATING); > } > } > > -- > 2.43.0 > >