On Fri, 28 Oct 2016, Fenghua Yu wrote:
> +static void l3_qos_cfg_update(void *arg)
> +{
> +     bool *enable = arg;
> +
> +     wrmsrl(IA32_L3_QOS_CFG, *enable);
> +}
> +
> +static int set_l3_qos_cfg(struct rdt_resource *r, bool enable)
> +{
> +     cpumask_var_t cpu_mask;
> +     struct rdt_domain *d;
> +     int cpu;
> +
> +     if (!zalloc_cpumask_var(&cpu_mask, GFP_KERNEL))
> +             return -ENOMEM;
> +
> +     list_for_each_entry(d, &r->domains, list) {
> +             /* Pick one CPU from each domain instance to update MSR */
> +             cpumask_set_cpu(cpumask_any(&d->cpu_mask), cpu_mask);
> +     }
> +     cpu = get_cpu();
> +     /* Update QOS_CFG MSR on this cpu if it's in cpu_mask. */
> +     if (cpumask_test_cpu(cpu, cpu_mask))
> +             l3_qos_cfg_update(r);

I made this &enable .....

> +     /* Update QOS_CFG MSR on all other cpus in cpu_mask. */
> +     smp_call_function_many(cpu_mask, l3_qos_cfg_update, &enable, 1);
> +     put_cpu();
> +     if (rdt_resources_all[RDT_RESOURCE_L3DATA].enabled &&
> +         rdt_resources_all[RDT_RESOURCE_L3CODE].enabled) {
> +             ret = set_l3_qos_cfg(&rdt_resources_all[RDT_RESOURCE_L3], true);
> +             if (ret) {
> +                     dentry = ERR_PTR(ret);
> +                     goto out;
> +             }
> +     }
> +
> +     dentry = kernfs_mount(fs_type, flags, rdt_root,
> +                           RDTGROUP_SUPER_MAGIC, NULL);
> +     if (IS_ERR(dentry))
> +             goto out;

This leaks a potentially enabled cdp. So if you mount again later w/o cdp
the machine will still be in cdp enabled mode. I fixed that up with proper
error handling. Please verify the changes carefuly.

Thanks,

        tglx

Reply via email to