On Sat, Jun 17, 2023 at 10:25 PM Sergey Senozhatsky <senozhatsky@xxxxxxxxxxxx> wrote: > > On (23/06/17 21:48), Yosry Ahmed wrote: > > > On (23/06/12 11:38), Domenico Cerasuolo wrote: > > > > +static int zswap_reclaim_entry(struct zswap_pool *pool) > > > > +{ > > > > + struct zswap_header *zhdr; > > > > + struct zswap_entry *entry; > > > > + struct zswap_tree *tree; > > > > + pgoff_t swpoffset; > > > > + int ret; > > > > + > > > > + /* Get an entry off the LRU */ > > > > + spin_lock(&pool->lru_lock); > > > > + if (list_empty(&pool->lru)) { > > > > + spin_unlock(&pool->lru_lock); > > > > + return -EINVAL; > > > > + } > > > > + entry = list_last_entry(&pool->lru, struct zswap_entry, lru); > > > > + list_del_init(&entry->lru); > > > > > > A quick question: should we zswap_entry_get() here? > > > > We need to hold the tree lock for that, and the lock ordering is tree > > lock -> lru lock. If we try to grab the tree lock here we may > > deadlock. > > We can deadlock doing this? > > lock tree_lock > lock lru_lock > list_del_init > unlock lru_lock > entry_get > unlock tree_lock > writeback We don't know which tree the zswap entry belongs to until we get from the LRU -- so we can't hold the tree lock before getting the entry from the lru (and to get the entry from the LRU we need the lru_lock).