Re: [PATCH v6 07/12] Add async PF initialization to PV guest.
On 10/08/2010 09:54 AM, Gleb Natapov wrote: + +static void kvm_guest_cpu_notify(void *dummy) +{ + if (!dummy) + kvm_guest_cpu_init(); + else + kvm_pv_disable_apf(NULL); +} Why are you making decisions based on a dummy input? The whole thing looks strange. Use two functions? What is so strange? Type of notification is passed as a parameter. The code that does this is just under the function. I can rename dummy to something else. Or make it two functions. Two separate functions is simplest. -- I have a truly marvellous patch that fixes the bug which this signature is too narrow to contain. -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v6 07/12] Add async PF initialization to PV guest.
On Thu, Oct 07, 2010 at 02:50:49PM +0200, Avi Kivity wrote: On 10/04/2010 05:56 PM, Gleb Natapov wrote: Enable async PF in a guest if async PF capability is discovered. +void __cpuinit kvm_guest_cpu_init(void) +{ +if (!kvm_para_available()) +return; + +if (kvm_para_has_feature(KVM_FEATURE_ASYNC_PF) kvmapf) { +u64 pa = __pa(__get_cpu_var(apf_reason)); + +if (native_write_msr_safe(MSR_KVM_ASYNC_PF_EN, + pa | KVM_ASYNC_PF_ENABLED, pa 32)) native_ versions of processor accessors shouldn't be used generally. Also, the MSR isn't documented to fail on valid input, so you can use a normal wrmsrl() here. Kernel will oops on wrong write then. OK, why not. +return; +__get_cpu_var(apf_reason).enabled = 1; +printk(KERN_INFOKVM setup async PF for cpu %d\n, + smp_processor_id()); +} +} + +static int kvm_pv_reboot_notify(struct notifier_block *nb, +unsigned long code, void *unused) +{ +if (code == SYS_RESTART) +on_each_cpu(kvm_pv_disable_apf, NULL, 1); +return NOTIFY_DONE; +} + +static struct notifier_block kvm_pv_reboot_nb = { +.notifier_call = kvm_pv_reboot_notify, +}; Does this handle kexec? Yes. + +static void kvm_guest_cpu_notify(void *dummy) +{ +if (!dummy) +kvm_guest_cpu_init(); +else +kvm_pv_disable_apf(NULL); +} Why are you making decisions based on a dummy input? The whole thing looks strange. Use two functions? What is so strange? Type of notification is passed as a parameter. The code that does this is just under the function. I can rename dummy to something else. Or make it two functions. -- Gleb. -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v6 07/12] Add async PF initialization to PV guest.
On 10/04/2010 05:56 PM, Gleb Natapov wrote: Enable async PF in a guest if async PF capability is discovered. +void __cpuinit kvm_guest_cpu_init(void) +{ + if (!kvm_para_available()) + return; + + if (kvm_para_has_feature(KVM_FEATURE_ASYNC_PF) kvmapf) { + u64 pa = __pa(__get_cpu_var(apf_reason)); + + if (native_write_msr_safe(MSR_KVM_ASYNC_PF_EN, + pa | KVM_ASYNC_PF_ENABLED, pa 32)) native_ versions of processor accessors shouldn't be used generally. Also, the MSR isn't documented to fail on valid input, so you can use a normal wrmsrl() here. + return; + __get_cpu_var(apf_reason).enabled = 1; + printk(KERN_INFOKVM setup async PF for cpu %d\n, + smp_processor_id()); + } +} + +static int kvm_pv_reboot_notify(struct notifier_block *nb, + unsigned long code, void *unused) +{ + if (code == SYS_RESTART) + on_each_cpu(kvm_pv_disable_apf, NULL, 1); + return NOTIFY_DONE; +} + +static struct notifier_block kvm_pv_reboot_nb = { + .notifier_call = kvm_pv_reboot_notify, +}; Does this handle kexec? + +static void kvm_guest_cpu_notify(void *dummy) +{ + if (!dummy) + kvm_guest_cpu_init(); + else + kvm_pv_disable_apf(NULL); +} Why are you making decisions based on a dummy input? The whole thing looks strange. Use two functions? -- I have a truly marvellous patch that fixes the bug which this signature is too narrow to contain. -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v6 07/12] Add async PF initialization to PV guest.
On Tue, Oct 05, 2010 at 03:25:54PM -0300, Marcelo Tosatti wrote: On Mon, Oct 04, 2010 at 05:56:29PM +0200, Gleb Natapov wrote: Enable async PF in a guest if async PF capability is discovered. Signed-off-by: Gleb Natapov g...@redhat.com --- Documentation/kernel-parameters.txt |3 + arch/x86/include/asm/kvm_para.h |5 ++ arch/x86/kernel/kvm.c | 92 +++ 3 files changed, 100 insertions(+), 0 deletions(-) +static int __cpuinit kvm_cpu_notify(struct notifier_block *self, + unsigned long action, void *hcpu) +{ + int cpu = (unsigned long)hcpu; + switch (action) { + case CPU_ONLINE: + case CPU_DOWN_FAILED: + case CPU_ONLINE_FROZEN: + smp_call_function_single(cpu, kvm_guest_cpu_notify, NULL, 0); wait parameter should probably be 1. Why should we wait for it? FWIW I copied this from somewhere (May be arch/x86/pci/amd_bus.c). -- Gleb. -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v6 07/12] Add async PF initialization to PV guest.
On Wed, Oct 06, 2010 at 12:55:04PM +0200, Gleb Natapov wrote: On Tue, Oct 05, 2010 at 03:25:54PM -0300, Marcelo Tosatti wrote: On Mon, Oct 04, 2010 at 05:56:29PM +0200, Gleb Natapov wrote: Enable async PF in a guest if async PF capability is discovered. Signed-off-by: Gleb Natapov g...@redhat.com --- Documentation/kernel-parameters.txt |3 + arch/x86/include/asm/kvm_para.h |5 ++ arch/x86/kernel/kvm.c | 92 +++ 3 files changed, 100 insertions(+), 0 deletions(-) +static int __cpuinit kvm_cpu_notify(struct notifier_block *self, + unsigned long action, void *hcpu) +{ + int cpu = (unsigned long)hcpu; + switch (action) { + case CPU_ONLINE: + case CPU_DOWN_FAILED: + case CPU_ONLINE_FROZEN: + smp_call_function_single(cpu, kvm_guest_cpu_notify, NULL, 0); wait parameter should probably be 1. Why should we wait for it? FWIW I copied this from somewhere (May be arch/x86/pci/amd_bus.c). So that you know its executed in a defined point in cpu bringup. -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v6 07/12] Add async PF initialization to PV guest.
On Wed, Oct 06, 2010 at 11:45:12AM -0300, Marcelo Tosatti wrote: On Wed, Oct 06, 2010 at 12:55:04PM +0200, Gleb Natapov wrote: On Tue, Oct 05, 2010 at 03:25:54PM -0300, Marcelo Tosatti wrote: On Mon, Oct 04, 2010 at 05:56:29PM +0200, Gleb Natapov wrote: Enable async PF in a guest if async PF capability is discovered. Signed-off-by: Gleb Natapov g...@redhat.com --- Documentation/kernel-parameters.txt |3 + arch/x86/include/asm/kvm_para.h |5 ++ arch/x86/kernel/kvm.c | 92 +++ 3 files changed, 100 insertions(+), 0 deletions(-) +static int __cpuinit kvm_cpu_notify(struct notifier_block *self, + unsigned long action, void *hcpu) +{ + int cpu = (unsigned long)hcpu; + switch (action) { + case CPU_ONLINE: + case CPU_DOWN_FAILED: + case CPU_ONLINE_FROZEN: + smp_call_function_single(cpu, kvm_guest_cpu_notify, NULL, 0); wait parameter should probably be 1. Why should we wait for it? FWIW I copied this from somewhere (May be arch/x86/pci/amd_bus.c). So that you know its executed in a defined point in cpu bringup. If I read code correctly CPU we are notified about is already running when callback is called, so I do not see what waiting for IPI to be processed will accomplish here. With many cpus we will make boot a little bit slower. I don't care too much though, so if you still think that 1 is required here I'll make it so. -- Gleb. -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v6 07/12] Add async PF initialization to PV guest.
On Mon, Oct 04, 2010 at 05:56:29PM +0200, Gleb Natapov wrote: Enable async PF in a guest if async PF capability is discovered. Signed-off-by: Gleb Natapov g...@redhat.com --- Documentation/kernel-parameters.txt |3 + arch/x86/include/asm/kvm_para.h |5 ++ arch/x86/kernel/kvm.c | 92 +++ 3 files changed, 100 insertions(+), 0 deletions(-) +static int __cpuinit kvm_cpu_notify(struct notifier_block *self, + unsigned long action, void *hcpu) +{ + int cpu = (unsigned long)hcpu; + switch (action) { + case CPU_ONLINE: + case CPU_DOWN_FAILED: + case CPU_ONLINE_FROZEN: + smp_call_function_single(cpu, kvm_guest_cpu_notify, NULL, 0); wait parameter should probably be 1. -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH v6 07/12] Add async PF initialization to PV guest.
Enable async PF in a guest if async PF capability is discovered. Signed-off-by: Gleb Natapov g...@redhat.com --- Documentation/kernel-parameters.txt |3 + arch/x86/include/asm/kvm_para.h |5 ++ arch/x86/kernel/kvm.c | 92 +++ 3 files changed, 100 insertions(+), 0 deletions(-) diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 8dc2548..0bd2203 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt @@ -1699,6 +1699,9 @@ and is between 256 and 4096 characters. It is defined in the file no-kvmclock [X86,KVM] Disable paravirtualized KVM clock driver + no-kvmapf [X86,KVM] Disable paravirtualized asynchronous page + fault handling. + nolapic [X86-32,APIC] Do not enable or use the local APIC. nolapic_timer [X86-32,APIC] Do not use the local APIC timer. diff --git a/arch/x86/include/asm/kvm_para.h b/arch/x86/include/asm/kvm_para.h index 8662ae0..e193c4f 100644 --- a/arch/x86/include/asm/kvm_para.h +++ b/arch/x86/include/asm/kvm_para.h @@ -65,6 +65,11 @@ struct kvm_mmu_op_release_pt { __u64 pt_phys; }; +struct kvm_vcpu_pv_apf_data { + __u32 reason; + __u32 enabled; +}; + #ifdef __KERNEL__ #include asm/processor.h diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index e6db179..67d1c8d 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c @@ -27,16 +27,30 @@ #include linux/mm.h #include linux/highmem.h #include linux/hardirq.h +#include linux/notifier.h +#include linux/reboot.h #include asm/timer.h +#include asm/cpu.h #define MMU_QUEUE_SIZE 1024 +static int kvmapf = 1; + +static int parse_no_kvmapf(char *arg) +{ +kvmapf = 0; +return 0; +} + +early_param(no-kvmapf, parse_no_kvmapf); + struct kvm_para_state { u8 mmu_queue[MMU_QUEUE_SIZE]; int mmu_queue_len; }; static DEFINE_PER_CPU(struct kvm_para_state, para_state); +static DEFINE_PER_CPU(struct kvm_vcpu_pv_apf_data, apf_reason) __aligned(64); static struct kvm_para_state *kvm_para_state(void) { @@ -231,12 +245,86 @@ static void __init paravirt_ops_setup(void) #endif } +void __cpuinit kvm_guest_cpu_init(void) +{ + if (!kvm_para_available()) + return; + + if (kvm_para_has_feature(KVM_FEATURE_ASYNC_PF) kvmapf) { + u64 pa = __pa(__get_cpu_var(apf_reason)); + + if (native_write_msr_safe(MSR_KVM_ASYNC_PF_EN, + pa | KVM_ASYNC_PF_ENABLED, pa 32)) + return; + __get_cpu_var(apf_reason).enabled = 1; + printk(KERN_INFOKVM setup async PF for cpu %d\n, + smp_processor_id()); + } +} + +static void kvm_pv_disable_apf(void *unused) +{ + if (!__get_cpu_var(apf_reason).enabled) + return; + + wrmsrl(MSR_KVM_ASYNC_PF_EN, 0); + __get_cpu_var(apf_reason).enabled = 0; + + printk(KERN_INFOUnregister pv shared memory for cpu %d\n, + smp_processor_id()); +} + +static int kvm_pv_reboot_notify(struct notifier_block *nb, + unsigned long code, void *unused) +{ + if (code == SYS_RESTART) + on_each_cpu(kvm_pv_disable_apf, NULL, 1); + return NOTIFY_DONE; +} + +static struct notifier_block kvm_pv_reboot_nb = { + .notifier_call = kvm_pv_reboot_notify, +}; + #ifdef CONFIG_SMP static void __init kvm_smp_prepare_boot_cpu(void) { WARN_ON(kvm_register_clock(primary cpu clock)); + kvm_guest_cpu_init(); native_smp_prepare_boot_cpu(); } + +static void kvm_guest_cpu_notify(void *dummy) +{ + if (!dummy) + kvm_guest_cpu_init(); + else + kvm_pv_disable_apf(NULL); +} + +static int __cpuinit kvm_cpu_notify(struct notifier_block *self, + unsigned long action, void *hcpu) +{ + int cpu = (unsigned long)hcpu; + switch (action) { + case CPU_ONLINE: + case CPU_DOWN_FAILED: + case CPU_ONLINE_FROZEN: + smp_call_function_single(cpu, kvm_guest_cpu_notify, NULL, 0); + break; + case CPU_DOWN_PREPARE: + case CPU_DOWN_PREPARE_FROZEN: + smp_call_function_single(cpu, kvm_guest_cpu_notify, (void*)1, 1); + break; + default: + break; + } + return NOTIFY_OK; +} + +static struct notifier_block __cpuinitdata kvm_cpu_notifier = { +.notifier_call = kvm_cpu_notify, +}; #endif void __init kvm_guest_init(void) @@ -245,7 +333,11 @@ void __init kvm_guest_init(void) return; paravirt_ops_setup(); + register_reboot_notifier(kvm_pv_reboot_nb); #ifdef CONFIG_SMP smp_ops.smp_prepare_boot_cpu = kvm_smp_prepare_boot_cpu; + register_cpu_notifier(kvm_cpu_notifier); +#else +
Re: [PATCH v6 07/12] Add async PF initialization to PV guest.
On 10/04/2010 11:56 AM, Gleb Natapov wrote: Enable async PF in a guest if async PF capability is discovered. Signed-off-by: Gleb Natapovg...@redhat.com Acked-by: Rik van Riel r...@redhat.com -- All rights reversed -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html