Skip to content

Commit 57510c5

Browse files
mjguzikbrauner
authored andcommitted
vfs: drop one lock trip in evict()
Most commonly neither I_LRU_ISOLATING nor I_SYNC are set, but the stock kernel takes a back-to-back relock trip to check for them. It probably can be avoided altogether, but for now massage things back to just one lock acquire. Signed-off-by: Mateusz Guzik <[email protected]> Link: https://lore.kernel.org/r/[email protected] Reviewed-by: Zhihao Cheng <[email protected]> Reviewed-by: Jeff Layton <[email protected]> Reviewed-by: Jan Kara <[email protected]> Signed-off-by: Christian Brauner <[email protected]>
1 parent 3a987b8 commit 57510c5

File tree

2 files changed

+6
-16
lines changed

2 files changed

+6
-16
lines changed

fs/fs-writeback.c

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1510,13 +1510,12 @@ static int write_inode(struct inode *inode, struct writeback_control *wbc)
15101510
* Wait for writeback on an inode to complete. Called with i_lock held.
15111511
* Caller must make sure inode cannot go away when we drop i_lock.
15121512
*/
1513-
static void __inode_wait_for_writeback(struct inode *inode)
1514-
__releases(inode->i_lock)
1515-
__acquires(inode->i_lock)
1513+
void inode_wait_for_writeback(struct inode *inode)
15161514
{
15171515
DEFINE_WAIT_BIT(wq, &inode->i_state, __I_SYNC);
15181516
wait_queue_head_t *wqh;
15191517

1518+
lockdep_assert_held(&inode->i_lock);
15201519
wqh = bit_waitqueue(&inode->i_state, __I_SYNC);
15211520
while (inode->i_state & I_SYNC) {
15221521
spin_unlock(&inode->i_lock);
@@ -1526,16 +1525,6 @@ static void __inode_wait_for_writeback(struct inode *inode)
15261525
}
15271526
}
15281527

1529-
/*
1530-
* Wait for writeback on an inode to complete. Caller must have inode pinned.
1531-
*/
1532-
void inode_wait_for_writeback(struct inode *inode)
1533-
{
1534-
spin_lock(&inode->i_lock);
1535-
__inode_wait_for_writeback(inode);
1536-
spin_unlock(&inode->i_lock);
1537-
}
1538-
15391528
/*
15401529
* Sleep until I_SYNC is cleared. This function must be called with i_lock
15411530
* held and drops it. It is aimed for callers not holding any inode reference
@@ -1757,7 +1746,7 @@ static int writeback_single_inode(struct inode *inode,
17571746
*/
17581747
if (wbc->sync_mode != WB_SYNC_ALL)
17591748
goto out;
1760-
__inode_wait_for_writeback(inode);
1749+
inode_wait_for_writeback(inode);
17611750
}
17621751
WARN_ON(inode->i_state & I_SYNC);
17631752
/*

fs/inode.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,7 @@ static void inode_unpin_lru_isolating(struct inode *inode)
507507

508508
static void inode_wait_for_lru_isolating(struct inode *inode)
509509
{
510-
spin_lock(&inode->i_lock);
510+
lockdep_assert_held(&inode->i_lock);
511511
if (inode->i_state & I_LRU_ISOLATING) {
512512
DEFINE_WAIT_BIT(wq, &inode->i_state, __I_LRU_ISOLATING);
513513
wait_queue_head_t *wqh;
@@ -518,7 +518,6 @@ static void inode_wait_for_lru_isolating(struct inode *inode)
518518
spin_lock(&inode->i_lock);
519519
WARN_ON(inode->i_state & I_LRU_ISOLATING);
520520
}
521-
spin_unlock(&inode->i_lock);
522521
}
523522

524523
/**
@@ -690,6 +689,7 @@ static void evict(struct inode *inode)
690689

691690
inode_sb_list_del(inode);
692691

692+
spin_lock(&inode->i_lock);
693693
inode_wait_for_lru_isolating(inode);
694694

695695
/*
@@ -699,6 +699,7 @@ static void evict(struct inode *inode)
699699
* the inode. We just have to wait for running writeback to finish.
700700
*/
701701
inode_wait_for_writeback(inode);
702+
spin_unlock(&inode->i_lock);
702703

703704
if (op->evict_inode) {
704705
op->evict_inode(inode);

0 commit comments

Comments
 (0)