Re: [PATCH v3 11/17] rv: Retry when da monitor detects race conditions
From: Nam Cao <hidden>
Date: 2025-07-15 15:23:26
Also in:
lkml
On Tue, Jul 15, 2025 at 09:14:28AM +0200, Gabriele Monaco wrote:
static inline bool \
da_event_##name(struct da_monitor *da_mon, enum events_##name event) \
{ \
- type curr_state = da_monitor_curr_state_##name(da_mon); \
- type next_state = model_get_next_state_##name(curr_state, event); \
- \
- if (next_state != INVALID_STATE) { \
- da_monitor_set_state_##name(da_mon, next_state); \
- \
- trace_event_##name(model_get_state_name_##name(curr_state), \
- model_get_event_name_##name(event), \
- model_get_state_name_##name(next_state), \
- model_is_final_state_##name(next_state)); \
- \
- return true; \
+ enum states_##name curr_state, next_state; \
+ \
+ curr_state = READ_ONCE(da_mon->curr_state); \
+ for (int i = 0; i < MAX_DA_RETRY_RACING_EVENTS; i++) { \
+ next_state = model_get_next_state_##name(curr_state, event); \
+ if (next_state == INVALID_STATE) \
+ goto out_react; \
+ if (likely(try_cmpxchg(&da_mon->curr_state, &curr_state, next_state))) \
+ goto out_success; \
} \
+ /* Special invalid transition if we run out of retries. */ \
+ curr_state = INVALID_STATE; \
\
+out_react: \
cond_react_##name(curr_state, event); \
\
trace_error_##name(model_get_state_name_##name(curr_state), \
model_get_event_name_##name(event)); \If I understand correctly, if after 3 tries and we still fail to change the state, we will invoke the reactor and trace_error? Doesn't that cause a false positive? Because it is not a violation of the model, it is just a race making us fail to change the state. Same below. Also, I wouldn't use goto unless necessary. Perhaps it is better to put the code at "out_react:" and "out_success:" into the loop. But that's just my personal preference, up to you. Nam