Ignore:
Timestamp:
Apr 21, 2017, 4:28:29 AM (5 weeks ago)
Author:
brainslayer
Message:

update

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/linux/universal/linux-3.18/virt/kvm/kvm_main.c

    r30469 r31885  
    615615        spin_unlock(&kvm_lock);
    616616        kvm_free_irq_routing(kvm);
    617         for (i = 0; i < KVM_NR_BUSES; i++)
    618                 kvm_io_bus_destroy(kvm->buses[i]);
     617        for (i = 0; i < KVM_NR_BUSES; i++) {
     618                if (kvm->buses[i])
     619                        kvm_io_bus_destroy(kvm->buses[i]);
     620                kvm->buses[i] = NULL;
     621        }
    619622        kvm_coalesced_mmio_free(kvm);
    620623#if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER)
     
    29792982
    29802983        bus = srcu_dereference(kvm->buses[bus_idx], &kvm->srcu);
     2984        if (!bus)
     2985                return -ENOMEM;
    29812986        r = __kvm_io_bus_write(bus, &range, val);
    29822987        return r < 0 ? r : 0;
     
    29963001
    29973002        bus = srcu_dereference(kvm->buses[bus_idx], &kvm->srcu);
     3003        if (!bus)
     3004                return -ENOMEM;
    29983005
    29993006        /* First try the device referenced by cookie. */
     
    30463053
    30473054        bus = srcu_dereference(kvm->buses[bus_idx], &kvm->srcu);
     3055        if (!bus)
     3056                return -ENOMEM;
    30483057        r = __kvm_io_bus_read(bus, &range, val);
    30493058        return r < 0 ? r : 0;
     
    30583067
    30593068        bus = kvm->buses[bus_idx];
     3069        if (!bus)
     3070                return -ENOMEM;
     3071
    30603072        /* exclude ioeventfd which is limited by maximum fd */
    30613073        if (bus->dev_count - bus->ioeventfd_count > NR_IOBUS_DEVS - 1)
     
    30773089
    30783090/* Caller must hold slots_lock. */
    3079 int kvm_io_bus_unregister_dev(struct kvm *kvm, enum kvm_bus bus_idx,
    3080                               struct kvm_io_device *dev)
    3081 {
    3082         int i, r;
     3091void kvm_io_bus_unregister_dev(struct kvm *kvm, enum kvm_bus bus_idx,
     3092                               struct kvm_io_device *dev)
     3093{
     3094        int i;
    30833095        struct kvm_io_bus *new_bus, *bus;
    30843096
    30853097        bus = kvm->buses[bus_idx];
    3086         r = -ENOENT;
     3098        if (!bus)
     3099                return;
     3100
    30873101        for (i = 0; i < bus->dev_count; i++)
    30883102                if (bus->range[i].dev == dev) {
    3089                         r = 0;
    30903103                        break;
    30913104                }
    30923105
    3093         if (r)
    3094                 return r;
     3106        if (i == bus->dev_count)
     3107                return;
    30953108
    30963109        new_bus = kzalloc(sizeof(*bus) + ((bus->dev_count - 1) *
    30973110                          sizeof(struct kvm_io_range)), GFP_KERNEL);
    3098         if (!new_bus)
    3099                 return -ENOMEM;
     3111        if (!new_bus)  {
     3112                pr_err("kvm: failed to shrink bus, removing it completely\n");
     3113                goto broken;
     3114        }
    31003115
    31013116        memcpy(new_bus, bus, sizeof(*bus) + i * sizeof(struct kvm_io_range));
     
    31043119               (new_bus->dev_count - i) * sizeof(struct kvm_io_range));
    31053120
     3121broken:
    31063122        rcu_assign_pointer(kvm->buses[bus_idx], new_bus);
    31073123        synchronize_srcu_expedited(&kvm->srcu);
    31083124        kfree(bus);
    3109         return r;
     3125        return;
    31103126}
    31113127
Note: See TracChangeset for help on using the changeset viewer.