[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v3 5/8] virtio-ccw: cleanup.
From: |
Cornelia Huck |
Subject: |
Re: [Qemu-devel] [PATCH v3 5/8] virtio-ccw: cleanup. |
Date: |
Mon, 15 Apr 2013 15:38:42 +0200 |
On Sun, 14 Apr 2013 23:26:34 +0200
address@hidden wrote:
> From: KONRAD Frederic <address@hidden>
>
> This is a cleanup for virtio-ccw.
> The init function is replaced by the device_plugged callback from
> virtio-bus.
Hm, so you replaced a callback that might return an error by another
one that can't...
>
> Signed-off-by: KONRAD Frederic <address@hidden>
> ---
> hw/s390x/virtio-ccw.c | 34 ++++++++++++++--------------------
> 1 file changed, 14 insertions(+), 20 deletions(-)
>
> diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c
> index 5d62606..4857f97 100644
> --- a/hw/s390x/virtio-ccw.c
> +++ b/hw/s390x/virtio-ccw.c
> @@ -392,8 +392,10 @@ static int virtio_ccw_cb(SubchDev *sch, CCW1 ccw)
> return ret;
> }
>
> -static int virtio_ccw_device_init(VirtioCcwDevice *dev, VirtIODevice *vdev)
> +/* This is called by virtio-bus just after the device is plugged. */
> +static void virtio_ccw_device_plugged(DeviceState *d)
> {
> + VirtioCcwDevice *dev = VIRTIO_CCW_DEVICE(d);
> unsigned int cssid = 0;
> unsigned int ssid = 0;
> unsigned int schid;
> @@ -401,7 +403,6 @@ static int virtio_ccw_device_init(VirtioCcwDevice *dev,
> VirtIODevice *vdev)
> bool have_devno = false;
> bool found = false;
> SubchDev *sch;
> - int ret;
> int num;
> DeviceState *parent = DEVICE(dev);
>
> @@ -410,7 +411,7 @@ static int virtio_ccw_device_init(VirtioCcwDevice *dev,
> VirtIODevice *vdev)
> sch->driver_data = dev;
> dev->sch = sch;
>
> - dev->vdev = vdev;
> + dev->vdev = dev->bus.vdev;
> dev->indicators = 0;
>
> /* Initialize subchannel structure. */
> @@ -425,19 +426,16 @@ static int virtio_ccw_device_init(VirtioCcwDevice *dev,
> VirtIODevice *vdev)
> num = sscanf(dev->bus_id, "%x.%x.%04x", &cssid, &ssid, &devno);
> if (num == 3) {
> if ((cssid > MAX_CSSID) || (ssid > MAX_SSID)) {
> - ret = -EINVAL;
> error_report("Invalid cssid or ssid: cssid %x, ssid %x",
> cssid, ssid);
> goto out_err;
> }
> /* Enforce use of virtual cssid. */
> if (cssid != VIRTUAL_CSSID) {
> - ret = -EINVAL;
> error_report("cssid %x not valid for virtio devices", cssid);
> goto out_err;
> }
> if (css_devno_used(cssid, ssid, devno)) {
> - ret = -EEXIST;
> error_report("Device %x.%x.%04x already exists", cssid, ssid,
> devno);
> goto out_err;
> @@ -447,7 +445,6 @@ static int virtio_ccw_device_init(VirtioCcwDevice *dev,
> VirtIODevice *vdev)
> sch->devno = devno;
> have_devno = true;
> } else {
> - ret = -EINVAL;
> error_report("Malformed devno parameter '%s'", dev->bus_id);
> goto out_err;
> }
> @@ -464,7 +461,6 @@ static int virtio_ccw_device_init(VirtioCcwDevice *dev,
> VirtIODevice *vdev)
> }
> }
> if (!found) {
> - ret = -ENODEV;
> error_report("No free subchannel found for %x.%x.%04x", cssid,
> ssid,
> devno);
> goto out_err;
> @@ -488,7 +484,6 @@ static int virtio_ccw_device_init(VirtioCcwDevice *dev,
> VirtIODevice *vdev)
> if (devno == MAX_SCHID) {
> devno = 0;
> } else if (devno == schid - 1) {
> - ret = -ENODEV;
> error_report("No free devno found");
> goto out_err;
> } else {
> @@ -506,7 +501,6 @@ static int virtio_ccw_device_init(VirtioCcwDevice *dev,
> VirtIODevice *vdev)
> }
> }
> if (!found) {
> - ret = -ENODEV;
> error_report("Virtual channel subsystem is full!");
> goto out_err;
> }
> @@ -525,20 +519,19 @@ static int virtio_ccw_device_init(VirtioCcwDevice *dev,
> VirtIODevice *vdev)
> sch->id.cu_type = VIRTIO_CCW_CU_TYPE;
> sch->id.cu_model = dev->vdev->device_id;
>
> - virtio_bind_device(vdev, &virtio_ccw_bindings, DEVICE(dev));
> /* Only the first 32 feature bits are used. */
> - dev->host_features[0] = vdev->get_features(vdev, dev->host_features[0]);
> + dev->host_features[0] = dev->vdev->get_features(dev->vdev,
> + dev->host_features[0]);
> dev->host_features[0] |= 0x1 << VIRTIO_F_NOTIFY_ON_EMPTY;
> dev->host_features[0] |= 0x1 << VIRTIO_F_BAD_FEATURE;
>
> css_generate_sch_crws(sch->cssid, sch->ssid, sch->schid,
> parent->hotplugged, 1);
> - return 0;
> + return;
>
> out_err:
> dev->sch = NULL;
> g_free(sch);
> - return ret;
What happens here? We now have a VirtioCcwDevice without an associated
subchannel device (i. e. no way to do any I/O). With the old code, we'd
just have failed initializing the virtio device, but now we have a
useless device laying around.
> }
>
> static int virtio_ccw_exit(VirtioCcwDevice *dev)
- [Qemu-devel] [PATCH v3 0/8] virtio-refactoring cleanup., fred . konrad, 2013/04/14
- [Qemu-devel] [PATCH v3 2/8] virtio-bus: make virtio_x_bus_new static., fred . konrad, 2013/04/14
- [Qemu-devel] [PATCH v3 3/8] virtio-pci: cleanup., fred . konrad, 2013/04/14
- [Qemu-devel] [PATCH v3 1/8] virtio-bus: add new functions., fred . konrad, 2013/04/14
- [Qemu-devel] [PATCH v3 4/8] s390-virtio-bus: cleanup., fred . konrad, 2013/04/14
- [Qemu-devel] [PATCH v3 5/8] virtio-ccw: cleanup., fred . konrad, 2013/04/14
- Re: [Qemu-devel] [PATCH v3 5/8] virtio-ccw: cleanup.,
Cornelia Huck <=
- [Qemu-devel] [PATCH v3 6/8] virtio: remove the function pointer., fred . konrad, 2013/04/14
- [Qemu-devel] [PATCH v3 8/8] virtio: cleanup: init and exit function., fred . konrad, 2013/04/14
- [Qemu-devel] [PATCH v3 7/8] virtio: remove virtiobindings., fred . konrad, 2013/04/14