Skip to content

Commit 4c6b408

Browse files
mjguzikbrauner
authored andcommitted
fs: cosmetic fixes to lru handling
1. inode_bit_waitqueue() was somehow placed between __inode_add_lru() and inode_add_lru(). move it up 2. assert ->i_lock is held in __inode_add_lru instead of just claiming it is needed 3. s/__inode_add_lru/__inode_lru_list_add/ for consistency with itself (inode_lru_list_del()) and similar routines for sb and io list management 4. push list presence check into inode_lru_list_del(), just like sb and io list Signed-off-by: Mateusz Guzik <mjguzik@gmail.com> Link: https://patch.msgid.link/20251029131428.654761-2-mjguzik@gmail.com Reviewed-by: Jan Kara <jack@suse.cz> Signed-off-by: Christian Brauner <brauner@kernel.org>
1 parent a27628f commit 4c6b408

7 files changed

Lines changed: 35 additions & 33 deletions

File tree

fs/fs-writeback.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1452,7 +1452,7 @@ static void inode_sync_complete(struct inode *inode)
14521452

14531453
inode_state_clear(inode, I_SYNC);
14541454
/* If inode is clean an unused, put it into LRU now... */
1455-
inode_add_lru(inode);
1455+
inode_lru_list_add(inode);
14561456
/* Called with inode->i_lock which ensures memory ordering. */
14571457
inode_wake_up_bit(inode, __I_SYNC);
14581458
}

fs/inode.c

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -530,23 +530,6 @@ void ihold(struct inode *inode)
530530
}
531531
EXPORT_SYMBOL(ihold);
532532

533-
static void __inode_add_lru(struct inode *inode, bool rotate)
534-
{
535-
if (inode_state_read(inode) & (I_DIRTY_ALL | I_SYNC | I_FREEING | I_WILL_FREE))
536-
return;
537-
if (icount_read(inode))
538-
return;
539-
if (!(inode->i_sb->s_flags & SB_ACTIVE))
540-
return;
541-
if (!mapping_shrinkable(&inode->i_data))
542-
return;
543-
544-
if (list_lru_add_obj(&inode->i_sb->s_inode_lru, &inode->i_lru))
545-
this_cpu_inc(nr_unused);
546-
else if (rotate)
547-
inode_state_set(inode, I_REFERENCED);
548-
}
549-
550533
struct wait_queue_head *inode_bit_waitqueue(struct wait_bit_queue_entry *wqe,
551534
struct inode *inode, u32 bit)
552535
{
@@ -584,18 +567,38 @@ void wait_on_new_inode(struct inode *inode)
584567
}
585568
EXPORT_SYMBOL(wait_on_new_inode);
586569

570+
static void __inode_lru_list_add(struct inode *inode, bool rotate)
571+
{
572+
lockdep_assert_held(&inode->i_lock);
573+
574+
if (inode_state_read(inode) & (I_DIRTY_ALL | I_SYNC | I_FREEING | I_WILL_FREE))
575+
return;
576+
if (icount_read(inode))
577+
return;
578+
if (!(inode->i_sb->s_flags & SB_ACTIVE))
579+
return;
580+
if (!mapping_shrinkable(&inode->i_data))
581+
return;
582+
583+
if (list_lru_add_obj(&inode->i_sb->s_inode_lru, &inode->i_lru))
584+
this_cpu_inc(nr_unused);
585+
else if (rotate)
586+
inode_state_set(inode, I_REFERENCED);
587+
}
588+
587589
/*
588590
* Add inode to LRU if needed (inode is unused and clean).
589-
*
590-
* Needs inode->i_lock held.
591591
*/
592-
void inode_add_lru(struct inode *inode)
592+
void inode_lru_list_add(struct inode *inode)
593593
{
594-
__inode_add_lru(inode, false);
594+
__inode_lru_list_add(inode, false);
595595
}
596596

597597
static void inode_lru_list_del(struct inode *inode)
598598
{
599+
if (list_empty(&inode->i_lru))
600+
return;
601+
599602
if (list_lru_del_obj(&inode->i_sb->s_inode_lru, &inode->i_lru))
600603
this_cpu_dec(nr_unused);
601604
}
@@ -1920,7 +1923,7 @@ static void iput_final(struct inode *inode)
19201923
if (!drop &&
19211924
!(inode_state_read(inode) & I_DONTCACHE) &&
19221925
(sb->s_flags & SB_ACTIVE)) {
1923-
__inode_add_lru(inode, true);
1926+
__inode_lru_list_add(inode, true);
19241927
spin_unlock(&inode->i_lock);
19251928
return;
19261929
}
@@ -1944,8 +1947,7 @@ static void iput_final(struct inode *inode)
19441947
inode_state_replace(inode, I_WILL_FREE, I_FREEING);
19451948
}
19461949

1947-
if (!list_empty(&inode->i_lru))
1948-
inode_lru_list_del(inode);
1950+
inode_lru_list_del(inode);
19491951
spin_unlock(&inode->i_lock);
19501952

19511953
evict(inode);

include/linux/fs.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3502,7 +3502,7 @@ static inline void remove_inode_hash(struct inode *inode)
35023502
}
35033503

35043504
extern void inode_sb_list_add(struct inode *inode);
3505-
extern void inode_add_lru(struct inode *inode);
3505+
extern void inode_lru_list_add(struct inode *inode);
35063506

35073507
extern int sb_set_blocksize(struct super_block *, int);
35083508
extern int sb_min_blocksize(struct super_block *, int);

mm/filemap.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ void filemap_remove_folio(struct folio *folio)
256256
__filemap_remove_folio(folio, NULL);
257257
xa_unlock_irq(&mapping->i_pages);
258258
if (mapping_shrinkable(mapping))
259-
inode_add_lru(mapping->host);
259+
inode_lru_list_add(mapping->host);
260260
spin_unlock(&mapping->host->i_lock);
261261

262262
filemap_free_folio(mapping, folio);
@@ -335,7 +335,7 @@ void delete_from_page_cache_batch(struct address_space *mapping,
335335
page_cache_delete_batch(mapping, fbatch);
336336
xa_unlock_irq(&mapping->i_pages);
337337
if (mapping_shrinkable(mapping))
338-
inode_add_lru(mapping->host);
338+
inode_lru_list_add(mapping->host);
339339
spin_unlock(&mapping->host->i_lock);
340340

341341
for (i = 0; i < folio_batch_count(fbatch); i++)

mm/truncate.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ static void clear_shadow_entries(struct address_space *mapping,
4646

4747
xas_unlock_irq(&xas);
4848
if (mapping_shrinkable(mapping))
49-
inode_add_lru(mapping->host);
49+
inode_lru_list_add(mapping->host);
5050
spin_unlock(&mapping->host->i_lock);
5151
}
5252

@@ -111,7 +111,7 @@ static void truncate_folio_batch_exceptionals(struct address_space *mapping,
111111

112112
xas_unlock_irq(&xas);
113113
if (mapping_shrinkable(mapping))
114-
inode_add_lru(mapping->host);
114+
inode_lru_list_add(mapping->host);
115115
spin_unlock(&mapping->host->i_lock);
116116
out:
117117
folio_batch_remove_exceptionals(fbatch);
@@ -622,7 +622,7 @@ int folio_unmap_invalidate(struct address_space *mapping, struct folio *folio,
622622
__filemap_remove_folio(folio, NULL);
623623
xa_unlock_irq(&mapping->i_pages);
624624
if (mapping_shrinkable(mapping))
625-
inode_add_lru(mapping->host);
625+
inode_lru_list_add(mapping->host);
626626
spin_unlock(&mapping->host->i_lock);
627627

628628
filemap_free_folio(mapping, folio);

mm/vmscan.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -811,7 +811,7 @@ static int __remove_mapping(struct address_space *mapping, struct folio *folio,
811811
__filemap_remove_folio(folio, shadow);
812812
xa_unlock_irq(&mapping->i_pages);
813813
if (mapping_shrinkable(mapping))
814-
inode_add_lru(mapping->host);
814+
inode_lru_list_add(mapping->host);
815815
spin_unlock(&mapping->host->i_lock);
816816

817817
if (free_folio)

mm/workingset.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -755,7 +755,7 @@ static enum lru_status shadow_lru_isolate(struct list_head *item,
755755
xa_unlock_irq(&mapping->i_pages);
756756
if (mapping->host != NULL) {
757757
if (mapping_shrinkable(mapping))
758-
inode_add_lru(mapping->host);
758+
inode_lru_list_add(mapping->host);
759759
spin_unlock(&mapping->host->i_lock);
760760
}
761761
ret = LRU_REMOVED_RETRY;

0 commit comments

Comments
 (0)