Merge tag 'driver-core-6.10-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-block.git] / drivers / perf / hisilicon / hns3_pmu.c
index 6d9725bdff831331a37db50491cb4647411efed0..c157f3572cae571b07f6a3bb0b5a733e370db00d 100644 (file)
@@ -1075,15 +1075,27 @@ static bool hns3_pmu_validate_event_group(struct perf_event *event)
                        return false;
 
                for (num = 0; num < counters; num++) {
+                       /*
+                        * If we find a related event, then it's a valid group
+                        * since we don't need to allocate a new counter for it.
+                        */
                        if (hns3_pmu_cmp_event(event_group[num], sibling))
                                break;
                }
 
+               /*
+                * Otherwise it's a new event but if there's no available counter,
+                * fail the check since we cannot schedule all the events in
+                * the group simultaneously.
+                */
+               if (num == HNS3_PMU_MAX_HW_EVENTS)
+                       return false;
+
                if (num == counters)
                        event_group[counters++] = sibling;
        }
 
-       return counters <= HNS3_PMU_MAX_HW_EVENTS;
+       return true;
 }
 
 static u32 hns3_pmu_get_filter_condition(struct perf_event *event)
@@ -1409,6 +1421,7 @@ static int hns3_pmu_alloc_pmu(struct pci_dev *pdev, struct hns3_pmu *hns3_pmu)
        hns3_pmu->pmu = (struct pmu) {
                .name           = name,
                .module         = THIS_MODULE,
+               .parent         = &pdev->dev,
                .event_init     = hns3_pmu_event_init,
                .pmu_enable     = hns3_pmu_enable,
                .pmu_disable    = hns3_pmu_disable,
@@ -1505,7 +1518,7 @@ static int hns3_pmu_irq_register(struct pci_dev *pdev,
                return ret;
        }
 
-       ret = devm_add_action(&pdev->dev, hns3_pmu_free_irq, pdev);
+       ret = devm_add_action_or_reset(&pdev->dev, hns3_pmu_free_irq, pdev);
        if (ret) {
                pci_err(pdev, "failed to add free irq action, ret = %d.\n", ret);
                return ret;