Re: [PATCH 18/21] mm/cma: support CMA in Designated Movable Blocks

From: kernel test robot
Date: Wed Sep 14 2022 - 13:08:19 EST


Hi Doug,

I love your patch! Perhaps something to improve:

[auto build test WARNING on robh/for-next]
[also build test WARNING on linus/master v6.0-rc5]
[cannot apply to akpm-mm/mm-everything next-20220914]
[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#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Doug-Berger/mm-introduce-Designated-Movable-Blocks/20220914-040216
base: https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next
config: i386-randconfig-a002 (https://download.01.org/0day-ci/archive/20220915/202209150009.PoWlLoNu-lkp@xxxxxxxxx/config)
compiler: clang version 14.0.6 (https://github.com/llvm/llvm-project f28c006a5895fc0e329fe15fead81e37457cb1d1)
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
# https://github.com/intel-lab-lkp/linux/commit/635e919c92ca242c4b900bdfc7e21529e76f2f8e
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Doug-Berger/mm-introduce-Designated-Movable-Blocks/20220914-040216
git checkout 635e919c92ca242c4b900bdfc7e21529e76f2f8e
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=i386 SHELL=/bin/bash

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@xxxxxxxxx>

All warnings (new ones prefixed by >>):

>> mm/page_alloc.c:9236:5: warning: no previous prototype for function '_alloc_contig_range' [-Wmissing-prototypes]
int _alloc_contig_range(unsigned long start, unsigned long end,
^
mm/page_alloc.c:9236:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
int _alloc_contig_range(unsigned long start, unsigned long end,
^
static
1 warning generated.


vim +/_alloc_contig_range +9236 mm/page_alloc.c

9235
> 9236 int _alloc_contig_range(unsigned long start, unsigned long end,
9237 unsigned int migratetype, gfp_t gfp_mask)
9238 {
9239 unsigned long outer_start, outer_end;
9240 int order;
9241 int ret = 0;
9242
9243 struct compact_control cc = {
9244 .nr_migratepages = 0,
9245 .order = -1,
9246 .zone = page_zone(pfn_to_page(start)),
9247 .mode = MIGRATE_SYNC,
9248 .ignore_skip_hint = true,
9249 .no_set_skip_hint = true,
9250 .gfp_mask = current_gfp_context(gfp_mask),
9251 .alloc_contig = true,
9252 };
9253 INIT_LIST_HEAD(&cc.migratepages);
9254
9255 /*
9256 * What we do here is we mark all pageblocks in range as
9257 * MIGRATE_ISOLATE. Because pageblock and max order pages may
9258 * have different sizes, and due to the way page allocator
9259 * work, start_isolate_page_range() has special handlings for this.
9260 *
9261 * Once the pageblocks are marked as MIGRATE_ISOLATE, we
9262 * migrate the pages from an unaligned range (ie. pages that
9263 * we are interested in). This will put all the pages in
9264 * range back to page allocator as MIGRATE_ISOLATE.
9265 *
9266 * When this is done, we take the pages in range from page
9267 * allocator removing them from the buddy system. This way
9268 * page allocator will never consider using them.
9269 *
9270 * This lets us mark the pageblocks back as
9271 * MIGRATE_CMA/MIGRATE_MOVABLE so that free pages in the
9272 * aligned range but not in the unaligned, original range are
9273 * put back to page allocator so that buddy can use them.
9274 */
9275
9276 ret = start_isolate_page_range(start, end, migratetype, 0, gfp_mask);
9277 if (ret)
9278 goto done;
9279
9280 drain_all_pages(cc.zone);
9281
9282 /*
9283 * In case of -EBUSY, we'd like to know which page causes problem.
9284 * So, just fall through. test_pages_isolated() has a tracepoint
9285 * which will report the busy page.
9286 *
9287 * It is possible that busy pages could become available before
9288 * the call to test_pages_isolated, and the range will actually be
9289 * allocated. So, if we fall through be sure to clear ret so that
9290 * -EBUSY is not accidentally used or returned to caller.
9291 */
9292 ret = __alloc_contig_migrate_range(&cc, start, end);
9293 if (ret && ret != -EBUSY)
9294 goto done;
9295 ret = 0;
9296 sync_hugetlb_dissolve();
9297
9298 /*
9299 * Pages from [start, end) are within a pageblock_nr_pages
9300 * aligned blocks that are marked as MIGRATE_ISOLATE. What's
9301 * more, all pages in [start, end) are free in page allocator.
9302 * What we are going to do is to allocate all pages from
9303 * [start, end) (that is remove them from page allocator).
9304 *
9305 * The only problem is that pages at the beginning and at the
9306 * end of interesting range may be not aligned with pages that
9307 * page allocator holds, ie. they can be part of higher order
9308 * pages. Because of this, we reserve the bigger range and
9309 * once this is done free the pages we are not interested in.
9310 *
9311 * We don't have to hold zone->lock here because the pages are
9312 * isolated thus they won't get removed from buddy.
9313 */
9314
9315 order = 0;
9316 outer_start = start;
9317 while (!PageBuddy(pfn_to_page(outer_start))) {
9318 if (++order >= MAX_ORDER) {
9319 outer_start = start;
9320 break;
9321 }
9322 outer_start &= ~0UL << order;
9323 }
9324
9325 if (outer_start != start) {
9326 order = buddy_order(pfn_to_page(outer_start));
9327
9328 /*
9329 * outer_start page could be small order buddy page and
9330 * it doesn't include start page. Adjust outer_start
9331 * in this case to report failed page properly
9332 * on tracepoint in test_pages_isolated()
9333 */
9334 if (outer_start + (1UL << order) <= start)
9335 outer_start = start;
9336 }
9337
9338 /* Make sure the range is really isolated. */
9339 if (test_pages_isolated(outer_start, end, 0)) {
9340 ret = -EBUSY;
9341 goto done;
9342 }
9343
9344 /* Grab isolated pages from freelists. */
9345 outer_end = isolate_freepages_range(&cc, outer_start, end);
9346 if (!outer_end) {
9347 ret = -EBUSY;
9348 goto done;
9349 }
9350
9351 /* Free head and tail (if any) */
9352 if (start != outer_start)
9353 free_contig_range(outer_start, start - outer_start);
9354 if (end != outer_end)
9355 free_contig_range(end, outer_end - end);
9356
9357 done:
9358 undo_isolate_page_range(start, end, migratetype);
9359 return ret;
9360 }
9361

--
0-DAY CI Kernel Test Service
https://01.org/lkp