Re: [PATCH 4/7] perf/x86/intel/uncore: Factor out box setup code
From: Ian Rogers
Date: Tue May 12 2026 - 20:28:19 EST
On Tue, May 12, 2026 at 4:39 PM Zide Chen <zide.chen@xxxxxxxxx> 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.
>
> Signed-off-by: Zide Chen <zide.chen@xxxxxxxxx>
Reviewed-by: Ian Rogers <irogers@xxxxxxxxxx>
Thanks,
Ian
> ---
> arch/x86/events/intel/uncore.c | 39 ++++++++++++++++++++++++----------
> 1 file changed, 28 insertions(+), 11 deletions(-)
>
> diff --git a/arch/x86/events/intel/uncore.c b/arch/x86/events/intel/uncore.c
> index 8d5170788af2..00ed4e5047ac 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 dies, ret;
> +
> + /* die_refcnt tracks online dies, not only functioning boxes. */
> + dies = atomic_inc_return(&pmu->die_refcnt);
> + uncore_box_init(box);
> +
> + /* First active box registers the pmu. */
> + if (dies > 1)
> + return 0;
> +
> + ret = uncore_pmu_register(pmu);
> + if (ret)
> + goto err;
> +
> + return 0;
> +err:
> + uncore_box_exit(box);
> + return ret;
> +}
> +
> /*
> * Register the PMU for a PCI device
> * @pdev: The PCI device.
> @@ -1173,19 +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->die_refcnt) > 1)
> - return 0;
> -
> - /* First active box registers the pmu */
> - ret = uncore_pmu_register(pmu);
> - if (ret) {
> - 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;
> }
>
> --
> 2.54.0
>