Re: [PATCH v2 6/9] perf/cxl: Unfreeze counters after handling an overflow interrupt

Dave Jiang <[email protected]> Thu, 30 Jul 2026 16:00:38 -0700
Newsgroups org.kernel.vger.linux-cxl,org.kernel.vger.linux-perf-users
Message-ID <[email protected]>

On 7/30/26 11:53 AM, Jonathan Cameron wrote:
> On Thu, 30 Jul 2026 13:04:17 +0100
> Robin Murphy <[email protected]> wrote:
> 
>> On 29/07/2026 3:55 pm, Dave Jiang wrote:
>>> The counters are configured with Freeze on Overflow, so when any counter
>>> overflows the CPMU freezes every counter in the block (CXL r4.0
>>> ยง8.2.7.2.1). cxl_pmu_irq() reads the overflowed counters and clears the
>>> overflow status, but never writes the CPMU Freeze register to unfreeze,
>>> so all counters stay frozen until the next pmu_enable() and events in
>>> that window are silently lost.
>>>
>>> Unfreeze after clearing the overflow status so counting resumes.
>>>
>>> Fixes: 5d7107c72796 ("perf: CXL Performance Monitoring Unit driver")
>>> Reported-by: [email protected]
>>> Closes: https://sashiko.dev/#/patchset/[email protected]?part=1
>>> Assisted-by: Claude:claude-opus-4-8
>>> Signed-off-by: Dave Jiang <[email protected]>
>>> ---
>>>   drivers/perf/cxl_pmu.c | 9 +++++++++
>>>   1 file changed, 9 insertions(+)
>>>
>>> diff --git a/drivers/perf/cxl_pmu.c b/drivers/perf/cxl_pmu.c
>>> index 8b89db8f4d68..52e78a6e0960 100644
>>> --- a/drivers/perf/cxl_pmu.c
>>> +++ b/drivers/perf/cxl_pmu.c
>>> @@ -804,6 +804,15 @@ static irqreturn_t cxl_pmu_irq(int irq, void *data)
>>>   
>>>   	writeq(overflowed, base + CXL_PMU_OVERFLOW_REG);
>>>   
>>> +	/*
>>> +	 * Counters are configured to freeze on overflow (Freeze on Overflow),
>>> +	 * which freezes every counter in the CPMU. Once the overflowed counters
>>> +	 * have been read and their status cleared, unfreeze so counting resumes;
>>> +	 * otherwise all counters stay frozen until the next pmu_enable() and
>>> +	 * events are silently lost.
>>> +	 */
>>> +	writeq(0, base + CXL_PMU_FREEZE_REG);  
>>
>> Does this unconditionally unfreeze _all_ counters, including any which 
>> might have have overflowed since the read of CXL_PMU_OVERFLOW_REG and 
>> thus have not been handled yet? Or are we hoping that the "global 
>> freeze" behaviour prevents that from being able to happen?
>>
> 
> Yes global freeze should stop world on first one overflowing - if two go together
> we should see them both in the handler.
> 
>> Furthermore, what if an overflow happens to occur just as 
>> cxl_pmu_disable() is intentionally freezing all the counters, such that 
>> by the time we get here, unfreezing them would be the wrong thing to do?
> 
> Hmm. That may indeed be bad.

I can add a bool as a en/disable state in info to guard against that. > 
>>
>> Thanks,
>> Robin.
>>
>>> +
>>>   	return IRQ_HANDLED;
>>>   }
>>>     
>>
>