Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 215780
b: refs/heads/master
c: cefa33e
h: refs/heads/master
v: v3
  • Loading branch information
Alexander Graf authored and Avi Kivity committed Oct 24, 2010
1 parent 1bf9153 commit 3e7c618
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: fc678d67fee1acccf21322318dd833b892a572e4
refs/heads/master: cefa33e2f8f7852abb42f22ec25a6084a931c5ac
1 change: 1 addition & 0 deletions trunk/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 trunk/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 3e7c618

Please sign in to comment.