Lines Matching refs:kdamond
900 /* TODO: support multiple contexts per kdamond */
936 * kdamond directory
950 static int damon_sysfs_kdamond_add_dirs(struct damon_sysfs_kdamond *kdamond)
960 &damon_sysfs_contexts_ktype, &kdamond->kobj,
966 kdamond->contexts = contexts;
971 static void damon_sysfs_kdamond_rm_dirs(struct damon_sysfs_kdamond *kdamond)
973 damon_sysfs_contexts_rm_dirs(kdamond->contexts);
974 kobject_put(&kdamond->contexts->kobj);
982 running = ctx->kdamond != NULL;
988 * enum damon_sysfs_cmd - Commands for a specific kdamond.
991 /* @DAMON_SYSFS_CMD_ON: Turn the kdamond on. */
993 /* @DAMON_SYSFS_CMD_OFF: Turn the kdamond off. */
995 /* @DAMON_SYSFS_CMD_COMMIT: Update kdamond inputs. */
1049 * @kdamond: The kobject wrapper that associated to the kdamond thread.
1054 * request will be handled by the DAMON callback. None-``NULL`` @kdamond means
1059 struct damon_sysfs_kdamond *kdamond;
1068 struct damon_sysfs_kdamond *kdamond = container_of(kobj,
1070 struct damon_ctx *ctx = kdamond->damon_ctx;
1201 * @data: The kobject wrapper that associated to the kdamond thread.
1203 * This function reads the schemes stats of specific kdamond and update the
1211 struct damon_sysfs_kdamond *kdamond = data;
1212 struct damon_ctx *ctx = kdamond->damon_ctx;
1215 kdamond->contexts->contexts_arr[0]->schemes, ctx);
1220 struct damon_sysfs_kdamond *kdamond)
1222 return kdamond->damon_ctx &&
1223 damon_sysfs_ctx_running(kdamond->damon_ctx);
1247 * damon_sysfs_commit_input() - Commit user inputs to a running kdamond.
1248 * @kdamond: The kobject wrapper for the associated kdamond.
1250 * If the sysfs input is wrong, the kdamond will be terminated.
1252 static int damon_sysfs_commit_input(struct damon_sysfs_kdamond *kdamond)
1257 if (!damon_sysfs_kdamond_running(kdamond))
1259 /* TODO: Support multiple contexts per kdamond */
1260 if (kdamond->contexts->nr != 1)
1263 param_ctx = damon_sysfs_build_ctx(kdamond->contexts->contexts_arr[0]);
1266 err = damon_commit_ctx(kdamond->damon_ctx, param_ctx);
1280 /* TODO: Support multiple contexts per kdamond */
1292 * @data: The kobject wrapper that associated to the kdamond thread.
1294 * This function reads the schemes' effective quotas of specific kdamond and
1301 struct damon_sysfs_kdamond *kdamond = data;
1302 struct damon_ctx *ctx = kdamond->damon_ctx;
1305 kdamond->contexts->contexts_arr[0]->schemes, ctx);
1316 * This function is periodically called back from the kdamond thread for @c.
1322 struct damon_sysfs_kdamond *kdamond;
1328 kdamond = damon_sysfs_cmd_request.kdamond;
1329 if (!kdamond || kdamond->damon_ctx != c)
1335 err = damon_sysfs_commit_input(kdamond);
1341 damon_sysfs_cmd_request.kdamond = NULL;
1396 static int damon_sysfs_turn_damon_on(struct damon_sysfs_kdamond *kdamond)
1401 if (damon_sysfs_kdamond_running(kdamond))
1403 if (damon_sysfs_cmd_request.kdamond == kdamond)
1405 /* TODO: support multiple contexts per kdamond */
1406 if (kdamond->contexts->nr != 1)
1409 if (kdamond->damon_ctx)
1410 damon_destroy_ctx(kdamond->damon_ctx);
1411 kdamond->damon_ctx = NULL;
1413 ctx = damon_sysfs_build_ctx(kdamond->contexts->contexts_arr[0]);
1421 kdamond->damon_ctx = ctx;
1425 static int damon_sysfs_turn_damon_off(struct damon_sysfs_kdamond *kdamond)
1427 if (!kdamond->damon_ctx)
1429 return damon_stop(&kdamond->damon_ctx, 1);
1432 * DAMON, we free kdamond->damon_ctx in next
1438 struct damon_sysfs_kdamond *kdamond)
1442 if (!kdamond->damon_ctx)
1445 call_control.data = kdamond;
1446 return damon_call(kdamond->damon_ctx, &call_control);
1490 * damon_sysfs_handle_cmd() - Handle a command for a specific kdamond.
1492 * @kdamond: The kobject wrapper for the associated kdamond.
1494 * This function handles a DAMON sysfs command for a kdamond. For commands
1503 struct damon_sysfs_kdamond *kdamond)
1509 return damon_sysfs_turn_damon_on(kdamond);
1511 return damon_sysfs_turn_damon_off(kdamond);
1515 kdamond);
1518 damon_sysfs_upd_schemes_stats, kdamond);
1520 return damon_sysfs_update_schemes_tried_regions(kdamond, true);
1522 return damon_sysfs_update_schemes_tried_regions(kdamond, false);
1525 kdamond->contexts->contexts_arr[0]->schemes);
1529 kdamond);
1535 if (damon_sysfs_cmd_request.kdamond)
1537 if (!damon_sysfs_kdamond_running(kdamond))
1540 damon_sysfs_cmd_request.kdamond = kdamond;
1544 * from kdamond context
1551 if (!damon_sysfs_cmd_request.kdamond) {
1554 } else if (!damon_sysfs_kdamond_running(kdamond)) {
1555 /* kdamond has already finished */
1557 damon_sysfs_cmd_request.kdamond = NULL;
1568 struct damon_sysfs_kdamond *kdamond = container_of(kobj,
1577 ret = damon_sysfs_handle_cmd(cmd, kdamond);
1590 struct damon_sysfs_kdamond *kdamond = container_of(kobj,
1597 ctx = kdamond->damon_ctx;
1602 if (ctx->kdamond)
1603 pid = ctx->kdamond->pid;
1612 struct damon_sysfs_kdamond *kdamond = container_of(kobj,
1615 if (kdamond->damon_ctx)
1616 damon_destroy_ctx(kdamond->damon_ctx);
1617 kfree(kdamond);
1675 damon_sysfs_cmd_request.kdamond == kdamonds[i])
1685 struct damon_sysfs_kdamond **kdamonds_arr, *kdamond;
1702 kdamond = damon_sysfs_kdamond_alloc();
1703 if (!kdamond) {
1708 err = kobject_init_and_add(&kdamond->kobj,
1714 err = damon_sysfs_kdamond_add_dirs(kdamond);
1718 kdamonds_arr[i] = kdamond;
1725 kobject_put(&kdamond->kobj);