Commit 00a8478f authored by Uros Bizjak's avatar Uros Bizjak Committed by Steven Rostedt (Google)

ring_buffer: Use try_cmpxchg instead of cmpxchg

Use try_cmpxchg instead of cmpxchg (*ptr, old, new) == old in
ring_buffer.c. x86 CMPXCHG instruction returns success in ZF flag,
so this change saves a compare after cmpxchg (and related move
instruction in front of cmpxchg).

No functional change intended.

Link: https://lore.kernel.org/linux-trace-kernel/20230714154418.8884-1-ubizjak@gmail.com

Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: default avatarUros Bizjak <ubizjak@gmail.com>
Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
parent e7186af7
...@@ -692,10 +692,7 @@ static void rb_time_set(rb_time_t *t, u64 val) ...@@ -692,10 +692,7 @@ static void rb_time_set(rb_time_t *t, u64 val)
static inline bool static inline bool
rb_time_read_cmpxchg(local_t *l, unsigned long expect, unsigned long set) rb_time_read_cmpxchg(local_t *l, unsigned long expect, unsigned long set)
{ {
unsigned long ret; return local_try_cmpxchg(l, &expect, set);
ret = local_cmpxchg(l, expect, set);
return ret == expect;
} }
static bool rb_time_cmpxchg(rb_time_t *t, u64 expect, u64 set) static bool rb_time_cmpxchg(rb_time_t *t, u64 expect, u64 set)
...@@ -752,9 +749,7 @@ static void rb_time_set(rb_time_t *t, u64 val) ...@@ -752,9 +749,7 @@ static void rb_time_set(rb_time_t *t, u64 val)
static bool rb_time_cmpxchg(rb_time_t *t, u64 expect, u64 set) static bool rb_time_cmpxchg(rb_time_t *t, u64 expect, u64 set)
{ {
u64 val; return local64_try_cmpxchg(&t->time, &expect, set);
val = local64_cmpxchg(&t->time, expect, set);
return val == expect;
} }
#endif #endif
...@@ -1494,14 +1489,11 @@ static bool rb_head_page_replace(struct buffer_page *old, ...@@ -1494,14 +1489,11 @@ static bool rb_head_page_replace(struct buffer_page *old,
{ {
unsigned long *ptr = (unsigned long *)&old->list.prev->next; unsigned long *ptr = (unsigned long *)&old->list.prev->next;
unsigned long val; unsigned long val;
unsigned long ret;
val = *ptr & ~RB_FLAG_MASK; val = *ptr & ~RB_FLAG_MASK;
val |= RB_PAGE_HEAD; val |= RB_PAGE_HEAD;
ret = cmpxchg(ptr, val, (unsigned long)&new->list); return try_cmpxchg(ptr, &val, (unsigned long)&new->list);
return ret == val;
} }
/* /*
...@@ -3003,7 +2995,6 @@ rb_try_to_discard(struct ring_buffer_per_cpu *cpu_buffer, ...@@ -3003,7 +2995,6 @@ rb_try_to_discard(struct ring_buffer_per_cpu *cpu_buffer,
{ {
unsigned long new_index, old_index; unsigned long new_index, old_index;
struct buffer_page *bpage; struct buffer_page *bpage;
unsigned long index;
unsigned long addr; unsigned long addr;
u64 write_stamp; u64 write_stamp;
u64 delta; u64 delta;
...@@ -3060,8 +3051,9 @@ rb_try_to_discard(struct ring_buffer_per_cpu *cpu_buffer, ...@@ -3060,8 +3051,9 @@ rb_try_to_discard(struct ring_buffer_per_cpu *cpu_buffer,
*/ */
old_index += write_mask; old_index += write_mask;
new_index += write_mask; new_index += write_mask;
index = local_cmpxchg(&bpage->write, old_index, new_index);
if (index == old_index) { /* caution: old_index gets updated on cmpxchg failure */
if (local_try_cmpxchg(&bpage->write, &old_index, new_index)) {
/* update counters */ /* update counters */
local_sub(event_length, &cpu_buffer->entries_bytes); local_sub(event_length, &cpu_buffer->entries_bytes);
return true; return true;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment