mm/damon/dbgfs: reduce stack usage in str_to_schemes()
Subsystems (2)
PATCH 1/2 mm/damon/dbgfs: reduce stack usage in str_to_schemes()
struct damos_quota quota caused the stack usage of str_to_schemes() to grow beyond the warning limit on 32-bit architectures w/ gcc.
mm/damon/dbgfs.c: In function ‘str_to_schemes’:mm/damon/dbgfs.c:292:1: warning: the frame size of 1496 bytes is larger than 1024 bytes [-Wframe-larger-than=]
Allocating dynamic memory in str_to_schemes() to fix this issue.
--- mm/damon/dbgfs.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-)
mm/damon/dbgfs.c +16 -6
@@ -237,18 +237,26 @@ static struct damos **str_to_schemes(const char *str, ssize_t len,int pos =0 , parsed, ret;unsigned int action_input;enum damos_action action; +struct damos_quota *quota; schemes =kmalloc_array (max_nr_schemes,sizeof (scheme),GFP_KERNEL );if (!schemes)return NULL ; + quota =kmalloc (sizeof (struct damos_quota ),GFP_KERNEL ); +if (!quota) { +kfree (schemes); +return NULL ; + } + *nr_schemes =0 ;while (pos < len && *nr_schemes < max_nr_schemes) {struct damos_access_pattern pattern = {}; -struct damos_quota quota = {};struct damos_watermarks wmarks; +memset (quota,0 ,sizeof (struct damos_quota )); + ret = sscanf(&str[pos], "%lu %lu %u %u %u %u %u %lu %lu %lu %u %u %u %u %lu %lu %lu %lu%n", &pattern.min_sz_region, &pattern.max_sz_region,
@@ -256,10 +264,10 @@ static struct damos **str_to_schemes(const char *str, ssize_t len, &pattern.max_nr_accesses, &pattern.min_age_region, &pattern.max_age_region, - &action_input, "a.ms, - "a.sz, "a.reset_interval, - "a.weight_sz, "a.weight_nr_accesses, - "a.weight_age, &wmarks.metric, + &action_input, "a->ms, + "a->sz, "a->reset_interval, + "a->weight_sz, "a->weight_nr_accesses, + "a->weight_age, &wmarks.metric, &wmarks.interval, &wmarks.high, &wmarks.mid, &wmarks.low, &parsed);if (ret !=18 )
@@ -278,15 +286,17 @@ static struct damos **str_to_schemes(const char *str, ssize_t len, goto fail; pos += parsed; - scheme =damon_new_scheme (&pattern, action, "a, &wmarks); + scheme =damon_new_scheme (&pattern, action, quota, &wmarks);if (!scheme) goto fail; schemes[*nr_schemes] = scheme; *nr_schemes +=1 ; } +kfree (quota);return schemes; fail: +kfree (quota);free_schemes_arr (schemes, *nr_schemes);return NULL ; }
Signature · 1 line
2.40.1
PATCH 2/2 mm/mm/damon/sysfs-schemes: reduce stack usage in damon_sysfs_mk_scheme()
struct damos_quota quota caused the stack usage of damon_sysfs_mk_scheme() to grow beyond the warning limit on 32-bit architectures w/ gcc.
mm/damon/sysfs-schemes.c: In function ‘damon_sysfs_mk_scheme’:mm/damon/sysfs-schemes.c:1526:1: warning: the frame size of 1280 bytes is larger than 1024 bytes [-Wframe-larger-than=]
Allocating dynamic memory in damon_sysfs_mk_scheme() to fix this issue.
--- mm/damon/sysfs-schemes.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-)
mm/damon/sysfs-schemes.c +19 -10
@@ -1486,6 +1486,7 @@ static struct damos *damon_sysfs_mk_scheme(struct damon_sysfs_scheme_filters *sysfs_filters = sysfs_scheme->filters;struct damos *scheme; +struct damos_quota *quota;int err;struct damos_access_pattern pattern = {
@@ -1496,14 +1497,6 @@ static struct damos *damon_sysfs_mk_scheme( .min_age_region = access_pattern->age->min, .max_age_region = access_pattern->age->max, }; -struct damos_quota quota = { - .ms = sysfs_quotas->ms, - .sz = sysfs_quotas->sz, - .reset_interval = sysfs_quotas->reset_interval_ms, - .weight_sz = sysfs_weights->sz, - .weight_nr_accesses = sysfs_weights->nr_accesses, - .weight_age = sysfs_weights->age, - };struct damos_watermarks wmarks = { .metric = sysfs_wmarks->metric, .interval = sysfs_wmarks->interval_us,
@@ -1512,16 +1505,32 @@ static struct damos *damon_sysfs_mk_scheme( .low = sysfs_wmarks->low, }; - scheme =damon_new_scheme (&pattern, sysfs_scheme->action, "a, + quota =kmalloc (sizeof (struct damos_quota ),GFP_KERNEL ); +if (!quota) +return NULL ; + + quota->ms = sysfs_quotas->ms; + quota->sz = sysfs_quotas->sz; + quota->reset_interval = sysfs_quotas->reset_interval_ms; + quota->weight_sz = sysfs_weights->sz; + quota->weight_nr_accesses = sysfs_weights->nr_accesses; + quota->weight_age = sysfs_weights->age; + + scheme =damon_new_scheme (&pattern, sysfs_scheme->action, quota, &wmarks); -if (!scheme) +if (!scheme) { +kfree (quota);return NULL ; + } err =damon_sysfs_set_scheme_filters (scheme, sysfs_filters);if (err) { +kfree (quota);damon_destroy_scheme (scheme);return NULL ; } + +kfree (quota);return scheme; }
Signature · 1 line
2.40.1
Hi all,
It warned because my config is wrong, sorry for the mistake, please ignore the patchset. :-P
Thanks,
Quoted 79 lines · Chao Yu
struct
damos_quotaquota caused the stack usage ofstr_to_schemes()to grow beyond the warning limit on 32-bit architectures w/ gcc.
mm/damon/dbgfs.c: In function ‘str_to_schemes’:mm/damon/dbgfs.c:292:1: warning: the frame size of 1496 bytes is larger than 1024 bytes [-Wframe-larger-than=]Allocating dynamic memory in
str_to_schemes()to fix this issue.Signed-off-by Chao Yu <[email protected]>--- mm/damon/dbgfs.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-)mm/damon/dbgfs.c +16
-6@@ -237,18 +237,26 @@ static struct damos **str_to_schemes(const char *str, ssize_t len,int pos =0 , parsed, ret;unsigned int action_input;enum damos_action action; +struct damos_quota *quota; schemes =kmalloc_array (max_nr_schemes,sizeof (scheme),GFP_KERNEL );if (!schemes)return NULL ; + quota =kmalloc (sizeof (struct damos_quota ),GFP_KERNEL ); +if (!quota) { +kfree (schemes); +return NULL ; + } + *nr_schemes =0 ;while (pos < len && *nr_schemes < max_nr_schemes) {struct damos_access_pattern pattern = {}; -struct damos_quota quota = {};struct damos_watermarks wmarks; +memset (quota,0 ,sizeof (struct damos_quota )); + ret = sscanf(&str[pos], "%lu %lu %u %u %u %u %u %lu %lu %lu %u %u %u %u %lu %lu %lu %lu%n", &pattern.min_sz_region, &pattern.max_sz_region,@@ -256,10 +264,10 @@ static struct damos **str_to_schemes(const char *str, ssize_t len, &pattern.max_nr_accesses, &pattern.min_age_region, &pattern.max_age_region, - &action_input, "a.ms, - "a.sz, "a.reset_interval, - "a.weight_sz, "a.weight_nr_accesses, - "a.weight_age, &wmarks.metric, + &action_input, "a->ms, + "a->sz, "a->reset_interval, + "a->weight_sz, "a->weight_nr_accesses, + "a->weight_age, &wmarks.metric, &wmarks.interval, &wmarks.high, &wmarks.mid, &wmarks.low, &parsed);if (ret !=18 )@@ -278,15 +286,17 @@ static struct damos **str_to_schemes(const char *str, ssize_t len, goto fail; pos += parsed; - scheme =damon_new_scheme (&pattern, action, "a, &wmarks); + scheme =damon_new_scheme (&pattern, action, quota, &wmarks);if (!scheme) goto fail; schemes[*nr_schemes] = scheme; *nr_schemes +=1 ; } +kfree (quota);return schemes; fail: +kfree (quota);free_schemes_arr (schemes, *nr_schemes);return NULL ; }
SeongJae Park
maintainerHi Chao,
Quoted 4 lines · On Mon, 17 Jul 2023 11:41:01 +0800 Chao Yu <[email protected]> wrote:
Hi all,
It warned because my config is wrong, sorry for the mistake, please ignore the patchset. :-P
No problem at all, appreciate for taking a look into DAMON :)
Thanks,
SJ
[...]