From aff07c50a1d1ca12fee7b068875eeececdc12fce Mon Sep 17 00:00:00 2001 From: Stephen Dickey Date: Fri, 30 Sep 2022 15:41:39 -0700 Subject: [PATCH] sched/walt/core_ctl: make the cpumasks writable The user should be able to determine how this particular soc has setup the cpumasks for controlling core control. Make those visible and allow them to be written by postboot. Change-Id: Icb74ab9573dbe392481032a8a460ba6938bf287a Signed-off-by: Stephen Dickey Signed-off-by: Abhijeet Dharmapurikar --- kernel/sched/walt/core_ctl.c | 132 +++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) diff --git a/kernel/sched/walt/core_ctl.c b/kernel/sched/walt/core_ctl.c index 44a5e40e3bdd..0840bed754ac 100644 --- a/kernel/sched/walt/core_ctl.c +++ b/kernel/sched/walt/core_ctl.c @@ -16,6 +16,7 @@ #include #include #include +#include #include "walt.h" #include "trace.h" @@ -405,6 +406,129 @@ static ssize_t show_not_preferred(const struct cluster_data *state, char *buf) return count; } +DECLARE_BITMAP(temp_bitmap, WALT_NR_CPUS); + +static ssize_t store_nrrun_cpu_mask(struct cluster_data *state, + const char *buf, size_t count) +{ + unsigned long bitmask = 0xFF; + const unsigned long *bitmaskp = &bitmask; + unsigned long flags; + int ret = 0; + + ret = kstrtoul(buf, 0, (unsigned long *)bitmaskp); + if (ret < 0) + return ret; + + bitmap_copy(temp_bitmap, bitmaskp, 8); + + spin_lock_irqsave(&state_lock, flags); + cpumask_copy(&state->nrrun_cpu_mask, to_cpumask(temp_bitmap)); + spin_unlock_irqrestore(&state_lock, flags); + + return count; +} + +static ssize_t show_nrrun_cpu_mask(const struct cluster_data *state, char *buf) +{ + int ret = 0; + + ret = scnprintf(buf, PAGE_SIZE, "0x%x\n", (*(cpumask_bits(&state->nrrun_cpu_mask)))); + + return ret; +} + +static ssize_t store_nrrun_cpu_misfit_mask(struct cluster_data *state, + const char *buf, size_t count) +{ + unsigned long bitmask; + const unsigned long *bitmaskp = &bitmask; + unsigned long flags; + int ret = 0; + + ret = kstrtoul(buf, 0, (unsigned long *)bitmaskp); + if (ret < 0) + return ret; + + bitmap_copy(temp_bitmap, bitmaskp, 8); + + spin_lock_irqsave(&state_lock, flags); + cpumask_copy(&state->nrrun_cpu_misfit_mask, to_cpumask(temp_bitmap)); + spin_unlock_irqrestore(&state_lock, flags); + + return count; +} + +static ssize_t show_nrrun_cpu_misfit_mask(const struct cluster_data *state, char *buf) +{ + int ret = 0; + + ret = scnprintf(buf, PAGE_SIZE, "0x%x\n", (*(cpumask_bits(&state->nrrun_cpu_misfit_mask)))); + + return ret; +} + +static ssize_t store_assist_cpu_mask(struct cluster_data *state, + const char *buf, size_t count) +{ + unsigned long bitmask; + const unsigned long *bitmaskp = &bitmask; + unsigned long flags; + int ret = 0; + + ret = kstrtoul(buf, 0, (unsigned long *)bitmaskp); + if (ret < 0) + return ret; + + bitmap_copy(temp_bitmap, bitmaskp, 8); + + spin_lock_irqsave(&state_lock, flags); + cpumask_copy(&state->assist_cpu_mask, to_cpumask(temp_bitmap)); + spin_unlock_irqrestore(&state_lock, flags); + + return count; +} + +static ssize_t show_assist_cpu_mask(const struct cluster_data *state, char *buf) +{ + int ret = 0; + + ret = scnprintf(buf, PAGE_SIZE, "0x%x\n", (*(cpumask_bits(&state->assist_cpu_mask)))); + + return ret; +} + +static ssize_t store_assist_cpu_misfit_mask(struct cluster_data *state, + const char *buf, size_t count) +{ + unsigned long bitmask; + const unsigned long *bitmaskp = &bitmask; + unsigned long flags; + int ret = 0; + + ret = kstrtoul(buf, 0, (unsigned long *)bitmaskp); + if (ret < 0) + return ret; + + bitmap_copy(temp_bitmap, bitmaskp, 8); + + spin_lock_irqsave(&state_lock, flags); + cpumask_copy(&state->assist_cpu_misfit_mask, to_cpumask(temp_bitmap)); + spin_unlock_irqrestore(&state_lock, flags); + + return count; +} + +static ssize_t show_assist_cpu_misfit_mask(const struct cluster_data *state, char *buf) +{ + int ret = 0; + + ret = scnprintf(buf, PAGE_SIZE, "0x%x\n", + (*(cpumask_bits(&state->assist_cpu_misfit_mask)))); + + return ret; +} + struct core_ctl_attr { struct attribute attr; ssize_t (*show)(const struct cluster_data *cd, char *c); @@ -432,6 +556,10 @@ core_ctl_attr_ro(active_cpus); core_ctl_attr_ro(global_state); core_ctl_attr_rw(not_preferred); core_ctl_attr_rw(enable); +core_ctl_attr_rw(nrrun_cpu_mask); +core_ctl_attr_rw(nrrun_cpu_misfit_mask); +core_ctl_attr_rw(assist_cpu_mask); +core_ctl_attr_rw(assist_cpu_misfit_mask); static struct attribute *default_attrs[] = { &min_cpus.attr, @@ -446,6 +574,10 @@ static struct attribute *default_attrs[] = { &active_cpus.attr, &global_state.attr, ¬_preferred.attr, + &nrrun_cpu_mask.attr, + &nrrun_cpu_misfit_mask.attr, + &assist_cpu_mask.attr, + &assist_cpu_misfit_mask.attr, NULL }; ATTRIBUTE_GROUPS(default);