Re: [PATCH v3 4/9] perf/cxl: Split the MSI vector out of info->irq

Robin Murphy <[email protected]> Mon, 3 Aug 2026 13:04:33 +0100
Newsgroups org.kernel.vger.linux-cxl,org.kernel.vger.linux-perf-users
Message-ID <[email protected]>
On 01/08/2026 12:28 am, Dave Jiang wrote:
> info->irq means two different things depending on how far probe has got.
> cxl_pmu_parse_caps() sets it to the MSI/MSI-X message number from the CPMU
> Capability register. cxl_pmu_probe() passes that to pci_irq_vector() and
> then overwrites it with the Linux virq, which is what the hotplug callbacks
> hand to irq_set_affinity().
> 
> Give the message number its own field. No functional change.

Thanks, this makes it much less confusing;

Reviewed-by: Robin Murphy <[email protected]>

If the fix itself was just the comparison operator then I'd suggest 
folding it in so as to avoid extra backporting dependencies/conflicts, 
but it sounds like we might have a corner case where 0 may still mean 
"no IRQ", so maybe sort that first then put this refactoring on top?

Cheers,
Robin.

> Assisted-by: Claude:claude-opus-4-8
> Signed-off-by: Dave Jiang <[email protected]>
> ---
> v3:
> - New patch
> ---
>   drivers/perf/cxl_pmu.c | 9 +++++----
>   1 file changed, 5 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/perf/cxl_pmu.c b/drivers/perf/cxl_pmu.c
> index 3511d049aea4..56e6ae7bebf7 100644
> --- a/drivers/perf/cxl_pmu.c
> +++ b/drivers/perf/cxl_pmu.c
> @@ -106,6 +106,7 @@ struct cxl_pmu_info {
>   	int on_cpu;
>   	struct hlist_node node;
>   	bool filter_hdm;
> +	int msi_vec;
>   	int irq;
>   };
>   
> @@ -143,9 +144,9 @@ static int cxl_pmu_parse_caps(struct device *dev, struct cxl_pmu_info *info)
>   
>   	info->filter_hdm = FIELD_GET(CXL_PMU_CAP_FILTERS_SUP_MSK, val) & CXL_PMU_FILTER_HDM;
>   	if (FIELD_GET(CXL_PMU_CAP_INT, val))
> -		info->irq = FIELD_GET(CXL_PMU_CAP_MSI_N_MSK, val);
> +		info->msi_vec = FIELD_GET(CXL_PMU_CAP_MSI_N_MSK, val);
>   	else
> -		info->irq = -1;
> +		info->msi_vec = -1;
>   
>   	/* First handle fixed function counters; note if configurable counters found */
>   	for (i = 0; i < info->num_counters; i++) {
> @@ -874,10 +875,10 @@ static int cxl_pmu_probe(struct device *dev)
>   		.capabilities = PERF_PMU_CAP_NO_EXCLUDE,
>   	};
>   
> -	if (info->irq <= 0)
> +	if (info->msi_vec <= 0)
>   		return -EINVAL;
>   
> -	rc = pci_irq_vector(pdev, info->irq);
> +	rc = pci_irq_vector(pdev, info->msi_vec);
>   	if (rc < 0)
>   		return rc;
>   	irq = rc;