perf/x86/intel/uncore: Clear attr_update properly
authorAlexander Antonov <alexander.antonov@linux.intel.com>
Thu, 17 Nov 2022 12:28:25 +0000 (12:28 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 12 Jan 2023 10:58:50 +0000 (11:58 +0100)
commit 6532783310e2b2f50dc13f46c49aa6546cb6e7a3 upstream.

Current clear_attr_update procedure in pmu_set_mapping() sets attr_update
field in NULL that is not correct because intel_uncore_type pmu types can
contain several groups in attr_update field. For example, SPR platform
already has uncore_alias_group to update and then UPI topology group will
be added in next patches.

Fix current behavior and clear attr_update group related to mapping only.

Fixes: bb42b3d39781 ("perf/x86/intel/uncore: Expose an Uncore unit to IIO PMON mapping")
Signed-off-by: Alexander Antonov <alexander.antonov@linux.intel.com>
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/20221117122833.3103580-4-alexander.antonov@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/x86/events/intel/uncore_snbep.c

index feef6ee..8f371f3 100644 (file)
@@ -3804,6 +3804,21 @@ static const struct attribute_group *skx_iio_attr_update[] = {
        NULL,
 };
 
+static void pmu_clear_mapping_attr(const struct attribute_group **groups,
+                                  struct attribute_group *ag)
+{
+       int i;
+
+       for (i = 0; groups[i]; i++) {
+               if (groups[i] == ag) {
+                       for (i++; groups[i]; i++)
+                               groups[i - 1] = groups[i];
+                       groups[i - 1] = NULL;
+                       break;
+               }
+       }
+}
+
 static int
 pmu_iio_set_mapping(struct intel_uncore_type *type, struct attribute_group *ag)
 {
@@ -3852,7 +3867,7 @@ clear_attrs:
 clear_topology:
        kfree(type->topology);
 clear_attr_update:
-       type->attr_update = NULL;
+       pmu_clear_mapping_attr(type->attr_update, ag);
        return ret;
 }