drivers/perf: hisi: add NULL check for name
authorJunhao He <hejunhao3@huawei.com>
Mon, 3 Apr 2023 08:14:23 +0000 (16:14 +0800)
committerWill Deacon <will@kernel.org>
Mon, 17 Apr 2023 12:14:10 +0000 (13:14 +0100)
When allocations fails that can be NULL now.

If the name provided is NULL, then the initialization process of the PMU
type and dev will be skipped in function perf_pmu_register().
Consequently, the PMU will not be able to register into the kernel.
Moreover, in the case of unregister the PMU, the function device_del()
will need to handle NULL pointers, which potentially can cause issues.

So move this allocation above the cpuhp_state_add_instance() and directly
return if it does fail.

Signed-off-by: Junhao He <hejunhao3@huawei.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Link: https://lore.kernel.org/r/20230403081423.62460-3-hejunhao3@huawei.com
Signed-off-by: Will Deacon <will@kernel.org>
drivers/perf/hisilicon/hisi_uncore_ddrc_pmu.c
drivers/perf/hisilicon/hisi_uncore_hha_pmu.c
drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c

index 8a3d74d..ffb039d 100644 (file)
@@ -499,13 +499,6 @@ static int hisi_ddrc_pmu_probe(struct platform_device *pdev)
        if (ret)
                return ret;
 
-       ret = cpuhp_state_add_instance(CPUHP_AP_PERF_ARM_HISI_DDRC_ONLINE,
-                                      &ddrc_pmu->node);
-       if (ret) {
-               dev_err(&pdev->dev, "Error %d registering hotplug;\n", ret);
-               return ret;
-       }
-
        if (ddrc_pmu->identifier >= HISI_PMU_V2)
                name = devm_kasprintf(&pdev->dev, GFP_KERNEL,
                                      "hisi_sccl%u_ddrc%u_%u",
@@ -516,6 +509,16 @@ static int hisi_ddrc_pmu_probe(struct platform_device *pdev)
                                      "hisi_sccl%u_ddrc%u", ddrc_pmu->sccl_id,
                                      ddrc_pmu->index_id);
 
+       if (!name)
+               return -ENOMEM;
+
+       ret = cpuhp_state_add_instance(CPUHP_AP_PERF_ARM_HISI_DDRC_ONLINE,
+                                      &ddrc_pmu->node);
+       if (ret) {
+               dev_err(&pdev->dev, "Error %d registering hotplug;\n", ret);
+               return ret;
+       }
+
        hisi_pmu_init(ddrc_pmu, THIS_MODULE);
 
        ret = perf_pmu_register(&ddrc_pmu->pmu, name, -1);
index 5701a84..15caf99 100644 (file)
@@ -510,6 +510,11 @@ static int hisi_hha_pmu_probe(struct platform_device *pdev)
        if (ret)
                return ret;
 
+       name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "hisi_sccl%u_hha%u",
+                             hha_pmu->sccl_id, hha_pmu->index_id);
+       if (!name)
+               return -ENOMEM;
+
        ret = cpuhp_state_add_instance(CPUHP_AP_PERF_ARM_HISI_HHA_ONLINE,
                                       &hha_pmu->node);
        if (ret) {
@@ -517,8 +522,6 @@ static int hisi_hha_pmu_probe(struct platform_device *pdev)
                return ret;
        }
 
-       name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "hisi_sccl%u_hha%u",
-                             hha_pmu->sccl_id, hha_pmu->index_id);
        hisi_pmu_init(hha_pmu, THIS_MODULE);
 
        ret = perf_pmu_register(&hha_pmu->pmu, name, -1);
index 68596b5..794dbcd 100644 (file)
@@ -544,6 +544,11 @@ static int hisi_l3c_pmu_probe(struct platform_device *pdev)
        if (ret)
                return ret;
 
+       name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "hisi_sccl%u_l3c%u",
+                             l3c_pmu->sccl_id, l3c_pmu->ccl_id);
+       if (!name)
+               return -ENOMEM;
+
        ret = cpuhp_state_add_instance(CPUHP_AP_PERF_ARM_HISI_L3_ONLINE,
                                       &l3c_pmu->node);
        if (ret) {
@@ -551,12 +556,6 @@ static int hisi_l3c_pmu_probe(struct platform_device *pdev)
                return ret;
        }
 
-       /*
-        * CCL_ID is used to identify the L3C in the same SCCL which was
-        * used _UID by mistake.
-        */
-       name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "hisi_sccl%u_l3c%u",
-                             l3c_pmu->sccl_id, l3c_pmu->ccl_id);
        hisi_pmu_init(l3c_pmu, THIS_MODULE);
 
        ret = perf_pmu_register(&l3c_pmu->pmu, name, -1);