Lines Matching full:scheme
13 * scheme region directory
113 * scheme regions directory
123 * Each DAMON-based operation scheme (&struct damos) has its own apply
124 * interval, and we need to expose the scheme tried regions based on only
126 * scheme. The status becomes 'idle' at the beginning.
136 * is called only after the scheme is completely applied
147 * apply intervals of the scheme is passed while the state is 'idle'.
1021 * scheme/weights directory
1383 * scheme directory
1413 struct damon_sysfs_scheme *scheme = kmalloc(sizeof(*scheme), in damon_sysfs_scheme_alloc() local
1416 if (!scheme) in damon_sysfs_scheme_alloc()
1418 scheme->kobj = (struct kobject){}; in damon_sysfs_scheme_alloc()
1419 scheme->action = action; in damon_sysfs_scheme_alloc()
1420 scheme->apply_interval_us = apply_interval_us; in damon_sysfs_scheme_alloc()
1421 return scheme; in damon_sysfs_scheme_alloc()
1425 struct damon_sysfs_scheme *scheme) in damon_sysfs_scheme_set_access_pattern() argument
1434 &damon_sysfs_access_pattern_ktype, &scheme->kobj, in damon_sysfs_scheme_set_access_pattern()
1441 scheme->access_pattern = access_pattern; in damon_sysfs_scheme_set_access_pattern()
1449 static int damon_sysfs_scheme_set_quotas(struct damon_sysfs_scheme *scheme) in damon_sysfs_scheme_set_quotas() argument
1457 &scheme->kobj, "quotas"); in damon_sysfs_scheme_set_quotas()
1463 scheme->quotas = quotas; in damon_sysfs_scheme_set_quotas()
1471 static int damon_sysfs_scheme_set_watermarks(struct damon_sysfs_scheme *scheme) in damon_sysfs_scheme_set_watermarks() argument
1480 &damon_sysfs_watermarks_ktype, &scheme->kobj, in damon_sysfs_scheme_set_watermarks()
1485 scheme->watermarks = watermarks; in damon_sysfs_scheme_set_watermarks()
1489 static int damon_sysfs_scheme_set_filters(struct damon_sysfs_scheme *scheme) in damon_sysfs_scheme_set_filters() argument
1498 &damon_sysfs_scheme_filters_ktype, &scheme->kobj, in damon_sysfs_scheme_set_filters()
1503 scheme->filters = filters; in damon_sysfs_scheme_set_filters()
1507 static int damon_sysfs_scheme_set_stats(struct damon_sysfs_scheme *scheme) in damon_sysfs_scheme_set_stats() argument
1515 &scheme->kobj, "stats"); in damon_sysfs_scheme_set_stats()
1519 scheme->stats = stats; in damon_sysfs_scheme_set_stats()
1524 struct damon_sysfs_scheme *scheme) in damon_sysfs_scheme_set_tried_regions() argument
1533 &damon_sysfs_scheme_regions_ktype, &scheme->kobj, in damon_sysfs_scheme_set_tried_regions()
1538 scheme->tried_regions = tried_regions; in damon_sysfs_scheme_set_tried_regions()
1542 static int damon_sysfs_scheme_add_dirs(struct damon_sysfs_scheme *scheme) in damon_sysfs_scheme_add_dirs() argument
1546 err = damon_sysfs_scheme_set_access_pattern(scheme); in damon_sysfs_scheme_add_dirs()
1549 err = damon_sysfs_scheme_set_quotas(scheme); in damon_sysfs_scheme_add_dirs()
1552 err = damon_sysfs_scheme_set_watermarks(scheme); in damon_sysfs_scheme_add_dirs()
1555 err = damon_sysfs_scheme_set_filters(scheme); in damon_sysfs_scheme_add_dirs()
1558 err = damon_sysfs_scheme_set_stats(scheme); in damon_sysfs_scheme_add_dirs()
1561 err = damon_sysfs_scheme_set_tried_regions(scheme); in damon_sysfs_scheme_add_dirs()
1567 kobject_put(&scheme->tried_regions->kobj); in damon_sysfs_scheme_add_dirs()
1568 scheme->tried_regions = NULL; in damon_sysfs_scheme_add_dirs()
1570 kobject_put(&scheme->filters->kobj); in damon_sysfs_scheme_add_dirs()
1571 scheme->filters = NULL; in damon_sysfs_scheme_add_dirs()
1573 kobject_put(&scheme->watermarks->kobj); in damon_sysfs_scheme_add_dirs()
1574 scheme->watermarks = NULL; in damon_sysfs_scheme_add_dirs()
1576 kobject_put(&scheme->quotas->kobj); in damon_sysfs_scheme_add_dirs()
1577 scheme->quotas = NULL; in damon_sysfs_scheme_add_dirs()
1579 kobject_put(&scheme->access_pattern->kobj); in damon_sysfs_scheme_add_dirs()
1580 scheme->access_pattern = NULL; in damon_sysfs_scheme_add_dirs()
1584 static void damon_sysfs_scheme_rm_dirs(struct damon_sysfs_scheme *scheme) in damon_sysfs_scheme_rm_dirs() argument
1586 damon_sysfs_access_pattern_rm_dirs(scheme->access_pattern); in damon_sysfs_scheme_rm_dirs()
1587 kobject_put(&scheme->access_pattern->kobj); in damon_sysfs_scheme_rm_dirs()
1588 damon_sysfs_quotas_rm_dirs(scheme->quotas); in damon_sysfs_scheme_rm_dirs()
1589 kobject_put(&scheme->quotas->kobj); in damon_sysfs_scheme_rm_dirs()
1590 kobject_put(&scheme->watermarks->kobj); in damon_sysfs_scheme_rm_dirs()
1591 damon_sysfs_scheme_filters_rm_dirs(scheme->filters); in damon_sysfs_scheme_rm_dirs()
1592 kobject_put(&scheme->filters->kobj); in damon_sysfs_scheme_rm_dirs()
1593 kobject_put(&scheme->stats->kobj); in damon_sysfs_scheme_rm_dirs()
1594 damon_sysfs_scheme_regions_rm_dirs(scheme->tried_regions); in damon_sysfs_scheme_rm_dirs()
1595 kobject_put(&scheme->tried_regions->kobj); in damon_sysfs_scheme_rm_dirs()
1601 struct damon_sysfs_scheme *scheme = container_of(kobj, in action_show() local
1605 damon_sysfs_damos_action_strs[scheme->action]); in action_show()
1611 struct damon_sysfs_scheme *scheme = container_of(kobj, in action_store() local
1617 scheme->action = action; in action_store()
1627 struct damon_sysfs_scheme *scheme = container_of(kobj, in apply_interval_us_show() local
1630 return sysfs_emit(buf, "%lu\n", scheme->apply_interval_us); in apply_interval_us_show()
1636 struct damon_sysfs_scheme *scheme = container_of(kobj, in apply_interval_us_store() local
1638 int err = kstrtoul(buf, 0, &scheme->apply_interval_us); in apply_interval_us_store()
1693 struct damon_sysfs_scheme **schemes_arr, *scheme; in damon_sysfs_schemes_add_dirs() local
1711 scheme = damon_sysfs_scheme_alloc(DAMOS_STAT, 0); in damon_sysfs_schemes_add_dirs()
1712 if (!scheme) { in damon_sysfs_schemes_add_dirs()
1717 err = kobject_init_and_add(&scheme->kobj, in damon_sysfs_schemes_add_dirs()
1722 err = damon_sysfs_scheme_add_dirs(scheme); in damon_sysfs_schemes_add_dirs()
1726 schemes_arr[i] = scheme; in damon_sysfs_schemes_add_dirs()
1733 kobject_put(&scheme->kobj); in damon_sysfs_schemes_add_dirs()
1828 static int damon_sysfs_set_scheme_filters(struct damos *scheme, in damon_sysfs_set_scheme_filters() argument
1834 damos_for_each_filter_safe(filter, next, scheme) in damon_sysfs_set_scheme_filters()
1866 damos_add_filter(scheme, filter); in damon_sysfs_set_scheme_filters()
1890 /* Higher score makes scheme less aggressive */ in damos_sysfs_set_quota_score()
1902 struct damos *scheme; in damos_sysfs_set_quota_scores() local
1905 damon_for_each_scheme(scheme, ctx) { in damos_sysfs_set_quota_scores()
1908 /* user could have removed the scheme sysfs dir */ in damos_sysfs_set_quota_scores()
1914 &scheme->quota); in damos_sysfs_set_quota_scores()
1929 struct damos *scheme; in damon_sysfs_mk_scheme() local
1958 scheme = damon_new_scheme(&pattern, sysfs_scheme->action, in damon_sysfs_mk_scheme()
1960 if (!scheme) in damon_sysfs_mk_scheme()
1963 err = damon_sysfs_set_scheme_filters(scheme, sysfs_filters); in damon_sysfs_mk_scheme()
1965 damon_destroy_scheme(scheme); in damon_sysfs_mk_scheme()
1968 return scheme; in damon_sysfs_mk_scheme()
1971 static void damon_sysfs_update_scheme(struct damos *scheme, in damon_sysfs_update_scheme() argument
1981 scheme->pattern.min_sz_region = access_pattern->sz->min; in damon_sysfs_update_scheme()
1982 scheme->pattern.max_sz_region = access_pattern->sz->max; in damon_sysfs_update_scheme()
1983 scheme->pattern.min_nr_accesses = access_pattern->nr_accesses->min; in damon_sysfs_update_scheme()
1984 scheme->pattern.max_nr_accesses = access_pattern->nr_accesses->max; in damon_sysfs_update_scheme()
1985 scheme->pattern.min_age_region = access_pattern->age->min; in damon_sysfs_update_scheme()
1986 scheme->pattern.max_age_region = access_pattern->age->max; in damon_sysfs_update_scheme()
1988 scheme->action = sysfs_scheme->action; in damon_sysfs_update_scheme()
1989 scheme->apply_interval_us = sysfs_scheme->apply_interval_us; in damon_sysfs_update_scheme()
1991 scheme->quota.ms = sysfs_quotas->ms; in damon_sysfs_update_scheme()
1992 scheme->quota.sz = sysfs_quotas->sz; in damon_sysfs_update_scheme()
1993 scheme->quota.reset_interval = sysfs_quotas->reset_interval_ms; in damon_sysfs_update_scheme()
1994 scheme->quota.weight_sz = sysfs_weights->sz; in damon_sysfs_update_scheme()
1995 scheme->quota.weight_nr_accesses = sysfs_weights->nr_accesses; in damon_sysfs_update_scheme()
1996 scheme->quota.weight_age = sysfs_weights->age; in damon_sysfs_update_scheme()
1998 damos_sysfs_set_quota_score(sysfs_quotas->goals, &scheme->quota); in damon_sysfs_update_scheme()
2000 scheme->wmarks.metric = sysfs_wmarks->metric; in damon_sysfs_update_scheme()
2001 scheme->wmarks.interval = sysfs_wmarks->interval_us; in damon_sysfs_update_scheme()
2002 scheme->wmarks.high = sysfs_wmarks->high; in damon_sysfs_update_scheme()
2003 scheme->wmarks.mid = sysfs_wmarks->mid; in damon_sysfs_update_scheme()
2004 scheme->wmarks.low = sysfs_wmarks->low; in damon_sysfs_update_scheme()
2006 err = damon_sysfs_set_scheme_filters(scheme, sysfs_scheme->filters); in damon_sysfs_update_scheme()
2008 damon_destroy_scheme(scheme); in damon_sysfs_update_scheme()
2014 struct damos *scheme, *next; in damon_sysfs_set_schemes() local
2017 damon_for_each_scheme_safe(scheme, next, ctx) { in damon_sysfs_set_schemes()
2019 damon_sysfs_update_scheme(scheme, in damon_sysfs_set_schemes()
2022 damon_destroy_scheme(scheme); in damon_sysfs_set_schemes()
2027 struct damos *scheme, *next; in damon_sysfs_set_schemes() local
2029 scheme = damon_sysfs_mk_scheme(sysfs_schemes->schemes_arr[i]); in damon_sysfs_set_schemes()
2030 if (!scheme) { in damon_sysfs_set_schemes()
2031 damon_for_each_scheme_safe(scheme, next, ctx) in damon_sysfs_set_schemes()
2032 damon_destroy_scheme(scheme); in damon_sysfs_set_schemes()
2035 damon_add_scheme(ctx, scheme); in damon_sysfs_set_schemes()
2044 struct damos *scheme; in damon_sysfs_schemes_update_stats() local
2047 damon_for_each_scheme(scheme, ctx) { in damon_sysfs_schemes_update_stats()
2050 /* user could have removed the scheme sysfs dir */ in damon_sysfs_schemes_update_stats()
2055 sysfs_stats->nr_tried = scheme->stat.nr_tried; in damon_sysfs_schemes_update_stats()
2056 sysfs_stats->sz_tried = scheme->stat.sz_tried; in damon_sysfs_schemes_update_stats()
2057 sysfs_stats->nr_applied = scheme->stat.nr_applied; in damon_sysfs_schemes_update_stats()
2058 sysfs_stats->sz_applied = scheme->stat.sz_applied; in damon_sysfs_schemes_update_stats()
2059 sysfs_stats->qt_exceeds = scheme->stat.qt_exceeds; in damon_sysfs_schemes_update_stats()
2080 struct damos *scheme; in damon_sysfs_before_damos_apply() local
2087 damon_for_each_scheme(scheme, ctx) { in damon_sysfs_before_damos_apply()
2088 if (scheme == s) in damon_sysfs_before_damos_apply()
2093 /* user could have removed the scheme sysfs dir */ in damon_sysfs_before_damos_apply()
2150 struct damos *scheme; in damon_sysfs_schemes_clear_regions() local
2153 damon_for_each_scheme(scheme, ctx) { in damon_sysfs_schemes_clear_regions()
2156 /* user could have removed the scheme sysfs dir */ in damon_sysfs_schemes_clear_regions()
2170 struct damos *scheme; in damos_sysfs_nth_scheme() local
2173 damon_for_each_scheme(scheme, ctx) { in damos_sysfs_nth_scheme()
2175 return scheme; in damos_sysfs_nth_scheme()
2186 struct damos *scheme; in damos_tried_regions_init_upd_status() local
2191 scheme = damos_sysfs_nth_scheme(i, ctx); in damos_tried_regions_init_upd_status()
2192 if (!scheme) { in damos_tried_regions_init_upd_status()
2199 2 * usecs_to_jiffies(scheme->apply_interval_us ? in damos_tried_regions_init_upd_status()
2200 scheme->apply_interval_us : in damos_tried_regions_init_upd_status()