diff options
Diffstat (limited to 'virt/kvm/kvm_main.c')
-rw-r--r-- | virt/kvm/kvm_main.c | 39 |
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 | ||
2536 | void kvm_io_bus_register_dev(struct kvm *kvm, struct kvm_io_bus *bus, | 2536 | int 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. */ |
2545 | void __kvm_io_bus_register_dev(struct kvm_io_bus *bus, | 2549 | int __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 | |||
2560 | void 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. */ | ||
2570 | void __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 | ||
2553 | static struct notifier_block kvm_cpu_notifier = { | 2582 | static struct notifier_block kvm_cpu_notifier = { |