Skip to contentSkip to conversation

lib: sbi_pmu: Honor CLEAR_VALUE/AUTO_START for all hardware event types

PATCH Applied David E. Garcia Porras 2 participants 2 messages May 22 – Jun 12

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 lib: sbi_pmu: Honor CLEAR_VALUE/AUTO_START for all hardware event types

sbi_pmu_ctr_cfg_match() only acts on SBI_PMU_CFG_FLAG_CLEAR_VALUE and SBI_PMU_CFG_FLAG_AUTO_START when the event type is SBI_PMU_EVENT_TYPE_HW. However, pmu_ctr_find_hw() allocates a hardware counter from the same hw_event_map for SBI_PMU_EVENT_TYPE_HW_CACHE, SBI_PMU_EVENT_TYPE_HW_RAW, and SBI_PMU_EVENT_TYPE_HW_RAW_V2 as well, and the start/clear helpers (pmu_ctr_start_hw, pmu_ctr_write_hw) operate on the counter index alone and are agnostic to the event type. As a result, when a supervisor configures a HW_CACHE/HW_RAW/HW_RAW_V2 event with these flags, the counter is programmed and recorded in active_events[] but is never cleared or started, requiring an extra SBI call to make it count.

Extend the check to cover all hardware-counter event types so that the configuration flags take effect for HW_CACHE and raw events too.

Deliberately avoiding using "not FW" logic to be explicit about HW-backed events only.

Fixes 13d40f21 ("lib: sbi: Add PMU support")
---
 lib/sbi/sbi_pmu.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
lib/sbi/sbi_pmu.c +4 -1
index 8a9021e2..480a9723 100644
@@ -946,7 +946,10 @@ int sbi_pmu_ctr_cfg_match(unsigned long cidx_base, unsigned long cidx_mask,
 
 	phs->active_events[ctr_idx] = event_idx;
 skip_match:
-	if (event_type == SBI_PMU_EVENT_TYPE_HW) {
+	if (event_type == SBI_PMU_EVENT_TYPE_HW ||
+	    event_type == SBI_PMU_EVENT_TYPE_HW_CACHE ||
+	    event_type == SBI_PMU_EVENT_TYPE_HW_RAW ||
+	    event_type == SBI_PMU_EVENT_TYPE_HW_RAW_V2) {
 		if (flags & SBI_PMU_CFG_FLAG_CLEAR_VALUE)
 			pmu_ctr_write_hw(ctr_idx, 0);
 		if (flags & SBI_PMU_CFG_FLAG_AUTO_START)
Signature · 7 lines
2.43.0


-- 
opensbi mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/opensbi
Reviewed-by on v1 1/1 Applied
#1 lore raw
Quoted 12 lines · David E. Garcia Porras

sbi_pmu_ctr_cfg_match() only acts on SBI_PMU_CFG_FLAG_CLEAR_VALUE and SBI_PMU_CFG_FLAG_AUTO_START when the event type is SBI_PMU_EVENT_TYPE_HW. However, pmu_ctr_find_hw() allocates a hardware counter from the same hw_event_map for SBI_PMU_EVENT_TYPE_HW_CACHE, SBI_PMU_EVENT_TYPE_HW_RAW, and SBI_PMU_EVENT_TYPE_HW_RAW_V2 as well, and the start/clear helpers (pmu_ctr_start_hw, pmu_ctr_write_hw) operate on the counter index alone and are agnostic to the event type. As a result, when a supervisor configures a HW_CACHE/HW_RAW/HW_RAW_V2 event with these flags, the counter is programmed and recorded in active_events[] but is never cleared or started, requiring an extra SBI call to make it count.

Quoted 7 lines

Extend the check to cover all hardware-counter event types so that the configuration flags take effect for HW_CACHE and raw events too.

Deliberately avoiding using "not FW" logic to be explicit about HW-backed events only.

Fixes 13d40f21 ("lib: sbi: Add PMU support")

LGTM.

Applied this patch to the riscv/opensbi repo.

Thanks,
Anup

Quoted 28 lines
---
 lib/sbi/sbi_pmu.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
lib/sbi/sbi_pmu.c +4 -2
index 8a9021e2..480a9723 100644
@@ -946,7 +946,10 @@ int sbi_pmu_ctr_cfg_match(unsigned long cidx_base, unsigned long cidx_mask,
 
        phs->active_events[ctr_idx] = event_idx;
 skip_match:
-       if (event_type == SBI_PMU_EVENT_TYPE_HW) {
+       if (event_type == SBI_PMU_EVENT_TYPE_HW ||
+           event_type == SBI_PMU_EVENT_TYPE_HW_CACHE ||
+           event_type == SBI_PMU_EVENT_TYPE_HW_RAW ||
+           event_type == SBI_PMU_EVENT_TYPE_HW_RAW_V2) {
                if (flags & SBI_PMU_CFG_FLAG_CLEAR_VALUE)
                        pmu_ctr_write_hw(ctr_idx, 0);
                if (flags & SBI_PMU_CFG_FLAG_AUTO_START)
--

2.43.0

--
opensbi mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/opensbi

Signature · 3 lines
opensbi mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/opensbi