On Sat, Jun 17, 2023 at 10:30 PM Sergey Senozhatsky <senozhatsky@xxxxxxxxxxxx> wrote: > > On (23/06/17 22:28), Yosry Ahmed 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 > > Oh... I must be blind. You are right. Sorry for the noise. Don't blame yourself, it is fairly convoluted :)