diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-30 15:56:17 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-30 15:56:17 -0500 |
| commit | b07d41b77e58baa2df2326cec68dde03cb2348c5 (patch) | |
| tree | 80bf63803e52c4930dd0118046ab3d2f074d529f | |
| parent | 8fa4d8702de3b32854344635667290776d1a754b (diff) | |
| parent | b4329db0d7fd5a233866e799ad3bae8639e90c71 (diff) | |
Merge branch 'kvm-updates/2.6.33' of git://git.kernel.org/pub/scm/virt/kvm/kvm
* 'kvm-updates/2.6.33' of git://git.kernel.org/pub/scm/virt/kvm/kvm:
KVM: get rid of kvm_create_vm() unused label warning on s390
KVM: powerpc: Fix mtsrin in book3s_64 mmu
KVM: ia64: fix build breakage due to host spinlock change
KVM: x86: Extend KVM_SET_VCPU_EVENTS with selective updates
KVM: LAPIC: make sure IRR bitmap is scanned after vm load
KVM: Fix possible circular locking in kvm_vm_ioctl_assign_device()
KVM: MMU: remove prefault from invlpg handler
| -rw-r--r-- | Documentation/kvm/api.txt | 10 | ||||
| -rw-r--r-- | arch/ia64/kvm/vcpu.h | 9 | ||||
| -rw-r--r-- | arch/ia64/kvm/vmm.c | 4 | ||||
| -rw-r--r-- | arch/ia64/kvm/vtlb.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/kvm/book3s_64_mmu.c | 22 | ||||
| -rw-r--r-- | arch/x86/include/asm/kvm.h | 4 | ||||
| -rw-r--r-- | arch/x86/kvm/lapic.c | 1 | ||||
| -rw-r--r-- | arch/x86/kvm/paging_tmpl.h | 18 | ||||
| -rw-r--r-- | arch/x86/kvm/x86.c | 12 | ||||
| -rw-r--r-- | virt/kvm/assigned-dev.c | 6 | ||||
| -rw-r--r-- | virt/kvm/kvm_main.c | 5 |
11 files changed, 59 insertions, 34 deletions
diff --git a/Documentation/kvm/api.txt b/Documentation/kvm/api.txt index e1a114161027..2811e452f756 100644 --- a/Documentation/kvm/api.txt +++ b/Documentation/kvm/api.txt | |||
| @@ -685,7 +685,7 @@ struct kvm_vcpu_events { | |||
| 685 | __u8 pad; | 685 | __u8 pad; |
| 686 | } nmi; | 686 | } nmi; |
| 687 | __u32 sipi_vector; | 687 | __u32 sipi_vector; |
| 688 | __u32 flags; /* must be zero */ | 688 | __u32 flags; |
| 689 | }; | 689 | }; |
| 690 | 690 | ||
| 691 | 4.30 KVM_SET_VCPU_EVENTS | 691 | 4.30 KVM_SET_VCPU_EVENTS |
| @@ -701,6 +701,14 @@ vcpu. | |||
| 701 | 701 | ||
| 702 | See KVM_GET_VCPU_EVENTS for the data structure. | 702 | See KVM_GET_VCPU_EVENTS for the data structure. |
| 703 | 703 | ||
| 704 | Fields that may be modified asynchronously by running VCPUs can be excluded | ||
| 705 | from the update. These fields are nmi.pending and sipi_vector. Keep the | ||
| 706 | corresponding bits in the flags field cleared to suppress overwriting the | ||
| 707 | current in-kernel state. The bits are: | ||
| 708 | |||
| 709 | KVM_VCPUEVENT_VALID_NMI_PENDING - transfer nmi.pending to the kernel | ||
| 710 | KVM_VCPUEVENT_VALID_SIPI_VECTOR - transfer sipi_vector | ||
| 711 | |||
| 704 | 712 | ||
| 705 | 5. The kvm_run structure | 713 | 5. The kvm_run structure |
| 706 | 714 | ||
diff --git a/arch/ia64/kvm/vcpu.h b/arch/ia64/kvm/vcpu.h index 360724d3ae69..988911b4cc7a 100644 --- a/arch/ia64/kvm/vcpu.h +++ b/arch/ia64/kvm/vcpu.h | |||
| @@ -388,6 +388,9 @@ static inline u64 __gpfn_is_io(u64 gpfn) | |||
| 388 | #define _vmm_raw_spin_lock(x) do {}while(0) | 388 | #define _vmm_raw_spin_lock(x) do {}while(0) |
| 389 | #define _vmm_raw_spin_unlock(x) do {}while(0) | 389 | #define _vmm_raw_spin_unlock(x) do {}while(0) |
| 390 | #else | 390 | #else |
| 391 | typedef struct { | ||
| 392 | volatile unsigned int lock; | ||
| 393 | } vmm_spinlock_t; | ||
| 391 | #define _vmm_raw_spin_lock(x) \ | 394 | #define _vmm_raw_spin_lock(x) \ |
| 392 | do { \ | 395 | do { \ |
| 393 | __u32 *ia64_spinlock_ptr = (__u32 *) (x); \ | 396 | __u32 *ia64_spinlock_ptr = (__u32 *) (x); \ |
| @@ -405,12 +408,12 @@ static inline u64 __gpfn_is_io(u64 gpfn) | |||
| 405 | 408 | ||
| 406 | #define _vmm_raw_spin_unlock(x) \ | 409 | #define _vmm_raw_spin_unlock(x) \ |
| 407 | do { barrier(); \ | 410 | do { barrier(); \ |
| 408 | ((spinlock_t *)x)->raw_lock.lock = 0; } \ | 411 | ((vmm_spinlock_t *)x)->lock = 0; } \ |
| 409 | while (0) | 412 | while (0) |
| 410 | #endif | 413 | #endif |
| 411 | 414 | ||
| 412 | void vmm_spin_lock(spinlock_t *lock); | 415 | void vmm_spin_lock(vmm_spinlock_t *lock); |
| 413 | void vmm_spin_unlock(spinlock_t *lock); | 416 | void vmm_spin_unlock(vmm_spinlock_t *lock); |
| 414 | enum { | 417 | enum { |
| 415 | I_TLB = 1, | 418 | I_TLB = 1, |
| 416 | D_TLB = 2 | 419 | D_TLB = 2 |
diff --git a/arch/ia64/kvm/vmm.c b/arch/ia64/kvm/vmm.c index f4b4c899bb6c..7a62f75778c5 100644 --- a/arch/ia64/kvm/vmm.c +++ b/arch/ia64/kvm/vmm.c | |||
| @@ -60,12 +60,12 @@ static void __exit kvm_vmm_exit(void) | |||
| 60 | return ; | 60 | return ; |
| 61 | } | 61 | } |
| 62 | 62 | ||
| 63 | void vmm_spin_lock(spinlock_t *lock) | 63 | void vmm_spin_lock(vmm_spinlock_t *lock) |
| 64 | { | 64 | { |
| 65 | _vmm_raw_spin_lock(lock); | 65 | _vmm_raw_spin_lock(lock); |
| 66 | } | 66 | } |
| 67 | 67 | ||
| 68 | void vmm_spin_unlock(spinlock_t *lock) | 68 | void vmm_spin_unlock(vmm_spinlock_t *lock) |
| 69 | { | 69 | { |
| 70 | _vmm_raw_spin_unlock(lock); | 70 | _vmm_raw_spin_unlock(lock); |
| 71 | } | 71 | } |
diff --git a/arch/ia64/kvm/vtlb.c b/arch/ia64/kvm/vtlb.c index 20b3852f7a6e..4332f7ee5203 100644 --- a/arch/ia64/kvm/vtlb.c +++ b/arch/ia64/kvm/vtlb.c | |||
| @@ -182,7 +182,7 @@ void mark_pages_dirty(struct kvm_vcpu *v, u64 pte, u64 ps) | |||
| 182 | { | 182 | { |
| 183 | u64 i, dirty_pages = 1; | 183 | u64 i, dirty_pages = 1; |
| 184 | u64 base_gfn = (pte&_PAGE_PPN_MASK) >> PAGE_SHIFT; | 184 | u64 base_gfn = (pte&_PAGE_PPN_MASK) >> PAGE_SHIFT; |
| 185 | spinlock_t *lock = __kvm_va(v->arch.dirty_log_lock_pa); | 185 | vmm_spinlock_t *lock = __kvm_va(v->arch.dirty_log_lock_pa); |
| 186 | void *dirty_bitmap = (void *)KVM_MEM_DIRTY_LOG_BASE; | 186 | void *dirty_bitmap = (void *)KVM_MEM_DIRTY_LOG_BASE; |
| 187 | 187 | ||
| 188 | dirty_pages <<= ps <= PAGE_SHIFT ? 0 : ps - PAGE_SHIFT; | 188 | dirty_pages <<= ps <= PAGE_SHIFT ? 0 : ps - PAGE_SHIFT; |
diff --git a/arch/powerpc/kvm/book3s_64_mmu.c b/arch/powerpc/kvm/book3s_64_mmu.c index 5598f88f142e..e4beeb371a73 100644 --- a/arch/powerpc/kvm/book3s_64_mmu.c +++ b/arch/powerpc/kvm/book3s_64_mmu.c | |||
| @@ -390,6 +390,26 @@ static void kvmppc_mmu_book3s_64_mtsrin(struct kvm_vcpu *vcpu, u32 srnum, | |||
| 390 | { | 390 | { |
| 391 | u64 rb = 0, rs = 0; | 391 | u64 rb = 0, rs = 0; |
| 392 | 392 | ||
| 393 | /* | ||
| 394 | * According to Book3 2.01 mtsrin is implemented as: | ||
| 395 | * | ||
| 396 | * The SLB entry specified by (RB)32:35 is loaded from register | ||
| 397 | * RS, as follows. | ||
| 398 | * | ||
| 399 | * SLBE Bit Source SLB Field | ||
| 400 | * | ||
| 401 | * 0:31 0x0000_0000 ESID-0:31 | ||
| 402 | * 32:35 (RB)32:35 ESID-32:35 | ||
| 403 | * 36 0b1 V | ||
| 404 | * 37:61 0x00_0000|| 0b0 VSID-0:24 | ||
| 405 | * 62:88 (RS)37:63 VSID-25:51 | ||
| 406 | * 89:91 (RS)33:35 Ks Kp N | ||
| 407 | * 92 (RS)36 L ((RS)36 must be 0b0) | ||
| 408 | * 93 0b0 C | ||
| 409 | */ | ||
| 410 | |||
| 411 | dprintk("KVM MMU: mtsrin(0x%x, 0x%lx)\n", srnum, value); | ||
| 412 | |||
| 393 | /* ESID = srnum */ | 413 | /* ESID = srnum */ |
| 394 | rb |= (srnum & 0xf) << 28; | 414 | rb |= (srnum & 0xf) << 28; |
| 395 | /* Set the valid bit */ | 415 | /* Set the valid bit */ |
| @@ -400,7 +420,7 @@ static void kvmppc_mmu_book3s_64_mtsrin(struct kvm_vcpu *vcpu, u32 srnum, | |||
| 400 | /* VSID = VSID */ | 420 | /* VSID = VSID */ |
| 401 | rs |= (value & 0xfffffff) << 12; | 421 | rs |= (value & 0xfffffff) << 12; |
| 402 | /* flags = flags */ | 422 | /* flags = flags */ |
| 403 | rs |= ((value >> 27) & 0xf) << 9; | 423 | rs |= ((value >> 28) & 0x7) << 9; |
| 404 | 424 | ||
| 405 | kvmppc_mmu_book3s_64_slbmte(vcpu, rs, rb); | 425 | kvmppc_mmu_book3s_64_slbmte(vcpu, rs, rb); |
| 406 | } | 426 | } |
diff --git a/arch/x86/include/asm/kvm.h b/arch/x86/include/asm/kvm.h index 950df434763f..f46b79f6c16c 100644 --- a/arch/x86/include/asm/kvm.h +++ b/arch/x86/include/asm/kvm.h | |||
| @@ -254,6 +254,10 @@ struct kvm_reinject_control { | |||
| 254 | __u8 reserved[31]; | 254 | __u8 reserved[31]; |
| 255 | }; | 255 | }; |
| 256 | 256 | ||
| 257 | /* When set in flags, include corresponding fields on KVM_SET_VCPU_EVENTS */ | ||
| 258 | #define KVM_VCPUEVENT_VALID_NMI_PENDING 0x00000001 | ||
| 259 | #define KVM_VCPUEVENT_VALID_SIPI_VECTOR 0x00000002 | ||
| 260 | |||
| 257 | /* for KVM_GET/SET_VCPU_EVENTS */ | 261 | /* for KVM_GET/SET_VCPU_EVENTS */ |
| 258 | struct kvm_vcpu_events { | 262 | struct kvm_vcpu_events { |
| 259 | struct { | 263 | struct { |
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index cd60c0bd1b32..3063a0c4858b 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c | |||
| @@ -1150,6 +1150,7 @@ void kvm_apic_post_state_restore(struct kvm_vcpu *vcpu) | |||
| 1150 | hrtimer_cancel(&apic->lapic_timer.timer); | 1150 | hrtimer_cancel(&apic->lapic_timer.timer); |
| 1151 | update_divide_count(apic); | 1151 | update_divide_count(apic); |
| 1152 | start_apic_timer(apic); | 1152 | start_apic_timer(apic); |
| 1153 | apic->irr_pending = true; | ||
| 1153 | } | 1154 | } |
| 1154 | 1155 | ||
| 1155 | void __kvm_migrate_apic_timer(struct kvm_vcpu *vcpu) | 1156 | void __kvm_migrate_apic_timer(struct kvm_vcpu *vcpu) |
diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h index a6017132fba8..58a0f1e88596 100644 --- a/arch/x86/kvm/paging_tmpl.h +++ b/arch/x86/kvm/paging_tmpl.h | |||
| @@ -455,8 +455,6 @@ out_unlock: | |||
| 455 | static void FNAME(invlpg)(struct kvm_vcpu *vcpu, gva_t gva) | 455 | static void FNAME(invlpg)(struct kvm_vcpu *vcpu, gva_t gva) |
| 456 | { | 456 | { |
| 457 | struct kvm_shadow_walk_iterator iterator; | 457 | struct kvm_shadow_walk_iterator iterator; |
| 458 | pt_element_t gpte; | ||
| 459 | gpa_t pte_gpa = -1; | ||
| 460 | int level; | 458 | int level; |
| 461 | u64 *sptep; | 459 | u64 *sptep; |
| 462 | int need_flush = 0; | 460 | int need_flush = 0; |
| @@ -470,10 +468,6 @@ static void FNAME(invlpg)(struct kvm_vcpu *vcpu, gva_t gva) | |||
| 470 | if (level == PT_PAGE_TABLE_LEVEL || | 468 | if (level == PT_PAGE_TABLE_LEVEL || |
| 471 | ((level == PT_DIRECTORY_LEVEL && is_large_pte(*sptep))) || | 469 | ((level == PT_DIRECTORY_LEVEL && is_large_pte(*sptep))) || |
| 472 | ((level == PT_PDPE_LEVEL && is_large_pte(*sptep)))) { | 470 | ((level == PT_PDPE_LEVEL && is_large_pte(*sptep)))) { |
| 473 | struct kvm_mmu_page *sp = page_header(__pa(sptep)); | ||
| 474 | |||
| 475 | pte_gpa = (sp->gfn << PAGE_SHIFT); | ||
| 476 | pte_gpa += (sptep - sp->spt) * sizeof(pt_element_t); | ||
| 477 | 471 | ||
| 478 | if (is_shadow_present_pte(*sptep)) { | 472 | if (is_shadow_present_pte(*sptep)) { |
| 479 | rmap_remove(vcpu->kvm, sptep); | 473 | rmap_remove(vcpu->kvm, sptep); |
| @@ -492,18 +486,6 @@ static void FNAME(invlpg)(struct kvm_vcpu *vcpu, gva_t gva) | |||
| 492 | if (need_flush) | 486 | if (need_flush) |
| 493 | kvm_flush_remote_tlbs(vcpu->kvm); | 487 | kvm_flush_remote_tlbs(vcpu->kvm); |
| 494 | spin_unlock(&vcpu->kvm->mmu_lock); | 488 | spin_unlock(&vcpu->kvm->mmu_lock); |
| 495 | |||
| 496 | if (pte_gpa == -1) | ||
| 497 | return; | ||
| 498 | if (kvm_read_guest_atomic(vcpu->kvm, pte_gpa, &gpte, | ||
| 499 | sizeof(pt_element_t))) | ||
| 500 | return; | ||
| 501 | if (is_present_gpte(gpte) && (gpte & PT_ACCESSED_MASK)) { | ||
| 502 | if (mmu_topup_memory_caches(vcpu)) | ||
| 503 | return; | ||
| 504 | kvm_mmu_pte_write(vcpu, pte_gpa, (const u8 *)&gpte, | ||
| 505 | sizeof(pt_element_t), 0); | ||
| 506 | } | ||
| 507 | } | 489 | } |
| 508 | 490 | ||
| 509 | static gpa_t FNAME(gva_to_gpa)(struct kvm_vcpu *vcpu, gva_t vaddr) | 491 | static gpa_t FNAME(gva_to_gpa)(struct kvm_vcpu *vcpu, gva_t vaddr) |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 9d068966fb2a..6651dbf58675 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
| @@ -1913,7 +1913,8 @@ static void kvm_vcpu_ioctl_x86_get_vcpu_events(struct kvm_vcpu *vcpu, | |||
| 1913 | 1913 | ||
| 1914 | events->sipi_vector = vcpu->arch.sipi_vector; | 1914 | events->sipi_vector = vcpu->arch.sipi_vector; |
| 1915 | 1915 | ||
| 1916 | events->flags = 0; | 1916 | events->flags = (KVM_VCPUEVENT_VALID_NMI_PENDING |
| 1917 | | KVM_VCPUEVENT_VALID_SIPI_VECTOR); | ||
| 1917 | 1918 | ||
| 1918 | vcpu_put(vcpu); | 1919 | vcpu_put(vcpu); |
| 1919 | } | 1920 | } |
| @@ -1921,7 +1922,8 @@ static void kvm_vcpu_ioctl_x86_get_vcpu_events(struct kvm_vcpu *vcpu, | |||
| 1921 | static int kvm_vcpu_ioctl_x86_set_vcpu_events(struct kvm_vcpu *vcpu, | 1922 | static int kvm_vcpu_ioctl_x86_set_vcpu_events(struct kvm_vcpu *vcpu, |
| 1922 | struct kvm_vcpu_events *events) | 1923 | struct kvm_vcpu_events *events) |
| 1923 | { | 1924 | { |
| 1924 | if (events->flags) | 1925 | if (events->flags & ~(KVM_VCPUEVENT_VALID_NMI_PENDING |
| 1926 | | KVM_VCPUEVENT_VALID_SIPI_VECTOR)) | ||
| 1925 | return -EINVAL; | 1927 | return -EINVAL; |
| 1926 | 1928 | ||
| 1927 | vcpu_load(vcpu); | 1929 | vcpu_load(vcpu); |
| @@ -1938,10 +1940,12 @@ static int kvm_vcpu_ioctl_x86_set_vcpu_events(struct kvm_vcpu *vcpu, | |||
| 1938 | kvm_pic_clear_isr_ack(vcpu->kvm); | 1940 | kvm_pic_clear_isr_ack(vcpu->kvm); |
| 1939 | 1941 | ||
| 1940 | vcpu->arch.nmi_injected = events->nmi.injected; | 1942 | vcpu->arch.nmi_injected = events->nmi.injected; |
| 1941 | vcpu->arch.nmi_pending = events->nmi.pending; | 1943 | if (events->flags & KVM_VCPUEVENT_VALID_NMI_PENDING) |
| 1944 | vcpu->arch.nmi_pending = events->nmi.pending; | ||
| 1942 | kvm_x86_ops->set_nmi_mask(vcpu, events->nmi.masked); | 1945 | kvm_x86_ops->set_nmi_mask(vcpu, events->nmi.masked); |
| 1943 | 1946 | ||
| 1944 | vcpu->arch.sipi_vector = events->sipi_vector; | 1947 | if (events->flags & KVM_VCPUEVENT_VALID_SIPI_VECTOR) |
| 1948 | vcpu->arch.sipi_vector = events->sipi_vector; | ||
| 1945 | 1949 | ||
| 1946 | vcpu_put(vcpu); | 1950 | vcpu_put(vcpu); |
| 1947 | 1951 | ||
diff --git a/virt/kvm/assigned-dev.c b/virt/kvm/assigned-dev.c index fd9c097b760a..f73de631e3ee 100644 --- a/virt/kvm/assigned-dev.c +++ b/virt/kvm/assigned-dev.c | |||
| @@ -508,8 +508,8 @@ static int kvm_vm_ioctl_assign_device(struct kvm *kvm, | |||
| 508 | struct kvm_assigned_dev_kernel *match; | 508 | struct kvm_assigned_dev_kernel *match; |
| 509 | struct pci_dev *dev; | 509 | struct pci_dev *dev; |
| 510 | 510 | ||
| 511 | down_read(&kvm->slots_lock); | ||
| 512 | mutex_lock(&kvm->lock); | 511 | mutex_lock(&kvm->lock); |
| 512 | down_read(&kvm->slots_lock); | ||
| 513 | 513 | ||
| 514 | match = kvm_find_assigned_dev(&kvm->arch.assigned_dev_head, | 514 | match = kvm_find_assigned_dev(&kvm->arch.assigned_dev_head, |
| 515 | assigned_dev->assigned_dev_id); | 515 | assigned_dev->assigned_dev_id); |
| @@ -573,8 +573,8 @@ static int kvm_vm_ioctl_assign_device(struct kvm *kvm, | |||
| 573 | } | 573 | } |
| 574 | 574 | ||
| 575 | out: | 575 | out: |
| 576 | mutex_unlock(&kvm->lock); | ||
| 577 | up_read(&kvm->slots_lock); | 576 | up_read(&kvm->slots_lock); |
| 577 | mutex_unlock(&kvm->lock); | ||
| 578 | return r; | 578 | return r; |
| 579 | out_list_del: | 579 | out_list_del: |
| 580 | list_del(&match->list); | 580 | list_del(&match->list); |
| @@ -585,8 +585,8 @@ out_put: | |||
| 585 | pci_dev_put(dev); | 585 | pci_dev_put(dev); |
| 586 | out_free: | 586 | out_free: |
| 587 | kfree(match); | 587 | kfree(match); |
| 588 | mutex_unlock(&kvm->lock); | ||
| 589 | up_read(&kvm->slots_lock); | 588 | up_read(&kvm->slots_lock); |
| 589 | mutex_unlock(&kvm->lock); | ||
| 590 | return r; | 590 | return r; |
| 591 | } | 591 | } |
| 592 | 592 | ||
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index b5af88167613..a944be392d6e 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
| @@ -64,7 +64,7 @@ MODULE_LICENSE("GPL"); | |||
| 64 | /* | 64 | /* |
| 65 | * Ordering of locks: | 65 | * Ordering of locks: |
| 66 | * | 66 | * |
| 67 | * kvm->slots_lock --> kvm->lock --> kvm->irq_lock | 67 | * kvm->lock --> kvm->slots_lock --> kvm->irq_lock |
| 68 | */ | 68 | */ |
| 69 | 69 | ||
| 70 | DEFINE_SPINLOCK(kvm_lock); | 70 | DEFINE_SPINLOCK(kvm_lock); |
| @@ -406,8 +406,11 @@ static struct kvm *kvm_create_vm(void) | |||
| 406 | out: | 406 | out: |
| 407 | return kvm; | 407 | return kvm; |
| 408 | 408 | ||
| 409 | #if defined(KVM_COALESCED_MMIO_PAGE_OFFSET) || \ | ||
| 410 | (defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER)) | ||
| 409 | out_err: | 411 | out_err: |
| 410 | hardware_disable_all(); | 412 | hardware_disable_all(); |
| 413 | #endif | ||
| 411 | out_err_nodisable: | 414 | out_err_nodisable: |
| 412 | kfree(kvm); | 415 | kfree(kvm); |
| 413 | return ERR_PTR(r); | 416 | return ERR_PTR(r); |
