* [anolis-intel-cloud:devel-5.10 2/2] mm/migrate.c:1539:5: warning: no previous prototype for function 'migrate_pages_batch'
@ 2025-10-01 3:17 kernel test robot
0 siblings, 0 replies; 2+ messages in thread
From: kernel test robot @ 2025-10-01 3:17 UTC (permalink / raw)
To: aubrey.li; +Cc: oe-kbuild-all
Hi Huang,
FYI, the error/warning still remains.
tree: https://gitee.com/anolis/intel-cloud-kernel.git devel-5.10
head: 6e46858a22077fce652e4757d5624bf5816c6639
commit: ac79f033ce6b175a45cdce5a554f1fc1719602a3 [2/2] migrate_pages: restrict number of pages to migrate in batch
config: x86_64-rhel-9.4-rust (https://download.01.org/0day-ci/archive/20251001/202510011148.cTfndznq-lkp@intel.com/config)
compiler: clang version 22.0.0git (https://github.com/llvm/llvm-project 39f292ffa13d7ca0d1edff27ac8fd55024bb4d19)
rustc: rustc 1.58.0 (02072b482 2022-01-11)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251001/202510011148.cTfndznq-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202510011148.cTfndznq-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> mm/migrate.c:1539:5: warning: no previous prototype for function 'migrate_pages_batch' [-Wmissing-prototypes]
1539 | int migrate_pages_batch(struct list_head *from, new_page_t get_new_page,
| ^
mm/migrate.c:1539:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
1539 | int migrate_pages_batch(struct list_head *from, new_page_t get_new_page,
| ^
| static
mm/migrate.c:2956:16: warning: variable 'addr' set but not used [-Wunused-but-set-variable]
2956 | unsigned long addr, i, restore = 0;
| ^
2 warnings generated.
vim +/migrate_pages_batch +1539 mm/migrate.c
1538
> 1539 int migrate_pages_batch(struct list_head *from, new_page_t get_new_page,
1540 free_page_t put_new_page, unsigned long private,
1541 enum migrate_mode mode, int reason, struct list_head *ret_pages,
1542 struct migrate_pages_stats *stats)
1543 {
1544 int retry = 1;
1545 int thp_retry = 1;
1546 int nr_failed = 0;
1547 int nr_retry_pages = 0;
1548 int pass = 0;
1549 bool is_thp = false;
1550 struct page *page, *page2;
1551 int rc, nr_pages;
1552 LIST_HEAD(thp_split_pages);
1553 bool nosplit = (reason == MR_NUMA_MISPLACED);
1554 bool no_subpage_counting = false;
1555
1556 thp_subpage_migration:
1557 for (pass = 0;
1558 pass < NR_MAX_MIGRATE_PAGES_RETRY && (retry || thp_retry);
1559 pass++) {
1560 retry = 0;
1561 thp_retry = 0;
1562 nr_retry_pages = 0;
1563
1564 list_for_each_entry_safe(page, page2, from, lru) {
1565 /*
1566 * THP statistics is based on the source huge page.
1567 * Capture required information that might get lost
1568 * during migration.
1569 */
1570 is_thp = PageTransHuge(page) && !PageHuge(page);
1571 nr_pages = compound_nr(page);
1572 cond_resched();
1573
1574 rc = unmap_and_move(get_new_page, put_new_page,
1575 private, page, pass > 2, mode,
1576 reason, ret_pages);
1577 /*
1578 * The rules are:
1579 * Success: page will be freed
1580 * -EAGAIN: stay on the from list
1581 * -ENOMEM: stay on the from list
1582 * -ENOSYS: stay on the from list
1583 * Other errno: put on ret_pages list
1584 */
1585 switch(rc) {
1586 /*
1587 * THP migration might be unsupported or the
1588 * allocation could've failed so we should
1589 * retry on the same page with the THP split
1590 * to base pages.
1591 *
1592 * Sub-pages are put in thp_split_pages, and
1593 * we will migrate them after the rest of the
1594 * list is processed.
1595 */
1596 case -ENOSYS:
1597 /* THP migration is unsupported */
1598 if (is_thp) {
1599 stats->nr_thp_failed++;
1600 if (!try_split_thp(page, &thp_split_pages)) {
1601 stats->nr_thp_split++;
1602 break;
1603 }
1604 /* Hugetlb migration is unsupported */
1605 } else if (!no_subpage_counting) {
1606 nr_failed++;
1607 }
1608
1609 stats->nr_failed_pages += nr_pages;
1610 list_move_tail(&page->lru, ret_pages);
1611 break;
1612 case -ENOMEM:
1613 /*
1614 * When memory is low, don't bother to try to migrate
1615 * other pages, just exit.
1616 */
1617 if (is_thp) {
1618 stats->nr_thp_failed++;
1619 /* THP NUMA faulting doesn't split THP to retry. */
1620 if (!nosplit && !try_split_thp(page, &thp_split_pages)) {
1621 stats->nr_thp_split++;
1622 break;
1623 }
1624 } else if (!no_subpage_counting) {
1625 nr_failed++;
1626 }
1627
1628 stats->nr_failed_pages += nr_pages + nr_retry_pages;
1629 /*
1630 * There might be some subpages of fail-to-migrate THPs
1631 * left in thp_split_pages list. Move them back to migration
1632 * list so that they could be put back to the right list by
1633 * the caller otherwise the page refcnt will be leaked.
1634 */
1635 list_splice_init(&thp_split_pages, ret_pages);
1636 /* nr_failed isn't updated for not used */
1637 stats->nr_thp_failed += thp_retry;
1638 goto out;
1639 case -EAGAIN:
1640 if (is_thp)
1641 thp_retry++;
1642 else if (!no_subpage_counting)
1643 retry++;
1644 nr_retry_pages += nr_pages;
1645 break;
1646 case MIGRATEPAGE_SUCCESS:
1647 stats->nr_succeeded += nr_pages;
1648 if (is_thp)
1649 stats->nr_thp_succeeded++;
1650 break;
1651 default:
1652 /*
1653 * Permanent failure (-EBUSY, etc.):
1654 * unlike -EAGAIN case, the failed page is
1655 * removed from migration page list and not
1656 * retried in the next outer loop.
1657 */
1658 if (is_thp)
1659 stats->nr_thp_failed++;
1660 else if (!no_subpage_counting)
1661 nr_failed++;
1662
1663 stats->nr_failed_pages += nr_pages;
1664 break;
1665 }
1666 }
1667 }
1668 nr_failed += retry;
1669 stats->nr_thp_failed += thp_retry;
1670 stats->nr_failed_pages += nr_retry_pages;
1671 /*
1672 * Try to migrate subpages of fail-to-migrate THPs, no nr_failed
1673 * counting in this round, since all subpages of a THP is counted
1674 * as 1 failure in the first round.
1675 */
1676 if (!list_empty(&thp_split_pages)) {
1677 /*
1678 * Move non-migrated pages (after NR_MAX_MIGRATE_PAGES_RETRY
1679 * retries) to ret_pages to avoid migrating them again.
1680 */
1681 list_splice_init(from, ret_pages);
1682 list_splice_init(&thp_split_pages, from);
1683 no_subpage_counting = true;
1684 retry = 1;
1685 goto thp_subpage_migration;
1686 }
1687
1688 rc = nr_failed + stats->nr_thp_failed;
1689 out:
1690 return rc;
1691 }
1692
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 2+ messages in thread* [anolis-intel-cloud:devel-5.10 2/2] mm/migrate.c:1539:5: warning: no previous prototype for function 'migrate_pages_batch'
@ 2025-12-05 12:46 kernel test robot
0 siblings, 0 replies; 2+ messages in thread
From: kernel test robot @ 2025-12-05 12:46 UTC (permalink / raw)
To: aubrey.li; +Cc: oe-kbuild-all
Hi Huang,
FYI, the error/warning still remains.
tree: https://gitee.com/anolis/intel-cloud-kernel.git devel-5.10
head: 31b356d59497695e1135b4c6ea07b6d0bd148e07
commit: ac79f033ce6b175a45cdce5a554f1fc1719602a3 [2/2] migrate_pages: restrict number of pages to migrate in batch
config: x86_64-rhel-9.4-rust (https://download.01.org/0day-ci/archive/20251205/202512052059.xrEUGaKq-lkp@intel.com/config)
compiler: clang version 22.0.0git (https://github.com/llvm/llvm-project 734a912d0f025559fcf76bde9aaaeb0383c1625a)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251205/202512052059.xrEUGaKq-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202512052059.xrEUGaKq-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> mm/migrate.c:1539:5: warning: no previous prototype for function 'migrate_pages_batch' [-Wmissing-prototypes]
1539 | int migrate_pages_batch(struct list_head *from, new_page_t get_new_page,
| ^
mm/migrate.c:1539:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
1539 | int migrate_pages_batch(struct list_head *from, new_page_t get_new_page,
| ^
| static
mm/migrate.c:2956:16: warning: variable 'addr' set but not used [-Wunused-but-set-variable]
2956 | unsigned long addr, i, restore = 0;
| ^
2 warnings generated.
vim +/migrate_pages_batch +1539 mm/migrate.c
1538
> 1539 int migrate_pages_batch(struct list_head *from, new_page_t get_new_page,
1540 free_page_t put_new_page, unsigned long private,
1541 enum migrate_mode mode, int reason, struct list_head *ret_pages,
1542 struct migrate_pages_stats *stats)
1543 {
1544 int retry = 1;
1545 int thp_retry = 1;
1546 int nr_failed = 0;
1547 int nr_retry_pages = 0;
1548 int pass = 0;
1549 bool is_thp = false;
1550 struct page *page, *page2;
1551 int rc, nr_pages;
1552 LIST_HEAD(thp_split_pages);
1553 bool nosplit = (reason == MR_NUMA_MISPLACED);
1554 bool no_subpage_counting = false;
1555
1556 thp_subpage_migration:
1557 for (pass = 0;
1558 pass < NR_MAX_MIGRATE_PAGES_RETRY && (retry || thp_retry);
1559 pass++) {
1560 retry = 0;
1561 thp_retry = 0;
1562 nr_retry_pages = 0;
1563
1564 list_for_each_entry_safe(page, page2, from, lru) {
1565 /*
1566 * THP statistics is based on the source huge page.
1567 * Capture required information that might get lost
1568 * during migration.
1569 */
1570 is_thp = PageTransHuge(page) && !PageHuge(page);
1571 nr_pages = compound_nr(page);
1572 cond_resched();
1573
1574 rc = unmap_and_move(get_new_page, put_new_page,
1575 private, page, pass > 2, mode,
1576 reason, ret_pages);
1577 /*
1578 * The rules are:
1579 * Success: page will be freed
1580 * -EAGAIN: stay on the from list
1581 * -ENOMEM: stay on the from list
1582 * -ENOSYS: stay on the from list
1583 * Other errno: put on ret_pages list
1584 */
1585 switch(rc) {
1586 /*
1587 * THP migration might be unsupported or the
1588 * allocation could've failed so we should
1589 * retry on the same page with the THP split
1590 * to base pages.
1591 *
1592 * Sub-pages are put in thp_split_pages, and
1593 * we will migrate them after the rest of the
1594 * list is processed.
1595 */
1596 case -ENOSYS:
1597 /* THP migration is unsupported */
1598 if (is_thp) {
1599 stats->nr_thp_failed++;
1600 if (!try_split_thp(page, &thp_split_pages)) {
1601 stats->nr_thp_split++;
1602 break;
1603 }
1604 /* Hugetlb migration is unsupported */
1605 } else if (!no_subpage_counting) {
1606 nr_failed++;
1607 }
1608
1609 stats->nr_failed_pages += nr_pages;
1610 list_move_tail(&page->lru, ret_pages);
1611 break;
1612 case -ENOMEM:
1613 /*
1614 * When memory is low, don't bother to try to migrate
1615 * other pages, just exit.
1616 */
1617 if (is_thp) {
1618 stats->nr_thp_failed++;
1619 /* THP NUMA faulting doesn't split THP to retry. */
1620 if (!nosplit && !try_split_thp(page, &thp_split_pages)) {
1621 stats->nr_thp_split++;
1622 break;
1623 }
1624 } else if (!no_subpage_counting) {
1625 nr_failed++;
1626 }
1627
1628 stats->nr_failed_pages += nr_pages + nr_retry_pages;
1629 /*
1630 * There might be some subpages of fail-to-migrate THPs
1631 * left in thp_split_pages list. Move them back to migration
1632 * list so that they could be put back to the right list by
1633 * the caller otherwise the page refcnt will be leaked.
1634 */
1635 list_splice_init(&thp_split_pages, ret_pages);
1636 /* nr_failed isn't updated for not used */
1637 stats->nr_thp_failed += thp_retry;
1638 goto out;
1639 case -EAGAIN:
1640 if (is_thp)
1641 thp_retry++;
1642 else if (!no_subpage_counting)
1643 retry++;
1644 nr_retry_pages += nr_pages;
1645 break;
1646 case MIGRATEPAGE_SUCCESS:
1647 stats->nr_succeeded += nr_pages;
1648 if (is_thp)
1649 stats->nr_thp_succeeded++;
1650 break;
1651 default:
1652 /*
1653 * Permanent failure (-EBUSY, etc.):
1654 * unlike -EAGAIN case, the failed page is
1655 * removed from migration page list and not
1656 * retried in the next outer loop.
1657 */
1658 if (is_thp)
1659 stats->nr_thp_failed++;
1660 else if (!no_subpage_counting)
1661 nr_failed++;
1662
1663 stats->nr_failed_pages += nr_pages;
1664 break;
1665 }
1666 }
1667 }
1668 nr_failed += retry;
1669 stats->nr_thp_failed += thp_retry;
1670 stats->nr_failed_pages += nr_retry_pages;
1671 /*
1672 * Try to migrate subpages of fail-to-migrate THPs, no nr_failed
1673 * counting in this round, since all subpages of a THP is counted
1674 * as 1 failure in the first round.
1675 */
1676 if (!list_empty(&thp_split_pages)) {
1677 /*
1678 * Move non-migrated pages (after NR_MAX_MIGRATE_PAGES_RETRY
1679 * retries) to ret_pages to avoid migrating them again.
1680 */
1681 list_splice_init(from, ret_pages);
1682 list_splice_init(&thp_split_pages, from);
1683 no_subpage_counting = true;
1684 retry = 1;
1685 goto thp_subpage_migration;
1686 }
1687
1688 rc = nr_failed + stats->nr_thp_failed;
1689 out:
1690 return rc;
1691 }
1692
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2025-12-05 12:47 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-10-01 3:17 [anolis-intel-cloud:devel-5.10 2/2] mm/migrate.c:1539:5: warning: no previous prototype for function 'migrate_pages_batch' kernel test robot
-- strict thread matches above, loose matches on Subject: below --
2025-12-05 12:46 kernel test robot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.