Skip to content

Commit

Permalink
KVM: S390: Add virtio hotplug add support
Browse files Browse the repository at this point in the history
The one big missing feature in s390-virtio was hotplugging. This is no more.
This patch implements hotplug add support, so you can on the fly add new devices
in the guest.

Keep in mind that this needs a patch for qemu to actually leverage the
functionality.

Signed-off-by: Alexander Graf <agraf@suse.de>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
  • Loading branch information
Alexander Graf authored and Avi Kivity committed Oct 24, 2010
1 parent fc678d6 commit cefa33e
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 0 deletions.
1 change: 1 addition & 0 deletions arch/s390/include/asm/kvm_virtio.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,5 +59,6 @@ struct kvm_vqconfig {
#define VIRTIO_PARAM_MASK 0xff
#define VIRTIO_PARAM_VRING_INTERRUPT 0x0
#define VIRTIO_PARAM_CONFIG_CHANGED 0x1
#define VIRTIO_PARAM_DEV_ADD 0x2

#endif
47 changes: 47 additions & 0 deletions drivers/s390/kvm/kvm_virtio.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
* The pointer to our (page) of device descriptions.
*/
static void *kvm_devices;
struct work_struct hotplug_work;

struct kvm_device {
struct virtio_device vdev;
Expand Down Expand Up @@ -327,6 +328,47 @@ static void scan_devices(void)
}
}

/*
* match for a kvm device with a specific desc pointer
*/
static int match_desc(struct device *dev, void *data)
{
if ((ulong)to_kvmdev(dev_to_virtio(dev))->desc == (ulong)data)
return 1;

return 0;
}

/*
* hotplug_device tries to find changes in the device page.
*/
static void hotplug_devices(struct work_struct *dummy)
{
unsigned int i;
struct kvm_device_desc *d;
struct device *dev;

for (i = 0; i < PAGE_SIZE; i += desc_size(d)) {
d = kvm_devices + i;

/* end of list */
if (d->type == 0)
break;

/* device already exists */
dev = device_find_child(kvm_root, d, match_desc);
if (dev) {
/* XXX check for hotplug remove */
put_device(dev);
continue;
}

/* new device */
printk(KERN_INFO "Adding new virtio device %p\n", d);
add_kvm_device(d, i);
}
}

/*
* we emulate the request_irq behaviour on top of s390 extints
*/
Expand Down Expand Up @@ -357,6 +399,9 @@ static void kvm_extint_handler(u16 code)

break;
}
case VIRTIO_PARAM_DEV_ADD:
schedule_work(&hotplug_work);
break;
case VIRTIO_PARAM_VRING_INTERRUPT:
default:
vring_interrupt(0, vq);
Expand Down Expand Up @@ -390,6 +435,8 @@ static int __init kvm_devices_init(void)

kvm_devices = (void *) real_memory_size;

INIT_WORK(&hotplug_work, hotplug_devices);

ctl_set_bit(0, 9);
register_external_interrupt(0x2603, kvm_extint_handler);

Expand Down

0 comments on commit cefa33e

Please sign in to comment.