Skip to content

Commit

Permalink
drivers/perf: hisi: add NULL check for name
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: Jonathan Cameron <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Will Deacon <[email protected]>
  • Loading branch information
Junhao He authored and willdeacon committed Apr 17, 2023
1 parent 25d8c25 commit 257aedb
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 15 deletions.
17 changes: 10 additions & 7 deletions drivers/perf/hisilicon/hisi_uncore_ddrc_pmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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);
Expand Down
7 changes: 5 additions & 2 deletions drivers/perf/hisilicon/hisi_uncore_hha_pmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -510,15 +510,18 @@ 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) {
dev_err(&pdev->dev, "Error %d registering hotplug\n", 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);
Expand Down
11 changes: 5 additions & 6 deletions drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -544,19 +544,18 @@ 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) {
dev_err(&pdev->dev, "Error %d registering hotplug\n", 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);
Expand Down

0 comments on commit 257aedb

Please sign in to comment.