mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-03 23:58:05 +00:00
perf/x86/intel/uncore: Fix IIO cleanup mapping procedure for SNR/ICX
skx_iio_cleanup_mapping() is re-used for snr and icx, but in those
cases it fails to use the appropriate XXX_iio_mapping_group and as
such fails to free previously allocated resources, leading to memory
leaks.
Fixes: 10337e95e0
("perf/x86/intel/uncore: Enable I/O stacks to IIO PMON mapping on ICX")
Signed-off-by: Alexander Antonov <alexander.antonov@linux.intel.com>
[peterz: Changelog]
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Kan Liang <kan.liang@linux.intel.com>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/20210706090723.41850-1-alexander.antonov@linux.intel.com
This commit is contained in:
parent
c76826a65f
commit
3f2cbe3810
1 changed files with 29 additions and 13 deletions
|
@ -3847,6 +3847,22 @@ pmu_iio_set_mapping(struct intel_uncore_type *type, struct attribute_group *ag)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
pmu_iio_cleanup_mapping(struct intel_uncore_type *type, struct attribute_group *ag)
|
||||
{
|
||||
struct attribute **attr = ag->attrs;
|
||||
|
||||
if (!attr)
|
||||
return;
|
||||
|
||||
for (; *attr; attr++)
|
||||
kfree((*attr)->name);
|
||||
kfree(attr_to_ext_attr(*ag->attrs));
|
||||
kfree(ag->attrs);
|
||||
ag->attrs = NULL;
|
||||
kfree(type->topology);
|
||||
}
|
||||
|
||||
static int skx_iio_set_mapping(struct intel_uncore_type *type)
|
||||
{
|
||||
return pmu_iio_set_mapping(type, &skx_iio_mapping_group);
|
||||
|
@ -3854,17 +3870,7 @@ static int skx_iio_set_mapping(struct intel_uncore_type *type)
|
|||
|
||||
static void skx_iio_cleanup_mapping(struct intel_uncore_type *type)
|
||||
{
|
||||
struct attribute **attr = skx_iio_mapping_group.attrs;
|
||||
|
||||
if (!attr)
|
||||
return;
|
||||
|
||||
for (; *attr; attr++)
|
||||
kfree((*attr)->name);
|
||||
kfree(attr_to_ext_attr(*skx_iio_mapping_group.attrs));
|
||||
kfree(skx_iio_mapping_group.attrs);
|
||||
skx_iio_mapping_group.attrs = NULL;
|
||||
kfree(type->topology);
|
||||
pmu_iio_cleanup_mapping(type, &skx_iio_mapping_group);
|
||||
}
|
||||
|
||||
static struct intel_uncore_type skx_uncore_iio = {
|
||||
|
@ -4510,6 +4516,11 @@ static int snr_iio_set_mapping(struct intel_uncore_type *type)
|
|||
return pmu_iio_set_mapping(type, &snr_iio_mapping_group);
|
||||
}
|
||||
|
||||
static void snr_iio_cleanup_mapping(struct intel_uncore_type *type)
|
||||
{
|
||||
pmu_iio_cleanup_mapping(type, &snr_iio_mapping_group);
|
||||
}
|
||||
|
||||
static struct intel_uncore_type snr_uncore_iio = {
|
||||
.name = "iio",
|
||||
.num_counters = 4,
|
||||
|
@ -4526,7 +4537,7 @@ static struct intel_uncore_type snr_uncore_iio = {
|
|||
.attr_update = snr_iio_attr_update,
|
||||
.get_topology = snr_iio_get_topology,
|
||||
.set_mapping = snr_iio_set_mapping,
|
||||
.cleanup_mapping = skx_iio_cleanup_mapping,
|
||||
.cleanup_mapping = snr_iio_cleanup_mapping,
|
||||
};
|
||||
|
||||
static struct intel_uncore_type snr_uncore_irp = {
|
||||
|
@ -5113,6 +5124,11 @@ static int icx_iio_set_mapping(struct intel_uncore_type *type)
|
|||
return pmu_iio_set_mapping(type, &icx_iio_mapping_group);
|
||||
}
|
||||
|
||||
static void icx_iio_cleanup_mapping(struct intel_uncore_type *type)
|
||||
{
|
||||
pmu_iio_cleanup_mapping(type, &icx_iio_mapping_group);
|
||||
}
|
||||
|
||||
static struct intel_uncore_type icx_uncore_iio = {
|
||||
.name = "iio",
|
||||
.num_counters = 4,
|
||||
|
@ -5130,7 +5146,7 @@ static struct intel_uncore_type icx_uncore_iio = {
|
|||
.attr_update = icx_iio_attr_update,
|
||||
.get_topology = icx_iio_get_topology,
|
||||
.set_mapping = icx_iio_set_mapping,
|
||||
.cleanup_mapping = skx_iio_cleanup_mapping,
|
||||
.cleanup_mapping = icx_iio_cleanup_mapping,
|
||||
};
|
||||
|
||||
static struct intel_uncore_type icx_uncore_irp = {
|
||||
|
|
Loading…
Reference in a new issue