On Tue, Feb 28, 2023 at 04:41:24PM -0500, Steven Rostedt wrote: > On Tue, 28 Feb 2023 13:29:11 -0800 > "Paul E. McKenney" <paulmck@xxxxxxxxxx> wrote: > > > All well and good, but the stall-warning code is nowhere near a fastpath. > > > > Is try_cmpxchg() considered more readable in this context? > > > - cmpxchg(&rcu_state.jiffies_stall, js, jn) == js) { > + try_cmpxchg(&rcu_state.jiffies_stall, &js, jn)) { > > It's basically the same :-/ That was my assessment. ;-) > But looking at this use case, I'd actually NAK it, as it is misleading. > > As try_cmpxchg() is used to get rid of the updating of the old value. As in > the ring buffer code we had: > > void ring_buffer_record_off(struct trace_buffer *buffer) > { > unsigned int rd; > unsigned int new_rd; > > do { > rd = atomic_read(&buffer->record_disabled); > new_rd = rd | RB_BUFFER_OFF; > } while (!atomic_cmpxchg(&buffer->record_disabled, &rd, new_rd) != rd); > } > > and the try_cmpxchg() converted it to: > > void ring_buffer_record_off(struct trace_buffer *buffer) > { > unsigned int rd; > unsigned int new_rd; > > rd = atomic_read(&buffer->record_disabled); > do { > new_rd = rd | RB_BUFFER_OFF; > } while (!atomic_try_cmpxchg(&buffer->record_disabled, &rd, new_rd)); > } > > Which got rid of the need to constantly update the rd variable (cmpxchg > will load rax with the value read, so it removes the need for an extra > move). > > But in your case, we don't need to update js, in which case the > try_cmpxchg() does. > > The patch that Uros sent me for the ring buffer code also does some of > that, which I feel is wrong. > > So with that, I would nack the patch. OK, I will leave this one out. Thanx, Paul