From: kernel test robot <lkp@intel.com>
To: kbuild-all@lists.01.org
Subject: Re: [PATCH V3 4/4] mm/damon: Remove some no need func definitions in damon.h file
Date: Mon, 15 Nov 2021 22:52:46 +0800 [thread overview]
Message-ID: <202111152235.BacumBvt-lkp@intel.com> (raw)
In-Reply-To: <d66fa6d5d19d9a4e7ff814c729f96b9c2d443f40.1636732449.git.xhao@linux.alibaba.com>
[-- Attachment #1: Type: text/plain, Size: 14623 bytes --]
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(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 33361 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: kernel test robot <lkp@intel.com>
To: Xin Hao <xhao@linux.alibaba.com>, sjpark@amazon.de
Cc: kbuild-all@lists.01.org, xhao@linux.alibaba.com,
akpm@linux-foundation.org, linux-mm@kvack.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH V3 4/4] mm/damon: Remove some no need func definitions in damon.h file
Date: Mon, 15 Nov 2021 22:52:46 +0800 [thread overview]
Message-ID: <202111152235.BacumBvt-lkp@intel.com> (raw)
In-Reply-To: <d66fa6d5d19d9a4e7ff814c729f96b9c2d443f40.1636732449.git.xhao@linux.alibaba.com>
[-- Attachment #1: Type: text/plain, Size: 14406 bytes --]
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
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 33361 bytes --]
next prev parent reply other threads:[~2021-11-15 14:52 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-12 16:02 [PATCH V3 0/4] mm/damon: Do some small changes Xin Hao
2021-11-12 16:02 ` [PATCH V3 1/4] mm/damon: Unified access_check function naming rules Xin Hao
2021-11-12 16:02 ` [PATCH V3 2/4] mm/damon: Add 'age' of region tracepoint support Xin Hao
2021-11-12 16:02 ` [PATCH V3 3/4] mm/damon/core: Using function abs() instead of diff_of() Xin Hao
2021-11-13 2:46 ` Muchun Song
2021-11-12 16:02 ` [PATCH V3 4/4] mm/damon: Remove some no need func definitions in damon.h file Xin Hao
2021-11-15 10:23 ` kernel test robot
2021-11-15 10:23 ` kernel test robot
2021-11-15 14:52 ` kernel test robot [this message]
2021-11-15 14:52 ` kernel test robot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202111152235.BacumBvt-lkp@intel.com \
--to=lkp@intel.com \
--cc=kbuild-all@lists.01.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.