diff options
Diffstat (limited to 'arch/x86/kernel/kvm.c')
| -rw-r--r-- | arch/x86/kernel/kvm.c | 26 | 
1 files changed, 20 insertions, 6 deletions
diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index 08320b0b2b27..1b51b727b140 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c @@ -270,9 +270,8 @@ DEFINE_IDTENTRY_SYSVEC(sysvec_kvm_asyncpf_interrupt)  {  	struct pt_regs *old_regs = set_irq_regs(regs);  	u32 token; -	irqentry_state_t state; -	state = irqentry_enter(regs); +	ack_APIC_irq();  	inc_irq_stat(irq_hv_callback_count); @@ -283,7 +282,6 @@ DEFINE_IDTENTRY_SYSVEC(sysvec_kvm_asyncpf_interrupt)  		wrmsrl(MSR_KVM_ASYNC_PF_ACK, 1);  	} -	irqentry_exit(regs, state);  	set_irq_regs(old_regs);  } @@ -654,7 +652,6 @@ static void __init kvm_guest_init(void)  	}  	if (pv_tlb_flush_supported()) { -		pv_ops.mmu.flush_tlb_others = kvm_flush_tlb_others;  		pv_ops.mmu.tlb_remove_table = tlb_remove_table;  		pr_info("KVM setup pv remote TLB flush\n");  	} @@ -767,6 +764,14 @@ static __init int activate_jump_labels(void)  }  arch_initcall(activate_jump_labels); +static void kvm_free_pv_cpu_mask(void) +{ +	unsigned int cpu; + +	for_each_possible_cpu(cpu) +		free_cpumask_var(per_cpu(__pv_cpu_mask, cpu)); +} +  static __init int kvm_alloc_cpumask(void)  {  	int cpu; @@ -785,11 +790,20 @@ static __init int kvm_alloc_cpumask(void)  	if (alloc)  		for_each_possible_cpu(cpu) { -			zalloc_cpumask_var_node(per_cpu_ptr(&__pv_cpu_mask, cpu), -				GFP_KERNEL, cpu_to_node(cpu)); +			if (!zalloc_cpumask_var_node( +				per_cpu_ptr(&__pv_cpu_mask, cpu), +				GFP_KERNEL, cpu_to_node(cpu))) { +				goto zalloc_cpumask_fail; +			}  		} +	apic->send_IPI_mask_allbutself = kvm_send_ipi_mask_allbutself; +	pv_ops.mmu.flush_tlb_others = kvm_flush_tlb_others;  	return 0; + +zalloc_cpumask_fail: +	kvm_free_pv_cpu_mask(); +	return -ENOMEM;  }  arch_initcall(kvm_alloc_cpumask);  |