Skip to content

Commit 9f643a9

Browse files
sjp38akpm00
authored andcommitted
mm/damon/sysfs-schemes: record filters of which layer should be added to the given filters directory
Unlike their name and assumed purposes, {core,ops}_filters DAMOS sysfs directories are allowing installing any type of filters. As a first step for preventing such wrong installments, add information about filters that handled by what layer should the installed to the given filters directory in the DAMOS sysfs internal data structures. Link: https://lkml.kernel.org/r/20250305222733.59089-6-sj@kernel.org Signed-off-by: SeongJae Park <sj@kernel.org> Cc: Jonathan Corbet <corbet@lwn.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
1 parent f7f0d88 commit 9f643a9

File tree

1 file changed

+36
-10
lines changed

1 file changed

+36
-10
lines changed

mm/damon/sysfs-schemes.c

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -309,8 +309,18 @@ static const struct kobj_type damon_sysfs_stats_ktype = {
309309
* filter directory
310310
*/
311311

312+
/*
313+
* enum damos_sysfs_filter_handle_layer - Layers handling filters of a dir.
314+
*/
315+
enum damos_sysfs_filter_handle_layer {
316+
DAMOS_SYSFS_FILTER_HANDLE_LAYER_CORE,
317+
DAMOS_SYSFS_FILTER_HANDLE_LAYER_OPS,
318+
DAMOS_SYSFS_FILTER_HANDLE_LAYER_BOTH,
319+
};
320+
312321
struct damon_sysfs_scheme_filter {
313322
struct kobject kobj;
323+
enum damos_sysfs_filter_handle_layer handle_layer;
314324
enum damos_filter_type type;
315325
bool matching;
316326
bool allow;
@@ -320,9 +330,15 @@ struct damon_sysfs_scheme_filter {
320330
int target_idx;
321331
};
322332

323-
static struct damon_sysfs_scheme_filter *damon_sysfs_scheme_filter_alloc(void)
333+
static struct damon_sysfs_scheme_filter *damon_sysfs_scheme_filter_alloc(
334+
enum damos_sysfs_filter_handle_layer layer)
324335
{
325-
return kzalloc(sizeof(struct damon_sysfs_scheme_filter), GFP_KERNEL);
336+
struct damon_sysfs_scheme_filter *filter;
337+
338+
filter = kzalloc(sizeof(struct damon_sysfs_scheme_filter), GFP_KERNEL);
339+
if (filter)
340+
filter->handle_layer = layer;
341+
return filter;
326342
}
327343

328344
/* Should match with enum damos_filter_type */
@@ -595,14 +611,20 @@ static const struct kobj_type damon_sysfs_scheme_filter_ktype = {
595611

596612
struct damon_sysfs_scheme_filters {
597613
struct kobject kobj;
614+
enum damos_sysfs_filter_handle_layer handle_layer;
598615
struct damon_sysfs_scheme_filter **filters_arr;
599616
int nr;
600617
};
601618

602619
static struct damon_sysfs_scheme_filters *
603-
damon_sysfs_scheme_filters_alloc(void)
620+
damon_sysfs_scheme_filters_alloc(enum damos_sysfs_filter_handle_layer layer)
604621
{
605-
return kzalloc(sizeof(struct damon_sysfs_scheme_filters), GFP_KERNEL);
622+
struct damon_sysfs_scheme_filters *filters;
623+
624+
filters = kzalloc(sizeof(struct damon_sysfs_scheme_filters), GFP_KERNEL);
625+
if (filters)
626+
filters->handle_layer = layer;
627+
return filters;
606628
}
607629

608630
static void damon_sysfs_scheme_filters_rm_dirs(
@@ -635,7 +657,8 @@ static int damon_sysfs_scheme_filters_add_dirs(
635657
filters->filters_arr = filters_arr;
636658

637659
for (i = 0; i < nr_filters; i++) {
638-
filter = damon_sysfs_scheme_filter_alloc();
660+
filter = damon_sysfs_scheme_filter_alloc(
661+
filters->handle_layer);
639662
if (!filter) {
640663
damon_sysfs_scheme_filters_rm_dirs(filters);
641664
return -ENOMEM;
@@ -1607,11 +1630,11 @@ static int damon_sysfs_scheme_set_watermarks(struct damon_sysfs_scheme *scheme)
16071630
}
16081631

16091632
static int damon_sysfs_scheme_set_filters(struct damon_sysfs_scheme *scheme,
1610-
const char *name,
1633+
enum damos_sysfs_filter_handle_layer layer, const char *name,
16111634
struct damon_sysfs_scheme_filters **filters_ptr)
16121635
{
16131636
struct damon_sysfs_scheme_filters *filters =
1614-
damon_sysfs_scheme_filters_alloc();
1637+
damon_sysfs_scheme_filters_alloc(layer);
16151638
int err;
16161639

16171640
if (!filters)
@@ -1630,15 +1653,18 @@ static int damos_sysfs_set_filter_dirs(struct damon_sysfs_scheme *scheme)
16301653
{
16311654
int err;
16321655

1633-
err = damon_sysfs_scheme_set_filters(scheme, "filters",
1656+
err = damon_sysfs_scheme_set_filters(scheme,
1657+
DAMOS_SYSFS_FILTER_HANDLE_LAYER_BOTH, "filters",
16341658
&scheme->filters);
16351659
if (err)
16361660
return err;
1637-
err = damon_sysfs_scheme_set_filters(scheme, "core_filters",
1661+
err = damon_sysfs_scheme_set_filters(scheme,
1662+
DAMOS_SYSFS_FILTER_HANDLE_LAYER_CORE, "core_filters",
16381663
&scheme->core_filters);
16391664
if (err)
16401665
goto put_filters_out;
1641-
err = damon_sysfs_scheme_set_filters(scheme, "ops_filters",
1666+
err = damon_sysfs_scheme_set_filters(scheme,
1667+
DAMOS_SYSFS_FILTER_HANDLE_LAYER_OPS, "ops_filters",
16421668
&scheme->ops_filters);
16431669
if (err)
16441670
goto put_core_filters_out;

0 commit comments

Comments
 (0)