Message ID | d66fa6d5d19d9a4e7ff814c729f96b9c2d443f40.1636732449.git.xhao@linux.alibaba.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | mm/damon: Do some small changes | expand |
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@intel.com> 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@lists.01.org
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: nios2-randconfig-r021-20211115 (attached as .config) compiler: nios2-linux-gcc (GCC) 11.2.0 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=gcc-11.2.0 make.cross ARCH=nios2 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>): >> mm/damon/vaddr.c:274:6: warning: no previous prototype for 'damon_va_init' [-Wmissing-prototypes] 274 | void damon_va_init(struct damon_ctx *ctx) | ^~~~~~~~~~~~~ >> mm/damon/vaddr.c:358:6: warning: no previous prototype for 'damon_va_update' [-Wmissing-prototypes] 358 | void damon_va_update(struct damon_ctx *ctx) | ^~~~~~~~~~~~~~~ >> mm/damon/vaddr.c:420:6: warning: no previous prototype for 'damon_va_prepare_access_checks' [-Wmissing-prototypes] 420 | void damon_va_prepare_access_checks(struct damon_ctx *ctx) | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> mm/damon/vaddr.c:541:14: warning: no previous prototype for 'damon_va_check_accesses' [-Wmissing-prototypes] 541 | unsigned int damon_va_check_accesses(struct damon_ctx *ctx) | ^~~~~~~~~~~~~~~~~~~~~~~ >> mm/damon/vaddr.c:605:5: warning: no previous prototype for 'damon_va_apply_scheme' [-Wmissing-prototypes] 605 | int damon_va_apply_scheme(struct damon_ctx *ctx, struct damon_target *t, | ^~~~~~~~~~~~~~~~~~~~~ >> mm/damon/vaddr.c:636:5: warning: no previous prototype for 'damon_va_scheme_score' [-Wmissing-prototypes] 636 | int damon_va_scheme_score(struct damon_ctx *context, struct damon_target *t, | ^~~~~~~~~~~~~~~~~~~~~ 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@lists.01.org
diff --git a/include/linux/damon.h b/include/linux/damon.h index 321de9d72360..8a73e825e0d5 100644 --- a/include/linux/damon.h +++ b/include/linux/damon.h @@ -461,34 +461,13 @@ int damon_stop(struct damon_ctx **ctxs, int nr_ctxs); #endif /* CONFIG_DAMON */ #ifdef CONFIG_DAMON_VADDR - -/* Monitoring primitives for virtual memory address spaces */ -void damon_va_init(struct damon_ctx *ctx); -void damon_va_update(struct damon_ctx *ctx); -void damon_va_prepare_access_checks(struct damon_ctx *ctx); -unsigned int damon_va_check_accesses(struct damon_ctx *ctx); -bool damon_va_target_valid(void *t); -void damon_va_cleanup(struct damon_ctx *ctx); -int damon_va_apply_scheme(struct damon_ctx *context, struct damon_target *t, - struct damon_region *r, struct damos *scheme); -int damon_va_scheme_score(struct damon_ctx *context, struct damon_target *t, - struct damon_region *r, struct damos *scheme); void damon_va_set_primitives(struct damon_ctx *ctx); - +bool damon_va_target_valid(void *t); #endif /* CONFIG_DAMON_VADDR */ #ifdef CONFIG_DAMON_PADDR - -/* Monitoring primitives for the physical memory address space */ -void damon_pa_prepare_access_checks(struct damon_ctx *ctx); -unsigned int damon_pa_check_accesses(struct damon_ctx *ctx); -bool damon_pa_target_valid(void *t); -int damon_pa_apply_scheme(struct damon_ctx *context, struct damon_target *t, - struct damon_region *r, struct damos *scheme); -int damon_pa_scheme_score(struct damon_ctx *context, struct damon_target *t, - struct damon_region *r, struct damos *scheme); void damon_pa_set_primitives(struct damon_ctx *ctx); - +bool damon_pa_target_valid(void *t); #endif /* CONFIG_DAMON_PADDR */ #endif /* _DAMON_H */