aboutsummaryrefslogtreecommitdiffstats
path: root/virt/kvm/kvm_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'virt/kvm/kvm_main.c')
-rw-r--r--virt/kvm/kvm_main.c39
1 files changed, 34 insertions, 5 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index fc1b58a72757..9c2fd025b8ae 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -2533,21 +2533,50 @@ int kvm_io_bus_read(struct kvm_io_bus *bus, gpa_t addr, int len, void *val)
2533 return -EOPNOTSUPP; 2533 return -EOPNOTSUPP;
2534} 2534}
2535 2535
2536void kvm_io_bus_register_dev(struct kvm *kvm, struct kvm_io_bus *bus, 2536int kvm_io_bus_register_dev(struct kvm *kvm, struct kvm_io_bus *bus,
2537 struct kvm_io_device *dev) 2537 struct kvm_io_device *dev)
2538{ 2538{
2539 int ret;
2540
2539 down_write(&kvm->slots_lock); 2541 down_write(&kvm->slots_lock);
2540 __kvm_io_bus_register_dev(bus, dev); 2542 ret = __kvm_io_bus_register_dev(bus, dev);
2541 up_write(&kvm->slots_lock); 2543 up_write(&kvm->slots_lock);
2544
2545 return ret;
2542} 2546}
2543 2547
2544/* An unlocked version. Caller must have write lock on slots_lock. */ 2548/* An unlocked version. Caller must have write lock on slots_lock. */
2545void __kvm_io_bus_register_dev(struct kvm_io_bus *bus, 2549int __kvm_io_bus_register_dev(struct kvm_io_bus *bus,
2546 struct kvm_io_device *dev) 2550 struct kvm_io_device *dev)
2547{ 2551{
2548 BUG_ON(bus->dev_count > (NR_IOBUS_DEVS-1)); 2552 if (bus->dev_count > NR_IOBUS_DEVS-1)
2553 return -ENOSPC;
2549 2554
2550 bus->devs[bus->dev_count++] = dev; 2555 bus->devs[bus->dev_count++] = dev;
2556
2557 return 0;
2558}
2559
2560void kvm_io_bus_unregister_dev(struct kvm *kvm,
2561 struct kvm_io_bus *bus,
2562 struct kvm_io_device *dev)
2563{
2564 down_write(&kvm->slots_lock);
2565 __kvm_io_bus_unregister_dev(bus, dev);
2566 up_write(&kvm->slots_lock);
2567}
2568
2569/* An unlocked version. Caller must have write lock on slots_lock. */
2570void __kvm_io_bus_unregister_dev(struct kvm_io_bus *bus,
2571 struct kvm_io_device *dev)
2572{
2573 int i;
2574
2575 for (i = 0; i < bus->dev_count; i++)
2576 if (bus->devs[i] == dev) {
2577 bus->devs[i] = bus->devs[--bus->dev_count];
2578 break;
2579 }
2551} 2580}
2552 2581
2553static struct notifier_block kvm_cpu_notifier = { 2582static struct notifier_block kvm_cpu_notifier = {