Messages in this thread Patch in this message | | | From | Chengming Zhou <> | Date | Sun, 28 Jan 2024 13:28:49 +0000 | Subject | [PATCH v2 1/3] mm/zswap: don't return LRU_SKIP if we have dropped lru lock |
| |
LRU_SKIP can only be returned if we don't ever dropped lru lock, or we need to return LRU_RETRY to restart from the head of lru list.
Otherwise, the iteration might continue from a cursor position that was freed while the locks were dropped.
Actually we may need to introduce another LRU_STOP to really terminate the ongoing shrinking scan process, when we encounter a warm page already in the swap cache. The current list_lru implementation doesn't have this function to early break from __list_lru_walk_one.
Fixes: b5ba474f3f51 ("zswap: shrink zswap pool based on memory pressure") Acked-by: Johannes Weiner <hannes@cmpxchg.org> Reviewed-by: Nhat Pham <nphamcs@gmail.com> Signed-off-by: Chengming Zhou <zhouchengming@bytedance.com> --- mm/zswap.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/mm/zswap.c b/mm/zswap.c index 00e90b9b5417..81cb3790e0dd 100644 --- a/mm/zswap.c +++ b/mm/zswap.c @@ -901,10 +901,8 @@ static enum lru_status shrink_memcg_cb(struct list_head *item, struct list_lru_o * into the warmer region. We should terminate shrinking (if we're in the dynamic * shrinker context). */ - if (writeback_result == -EEXIST && encountered_page_in_swapcache) { - ret = LRU_SKIP; + if (writeback_result == -EEXIST && encountered_page_in_swapcache) *encountered_page_in_swapcache = true; - } goto put_unlock; } -- b4 0.10.1
| |