All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tang Chen <tangchen@cn.fujitsu.com>
To: Wanpeng Li <wanpeng.li@linux.intel.com>
Cc: <gleb@kernel.org>, <mtosatti@redhat.com>, <kvm@vger.kernel.org>,
	<laijs@cn.fujitsu.com>, <isimatu.yasuaki@jp.fujitsu.com>,
	<guz.fnst@cn.fujitsu.com>, <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 4/4] kvm, mem-hotplug: Update apic access page when it is migrated.
Date: Tue, 8 Jul 2014 17:40:44 +0800	[thread overview]
Message-ID: <53BBBC9C.6040209@cn.fujitsu.com> (raw)
In-Reply-To: <20140707103559.GA2867@kernel>

Hi Wanpeng,

On 07/07/2014 06:35 PM, Wanpeng Li wrote:
> On Wed, Jul 02, 2014 at 05:00:37PM +0800, Tang Chen wrote:
>> apic access page is pinned in memory, and as a result it cannot be
>> migrated/hot-removed.
>>
>> Actually it doesn't need to be pinned in memory.
>>
>> This patch introduces a new vcpu request: KVM_REQ_MIGRATE_EPT. This requet
>
> s/KVM_REQ_MIGRATE_EPT/KVM_REQ_MIGRATE_APIC

Thanks, will fix it in the next version.

Thanks.

>
>> will be made when kvm_mmu_notifier_invalidate_page() is called when the page
>> is unmapped from the qemu user space to reset APIC_ACCESS_ADDR pointer in
>> each online vcpu to 0. And will also be made when ept violation happens to
>> reset APIC_ACCESS_ADDR to the new page phys_addr (host phys_addr).
>> ---
>> arch/x86/include/asm/kvm_host.h |  2 ++
>> arch/x86/kvm/mmu.c              | 15 +++++++++++++++
>> arch/x86/kvm/vmx.c              |  9 ++++++++-
>> arch/x86/kvm/x86.c              | 20 ++++++++++++++++++++
>> include/linux/kvm_host.h        |  1 +
>> virt/kvm/kvm_main.c             | 15 +++++++++++++++
>> 6 files changed, 61 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
>> index 8771c0f..f104b87 100644
>> --- a/arch/x86/include/asm/kvm_host.h
>> +++ b/arch/x86/include/asm/kvm_host.h
>> @@ -575,6 +575,7 @@ struct kvm_arch {
>>
>> 	unsigned int tss_addr;
>> 	struct page *apic_access_page;
>> +	bool apic_access_page_migrated;
>>
>> 	gpa_t wall_clock;
>>
>> @@ -739,6 +740,7 @@ struct kvm_x86_ops {
>> 	void (*hwapic_isr_update)(struct kvm *kvm, int isr);
>> 	void (*load_eoi_exitmap)(struct kvm_vcpu *vcpu, u64 *eoi_exit_bitmap);
>> 	void (*set_virtual_x2apic_mode)(struct kvm_vcpu *vcpu, bool set);
>> +	void (*set_apic_access_page_addr)(struct kvm *kvm, hpa_t hpa);
>> 	void (*deliver_posted_interrupt)(struct kvm_vcpu *vcpu, int vector);
>> 	void (*sync_pir_to_irr)(struct kvm_vcpu *vcpu);
>> 	int (*set_tss_addr)(struct kvm *kvm, unsigned int addr);
>> diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
>> index c0d72f6..a655444 100644
>> --- a/arch/x86/kvm/mmu.c
>> +++ b/arch/x86/kvm/mmu.c
>> @@ -3436,6 +3436,21 @@ static int tdp_page_fault(struct kvm_vcpu *vcpu, gva_t gpa, u32 error_code,
>> 		kvm_make_request(KVM_REQ_MIGRATE_EPT, vcpu);
>> 	}
>>
>> +	if (gpa == VMX_APIC_ACCESS_PAGE_ADDR&&
>> +	    vcpu->kvm->arch.apic_access_page_migrated) {
>> +		int i;
>> +
>> +		vcpu->kvm->arch.apic_access_page_migrated = false;
>> +
>> +		/*
>> +		 * We need update APIC_ACCESS_ADDR pointer in each VMCS of
>> +		 * all the online vcpus.
>> +		 */
>> +		for (i = 0; i<  atomic_read(&vcpu->kvm->online_vcpus); i++)
>> +			kvm_make_request(KVM_REQ_MIGRATE_APIC,
>> +					 vcpu->kvm->vcpus[i]);
>> +	}
>> +
>> 	spin_unlock(&vcpu->kvm->mmu_lock);
>>
>> 	return r;
>> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
>> index c336cb3..abc152f 100644
>> --- a/arch/x86/kvm/vmx.c
>> +++ b/arch/x86/kvm/vmx.c
>> @@ -3988,7 +3988,7 @@ static int alloc_apic_access_page(struct kvm *kvm)
>> 	if (r)
>> 		goto out;
>>
>> -	page = gfn_to_page(kvm, VMX_APIC_ACCESS_PAGE_ADDR>>  PAGE_SHIFT);
>> +	page = gfn_to_page_no_pin(kvm, VMX_APIC_ACCESS_PAGE_ADDR>>  PAGE_SHIFT);
>> 	if (is_error_page(page)) {
>> 		r = -EFAULT;
>> 		goto out;
>> @@ -7075,6 +7075,12 @@ static void vmx_set_virtual_x2apic_mode(struct kvm_vcpu *vcpu, bool set)
>> 	vmx_set_msr_bitmap(vcpu);
>> }
>>
>> +static void vmx_set_apic_access_page_addr(struct kvm *kvm, hpa_t hpa)
>> +{
>> +	if (vm_need_virtualize_apic_accesses(kvm))
>> +		vmcs_write64(APIC_ACCESS_ADDR, hpa);
>> +}
>> +
>> static void vmx_hwapic_isr_update(struct kvm *kvm, int isr)
>> {
>> 	u16 status;
>> @@ -8846,6 +8852,7 @@ static struct kvm_x86_ops vmx_x86_ops = {
>> 	.enable_irq_window = enable_irq_window,
>> 	.update_cr8_intercept = update_cr8_intercept,
>> 	.set_virtual_x2apic_mode = vmx_set_virtual_x2apic_mode,
>> +	.set_apic_access_page_addr = vmx_set_apic_access_page_addr,
>> 	.vm_has_apicv = vmx_vm_has_apicv,
>> 	.load_eoi_exitmap = vmx_load_eoi_exitmap,
>> 	.hwapic_irr_update = vmx_hwapic_irr_update,
>> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
>> index a26524f..14e7174 100644
>> --- a/arch/x86/kvm/x86.c
>> +++ b/arch/x86/kvm/x86.c
>> @@ -5943,6 +5943,24 @@ static void vcpu_migrated_page_update_ept(struct kvm_vcpu *vcpu)
>> 	}
>> }
>>
>> +static void vcpu_migrated_page_update_apic(struct kvm_vcpu *vcpu)
>> +{
>> +	struct kvm *kvm = vcpu->kvm;
>> +
>> +	if (kvm->arch.apic_access_page_migrated) {
>> +		if (kvm->arch.apic_access_page)
>> +			kvm->arch.apic_access_page = pfn_to_page(0);
>> +		kvm_x86_ops->set_apic_access_page_addr(kvm, 0x0ull);
>> +	} else {
>> +		struct page *page;
>> +		page = gfn_to_page_no_pin(kvm,
>> +				VMX_APIC_ACCESS_PAGE_ADDR>>  PAGE_SHIFT);
>> +		kvm->arch.apic_access_page = page;
>> +		kvm_x86_ops->set_apic_access_page_addr(kvm,
>> +						       page_to_phys(page));
>> +	}
>> +}
>> +
>> /*
>>   * Returns 1 to let __vcpu_run() continue the guest execution loop without
>>   * exiting to the userspace.  Otherwise, the value will be returned to the
>> @@ -6005,6 +6023,8 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
>> 			vcpu_scan_ioapic(vcpu);
>> 		if (kvm_check_request(KVM_REQ_MIGRATE_EPT, vcpu))
>> 			vcpu_migrated_page_update_ept(vcpu);
>> +		if (kvm_check_request(KVM_REQ_MIGRATE_APIC, vcpu))
>> +			vcpu_migrated_page_update_apic(vcpu);
>> 	}
>>
>> 	if (kvm_check_request(KVM_REQ_EVENT, vcpu) || req_int_win) {
>> diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
>> index 4b7e51a..e2ad65e 100644
>> --- a/include/linux/kvm_host.h
>> +++ b/include/linux/kvm_host.h
>> @@ -137,6 +137,7 @@ static inline bool is_error_page(struct page *page)
>> #define KVM_REQ_ENABLE_IBS        23
>> #define KVM_REQ_DISABLE_IBS       24
>> #define KVM_REQ_MIGRATE_EPT       25
>> +#define KVM_REQ_MIGRATE_APIC      26
>>
>> #define KVM_USERSPACE_IRQ_SOURCE_ID		0
>> #define KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID	1
>> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
>> index d271e89..f06438c 100644
>> --- a/virt/kvm/kvm_main.c
>> +++ b/virt/kvm/kvm_main.c
>> @@ -54,6 +54,7 @@
>> #include<asm/io.h>
>> #include<asm/uaccess.h>
>> #include<asm/pgtable.h>
>> +#include<asm/vmx.h>
>>
>> #include "coalesced_mmio.h"
>> #include "async_pf.h"
>> @@ -300,6 +301,20 @@ static void kvm_mmu_notifier_invalidate_page(struct mmu_notifier *mn,
>> 		kvm_make_request(KVM_REQ_MIGRATE_EPT, kvm->vcpus[0]);
>> 	}
>>
>> +	if (address ==
>> +	    gfn_to_hva(kvm, VMX_APIC_ACCESS_PAGE_ADDR>>  PAGE_SHIFT)) {
>> +		int i;
>> +
>> +		kvm->arch.apic_access_page_migrated = true;
>> +
>> +		/*
>> +		 * We need update APIC_ACCESS_ADDR pointer in each VMCS of
>> +		 * all the online vcpus.
>> +		 */
>> +		for (i = 0; i<  atomic_read(&kvm->online_vcpus); i++)
>> +			kvm_make_request(KVM_REQ_MIGRATE_APIC, kvm->vcpus[i]);
>> +	}
>> +
>> 	spin_unlock(&kvm->mmu_lock);
>> 	srcu_read_unlock(&kvm->srcu, idx);
>> }
>> --
>> 1.8.3.1
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe kvm" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> .
>

  reply	other threads:[~2014-07-08  9:40 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-02  9:00 [PATCH 0/4] kvm, mem-hotplug: Do not pin ept identity pagetable and apic access page Tang Chen
2014-07-02  9:00 ` [PATCH 1/4] kvm: Add gfn_to_page_no_pin() Tang Chen
2014-07-02  9:00 ` [PATCH 2/4] kvm: Add macro VMX_APIC_ACCESS_PAGE_ADDR Tang Chen
2014-07-02 16:24   ` Gleb Natapov
2014-07-03  1:19     ` Tang Chen
2014-07-02  9:00 ` [PATCH 3/4] kvm, memory-hotplug: Update ept identity pagetable when it is migrated Tang Chen
2014-07-02 16:34   ` Gleb Natapov
2014-07-03  1:19     ` Tang Chen
2014-07-04  2:36     ` Tang Chen
2014-07-04  9:49       ` Gleb Natapov
2014-07-02  9:00 ` [PATCH 4/4] kvm, mem-hotplug: Update apic access page " Tang Chen
2014-07-03 13:55   ` Gleb Natapov
2014-07-04  2:18     ` Tang Chen
2014-07-04  2:18     ` Tang Chen
2014-07-04 10:13       ` Gleb Natapov
2014-07-07  6:17         ` Tang Chen
2014-07-07  9:52         ` Tang Chen
2014-07-07 11:42           ` Nadav Amit
2014-07-07 11:54             ` Gleb Natapov
2014-07-07 12:10               ` Nadav Amit
2014-07-07 12:15                 ` Gleb Natapov
     [not found]                   ` <1408522330-18009-1-git-send-email-namit@cs.technion.ac.il>
2014-08-20  8:44                     ` [PATCH] KVM: x86: Warn on APIC base relocation Nadav Amit
2014-07-08  1:44                 ` [PATCH 4/4] kvm, mem-hotplug: Update apic access page when it is migrated Tang Chen
2014-07-08  6:46                   ` Nadav Amit
2014-07-07 10:35   ` Wanpeng Li
2014-07-08  9:40     ` Tang Chen [this message]
2014-07-03  1:17 ` [PATCH 0/4] kvm, mem-hotplug: Do not pin ept identity pagetable and apic access page Tang Chen
2014-07-03  6:04   ` Gleb Natapov
2014-07-04  6:41     ` Tang Chen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=53BBBC9C.6040209@cn.fujitsu.com \
    --to=tangchen@cn.fujitsu.com \
    --cc=gleb@kernel.org \
    --cc=guz.fnst@cn.fujitsu.com \
    --cc=isimatu.yasuaki@jp.fujitsu.com \
    --cc=kvm@vger.kernel.org \
    --cc=laijs@cn.fujitsu.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mtosatti@redhat.com \
    --cc=wanpeng.li@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.