Re: [PATCH v5 08/13] powerpc/perf: PMU functions for Core IMC and hotplugging
From: Madhavan Srinivasan <hidden>
Date: 2017-03-28 05:34:43
Also in:
lkml
On Thursday 23 March 2017 06:39 PM, Gautham R Shenoy wrote:
Hi Maddy, Hemant, Anju, On Thu, Mar 16, 2017 at 01:05:02PM +0530, Madhavan Srinivasan wrote: [..snip..]quoted
+ +static void core_imc_change_cpu_context(int old_cpu, int new_cpu) +{ + if (!core_imc_pmu) + return; + perf_pmu_migrate_context(&core_imc_pmu->pmu, old_cpu, new_cpu); +} + + +static int ppc_core_imc_cpu_online(unsigned int cpu) +{ + int ret; + + /* If a cpu for this core is already set, then, don't do anything */ + ret = cpumask_any_and(&core_imc_cpumask, + cpu_sibling_mask(cpu)); + if (ret < nr_cpu_ids) + return 0; + + /* Else, set the cpu in the mask, and change the context */ + cpumask_set_cpu(cpu, &core_imc_cpumask); + core_imc_change_cpu_context(-1, cpu);So, in the core case, we are ok as long as any cpu in the core is present in the imc_cpumask. It need not have to be the smallest online cpu in the core. Can the same logic be applied to the earlier nest case ?
Yes. This makes sense. Let me look at this. Thanks for review Maddy
We can have a single function for cpu_offline and cpu_online which
implements these checks and sets the cpu bit if required.
ppc_entity_imc_cpu_offline(unsigned int cpu, cpumask_t
entity_imc_mask,
entity_imc_change_cpu_context_fn)
{
.
.
.
}
static ppc_nest_imc_cpu_offline(unsigned int cpu)
{
return ppc_entity_imc_cpu_offline(cpu, nest_imc_mask,
nest_imc_change_cpu_context);
}
And similar ones for core imc and thread imc.
Does this sound reasonable ?quoted
+ return 0; +} + +static int ppc_core_imc_cpu_offline(unsigned int cpu) +{ + int target; + unsigned int ncpu; + + /* + * clear this cpu out of the mask, if not present in the mask, + * don't bother doing anything. + */ + if (!cpumask_test_and_clear_cpu(cpu, &core_imc_cpumask)) + return 0; + + /* Find any online cpu in that core except the current "cpu" */ + ncpu = cpumask_any_but(cpu_sibling_mask(cpu), cpu); + + if (ncpu < nr_cpu_ids) { + target = ncpu; + cpumask_set_cpu(target, &core_imc_cpumask); + } else + target = -1; + + /* migrate the context */ + core_imc_change_cpu_context(cpu, target); + + return 0; +} +-- Thanks and Regards gautham.