Re: [PATCH V2 5/8] perf/x86/intel/uncore: Factor out box setup code

From: Mi, Dapeng

Date: Tue Jun 02 2026 - 21:37:27 EST


Reviewed-by: Dapeng Mi <dapeng1.mi@xxxxxxxxxxxxxxx>

On 6/2/2026 1:01 AM, Zide Chen wrote:
> The PCI uncore PMU path already implements a lazy registration model:
> the PMU is registered when the first active box appears and
> unregistered when the last active box is removed.
>
> Factor this registration management into a shared helper, so the same
> code can be reused by the MSR and MMIO paths in later changes.
>
> No functional change intended.
>
> Reviewed-by: Ian Rogers <irogers@xxxxxxxxxx>
> Signed-off-by: Zide Chen <zide.chen@xxxxxxxxx>
> ---
> arch/x86/events/intel/uncore.c | 40 ++++++++++++++++++++++++----------
> 1 file changed, 28 insertions(+), 12 deletions(-)
>
> diff --git a/arch/x86/events/intel/uncore.c b/arch/x86/events/intel/uncore.c
> index 6df44f69cc5b..283e41933ba7 100644
> --- a/arch/x86/events/intel/uncore.c
> +++ b/arch/x86/events/intel/uncore.c
> @@ -1148,6 +1148,29 @@ uncore_pci_find_dev_pmu(struct pci_dev *pdev, const struct pci_device_id *ids)
> return pmu;
> }
>
> +static int uncore_box_setup(struct intel_uncore_pmu *pmu,
> + struct intel_uncore_box *box)
> +{
> + int ret;
> +
> + uncore_box_init(box);
> +
> + /* First active box registers the pmu. */
> + if (atomic_inc_return(&pmu->activeboxes) > 1)
> + return 0;
> +
> + ret = uncore_pmu_register(pmu);
> + if (ret) {
> + atomic_dec(&pmu->activeboxes);
> + goto err;
> + }
> +
> + return 0;
> +err:
> + uncore_box_exit(box);
> + return ret;
> +}
> +
> /*
> * Register the PMU for a PCI device
> * @pdev: The PCI device.
> @@ -1173,20 +1196,13 @@ static int uncore_pci_pmu_register(struct pci_dev *pdev,
> box->dieid = die;
> box->pci_dev = pdev;
> box->pmu = pmu;
> - uncore_box_init(box);
>
> - pmu->boxes[die] = box;
> - if (atomic_inc_return(&pmu->activeboxes) > 1)
> - return 0;
> -
> - /* First active box registers the pmu */
> - ret = uncore_pmu_register(pmu);
> - if (ret) {
> - atomic_dec(&pmu->activeboxes);
> - pmu->boxes[die] = NULL;
> - uncore_box_exit(box);
> + ret = uncore_box_setup(pmu, box);
> + if (!ret)
> + pmu->boxes[die] = box;
> + else
> kfree(box);
> - }
> +
> return ret;
> }
>