Skip to content

Commit

Permalink
Merge remote-tracking branch 'remotes/amit/for-2.2' into staging
Browse files Browse the repository at this point in the history
* remotes/amit/for-2.2:
  virtio-serial: search for duplicate port names before adding new ports
  virtio-serial: create a linked list of all active devices

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
  • Loading branch information
pm215 committed Aug 18, 2014
2 parents 08ab597 + d0a0bfe commit 073fd73
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 0 deletions.
32 changes: 32 additions & 0 deletions hw/char/virtio-serial-bus.c
Expand Up @@ -26,6 +26,10 @@
#include "hw/virtio/virtio-serial.h"
#include "hw/virtio/virtio-access.h"

struct VirtIOSerialDevices {
QLIST_HEAD(, VirtIOSerial) devices;
} vserdevices;

static VirtIOSerialPort *find_port_by_id(VirtIOSerial *vser, uint32_t id)
{
VirtIOSerialPort *port;
Expand All @@ -52,6 +56,22 @@ static VirtIOSerialPort *find_port_by_vq(VirtIOSerial *vser, VirtQueue *vq)
return NULL;
}

static VirtIOSerialPort *find_port_by_name(char *name)
{
VirtIOSerial *vser;

QLIST_FOREACH(vser, &vserdevices.devices, next) {
VirtIOSerialPort *port;

QTAILQ_FOREACH(port, &vser->ports, next) {
if (!strcmp(port->name, name)) {
return port;
}
}
}
return NULL;
}

static bool use_multiport(VirtIOSerial *vser)
{
VirtIODevice *vdev = VIRTIO_DEVICE(vser);
Expand Down Expand Up @@ -851,6 +871,12 @@ static void virtser_port_device_realize(DeviceState *dev, Error **errp)
return;
}

if (find_port_by_name(port->name)) {
error_setg(errp, "virtio-serial-bus: A port already exists by name %s",
port->name);
return;
}

if (port->id == VIRTIO_CONSOLE_BAD_ID) {
if (plugging_port0) {
port->id = 0;
Expand Down Expand Up @@ -983,6 +1009,8 @@ static void virtio_serial_device_realize(DeviceState *dev, Error **errp)
*/
register_savevm(dev, "virtio-console", -1, 3, virtio_serial_save,
virtio_serial_load, vser);

QLIST_INSERT_HEAD(&vserdevices.devices, vser, next);
}

static void virtio_serial_port_class_init(ObjectClass *klass, void *data)
Expand Down Expand Up @@ -1011,6 +1039,8 @@ static void virtio_serial_device_unrealize(DeviceState *dev, Error **errp)
VirtIODevice *vdev = VIRTIO_DEVICE(dev);
VirtIOSerial *vser = VIRTIO_SERIAL(dev);

QLIST_REMOVE(vser, next);

unregister_savevm(dev, "virtio-console", vser);

g_free(vser->ivqs);
Expand All @@ -1035,6 +1065,8 @@ static void virtio_serial_class_init(ObjectClass *klass, void *data)
DeviceClass *dc = DEVICE_CLASS(klass);
VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);

QLIST_INIT(&vserdevices.devices);

dc->props = virtio_serial_properties;
set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
vdc->realize = virtio_serial_device_realize;
Expand Down
2 changes: 2 additions & 0 deletions include/hw/virtio/virtio-serial.h
Expand Up @@ -202,6 +202,8 @@ struct VirtIOSerial {

QTAILQ_HEAD(, VirtIOSerialPort) ports;

QLIST_ENTRY(VirtIOSerial) next;

/* bitmap for identifying active ports */
uint32_t *ports_map;

Expand Down

0 comments on commit 073fd73

Please sign in to comment.