Messages in this thread | | | Subject | Re: [PATCH v5 08/13] powerpc/perf: PMU functions for Core IMC and hotplugging | From | Madhavan Srinivasan <> | Date | Tue, 28 Mar 2017 10:11:51 +0530 |
| |
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..] > >> + >> +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 ?
>> + 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.
| |