On Mon, Jun 22, 2020 at 10:02:50 +0100, Alex Bennée wrote: > Emilio G. Cota <c...@braap.org> writes: > > On Wed, Jun 10, 2020 at 16:55:06 +0100, Alex Bennée wrote: (snip) > >> +#ifdef CONFIG_PLUGIN > >> + > >> +typedef struct SavedIOTLB { > >> + struct rcu_head rcu; > >> + struct SavedIOTLB **save_loc; > >> + MemoryRegionSection *section; > >> + hwaddr mr_offset; > >> +} SavedIOTLB; > >> + > >> +static void clean_saved_entry(SavedIOTLB *s) > >> +{ > >> + atomic_rcu_set(s->save_loc, NULL); > > > > This will race with the CPU thread that sets saved_for_plugin in > > save_iotlb_data(). > > Surely that only happens outside the critical section?
I am not sure which critical section you're referring to. With call_rcu() we defer the execution of the function to the RCU thread at a later time, where "later time" is defined as any time after the pre-existing RCU read critical sections have elapsed. So we could have the RCU thread clearing the variable while the CPU thread, which is in a _later_ RCU read critical section, is setting said variable. This is the race I was referring to. Thanks, Emilio