David Hildenbrand <david@xxxxxxxxxx> writes: > On 28.10.23 02:09, Stefan Roesch wrote: >> This adds four new knobs for the KSM advisor to influence its behaviour. >> The knobs are: >> - advisor_mode: >> 0: no advisor (default) >> 1: scan time advisor >> - advisor_min_cpu: 15 (default, cpu usage percent) >> - advisor_max_cpu: 70 (default, cpu usage percent) >> - advisor_min_pages: 500 (default) >> - advisor_max_pages: 30000 (default) >> - advisor_target_scan_time: 200 (default in seconds) >> The new values will take effect on the next scan round. >> Signed-off-by: Stefan Roesch <shr@xxxxxxxxxxxx> >> --- >> mm/ksm.c | 154 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ >> 1 file changed, 154 insertions(+) >> diff --git a/mm/ksm.c b/mm/ksm.c >> index e18fecfb359d..042ecaeb0beb 100644 >> --- a/mm/ksm.c >> +++ b/mm/ksm.c >> @@ -351,6 +351,14 @@ static void init_advisor(void) >> advisor_ctx.cpu_time = 0; >> } > > > [...] > >> * Use previous scan time if available, otherwise use current scan time as an >> * approximation for the previous scan time. >> @@ -3719,6 +3727,146 @@ static ssize_t smart_scan_store(struct kobject *kobj, >> } >> KSM_ATTR(smart_scan); >> +static ssize_t advisor_mode_show(struct kobject *kobj, >> + struct kobj_attribute *attr, char *buf) >> +{ >> + return sysfs_emit(buf, "%u\n", ksm_advisor); >> +} >> + >> +static ssize_t advisor_mode_store(struct kobject *kobj, >> + struct kobj_attribute *attr, const char *buf, >> + size_t count) >> +{ >> + unsigned int mode; >> + int err; >> + >> + err = kstrtouint(buf, 10, &mode); >> + if (err) >> + return -EINVAL; >> + if (mode > KSM_ADVISOR_LAST) >> + return -EINVAL; >> + >> + /* Set advisor default values */ >> + ksm_advisor = mode; >> + init_advisor(); >> + set_advisor_defaults(); >> + >> + return count; > > Can we instead use human-readable strings? > > "none" and "scan-time" should be clearer. > I'll change the interface to use strings instead of numbers.