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? > 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); > }