Re: [PATCH] mm/migrate.c: Rework migration_entry_wait() to not take a pageref
From: kernel test robot
Date: Fri Nov 05 2021 - 05:50:46 EST
Hi Alistair,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on linux/master]
[also build test ERROR on v5.15]
[cannot apply to hnaz-mm/master linus/master next-20211105]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Alistair-Popple/mm-migrate-c-Rework-migration_entry_wait-to-not-take-a-pageref/20211104-183442
base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 2f111a6fd5b5297b4e92f53798ca086f7c7d33a4
config: arm-randconfig-r026-20211105 (attached as .config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 847a6807332b13f43704327c2d30103ec0347c77)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install arm cross compiling tool for clang build
# apt-get install binutils-arm-linux-gnueabi
# https://github.com/0day-ci/linux/commit/e9447498f8f8758741f3dae044c3e4593130595c
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Alistair-Popple/mm-migrate-c-Rework-migration_entry_wait-to-not-take-a-pageref/20211104-183442
git checkout e9447498f8f8758741f3dae044c3e4593130595c
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 ARCH=arm
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@xxxxxxxxx>
All errors (new ones prefixed by >>):
>> mm/filemap.c:1468:2: error: implicit declaration of function 'pte_unmap' [-Werror,-Wimplicit-function-declaration]
pte_unmap_unlock(ptep, ptl);
^
include/linux/mm.h:2275:2: note: expanded from macro 'pte_unmap_unlock'
pte_unmap(pte); \
^
1 error generated.
vim +/pte_unmap +1468 mm/filemap.c
1413
1414 /**
1415 * migration_entry_wait_on_locked - Wait for a migration entry to be removed
1416 * @page: page referenced by the migration entry.
1417 * @ptep: mapped pte pointer. This function will return with the ptep unmapped.
1418 * @ptl: already locked ptl. This function will drop the lock.
1419 *
1420 * Wait for a migration entry referencing the given page to be removed. This is
1421 * equivalent to put_and_wait_on_page_locked(page, TASK_UNINTERRUPTIBLE) except
1422 * this can be called without taking a reference on the page. Instead this
1423 * should be called while holding the ptl for the migration entry referencing
1424 * the page.
1425 *
1426 * Returns after unmapping and unlocking the pte/ptl with pte_unmap_unlock().
1427 *
1428 * This follows the same logic as wait_on_page_bit_common() so see the comments
1429 * there.
1430 */
1431 void migration_entry_wait_on_locked(struct page *page, pte_t *ptep,
1432 spinlock_t *ptl)
1433 {
1434 struct wait_page_queue wait_page;
1435 wait_queue_entry_t *wait = &wait_page.wait;
1436 bool thrashing = false;
1437 bool delayacct = false;
1438 unsigned long pflags;
1439 wait_queue_head_t *q;
1440
1441 q = page_waitqueue(page);
1442 if (!PageUptodate(page) && PageWorkingset(page)) {
1443 if (!PageSwapBacked(page)) {
1444 delayacct_thrashing_start();
1445 delayacct = true;
1446 }
1447 psi_memstall_enter(&pflags);
1448 thrashing = true;
1449 }
1450
1451 init_wait(wait);
1452 wait->func = wake_page_function;
1453 wait_page.page = page;
1454 wait_page.bit_nr = PG_locked;
1455 wait->flags = 0;
1456
1457 spin_lock_irq(&q->lock);
1458 SetPageWaiters(page);
1459 if (!trylock_page_bit_common(page, PG_locked, wait))
1460 __add_wait_queue_entry_tail(q, wait);
1461 spin_unlock_irq(&q->lock);
1462
1463 /*
1464 * If a migration entry exists for the page the migration path must hold
1465 * a valid reference to the page, and it must take the ptl to remove the
1466 * migration entry. So the page is valid until the ptl is dropped.
1467 */
> 1468 pte_unmap_unlock(ptep, ptl);
1469
1470 for (;;) {
1471 unsigned int flags;
1472
1473 set_current_state(TASK_UNINTERRUPTIBLE);
1474
1475 /* Loop until we've been woken or interrupted */
1476 flags = smp_load_acquire(&wait->flags);
1477 if (!(flags & WQ_FLAG_WOKEN)) {
1478 if (signal_pending_state(TASK_UNINTERRUPTIBLE, current))
1479 break;
1480
1481 io_schedule();
1482 continue;
1483 }
1484 break;
1485 }
1486
1487 finish_wait(q, wait);
1488
1489 if (thrashing) {
1490 if (delayacct)
1491 delayacct_thrashing_end();
1492 psi_memstall_leave(&pflags);
1493 }
1494 }
1495
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx
Attachment:
.config.gz
Description: application/gzip