Re: [PATCH] erofs(shrinker): return SHRINK_EMPTY if no objects to free

From: Gao Xiang
Date: Thu Jan 16 2025 - 02:51:25 EST


Hi Linxuan,

On 2025/1/16 15:20, Chen Linxuan wrote:
Comments in file include/linux/shrinker.h says that
`count_objects` of `struct shrinker` should return SHRINK_EMPTY
when there are no objects to free.

If there are no objects to free, it should return SHRINK_EMPTY,
while 0 is returned in cases of the number of freeable items cannot
be determined or shrinker should skip this cache for this time
(e.g., their number is below shrinkable limit).

Thanks for the patch!

Yeah, it seems that is the case. Yet it'd better to document
what the impact if 0 is returned here if you know more..


Signed-off-by: Chen Linxuan <chenlinxuan@xxxxxxxxxxxxx>
---
fs/erofs/zutil.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/fs/erofs/zutil.c b/fs/erofs/zutil.c
index 0dd65cefce33..682863fa9e1c 100644
--- a/fs/erofs/zutil.c
+++ b/fs/erofs/zutil.c
@@ -243,7 +243,9 @@ void erofs_shrinker_unregister(struct super_block *sb)
static unsigned long erofs_shrink_count(struct shrinker *shrink,
struct shrink_control *sc)
{
- return atomic_long_read(&erofs_global_shrink_cnt);
+ unsigned long count = atomic_long_read(&erofs_global_shrink_cnt);
+
+ return count ? count : SHRINK_EMPTY;

I guess you could just use

return atomic_long_read(&erofs_global_shrink_cnt) ?: SHRINK_EMPTY;

Thanks,
Gao Xiang

}
static unsigned long erofs_shrink_scan(struct shrinker *shrink,