* mm/cma.c:509:3-5: opportunity for str_plural(nr)
@ 2025-04-19 11:28 kernel test robot
0 siblings, 0 replies; only message in thread
From: kernel test robot @ 2025-04-19 11:28 UTC (permalink / raw)
To: oe-kbuild; +Cc: lkp, Julia Lawall
BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
CC: linux-kernel@vger.kernel.org
TO: Frank van der Linden <fvdl@google.com>
CC: Andrew Morton <akpm@linux-foundation.org>
CC: Linux Memory Management List <linux-mm@kvack.org>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 8560697b23dc2f405cb463af2b17256a9888129d
commit: c009da4258f9885c5a3749fc004870db9c0e7a99 mm, cma: support multiple contiguous ranges, if requested
date: 5 weeks ago
:::::: branch date: 8 hours ago
:::::: commit date: 5 weeks ago
config: hexagon-randconfig-r064-20250419 (https://download.01.org/0day-ci/archive/20250419/202504191949.RsRida7L-lkp@intel.com/config)
compiler: clang version 17.0.6 (https://github.com/llvm/llvm-project 6009708b4367171ccdbf4b5905cb6a803753fe18)
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>
| Reported-by: Julia Lawall <julia.lawall@inria.fr>
| Closes: https://lore.kernel.org/r/202504191949.RsRida7L-lkp@intel.com/
cocci warnings: (new ones prefixed by >>)
>> mm/cma.c:509:3-5: opportunity for str_plural(nr)
vim +509 mm/cma.c
c009da4258f9885 Frank van der Linden 2025-02-28 319
c009da4258f9885 Frank van der Linden 2025-02-28 320 /*
c009da4258f9885 Frank van der Linden 2025-02-28 321 * Create CMA areas with a total size of @total_size. A normal allocation
c009da4258f9885 Frank van der Linden 2025-02-28 322 * for one area is tried first. If that fails, the biggest memblock
c009da4258f9885 Frank van der Linden 2025-02-28 323 * ranges above 4G are selected, and allocated bottom up.
c009da4258f9885 Frank van der Linden 2025-02-28 324 *
c009da4258f9885 Frank van der Linden 2025-02-28 325 * The complexity here is not great, but this function will only be
c009da4258f9885 Frank van der Linden 2025-02-28 326 * called during boot, and the lists operated on have fewer than
c009da4258f9885 Frank van der Linden 2025-02-28 327 * CMA_MAX_RANGES elements (default value: 8).
c009da4258f9885 Frank van der Linden 2025-02-28 328 */
c009da4258f9885 Frank van der Linden 2025-02-28 329 int __init cma_declare_contiguous_multi(phys_addr_t total_size,
c009da4258f9885 Frank van der Linden 2025-02-28 330 phys_addr_t align, unsigned int order_per_bit,
c009da4258f9885 Frank van der Linden 2025-02-28 331 const char *name, struct cma **res_cma, int nid)
c009da4258f9885 Frank van der Linden 2025-02-28 332 {
c009da4258f9885 Frank van der Linden 2025-02-28 333 phys_addr_t start, end;
c009da4258f9885 Frank van der Linden 2025-02-28 334 phys_addr_t size, sizesum, sizeleft;
c009da4258f9885 Frank van der Linden 2025-02-28 335 struct cma_init_memrange *mrp, *mlp, *failed;
c009da4258f9885 Frank van der Linden 2025-02-28 336 struct cma_memrange *cmrp;
c009da4258f9885 Frank van der Linden 2025-02-28 337 LIST_HEAD(ranges);
c009da4258f9885 Frank van der Linden 2025-02-28 338 LIST_HEAD(final_ranges);
c009da4258f9885 Frank van der Linden 2025-02-28 339 struct list_head *mp, *next;
c009da4258f9885 Frank van der Linden 2025-02-28 340 int ret, nr = 1;
c009da4258f9885 Frank van der Linden 2025-02-28 341 u64 i;
c009da4258f9885 Frank van der Linden 2025-02-28 342 struct cma *cma;
c009da4258f9885 Frank van der Linden 2025-02-28 343
c009da4258f9885 Frank van der Linden 2025-02-28 344 /*
c009da4258f9885 Frank van der Linden 2025-02-28 345 * First, try it the normal way, producing just one range.
c009da4258f9885 Frank van der Linden 2025-02-28 346 */
c009da4258f9885 Frank van der Linden 2025-02-28 347 ret = __cma_declare_contiguous_nid(0, total_size, 0, align,
c009da4258f9885 Frank van der Linden 2025-02-28 348 order_per_bit, false, name, res_cma, nid);
c009da4258f9885 Frank van der Linden 2025-02-28 349 if (ret != -ENOMEM)
c009da4258f9885 Frank van der Linden 2025-02-28 350 goto out;
c009da4258f9885 Frank van der Linden 2025-02-28 351
c009da4258f9885 Frank van der Linden 2025-02-28 352 /*
c009da4258f9885 Frank van der Linden 2025-02-28 353 * Couldn't find one range that fits our needs, so try multiple
c009da4258f9885 Frank van der Linden 2025-02-28 354 * ranges.
c009da4258f9885 Frank van der Linden 2025-02-28 355 *
c009da4258f9885 Frank van der Linden 2025-02-28 356 * No need to do the alignment checks here, the call to
c009da4258f9885 Frank van der Linden 2025-02-28 357 * cma_declare_contiguous_nid above would have caught
c009da4258f9885 Frank van der Linden 2025-02-28 358 * any issues. With the checks, we know that:
c009da4258f9885 Frank van der Linden 2025-02-28 359 *
c009da4258f9885 Frank van der Linden 2025-02-28 360 * - @align is a power of 2
c009da4258f9885 Frank van der Linden 2025-02-28 361 * - @align is >= pageblock alignment
c009da4258f9885 Frank van der Linden 2025-02-28 362 * - @size is aligned to @align and to @order_per_bit
c009da4258f9885 Frank van der Linden 2025-02-28 363 *
c009da4258f9885 Frank van der Linden 2025-02-28 364 * So, as long as we create ranges that have a base
c009da4258f9885 Frank van der Linden 2025-02-28 365 * aligned to @align, and a size that is aligned to
c009da4258f9885 Frank van der Linden 2025-02-28 366 * both @align and @order_to_bit, things will work out.
c009da4258f9885 Frank van der Linden 2025-02-28 367 */
c009da4258f9885 Frank van der Linden 2025-02-28 368 nr = 0;
c009da4258f9885 Frank van der Linden 2025-02-28 369 sizesum = 0;
c009da4258f9885 Frank van der Linden 2025-02-28 370 failed = NULL;
c009da4258f9885 Frank van der Linden 2025-02-28 371
c009da4258f9885 Frank van der Linden 2025-02-28 372 ret = cma_new_area(name, total_size, order_per_bit, &cma);
c009da4258f9885 Frank van der Linden 2025-02-28 373 if (ret != 0)
c009da4258f9885 Frank van der Linden 2025-02-28 374 goto out;
c009da4258f9885 Frank van der Linden 2025-02-28 375
c009da4258f9885 Frank van der Linden 2025-02-28 376 align = max_t(phys_addr_t, align, CMA_MIN_ALIGNMENT_BYTES);
c009da4258f9885 Frank van der Linden 2025-02-28 377 /*
c009da4258f9885 Frank van der Linden 2025-02-28 378 * Create a list of ranges above 4G, largest range first.
c009da4258f9885 Frank van der Linden 2025-02-28 379 */
c009da4258f9885 Frank van der Linden 2025-02-28 380 for_each_free_mem_range(i, nid, MEMBLOCK_NONE, &start, &end, NULL) {
c009da4258f9885 Frank van der Linden 2025-02-28 381 if (upper_32_bits(start) == 0)
c009da4258f9885 Frank van der Linden 2025-02-28 382 continue;
c009da4258f9885 Frank van der Linden 2025-02-28 383
c009da4258f9885 Frank van der Linden 2025-02-28 384 start = ALIGN(start, align);
c009da4258f9885 Frank van der Linden 2025-02-28 385 if (start >= end)
c009da4258f9885 Frank van der Linden 2025-02-28 386 continue;
c009da4258f9885 Frank van der Linden 2025-02-28 387
c009da4258f9885 Frank van der Linden 2025-02-28 388 end = ALIGN_DOWN(end, align);
c009da4258f9885 Frank van der Linden 2025-02-28 389 if (end <= start)
c009da4258f9885 Frank van der Linden 2025-02-28 390 continue;
c009da4258f9885 Frank van der Linden 2025-02-28 391
c009da4258f9885 Frank van der Linden 2025-02-28 392 size = end - start;
c009da4258f9885 Frank van der Linden 2025-02-28 393 size = ALIGN_DOWN(size, (PAGE_SIZE << order_per_bit));
c009da4258f9885 Frank van der Linden 2025-02-28 394 if (!size)
c009da4258f9885 Frank van der Linden 2025-02-28 395 continue;
c009da4258f9885 Frank van der Linden 2025-02-28 396 sizesum += size;
c009da4258f9885 Frank van der Linden 2025-02-28 397
c009da4258f9885 Frank van der Linden 2025-02-28 398 pr_debug("consider %016llx - %016llx\n", (u64)start, (u64)end);
c009da4258f9885 Frank van der Linden 2025-02-28 399
c009da4258f9885 Frank van der Linden 2025-02-28 400 /*
c009da4258f9885 Frank van der Linden 2025-02-28 401 * If we don't yet have used the maximum number of
c009da4258f9885 Frank van der Linden 2025-02-28 402 * areas, grab a new one.
c009da4258f9885 Frank van der Linden 2025-02-28 403 *
c009da4258f9885 Frank van der Linden 2025-02-28 404 * If we can't use anymore, see if this range is not
c009da4258f9885 Frank van der Linden 2025-02-28 405 * smaller than the smallest one already recorded. If
c009da4258f9885 Frank van der Linden 2025-02-28 406 * not, re-use the smallest element.
c009da4258f9885 Frank van der Linden 2025-02-28 407 */
c009da4258f9885 Frank van der Linden 2025-02-28 408 if (nr < CMA_MAX_RANGES)
c009da4258f9885 Frank van der Linden 2025-02-28 409 mrp = &memranges[nr++];
c009da4258f9885 Frank van der Linden 2025-02-28 410 else {
c009da4258f9885 Frank van der Linden 2025-02-28 411 mrp = list_last_entry(&ranges,
c009da4258f9885 Frank van der Linden 2025-02-28 412 struct cma_init_memrange, list);
c009da4258f9885 Frank van der Linden 2025-02-28 413 if (size < mrp->size)
c009da4258f9885 Frank van der Linden 2025-02-28 414 continue;
c009da4258f9885 Frank van der Linden 2025-02-28 415 list_del(&mrp->list);
c009da4258f9885 Frank van der Linden 2025-02-28 416 sizesum -= mrp->size;
c009da4258f9885 Frank van der Linden 2025-02-28 417 pr_debug("deleted %016llx - %016llx from the list\n",
c009da4258f9885 Frank van der Linden 2025-02-28 418 (u64)mrp->base, (u64)mrp->base + size);
c009da4258f9885 Frank van der Linden 2025-02-28 419 }
c009da4258f9885 Frank van der Linden 2025-02-28 420 mrp->base = start;
c009da4258f9885 Frank van der Linden 2025-02-28 421 mrp->size = size;
c009da4258f9885 Frank van der Linden 2025-02-28 422
c009da4258f9885 Frank van der Linden 2025-02-28 423 /*
c009da4258f9885 Frank van der Linden 2025-02-28 424 * Now do a sorted insert.
c009da4258f9885 Frank van der Linden 2025-02-28 425 */
c009da4258f9885 Frank van der Linden 2025-02-28 426 list_insert_sorted(&ranges, mrp, revsizecmp);
c009da4258f9885 Frank van der Linden 2025-02-28 427 pr_debug("added %016llx - %016llx to the list\n",
c009da4258f9885 Frank van der Linden 2025-02-28 428 (u64)mrp->base, (u64)mrp->base + size);
c009da4258f9885 Frank van der Linden 2025-02-28 429 pr_debug("total size now %llu\n", (u64)sizesum);
c009da4258f9885 Frank van der Linden 2025-02-28 430 }
c009da4258f9885 Frank van der Linden 2025-02-28 431
c009da4258f9885 Frank van der Linden 2025-02-28 432 /*
c009da4258f9885 Frank van der Linden 2025-02-28 433 * There is not enough room in the CMA_MAX_RANGES largest
c009da4258f9885 Frank van der Linden 2025-02-28 434 * ranges, so bail out.
c009da4258f9885 Frank van der Linden 2025-02-28 435 */
c009da4258f9885 Frank van der Linden 2025-02-28 436 if (sizesum < total_size) {
c009da4258f9885 Frank van der Linden 2025-02-28 437 cma_drop_area(cma);
c009da4258f9885 Frank van der Linden 2025-02-28 438 ret = -ENOMEM;
c009da4258f9885 Frank van der Linden 2025-02-28 439 goto out;
c009da4258f9885 Frank van der Linden 2025-02-28 440 }
c009da4258f9885 Frank van der Linden 2025-02-28 441
c009da4258f9885 Frank van der Linden 2025-02-28 442 /*
c009da4258f9885 Frank van der Linden 2025-02-28 443 * Found ranges that provide enough combined space.
c009da4258f9885 Frank van der Linden 2025-02-28 444 * Now, sorted them by address, smallest first, because we
c009da4258f9885 Frank van der Linden 2025-02-28 445 * want to mimic a bottom-up memblock allocation.
c009da4258f9885 Frank van der Linden 2025-02-28 446 */
c009da4258f9885 Frank van der Linden 2025-02-28 447 sizesum = 0;
c009da4258f9885 Frank van der Linden 2025-02-28 448 list_for_each_safe(mp, next, &ranges) {
c009da4258f9885 Frank van der Linden 2025-02-28 449 mlp = list_entry(mp, struct cma_init_memrange, list);
c009da4258f9885 Frank van der Linden 2025-02-28 450 list_del(mp);
c009da4258f9885 Frank van der Linden 2025-02-28 451 list_insert_sorted(&final_ranges, mlp, basecmp);
c009da4258f9885 Frank van der Linden 2025-02-28 452 sizesum += mlp->size;
c009da4258f9885 Frank van der Linden 2025-02-28 453 if (sizesum >= total_size)
c009da4258f9885 Frank van der Linden 2025-02-28 454 break;
c009da4258f9885 Frank van der Linden 2025-02-28 455 }
c009da4258f9885 Frank van der Linden 2025-02-28 456
c009da4258f9885 Frank van der Linden 2025-02-28 457 /*
c009da4258f9885 Frank van der Linden 2025-02-28 458 * Walk the final list, and add a CMA range for
c009da4258f9885 Frank van der Linden 2025-02-28 459 * each range, possibly not using the last one fully.
c009da4258f9885 Frank van der Linden 2025-02-28 460 */
c009da4258f9885 Frank van der Linden 2025-02-28 461 nr = 0;
c009da4258f9885 Frank van der Linden 2025-02-28 462 sizeleft = total_size;
c009da4258f9885 Frank van der Linden 2025-02-28 463 list_for_each(mp, &final_ranges) {
c009da4258f9885 Frank van der Linden 2025-02-28 464 mlp = list_entry(mp, struct cma_init_memrange, list);
c009da4258f9885 Frank van der Linden 2025-02-28 465 size = min(sizeleft, mlp->size);
c009da4258f9885 Frank van der Linden 2025-02-28 466 if (memblock_reserve(mlp->base, size)) {
c009da4258f9885 Frank van der Linden 2025-02-28 467 /*
c009da4258f9885 Frank van der Linden 2025-02-28 468 * Unexpected error. Could go on to
c009da4258f9885 Frank van der Linden 2025-02-28 469 * the next one, but just abort to
c009da4258f9885 Frank van der Linden 2025-02-28 470 * be safe.
c009da4258f9885 Frank van der Linden 2025-02-28 471 */
c009da4258f9885 Frank van der Linden 2025-02-28 472 failed = mlp;
c009da4258f9885 Frank van der Linden 2025-02-28 473 break;
c009da4258f9885 Frank van der Linden 2025-02-28 474 }
c009da4258f9885 Frank van der Linden 2025-02-28 475
c009da4258f9885 Frank van der Linden 2025-02-28 476 pr_debug("created region %d: %016llx - %016llx\n",
c009da4258f9885 Frank van der Linden 2025-02-28 477 nr, (u64)mlp->base, (u64)mlp->base + size);
c009da4258f9885 Frank van der Linden 2025-02-28 478 cmrp = &cma->ranges[nr++];
c009da4258f9885 Frank van der Linden 2025-02-28 479 cmrp->base_pfn = PHYS_PFN(mlp->base);
c009da4258f9885 Frank van der Linden 2025-02-28 480 cmrp->count = size >> PAGE_SHIFT;
c009da4258f9885 Frank van der Linden 2025-02-28 481
c009da4258f9885 Frank van der Linden 2025-02-28 482 sizeleft -= size;
c009da4258f9885 Frank van der Linden 2025-02-28 483 if (sizeleft == 0)
c009da4258f9885 Frank van der Linden 2025-02-28 484 break;
c009da4258f9885 Frank van der Linden 2025-02-28 485 }
c009da4258f9885 Frank van der Linden 2025-02-28 486
c009da4258f9885 Frank van der Linden 2025-02-28 487 if (failed) {
c009da4258f9885 Frank van der Linden 2025-02-28 488 list_for_each(mp, &final_ranges) {
c009da4258f9885 Frank van der Linden 2025-02-28 489 mlp = list_entry(mp, struct cma_init_memrange, list);
c009da4258f9885 Frank van der Linden 2025-02-28 490 if (mlp == failed)
c009da4258f9885 Frank van der Linden 2025-02-28 491 break;
c009da4258f9885 Frank van der Linden 2025-02-28 492 memblock_phys_free(mlp->base, mlp->size);
c009da4258f9885 Frank van der Linden 2025-02-28 493 }
c009da4258f9885 Frank van der Linden 2025-02-28 494 cma_drop_area(cma);
c009da4258f9885 Frank van der Linden 2025-02-28 495 ret = -ENOMEM;
c009da4258f9885 Frank van der Linden 2025-02-28 496 goto out;
c009da4258f9885 Frank van der Linden 2025-02-28 497 }
c009da4258f9885 Frank van der Linden 2025-02-28 498
c009da4258f9885 Frank van der Linden 2025-02-28 499 cma->nranges = nr;
de9e14eebf33a60 Marek Szyprowski 2014-10-13 500 *res_cma = cma;
de9e14eebf33a60 Marek Szyprowski 2014-10-13 501
c009da4258f9885 Frank van der Linden 2025-02-28 502 out:
c009da4258f9885 Frank van der Linden 2025-02-28 503 if (ret != 0)
c009da4258f9885 Frank van der Linden 2025-02-28 504 pr_err("Failed to reserve %lu MiB\n",
c009da4258f9885 Frank van der Linden 2025-02-28 505 (unsigned long)total_size / SZ_1M);
c009da4258f9885 Frank van der Linden 2025-02-28 506 else
c009da4258f9885 Frank van der Linden 2025-02-28 507 pr_info("Reserved %lu MiB in %d range%s\n",
c009da4258f9885 Frank van der Linden 2025-02-28 508 (unsigned long)total_size / SZ_1M, nr,
c009da4258f9885 Frank van der Linden 2025-02-28 @509 nr > 1 ? "s" : "");
c009da4258f9885 Frank van der Linden 2025-02-28 510
c009da4258f9885 Frank van der Linden 2025-02-28 511 return ret;
de9e14eebf33a60 Marek Szyprowski 2014-10-13 512 }
de9e14eebf33a60 Marek Szyprowski 2014-10-13 513
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2025-04-19 11:28 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-19 11:28 mm/cma.c:509:3-5: opportunity for str_plural(nr) 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.