Message ID | 20200831150124.206267-1-mlevitsk@redhat.com |
---|---|
Headers | show |
Series | Fix scsi devices plug/unplug races w.r.t virtio-scsi iothread | expand |
On Mon, Aug 31, 2020 at 06:01:21PM +0300, Maxim Levitsky wrote: > The device core first places a device on the bus and then realizes it. > Make scsi_device_find avoid returing such devices to avoid > races in drivers that use an iothread (currently virtio-scsi) > > Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1812399 > > Suggested-by: Paolo Bonzini <pbonzini@redhat.com> > Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com> > --- > hw/scsi/scsi-bus.c | 88 ++++++++++++++++++++++++++++------------------ > 1 file changed, 53 insertions(+), 35 deletions(-) > > diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c > index 92d412b65c..7ceae2c92b 100644 > --- a/hw/scsi/scsi-bus.c > +++ b/hw/scsi/scsi-bus.c > @@ -51,6 +51,56 @@ static const TypeInfo scsi_bus_info = { > }; > static int next_scsi_bus; > > +static SCSIDevice *_scsi_device_find(SCSIBus *bus, int channel, int id, int lun, > + bool include_unrealized) Declaring an identifier with a leading underscore with file scope is undefined behavior according to the C99 standard (7.1.3 Reserved identifiers). QEMU code usually avoids doing this by calling the function do_scsi_device_find() or similar. I'm not aware of any practical problem though, so don't worry about changing it unless you respin the series: Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
On Tue, 2020-09-08 at 16:00 +0100, Stefan Hajnoczi wrote: > On Mon, Aug 31, 2020 at 06:01:21PM +0300, Maxim Levitsky wrote: > > The device core first places a device on the bus and then realizes it. > > Make scsi_device_find avoid returing such devices to avoid > > races in drivers that use an iothread (currently virtio-scsi) > > > > Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1812399 > > > > Suggested-by: Paolo Bonzini <pbonzini@redhat.com> > > Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com> > > --- > > hw/scsi/scsi-bus.c | 88 ++++++++++++++++++++++++++++------------------ > > 1 file changed, 53 insertions(+), 35 deletions(-) > > > > diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c > > index 92d412b65c..7ceae2c92b 100644 > > --- a/hw/scsi/scsi-bus.c > > +++ b/hw/scsi/scsi-bus.c > > @@ -51,6 +51,56 @@ static const TypeInfo scsi_bus_info = { > > }; > > static int next_scsi_bus; > > > > +static SCSIDevice *_scsi_device_find(SCSIBus *bus, int channel, int id, int lun, > > + bool include_unrealized) > > Declaring an identifier with a leading underscore with file scope is > undefined behavior according to the C99 standard (7.1.3 Reserved > identifiers). QEMU code usually avoids doing this by calling the > function do_scsi_device_find() or similar. I'll fix that, thanks! Best regards, Maxim Levitsky > > I'm not aware of any practical problem though, so don't worry about > changing it unless you respin the series: > > Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
On Wed, Sep 09, 2020 at 11:20:24AM +0300, Maxim Levitsky wrote: > On Tue, 2020-09-08 at 16:27 +0100, Stefan Hajnoczi wrote: > > On Mon, Aug 31, 2020 at 06:01:24PM +0300, Maxim Levitsky wrote: > > > @@ -460,46 +466,36 @@ static bool scsi_target_emulate_report_luns(SCSITargetReq *r) > > > } > > > channel = r->req.dev->channel; > > > id = r->req.dev->id; > > > - found_lun0 = false; > > > - n = 0; > > > > > > - rcu_read_lock(); > > > > > > - QTAILQ_FOREACH_RCU(kid, &r->req.bus->qbus.children, sibling) { > > > - DeviceState *qdev = kid->child; > > > - SCSIDevice *dev = SCSI_DEVICE(qdev); > > > + /* add size (will be updated later to correct value */ > > > + g_byte_array_append(buf, tmp, 8); > > > + len += 8; > > > > Can g_byte_array_size() be used instead of keeping a len local variable? > Glib don't seem to have this function, I checked the docs. > Its seems that they want to convert it to GBytes which is basically immutible verion > of GByteArray and it does have g_bytes_get_size. > I decided that a local variable while ugly is still better that this. > > > I haven't wrote much code that uses Glib, so I might have missed something though. > I had read this reference: > https://developer.gnome.org/glib/stable/glib-Byte-Arrays.html Oops, you're right. GByteArray != GBytes. The local variable makes sense. Stefan