diff --git a/mm/internal.h b/mm/internal.h index 5b02066f7186b449eee0feb311f64fb906cb27fc..58d60d5472d0196095b2f176b8dc2e37e32c1eb0 100644 --- a/mm/internal.h +++ b/mm/internal.h @@ -791,6 +791,7 @@ struct reclaim_acct { }; bool reclaimacct_initialize_show_data(void); +void reclaimacct_reinitialize_show_data(void); void reclaimacct_destroy_show_data(void); void reclaimacct_collect_data(void); diff --git a/mm/reclaim_acct.c b/mm/reclaim_acct.c index 18ac0e096c4132c96ea5fee63cb74496514eafac..2fbbbaee6f978fc1326c97db73d90063632e1307 100644 --- a/mm/reclaim_acct.c +++ b/mm/reclaim_acct.c @@ -161,4 +161,22 @@ static int __init reclaimacct_module_init(void) late_initcall(reclaimacct_module_init); -module_param_named(disable, reclaimacct_disable, int, 0644); +static int reclaimacct_disable_set(const char *val, const struct kernel_param *kp) +{ + int ret; + + ret = param_set_int(val, kp); + if (ret) + return ret; + + if (!reclaimacct_disable) + reclaimacct_reinitialize_show_data(); + return 0; +} + +static const struct kernel_param_ops reclaimacct_disable_ops = { + .set = reclaimacct_disable_set, + .get = param_get_int, +}; + +module_param_cb(disable, &reclaimacct_disable_ops, &reclaimacct_disable, 0644); diff --git a/mm/reclaimacct_show.c b/mm/reclaimacct_show.c index 18b073db48baf24cdc2be2738e4d6bffd583d91a..2ccf71875bfe8ba4aad26716e3782c9eb09e0c45 100644 --- a/mm/reclaimacct_show.c +++ b/mm/reclaimacct_show.c @@ -47,6 +47,15 @@ bool reclaimacct_initialize_show_data(void) return false; } +void reclaimacct_reinitialize_show_data(void) +{ + if (ra_show) + memset(ra_show, 0, sizeof(struct reclaimacct_show)); + + if (ra_eff) + memset(ra_eff, 0, sizeof(struct reclaim_efficiency) * RECLAIM_TYPES); +} + void reclaimacct_destroy_show_data(void) { kfree(ra_show);