Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mm/damon/sysfs-schemes: support target damos filter

Extend DAMON sysfs interface to support the DAMON monitoring target based
DAMOS filter. Users can use it via writing 'target' to the filter's
'type' file and specifying the index of the target from the corresponding
DAMON context's monitoring targets list to 'target_idx' sysfs file.

Link: https://lkml.kernel.org/r/20230802214312.110532-10-sj@kernel.org
Signed-off-by: SeongJae Park <sj@kernel.org>
Cc: Brendan Higgins <brendanhiggins@google.com>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Shuah Khan <shuah@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

SeongJae Park and committed by
Andrew Morton
9f6e47ab 17e7c724

+27
+27
mm/damon/sysfs-schemes.c
··· 283 283 bool matching; 284 284 char *memcg_path; 285 285 struct damon_addr_range addr_range; 286 + int target_idx; 286 287 }; 287 288 288 289 static struct damon_sysfs_scheme_filter *damon_sysfs_scheme_filter_alloc(void) ··· 296 295 "anon", 297 296 "memcg", 298 297 "addr", 298 + "target", 299 299 }; 300 300 301 301 static ssize_t type_show(struct kobject *kobj, ··· 415 413 return err ? err : count; 416 414 } 417 415 416 + static ssize_t damon_target_idx_show(struct kobject *kobj, 417 + struct kobj_attribute *attr, char *buf) 418 + { 419 + struct damon_sysfs_scheme_filter *filter = container_of(kobj, 420 + struct damon_sysfs_scheme_filter, kobj); 421 + 422 + return sysfs_emit(buf, "%d\n", filter->target_idx); 423 + } 424 + 425 + static ssize_t damon_target_idx_store(struct kobject *kobj, 426 + struct kobj_attribute *attr, const char *buf, size_t count) 427 + { 428 + struct damon_sysfs_scheme_filter *filter = container_of(kobj, 429 + struct damon_sysfs_scheme_filter, kobj); 430 + int err = kstrtoint(buf, 0, &filter->target_idx); 431 + 432 + return err ? err : count; 433 + } 434 + 418 435 static void damon_sysfs_scheme_filter_release(struct kobject *kobj) 419 436 { 420 437 struct damon_sysfs_scheme_filter *filter = container_of(kobj, ··· 458 437 static struct kobj_attribute damon_sysfs_scheme_filter_addr_end_attr = 459 438 __ATTR_RW_MODE(addr_end, 0600); 460 439 440 + static struct kobj_attribute damon_sysfs_scheme_filter_damon_target_idx_attr = 441 + __ATTR_RW_MODE(damon_target_idx, 0600); 442 + 461 443 static struct attribute *damon_sysfs_scheme_filter_attrs[] = { 462 444 &damon_sysfs_scheme_filter_type_attr.attr, 463 445 &damon_sysfs_scheme_filter_matching_attr.attr, 464 446 &damon_sysfs_scheme_filter_memcg_path_attr.attr, 465 447 &damon_sysfs_scheme_filter_addr_start_attr.attr, 466 448 &damon_sysfs_scheme_filter_addr_end_attr.attr, 449 + &damon_sysfs_scheme_filter_damon_target_idx_attr.attr, 467 450 NULL, 468 451 }; 469 452 ATTRIBUTE_GROUPS(damon_sysfs_scheme_filter); ··· 1564 1539 return -EINVAL; 1565 1540 } 1566 1541 filter->addr_range = sysfs_filter->addr_range; 1542 + } else if (filter->type == DAMOS_FILTER_TYPE_TARGET) { 1543 + filter->target_idx = sysfs_filter->target_idx; 1567 1544 } 1568 1545 1569 1546 damos_add_filter(scheme, filter);