Messages in this thread | | | Date | Wed, 24 Feb 2016 11:22:47 +0100 (CET) | From | Thomas Gleixner <> | Subject | Re: [PATCH 2/5] x86/mbm: Intel Memory B/W Monitoring enumeration and init |
| |
On Wed, 10 Feb 2016, Vikas Shivappa wrote:ar > +static int intel_mbm_init(void) > +{ > + int ret = 0, array_size, maxid = cqm_max_rmid + 1; > + > + mbm_socket_max = cpumask_weight(&cqm_cpumask);
This should use the new topology_max_packages() function, so you can alloc your array correctly even if not all sockets are online/plugged yet.
> + array_size = sizeof(struct sample) * maxid * mbm_socket_max; > + mbm_local = kmalloc(array_size, GFP_KERNEL); > + if (!mbm_local) { > + ret = -ENOMEM;
return -ENOMEM is sufficient here.
> + goto out; > + } > + > + mbm_total = kmalloc(array_size, GFP_KERNEL); > + if (!mbm_total) { > + kfree(mbm_local); > + ret = -ENOMEM; > + } > +out: > + > + return ret; > +} > + > cqm_l3_scale = boot_cpu_data.x86_cache_occ_scale; > @@ -1384,14 +1520,34 @@ static int __init intel_cqm_init(void) > > __perf_cpu_notifier(intel_cqm_cpu_notifier);
You really should register the notifier _AFTER_ registering the pmu. That needs to be fixed anyway, because the existing code leaks the notifier AND memory in case perf_pmu_register fails.
Thanks,
tglx
| |