On Thu, Apr 16, 2020 at 11:36:23PM +0300, Maxim Levitsky wrote: > Some code might race with placement of new devices on a bus. > We currently first place a (unrealized) device on the bus > and then realize it. > > As a workaround, users that scan the child device list, can > check the realized property to see if it is safe to access such a device. > Use an atomic write here too to aid with this. > > A separate discussion is what to do with devices that are unrealized: > It looks like for this case we only call the hotplug handler's unplug > callback and its up to it to unrealize the device. > An atomic operation doesn't cause harm for this code path though. > > Signed-off-by: Maxim Levitsky > --- > hw/core/qdev.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/hw/core/qdev.c b/hw/core/qdev.c > index f0c87e582e..bbb1ae3eb3 100644 > --- a/hw/core/qdev.c > +++ b/hw/core/qdev.c > @@ -983,7 +983,7 @@ static void device_set_realized(Object *obj, bool value, Error **errp) > } > > assert(local_err == NULL); > - dev->realized = value; > + atomic_set(&dev->realized, value); A memory barrier is probably needed so that the atomic_read() thread sees up-to-date dev fields. Stefan