linux-perf-users.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/3] perf/hw_breakpoint: Optimize __modify_bp_slot() handling
@ 2025-09-03  7:51 Jinchao Wang
  2025-09-03  7:51 ` [PATCH 2/3] perf/hw_breakpoint: Parse before reserving slots Jinchao Wang
  2025-09-03  7:51 ` [PATCH 3/3] perf/hw_breakpoint: Skip modify_bp_slot() if slot index unchanged Jinchao Wang
  0 siblings, 2 replies; 3+ messages in thread
From: Jinchao Wang @ 2025-09-03  7:51 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Liang, Kan, linux-perf-users
  Cc: linux-kernel, Jinchao Wang

Reserve the new slot first, then release the old one to maintain
consistency and avoid transient failures.

Signed-off-by: Jinchao Wang <wangjinchao600@gmail.com>
---
This patch supersedes the previous version:
https://lore.kernel.org/all/20250902091759.590664-1-wangjinchao600@gmail.com/
---
 kernel/events/hw_breakpoint.c | 19 +++++--------------
 1 file changed, 5 insertions(+), 14 deletions(-)

diff --git a/kernel/events/hw_breakpoint.c b/kernel/events/hw_breakpoint.c
index 8ec2cb688903..6066aff38eec 100644
--- a/kernel/events/hw_breakpoint.c
+++ b/kernel/events/hw_breakpoint.c
@@ -626,22 +626,13 @@ static int __modify_bp_slot(struct perf_event *bp, u64 old_type, u64 new_type)
 {
 	int err;
 
-	__release_bp_slot(bp, old_type);
-
 	err = __reserve_bp_slot(bp, new_type);
-	if (err) {
-		/*
-		 * Reserve the old_type slot back in case
-		 * there's no space for the new type.
-		 *
-		 * This must succeed, because we just released
-		 * the old_type slot in the __release_bp_slot
-		 * call above. If not, something is broken.
-		 */
-		WARN_ON(__reserve_bp_slot(bp, old_type));
-	}
+	if (err)
+		return err;
 
-	return err;
+	__release_bp_slot(bp, old_type);
+
+	return 0;
 }
 
 static int modify_bp_slot(struct perf_event *bp, u64 old_type, u64 new_type)
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH 2/3] perf/hw_breakpoint: Parse before reserving slots
  2025-09-03  7:51 [PATCH 1/3] perf/hw_breakpoint: Optimize __modify_bp_slot() handling Jinchao Wang
@ 2025-09-03  7:51 ` Jinchao Wang
  2025-09-03  7:51 ` [PATCH 3/3] perf/hw_breakpoint: Skip modify_bp_slot() if slot index unchanged Jinchao Wang
  1 sibling, 0 replies; 3+ messages in thread
From: Jinchao Wang @ 2025-09-03  7:51 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Liang, Kan, linux-perf-users
  Cc: linux-kernel, Jinchao Wang

Reserve operations update global slot accounting across CPUs and are more
expensive than local parsing. Parsing only validates and decodes attributes
for the given breakpoint.

By moving parsing ahead of reserving, invalid attributes are rejected
before touching global state. This not only fails fast but also avoids
unnecessary reserve and release cycles.

Signed-off-by: Jinchao Wang <wangjinchao600@gmail.com>
---
 kernel/events/hw_breakpoint.c | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/kernel/events/hw_breakpoint.c b/kernel/events/hw_breakpoint.c
index 6066aff38eec..1db2c5e24d0e 100644
--- a/kernel/events/hw_breakpoint.c
+++ b/kernel/events/hw_breakpoint.c
@@ -706,15 +706,13 @@ int register_perf_hw_breakpoint(struct perf_event *bp)
 	struct arch_hw_breakpoint hw = { };
 	int err;
 
-	err = reserve_bp_slot(bp);
+	err = hw_breakpoint_parse(bp, &bp->attr, &hw);
 	if (err)
 		return err;
 
-	err = hw_breakpoint_parse(bp, &bp->attr, &hw);
-	if (err) {
-		release_bp_slot(bp);
+	err = reserve_bp_slot(bp);
+	if (err)
 		return err;
-	}
 
 	bp->hw.info = hw;
 
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH 3/3] perf/hw_breakpoint: Skip modify_bp_slot() if slot index unchanged
  2025-09-03  7:51 [PATCH 1/3] perf/hw_breakpoint: Optimize __modify_bp_slot() handling Jinchao Wang
  2025-09-03  7:51 ` [PATCH 2/3] perf/hw_breakpoint: Parse before reserving slots Jinchao Wang
@ 2025-09-03  7:51 ` Jinchao Wang
  1 sibling, 0 replies; 3+ messages in thread
From: Jinchao Wang @ 2025-09-03  7:51 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Liang, Kan, linux-perf-users
  Cc: linux-kernel, Jinchao Wang

Only call modify_bp_slot() when the old and new breakpoint types map to
different slot indices.

This avoids unnecessary release/reserve operations and improves efficiency.

Signed-off-by: Jinchao Wang <wangjinchao600@gmail.com>
---
 kernel/events/hw_breakpoint.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/kernel/events/hw_breakpoint.c b/kernel/events/hw_breakpoint.c
index 1db2c5e24d0e..6fed9521baf2 100644
--- a/kernel/events/hw_breakpoint.c
+++ b/kernel/events/hw_breakpoint.c
@@ -752,6 +752,7 @@ modify_user_hw_breakpoint_check(struct perf_event *bp, struct perf_event_attr *a
 {
 	struct arch_hw_breakpoint hw = { };
 	int err;
+	enum bp_type_idx old_type_idx, new_type_idx;
 
 	err = hw_breakpoint_parse(bp, attr, &hw);
 	if (err)
@@ -766,7 +767,9 @@ modify_user_hw_breakpoint_check(struct perf_event *bp, struct perf_event_attr *a
 			return -EINVAL;
 	}
 
-	if (bp->attr.bp_type != attr->bp_type) {
+	old_type_idx = find_slot_idx(bp->attr.bp_type);
+	new_type_idx = find_slot_idx(attr->bp_type);
+	if (old_type_idx != new_type_idx) {
 		err = modify_bp_slot(bp, bp->attr.bp_type, attr->bp_type);
 		if (err)
 			return err;
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2025-09-03  7:52 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-03  7:51 [PATCH 1/3] perf/hw_breakpoint: Optimize __modify_bp_slot() handling Jinchao Wang
2025-09-03  7:51 ` [PATCH 2/3] perf/hw_breakpoint: Parse before reserving slots Jinchao Wang
2025-09-03  7:51 ` [PATCH 3/3] perf/hw_breakpoint: Skip modify_bp_slot() if slot index unchanged Jinchao Wang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).