From: Paolo Bonzini <pbonzini@redhat.com>
To: "Michael S. Tsirkin" <mst@redhat.com>
Cc: qemu-devel@nongnu.org, agraf@suse.de
Subject: Re: [Qemu-devel] [PATCH 1/2] virtio-pci: reset all qbuses too when writing to the status field
Date: Wed, 12 Dec 2012 18:29:54 +0100 [thread overview]
Message-ID: <50C8BF12.1070906@redhat.com> (raw)
In-Reply-To: <20121212170522.GA18597@redhat.com>
>> No, it's a generic thing. Other virtio devices may have a bus, and they
>> should reset it just as well. virtio-serial's guest_reset function
>> closes each port from its own reset callback manually (since commit
>> 4399722, virtio-serial-bus: Unset guest_connected at reset and driver
>> reset, 2012-04-24). That shouldn't even exist. The ports should close
>> themselves when a reset signal reaches them, and the propagation of the
>> reset should happen automatically just like IMO it should for virtio-scsi.
>>
>> Let's not hide the basic concepts behind "it's a SCSI thing". The
>> concept here is that of a soft and hard reset, and these is the definition:
>>
>> - you soft-reset a device by writing to a register which is in the spec
>> of the device (e.g., write zero to the status register);
>>
>> - you hard-reset a device by writing to a register which is in the spec
>> of the bus (e.g., FLR);
>>
>> - hard reset is a superset of soft reset;
>>
>> - soft-resetting device X will also do a hard reset of all devices below X.
>>
>> For example, a soft-reset of a PCI-to-PCI bridge does a hard-reset of
>> all devices below (qdev_reset_all calls pcibus_reset calls
>> pci_device_reset).
>>
>> In QEMU, qdev_reset_all is a soft reset of a device. qbus_reset_all_fn
>> is a hard reset of all devices below a particular device.
>
> I might be convinced if it's renamed qdev_reset_soft,
> qbus_reset_hard.
Let's rename it.
> As it is it, these look like internal interfaces
> that one needs to poke at implementation to figure out.
Point taken.
>> There is no
>> generic qdev function for a hard reset of a particular device
>> (pci_device_reset is it for the PCI case, just to complete the
>> nomenclature with something you're familiar with).
>>
>> These are all generic concepts. Nothing virtio-specific, nothing
>> SCSI-specific. It's not open for questioning. :)
>
> When we have a similar issue in another device it
> will be easier to see how to do it right.
> At the moment let's fix it locally.
We have a similar issue in virtio-serial.c, and with my patch you can
do this:
diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c
index 155da58..1564482 100644
--- a/hw/virtio-serial-bus.c
+++ b/hw/virtio-serial-bus.c
@@ -532,12 +532,13 @@ static void set_config(VirtIODevice *vdev, const uint8_t *config_data)
memcpy(&config, config_data, sizeof(config));
}
-static void guest_reset(VirtIOSerial *vser)
+static int virtser_bus_reset(BusState *qbus)
{
+ VirtIOSerialBus *bus = DO_UPCAST(VirtIOSerialBus, qbus, qbus);
VirtIOSerialPort *port;
VirtIOSerialPortClass *vsc;
- QTAILQ_FOREACH(port, &vser->ports, next) {
+ QTAILQ_FOREACH(port, &bus->vser->ports, next) {
vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);
if (port->guest_connected) {
port->guest_connected = false;
@@ -546,6 +547,7 @@ static void guest_reset(VirtIOSerial *vser)
vsc->guest_close(port);
}
}
+ return 0;
}
static void set_status(VirtIODevice *vdev, uint8_t status)
@@ -566,17 +568,6 @@ static void set_status(VirtIODevice *vdev, uint8_t status)
*/
port->guest_connected = true;
}
- if (!(status & VIRTIO_CONFIG_S_DRIVER_OK)) {
- guest_reset(vser);
- }
-}
-
-static void vser_reset(VirtIODevice *vdev)
-{
- VirtIOSerial *vser;
-
- vser = DO_UPCAST(VirtIOSerial, vdev, vdev);
- guest_reset(vser);
}
static void virtio_serial_save(QEMUFile *f, void *opaque)
@@ -766,6 +757,7 @@ static void virtser_bus_class_init(ObjectClass *klass, void *data)
{
BusClass *k = BUS_CLASS(klass);
k->print_dev = virtser_bus_dev_print;
+ k->reset = virtser_bus_reset;
}
static const TypeInfo virtser_bus_info = {
@@ -985,7 +977,6 @@ VirtIODevice *virtio_serial_init(DeviceState *dev, virtio_serial_conf *conf)
vser->vdev.get_config = get_config;
vser->vdev.set_config = set_config;
vser->vdev.set_status = set_status;
- vser->vdev.reset = vser_reset;
vser->qdev = dev;
i.e. just implement a method on the bus to do the hard-reset, and let
generic infrastructure call it.
> OK the right thing would be to to qdev_reset_all
> at the virtio scsi level. The modeling
> is wrong though and the devices are not the
> children of the right device.
>
> Sticking the reset in virtio-pci just propagates this bug.
Sticking a bus reset in virtio_pci_reset would. But that's not
what my patch does.
>>> but apparently same applies to virtio-blk which
>>> really has no block bus.
>>
>> virtio-blk has no bus, so it does the reset from its own virtio_reset
>> callback.
>>
>> virtio-scsi needs to ask the SCSIDevices to reset themselves. Whatever
>> virtio-blk does in its reset callback, the SCSIDevices will do---only in
>> a "regular" qdev reset rather than a special-purpose reset callback.
>>
>> I can of course iterate on all the devices, but it is pointless when
>> there is already a perfectly good callback to do a soft reset, and it's
>> called qdev_reset_all.
>
> Fine bug call it from virtio_scsi_reset.
No, because that would also reset the virtio-pci bits (ioeventfd etc.) which
virtio-scsi has no business with. What I could do is to call qbus_reset_all,
but it makes no sense to me when there is a generic solution.
Paolo
next prev parent reply other threads:[~2012-12-12 17:30 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-12-12 14:26 [Qemu-devel] [PATCH 0/2] virtio: reset all qbuses too when writing to the status field Paolo Bonzini
2012-12-12 14:26 ` [Qemu-devel] [PATCH 1/2] virtio-pci: " Paolo Bonzini
2012-12-12 14:44 ` Michael S. Tsirkin
2012-12-12 15:20 ` Paolo Bonzini
2012-12-12 15:33 ` Michael S. Tsirkin
2012-12-12 16:37 ` Paolo Bonzini
2012-12-12 17:05 ` Michael S. Tsirkin
2012-12-12 17:29 ` Paolo Bonzini [this message]
2012-12-12 21:32 ` Michael S. Tsirkin
2012-12-13 7:56 ` Paolo Bonzini
2012-12-12 14:26 ` [Qemu-devel] [PATCH 2/2] virtio-s390: " Paolo Bonzini
2012-12-12 15:38 ` [Qemu-devel] [PATCH 0/2] virtio: " Michael S. Tsirkin
2012-12-12 16:38 ` Paolo Bonzini
2012-12-12 17:18 ` Michael S. Tsirkin
[not found] ` <50C8BF83.4010307@redhat.com>
[not found] ` <20121212212720.GC23087@redhat.com>
2012-12-13 8:54 ` Paolo Bonzini
2012-12-16 17:04 ` Michael S. Tsirkin
2012-12-16 19:31 ` Paolo Bonzini
2012-12-16 21:15 ` Michael S. Tsirkin
2012-12-17 9:24 ` Paolo Bonzini
2012-12-17 10:40 ` Michael S. Tsirkin
2012-12-17 15:14 ` Paolo Bonzini
2012-12-17 15:24 ` Michael S. Tsirkin
2012-12-17 15:37 ` Paolo Bonzini
2012-12-17 16:01 ` Michael S. Tsirkin
2012-12-17 16:14 ` Paolo Bonzini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=50C8BF12.1070906@redhat.com \
--to=pbonzini@redhat.com \
--cc=agraf@suse.de \
--cc=mst@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).