Re: [PATCH V3 4/4] mm/damon: Remove some no need func definitions in damon.h file
From: kernel test robot
Date: Mon Nov 15 2021 - 05:24:56 EST
Hi Xin,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on hnaz-mm/master]
url: https://github.com/0day-ci/linux/commits/Xin-Hao/mm-damon-Do-some-small-changes/20211113-000614
base: https://github.com/hnaz/linux-mm master
config: hexagon-randconfig-r041-20211115 (attached as .config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project fbe72e41b99dc7994daac300d208a955be3e4a0a)
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/0day-ci/linux/commit/c9ed99dc122a1b52e3d9591ed817ccc826b08de0
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Xin-Hao/mm-damon-Do-some-small-changes/20211113-000614
git checkout c9ed99dc122a1b52e3d9591ed817ccc826b08de0
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 ARCH=hexagon
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@xxxxxxxxx>
All warnings (new ones prefixed by >>):
>> mm/damon/vaddr.c:274:6: warning: no previous prototype for function 'damon_va_init' [-Wmissing-prototypes]
void damon_va_init(struct damon_ctx *ctx)
^
mm/damon/vaddr.c:274:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void damon_va_init(struct damon_ctx *ctx)
^
static
>> mm/damon/vaddr.c:358:6: warning: no previous prototype for function 'damon_va_update' [-Wmissing-prototypes]
void damon_va_update(struct damon_ctx *ctx)
^
mm/damon/vaddr.c:358:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void damon_va_update(struct damon_ctx *ctx)
^
static
>> mm/damon/vaddr.c:420:6: warning: no previous prototype for function 'damon_va_prepare_access_checks' [-Wmissing-prototypes]
void damon_va_prepare_access_checks(struct damon_ctx *ctx)
^
mm/damon/vaddr.c:420:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void damon_va_prepare_access_checks(struct damon_ctx *ctx)
^
static
>> mm/damon/vaddr.c:541:14: warning: no previous prototype for function 'damon_va_check_accesses' [-Wmissing-prototypes]
unsigned int damon_va_check_accesses(struct damon_ctx *ctx)
^
mm/damon/vaddr.c:541:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
unsigned int damon_va_check_accesses(struct damon_ctx *ctx)
^
static
>> mm/damon/vaddr.c:605:5: warning: no previous prototype for function 'damon_va_apply_scheme' [-Wmissing-prototypes]
int damon_va_apply_scheme(struct damon_ctx *ctx, struct damon_target *t,
^
mm/damon/vaddr.c:605:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
int damon_va_apply_scheme(struct damon_ctx *ctx, struct damon_target *t,
^
static
>> mm/damon/vaddr.c:636:5: warning: no previous prototype for function 'damon_va_scheme_score' [-Wmissing-prototypes]
int damon_va_scheme_score(struct damon_ctx *context, struct damon_target *t,
^
mm/damon/vaddr.c:636:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
int damon_va_scheme_score(struct damon_ctx *context, struct damon_target *t,
^
static
6 warnings generated.
vim +/damon_va_init +274 mm/damon/vaddr.c
3f49584b262cf8 SeongJae Park 2021-09-07 272
3f49584b262cf8 SeongJae Park 2021-09-07 273 /* Initialize '->regions_list' of every target (task) */
3f49584b262cf8 SeongJae Park 2021-09-07 @274 void damon_va_init(struct damon_ctx *ctx)
3f49584b262cf8 SeongJae Park 2021-09-07 275 {
3f49584b262cf8 SeongJae Park 2021-09-07 276 struct damon_target *t;
3f49584b262cf8 SeongJae Park 2021-09-07 277
3f49584b262cf8 SeongJae Park 2021-09-07 278 damon_for_each_target(t, ctx) {
3f49584b262cf8 SeongJae Park 2021-09-07 279 /* the user may set the target regions as they want */
3f49584b262cf8 SeongJae Park 2021-09-07 280 if (!damon_nr_regions(t))
3f49584b262cf8 SeongJae Park 2021-09-07 281 __damon_va_init_regions(ctx, t);
3f49584b262cf8 SeongJae Park 2021-09-07 282 }
3f49584b262cf8 SeongJae Park 2021-09-07 283 }
3f49584b262cf8 SeongJae Park 2021-09-07 284
3f49584b262cf8 SeongJae Park 2021-09-07 285 /*
3f49584b262cf8 SeongJae Park 2021-09-07 286 * Functions for the dynamic monitoring target regions update
3f49584b262cf8 SeongJae Park 2021-09-07 287 */
3f49584b262cf8 SeongJae Park 2021-09-07 288
3f49584b262cf8 SeongJae Park 2021-09-07 289 /*
3f49584b262cf8 SeongJae Park 2021-09-07 290 * Check whether a region is intersecting an address range
3f49584b262cf8 SeongJae Park 2021-09-07 291 *
3f49584b262cf8 SeongJae Park 2021-09-07 292 * Returns true if it is.
3f49584b262cf8 SeongJae Park 2021-09-07 293 */
3f49584b262cf8 SeongJae Park 2021-09-07 294 static bool damon_intersect(struct damon_region *r, struct damon_addr_range *re)
3f49584b262cf8 SeongJae Park 2021-09-07 295 {
3f49584b262cf8 SeongJae Park 2021-09-07 296 return !(r->ar.end <= re->start || re->end <= r->ar.start);
3f49584b262cf8 SeongJae Park 2021-09-07 297 }
3f49584b262cf8 SeongJae Park 2021-09-07 298
3f49584b262cf8 SeongJae Park 2021-09-07 299 /*
3f49584b262cf8 SeongJae Park 2021-09-07 300 * Update damon regions for the three big regions of the given target
3f49584b262cf8 SeongJae Park 2021-09-07 301 *
3f49584b262cf8 SeongJae Park 2021-09-07 302 * t the given target
3f49584b262cf8 SeongJae Park 2021-09-07 303 * bregions the three big regions of the target
3f49584b262cf8 SeongJae Park 2021-09-07 304 */
3f49584b262cf8 SeongJae Park 2021-09-07 305 static void damon_va_apply_three_regions(struct damon_target *t,
3f49584b262cf8 SeongJae Park 2021-09-07 306 struct damon_addr_range bregions[3])
3f49584b262cf8 SeongJae Park 2021-09-07 307 {
3f49584b262cf8 SeongJae Park 2021-09-07 308 struct damon_region *r, *next;
966a1baa2355c1 Xin Hao 2021-10-28 309 unsigned int i;
3f49584b262cf8 SeongJae Park 2021-09-07 310
3f49584b262cf8 SeongJae Park 2021-09-07 311 /* Remove regions which are not in the three big regions now */
3f49584b262cf8 SeongJae Park 2021-09-07 312 damon_for_each_region_safe(r, next, t) {
3f49584b262cf8 SeongJae Park 2021-09-07 313 for (i = 0; i < 3; i++) {
3f49584b262cf8 SeongJae Park 2021-09-07 314 if (damon_intersect(r, &bregions[i]))
3f49584b262cf8 SeongJae Park 2021-09-07 315 break;
3f49584b262cf8 SeongJae Park 2021-09-07 316 }
3f49584b262cf8 SeongJae Park 2021-09-07 317 if (i == 3)
3f49584b262cf8 SeongJae Park 2021-09-07 318 damon_destroy_region(r, t);
3f49584b262cf8 SeongJae Park 2021-09-07 319 }
3f49584b262cf8 SeongJae Park 2021-09-07 320
3f49584b262cf8 SeongJae Park 2021-09-07 321 /* Adjust intersecting regions to fit with the three big regions */
3f49584b262cf8 SeongJae Park 2021-09-07 322 for (i = 0; i < 3; i++) {
3f49584b262cf8 SeongJae Park 2021-09-07 323 struct damon_region *first = NULL, *last;
3f49584b262cf8 SeongJae Park 2021-09-07 324 struct damon_region *newr;
3f49584b262cf8 SeongJae Park 2021-09-07 325 struct damon_addr_range *br;
3f49584b262cf8 SeongJae Park 2021-09-07 326
3f49584b262cf8 SeongJae Park 2021-09-07 327 br = &bregions[i];
3f49584b262cf8 SeongJae Park 2021-09-07 328 /* Get the first and last regions which intersects with br */
3f49584b262cf8 SeongJae Park 2021-09-07 329 damon_for_each_region(r, t) {
3f49584b262cf8 SeongJae Park 2021-09-07 330 if (damon_intersect(r, br)) {
3f49584b262cf8 SeongJae Park 2021-09-07 331 if (!first)
3f49584b262cf8 SeongJae Park 2021-09-07 332 first = r;
3f49584b262cf8 SeongJae Park 2021-09-07 333 last = r;
3f49584b262cf8 SeongJae Park 2021-09-07 334 }
3f49584b262cf8 SeongJae Park 2021-09-07 335 if (r->ar.start >= br->end)
3f49584b262cf8 SeongJae Park 2021-09-07 336 break;
3f49584b262cf8 SeongJae Park 2021-09-07 337 }
3f49584b262cf8 SeongJae Park 2021-09-07 338 if (!first) {
3f49584b262cf8 SeongJae Park 2021-09-07 339 /* no damon_region intersects with this big region */
3f49584b262cf8 SeongJae Park 2021-09-07 340 newr = damon_new_region(
3f49584b262cf8 SeongJae Park 2021-09-07 341 ALIGN_DOWN(br->start,
3f49584b262cf8 SeongJae Park 2021-09-07 342 DAMON_MIN_REGION),
3f49584b262cf8 SeongJae Park 2021-09-07 343 ALIGN(br->end, DAMON_MIN_REGION));
3f49584b262cf8 SeongJae Park 2021-09-07 344 if (!newr)
3f49584b262cf8 SeongJae Park 2021-09-07 345 continue;
3f49584b262cf8 SeongJae Park 2021-09-07 346 damon_insert_region(newr, damon_prev_region(r), r, t);
3f49584b262cf8 SeongJae Park 2021-09-07 347 } else {
3f49584b262cf8 SeongJae Park 2021-09-07 348 first->ar.start = ALIGN_DOWN(br->start,
3f49584b262cf8 SeongJae Park 2021-09-07 349 DAMON_MIN_REGION);
3f49584b262cf8 SeongJae Park 2021-09-07 350 last->ar.end = ALIGN(br->end, DAMON_MIN_REGION);
3f49584b262cf8 SeongJae Park 2021-09-07 351 }
3f49584b262cf8 SeongJae Park 2021-09-07 352 }
3f49584b262cf8 SeongJae Park 2021-09-07 353 }
3f49584b262cf8 SeongJae Park 2021-09-07 354
3f49584b262cf8 SeongJae Park 2021-09-07 355 /*
3f49584b262cf8 SeongJae Park 2021-09-07 356 * Update regions for current memory mappings
3f49584b262cf8 SeongJae Park 2021-09-07 357 */
3f49584b262cf8 SeongJae Park 2021-09-07 @358 void damon_va_update(struct damon_ctx *ctx)
3f49584b262cf8 SeongJae Park 2021-09-07 359 {
3f49584b262cf8 SeongJae Park 2021-09-07 360 struct damon_addr_range three_regions[3];
3f49584b262cf8 SeongJae Park 2021-09-07 361 struct damon_target *t;
3f49584b262cf8 SeongJae Park 2021-09-07 362
3f49584b262cf8 SeongJae Park 2021-09-07 363 damon_for_each_target(t, ctx) {
3f49584b262cf8 SeongJae Park 2021-09-07 364 if (damon_va_three_regions(t, three_regions))
3f49584b262cf8 SeongJae Park 2021-09-07 365 continue;
3f49584b262cf8 SeongJae Park 2021-09-07 366 damon_va_apply_three_regions(t, three_regions);
3f49584b262cf8 SeongJae Park 2021-09-07 367 }
3f49584b262cf8 SeongJae Park 2021-09-07 368 }
3f49584b262cf8 SeongJae Park 2021-09-07 369
3f49584b262cf8 SeongJae Park 2021-09-07 370 static int damon_mkold_pmd_entry(pmd_t *pmd, unsigned long addr,
3f49584b262cf8 SeongJae Park 2021-09-07 371 unsigned long next, struct mm_walk *walk)
3f49584b262cf8 SeongJae Park 2021-09-07 372 {
3f49584b262cf8 SeongJae Park 2021-09-07 373 pte_t *pte;
3f49584b262cf8 SeongJae Park 2021-09-07 374 spinlock_t *ptl;
3f49584b262cf8 SeongJae Park 2021-09-07 375
3f49584b262cf8 SeongJae Park 2021-09-07 376 if (pmd_huge(*pmd)) {
3f49584b262cf8 SeongJae Park 2021-09-07 377 ptl = pmd_lock(walk->mm, pmd);
3f49584b262cf8 SeongJae Park 2021-09-07 378 if (pmd_huge(*pmd)) {
3f49584b262cf8 SeongJae Park 2021-09-07 379 damon_pmdp_mkold(pmd, walk->mm, addr);
3f49584b262cf8 SeongJae Park 2021-09-07 380 spin_unlock(ptl);
3f49584b262cf8 SeongJae Park 2021-09-07 381 return 0;
3f49584b262cf8 SeongJae Park 2021-09-07 382 }
3f49584b262cf8 SeongJae Park 2021-09-07 383 spin_unlock(ptl);
3f49584b262cf8 SeongJae Park 2021-09-07 384 }
3f49584b262cf8 SeongJae Park 2021-09-07 385
3f49584b262cf8 SeongJae Park 2021-09-07 386 if (pmd_none(*pmd) || unlikely(pmd_bad(*pmd)))
3f49584b262cf8 SeongJae Park 2021-09-07 387 return 0;
3f49584b262cf8 SeongJae Park 2021-09-07 388 pte = pte_offset_map_lock(walk->mm, pmd, addr, &ptl);
3f49584b262cf8 SeongJae Park 2021-09-07 389 if (!pte_present(*pte))
3f49584b262cf8 SeongJae Park 2021-09-07 390 goto out;
3f49584b262cf8 SeongJae Park 2021-09-07 391 damon_ptep_mkold(pte, walk->mm, addr);
3f49584b262cf8 SeongJae Park 2021-09-07 392 out:
3f49584b262cf8 SeongJae Park 2021-09-07 393 pte_unmap_unlock(pte, ptl);
3f49584b262cf8 SeongJae Park 2021-09-07 394 return 0;
3f49584b262cf8 SeongJae Park 2021-09-07 395 }
3f49584b262cf8 SeongJae Park 2021-09-07 396
aafaf6b3b9b77a Rikard Falkeborn 2021-10-28 397 static const struct mm_walk_ops damon_mkold_ops = {
3f49584b262cf8 SeongJae Park 2021-09-07 398 .pmd_entry = damon_mkold_pmd_entry,
3f49584b262cf8 SeongJae Park 2021-09-07 399 };
3f49584b262cf8 SeongJae Park 2021-09-07 400
3f49584b262cf8 SeongJae Park 2021-09-07 401 static void damon_va_mkold(struct mm_struct *mm, unsigned long addr)
3f49584b262cf8 SeongJae Park 2021-09-07 402 {
3f49584b262cf8 SeongJae Park 2021-09-07 403 mmap_read_lock(mm);
3f49584b262cf8 SeongJae Park 2021-09-07 404 walk_page_range(mm, addr, addr + 1, &damon_mkold_ops, NULL);
3f49584b262cf8 SeongJae Park 2021-09-07 405 mmap_read_unlock(mm);
3f49584b262cf8 SeongJae Park 2021-09-07 406 }
3f49584b262cf8 SeongJae Park 2021-09-07 407
3f49584b262cf8 SeongJae Park 2021-09-07 408 /*
3f49584b262cf8 SeongJae Park 2021-09-07 409 * Functions for the access checking of the regions
3f49584b262cf8 SeongJae Park 2021-09-07 410 */
3f49584b262cf8 SeongJae Park 2021-09-07 411
a7c7432ffce91f Xin Hao 2021-11-13 412 static void __damon_va_prepare_access_check(struct damon_ctx *ctx,
3f49584b262cf8 SeongJae Park 2021-09-07 413 struct mm_struct *mm, struct damon_region *r)
3f49584b262cf8 SeongJae Park 2021-09-07 414 {
3f49584b262cf8 SeongJae Park 2021-09-07 415 r->sampling_addr = damon_rand(r->ar.start, r->ar.end);
3f49584b262cf8 SeongJae Park 2021-09-07 416
3f49584b262cf8 SeongJae Park 2021-09-07 417 damon_va_mkold(mm, r->sampling_addr);
3f49584b262cf8 SeongJae Park 2021-09-07 418 }
3f49584b262cf8 SeongJae Park 2021-09-07 419
3f49584b262cf8 SeongJae Park 2021-09-07 @420 void damon_va_prepare_access_checks(struct damon_ctx *ctx)
3f49584b262cf8 SeongJae Park 2021-09-07 421 {
3f49584b262cf8 SeongJae Park 2021-09-07 422 struct damon_target *t;
3f49584b262cf8 SeongJae Park 2021-09-07 423 struct mm_struct *mm;
3f49584b262cf8 SeongJae Park 2021-09-07 424 struct damon_region *r;
3f49584b262cf8 SeongJae Park 2021-09-07 425
3f49584b262cf8 SeongJae Park 2021-09-07 426 damon_for_each_target(t, ctx) {
3f49584b262cf8 SeongJae Park 2021-09-07 427 mm = damon_get_mm(t);
3f49584b262cf8 SeongJae Park 2021-09-07 428 if (!mm)
3f49584b262cf8 SeongJae Park 2021-09-07 429 continue;
3f49584b262cf8 SeongJae Park 2021-09-07 430 damon_for_each_region(r, t)
a7c7432ffce91f Xin Hao 2021-11-13 431 __damon_va_prepare_access_check(ctx, mm, r);
3f49584b262cf8 SeongJae Park 2021-09-07 432 mmput(mm);
3f49584b262cf8 SeongJae Park 2021-09-07 433 }
3f49584b262cf8 SeongJae Park 2021-09-07 434 }
3f49584b262cf8 SeongJae Park 2021-09-07 435
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx
Attachment:
.config.gz
Description: application/gzip