From: Henry Burns henryburns@google.com
commit be03074c9af25d06cf8e9ebddfcd284c0bf7f947 upstream.
z3fold_page_migrate() will never succeed because it attempts to acquire a lock that has already been taken by migrate.c in __unmap_and_move().
__unmap_and_move() migrate.c trylock_page(oldpage) move_to_new_page(oldpage_newpage) a_ops->migrate_page(oldpage, newpage) z3fold_page_migrate(oldpage, newpage) trylock_page(oldpage)
Link: http://lkml.kernel.org/r/20190710213238.91835-1-henryburns@google.com Fixes: 1f862989b04a ("mm/z3fold.c: support page migration") Signed-off-by: Henry Burns henryburns@google.com Reviewed-by: Shakeel Butt shakeelb@google.com Cc: Vitaly Wool vitalywool@gmail.com Cc: Vitaly Vul vitaly.vul@sony.com Cc: Jonathan Adams jwadams@google.com Cc: Greg Kroah-Hartman gregkh@linuxfoundation.org Cc: Snild Dolkow snild@sony.com Cc: Thomas Gleixner tglx@linutronix.de Signed-off-by: Andrew Morton akpm@linux-foundation.org Signed-off-by: Linus Torvalds torvalds@linux-foundation.org Signed-off-by: Greg Kroah-Hartman gregkh@linuxfoundation.org
--- mm/z3fold.c | 6 ------ 1 file changed, 6 deletions(-)
--- a/mm/z3fold.c +++ b/mm/z3fold.c @@ -1439,16 +1439,11 @@ static int z3fold_page_migrate(struct ad zhdr = page_address(page); pool = zhdr_to_pool(zhdr);
- if (!trylock_page(page)) - return -EAGAIN; - if (!z3fold_page_trylock(zhdr)) { - unlock_page(page); return -EAGAIN; } if (zhdr->mapped_count != 0) { z3fold_page_unlock(zhdr); - unlock_page(page); return -EBUSY; } if (work_pending(&zhdr->work)) { @@ -1494,7 +1489,6 @@ static int z3fold_page_migrate(struct ad spin_unlock(&pool->lock);
page_mapcount_reset(page); - unlock_page(page); put_page(page); return 0; }