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.

Reply via email to