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>
 
        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",
                                      "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);
 
        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) {
                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);
 
        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) {
                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);