On 2024/2/28 14:01, Sergey Senozhatsky wrote: > On (24/02/27 03:02), Chengming Zhou wrote: >> static void __free_zspage(struct zs_pool *pool, struct size_class *class, >> struct zspage *zspage) >> { >> @@ -834,13 +841,12 @@ static void __free_zspage(struct zs_pool *pool, struct size_class *class, >> VM_BUG_ON_PAGE(!PageLocked(page), page); > > Who owns page lock here if free_zspage() doesn't trylock_zspage() no longer? Right, it should be removed. > >> next = get_next_page(page); >> reset_page(page); >> - unlock_page(page); >> dec_zone_page_state(page, NR_ZSPAGES); >> put_page(page); >> page = next; >> } while (page != NULL); >> >> - cache_free_zspage(pool, zspage); >> + call_rcu(&zspage->rcu_head, rcu_free_zspage); >> >> class_stat_dec(class, ZS_OBJS_ALLOCATED, class->objs_per_zspage); >> atomic_long_sub(class->pages_per_zspage, &pool->pages_allocated); >> @@ -852,16 +858,6 @@ static void free_zspage(struct zs_pool *pool, struct size_class *class, >> VM_BUG_ON(get_zspage_inuse(zspage)); >> VM_BUG_ON(list_empty(&zspage->list)); >> >> - /* >> - * Since zs_free couldn't be sleepable, this function cannot call >> - * lock_page. The page locks trylock_zspage got will be released >> - * by __free_zspage. >> - */ >> - if (!trylock_zspage(zspage)) { >> - kick_deferred_free(pool); >> - return; >> - } >> - >> remove_zspage(class, zspage); >> __free_zspage(pool, class, zspage); >> }