Skip to content

Commit

Permalink
mm/damon/core: move damon_set_targets() into dbgfs
Browse files Browse the repository at this point in the history
damon_set_targets() function is defined in the core for general use cases,
but called from only dbgfs.  Also, because the function is for general use
cases, dbgfs does additional handling of pid type target id case.  To make
the situation simpler, this commit moves the function into dbgfs and makes
it to do the pid type case handling on its own.

Link: https://lkml.kernel.org/r/[email protected]
Signed-off-by: SeongJae Park <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
sjp38 authored and torvalds committed Mar 22, 2022
1 parent 8041c87 commit 4364282
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 54 deletions.
2 changes: 0 additions & 2 deletions include/linux/damon.h
Original file line number Diff line number Diff line change
Expand Up @@ -484,8 +484,6 @@ unsigned int damon_nr_regions(struct damon_target *t);

struct damon_ctx *damon_new_ctx(void);
void damon_destroy_ctx(struct damon_ctx *ctx);
int damon_set_targets(struct damon_ctx *ctx,
unsigned long *ids, ssize_t nr_ids);
int damon_set_attrs(struct damon_ctx *ctx, unsigned long sample_int,
unsigned long aggr_int, unsigned long primitive_upd_int,
unsigned long min_nr_reg, unsigned long max_nr_reg);
Expand Down
5 changes: 4 additions & 1 deletion mm/damon/core-test.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,10 @@ static void damon_test_aggregate(struct kunit *test)
struct damon_region *r;
int it, ir;

damon_set_targets(ctx, target_ids, 3);
for (it = 0; it < 3; it++) {
t = damon_new_target(target_ids[it]);
damon_add_target(ctx, t);
}

it = 0;
damon_for_each_target(t, ctx) {
Expand Down
32 changes: 0 additions & 32 deletions mm/damon/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -245,38 +245,6 @@ void damon_destroy_ctx(struct damon_ctx *ctx)
kfree(ctx);
}

/**
* damon_set_targets() - Set monitoring targets.
* @ctx: monitoring context
* @ids: array of target ids
* @nr_ids: number of entries in @ids
*
* This function should not be called while the kdamond is running.
*
* Return: 0 on success, negative error code otherwise.
*/
int damon_set_targets(struct damon_ctx *ctx,
unsigned long *ids, ssize_t nr_ids)
{
ssize_t i;
struct damon_target *t, *next;

damon_destroy_targets(ctx);

for (i = 0; i < nr_ids; i++) {
t = damon_new_target(ids[i]);
if (!t) {
/* The caller should do cleanup of the ids itself */
damon_for_each_target_safe(t, next, ctx)
damon_destroy_target(t);
return -ENOMEM;
}
damon_add_target(ctx, t);
}

return 0;
}

/**
* damon_set_attrs() - Set attributes for the monitoring.
* @ctx: monitoring context
Expand Down
14 changes: 7 additions & 7 deletions mm/damon/dbgfs-test.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,23 +86,23 @@ static void damon_dbgfs_test_set_targets(struct kunit *test)
ctx->primitive.target_valid = NULL;
ctx->primitive.cleanup = NULL;

damon_set_targets(ctx, ids, 3);
dbgfs_set_targets(ctx, ids, 3);
sprint_target_ids(ctx, buf, 64);
KUNIT_EXPECT_STREQ(test, (char *)buf, "1 2 3\n");

damon_set_targets(ctx, NULL, 0);
dbgfs_set_targets(ctx, NULL, 0);
sprint_target_ids(ctx, buf, 64);
KUNIT_EXPECT_STREQ(test, (char *)buf, "\n");

damon_set_targets(ctx, (unsigned long []){1, 2}, 2);
dbgfs_set_targets(ctx, (unsigned long []){1, 2}, 2);
sprint_target_ids(ctx, buf, 64);
KUNIT_EXPECT_STREQ(test, (char *)buf, "1 2\n");

damon_set_targets(ctx, (unsigned long []){2}, 1);
dbgfs_set_targets(ctx, (unsigned long []){2}, 1);
sprint_target_ids(ctx, buf, 64);
KUNIT_EXPECT_STREQ(test, (char *)buf, "2\n");

damon_set_targets(ctx, NULL, 0);
dbgfs_set_targets(ctx, NULL, 0);
sprint_target_ids(ctx, buf, 64);
KUNIT_EXPECT_STREQ(test, (char *)buf, "\n");

Expand Down Expand Up @@ -130,7 +130,7 @@ static void damon_dbgfs_test_set_init_regions(struct kunit *test)
int i, rc;
char buf[256];

damon_set_targets(ctx, ids, 3);
dbgfs_set_targets(ctx, ids, 3);

/* Put valid inputs and check the results */
for (i = 0; i < ARRAY_SIZE(valid_inputs); i++) {
Expand Down Expand Up @@ -158,7 +158,7 @@ static void damon_dbgfs_test_set_init_regions(struct kunit *test)
KUNIT_EXPECT_STREQ(test, (char *)buf, "");
}

damon_set_targets(ctx, NULL, 0);
dbgfs_set_targets(ctx, NULL, 0);
damon_destroy_ctx(ctx);
}

Expand Down
53 changes: 41 additions & 12 deletions mm/damon/dbgfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -358,11 +358,48 @@ static void dbgfs_put_pids(unsigned long *ids, int nr_ids)
put_pid((struct pid *)ids[i]);
}

/*
* dbgfs_set_targets() - Set monitoring targets.
* @ctx: monitoring context
* @ids: array of target ids
* @nr_ids: number of entries in @ids
*
* This function should not be called while the kdamond is running.
*
* Return: 0 on success, negative error code otherwise.
*/
static int dbgfs_set_targets(struct damon_ctx *ctx,
unsigned long *ids, ssize_t nr_ids)
{
ssize_t i;
struct damon_target *t, *next;

damon_for_each_target_safe(t, next, ctx) {
if (targetid_is_pid(ctx))
put_pid((struct pid *)t->id);
damon_destroy_target(t);
}

for (i = 0; i < nr_ids; i++) {
t = damon_new_target(ids[i]);
if (!t) {
/* The caller should do cleanup of the ids itself */
damon_for_each_target_safe(t, next, ctx)
damon_destroy_target(t);
if (targetid_is_pid(ctx))
dbgfs_put_pids(ids, nr_ids);
return -ENOMEM;
}
damon_add_target(ctx, t);
}

return 0;
}

static ssize_t dbgfs_target_ids_write(struct file *file,
const char __user *buf, size_t count, loff_t *ppos)
{
struct damon_ctx *ctx = file->private_data;
struct damon_target *t, *next_t;
bool id_is_pid = true;
char *kbuf;
unsigned long *targets;
Expand Down Expand Up @@ -407,25 +444,17 @@ static ssize_t dbgfs_target_ids_write(struct file *file,
}

/* remove previously set targets */
damon_for_each_target_safe(t, next_t, ctx) {
if (targetid_is_pid(ctx))
put_pid((struct pid *)t->id);
damon_destroy_target(t);
}
dbgfs_set_targets(ctx, NULL, 0);

/* Configure the context for the address space type */
if (id_is_pid)
damon_va_set_primitives(ctx);
else
damon_pa_set_primitives(ctx);

ret = damon_set_targets(ctx, targets, nr_targets);
if (ret) {
if (id_is_pid)
dbgfs_put_pids(targets, nr_targets);
} else {
ret = dbgfs_set_targets(ctx, targets, nr_targets);
if (!ret)
ret = count;
}

unlock_out:
mutex_unlock(&ctx->kdamond_lock);
Expand Down

0 comments on commit 4364282

Please sign in to comment.