linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4 0/5] misc fixes to PV extentions code
@ 2019-07-01  5:19 Zhenzhong Duan
  2019-07-01  5:19 ` [PATCH v4 1/5] x86/xen: Mark xen_hvm_need_lapic() and xen_x2apic_para_available() as __init Zhenzhong Duan
                   ` (4 more replies)
  0 siblings, 5 replies; 10+ messages in thread
From: Zhenzhong Duan @ 2019-07-01  5:19 UTC (permalink / raw)
  To: linux-kernel
  Cc: xen-devel, boris.ostrovsky, jgross, sstabellini, tglx, mingo, bp,
	Zhenzhong Duan

Hi,

In virtualization environment, PV extensions (drivers, interrupts,
timers, etc) are enabled in the majority of use cases which is the
best option.

However, in some cases (kexec not fully working, benchmarking, etc)
we want to disable PV extensions. We have xen_nopv for that purpose
but only for XEN. For a consistent admin experience a common command
line parameter set across all PV guest implementations is a better
choice.

To achieve this introduce a new 'nopv' parameter which is usable by
most of PV guest implementation. Due to the limitation of some PV
guests(XEN PV, XEN PVH and jailhouse), 'nopv' is ignored for XEN PV
, jailhouse and XEN PVH if booting via Xen-PVH boot entry. If booting
via normal boot entry(like grub2), PVH guest has to panic itself
currently.

While analyzing the PV guest code one bug were found and fixed.
(Patches 1). It can be applied independent of the functional
changes, but is kept in the series as the functional changes
depend on them.

As I see there is an issue with xen_nopv when booting PVH guest, so
I revert 'xen_nopv' in one patch and map it back to 'nopv' in the
following patch. This is the easier way to fix the issue and easy
for review.

I didn't get env to test with jailhouse and Hyperv, the others work
as expected.

v4:
PATCH5 a new patch to add 'xen_nopv' back per Boris

v3:
Remove some unrelated patches from patchset as suggested by Tglx

PATCH1 unchanged
PATCH2 add Reviewed-by
PATCH3 add Reviewed-by
PATCH4 rewrite the patch as Jgross found an issue in old patch,
description is also updated.



v2:
PATCH3 use 'ignore_nopv' for PVH/PV guest as suggested by Jgross.
PATCH5 new added one, specifically for HVM guest

Thanks
Zhenzhong

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v4 1/5] x86/xen: Mark xen_hvm_need_lapic() and xen_x2apic_para_available() as __init
  2019-07-01  5:19 [PATCH v4 0/5] misc fixes to PV extentions code Zhenzhong Duan
@ 2019-07-01  5:19 ` Zhenzhong Duan
  2019-07-01  5:19 ` [PATCH v4 2/5] x86: Add nopv parameter to disable PV extensions Zhenzhong Duan
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 10+ messages in thread
From: Zhenzhong Duan @ 2019-07-01  5:19 UTC (permalink / raw)
  To: linux-kernel
  Cc: xen-devel, boris.ostrovsky, jgross, sstabellini, tglx, mingo, bp,
	Zhenzhong Duan

.. as they are only called at early bootup stage. In fact, other
functions in x86_hyper_xen_hvm.init.* are all marked as __init.

Unexport xen_hvm_need_lapic as it's never used outside.

Signed-off-by: Zhenzhong Duan <zhenzhong.duan@oracle.com>
Reviewed-by: Juergen Gross <jgross@suse.com>
Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: Stefano Stabellini <sstabellini@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
---
 arch/x86/include/asm/xen/hypervisor.h | 6 +++---
 arch/x86/xen/enlighten_hvm.c          | 3 +--
 2 files changed, 4 insertions(+), 5 deletions(-)

diff --git a/arch/x86/include/asm/xen/hypervisor.h b/arch/x86/include/asm/xen/hypervisor.h
index 39171b3..42e1245 100644
--- a/arch/x86/include/asm/xen/hypervisor.h
+++ b/arch/x86/include/asm/xen/hypervisor.h
@@ -44,14 +44,14 @@ static inline uint32_t xen_cpuid_base(void)
 }
 
 #ifdef CONFIG_XEN
-extern bool xen_hvm_need_lapic(void);
+extern bool __init xen_hvm_need_lapic(void);
 
-static inline bool xen_x2apic_para_available(void)
+static inline bool __init xen_x2apic_para_available(void)
 {
 	return xen_hvm_need_lapic();
 }
 #else
-static inline bool xen_x2apic_para_available(void)
+static inline bool __init xen_x2apic_para_available(void)
 {
 	return (xen_cpuid_base() != 0);
 }
diff --git a/arch/x86/xen/enlighten_hvm.c b/arch/x86/xen/enlighten_hvm.c
index 0e75642..ac4943c 100644
--- a/arch/x86/xen/enlighten_hvm.c
+++ b/arch/x86/xen/enlighten_hvm.c
@@ -218,7 +218,7 @@ static __init int xen_parse_nopv(char *arg)
 }
 early_param("xen_nopv", xen_parse_nopv);
 
-bool xen_hvm_need_lapic(void)
+bool __init xen_hvm_need_lapic(void)
 {
 	if (xen_nopv)
 		return false;
@@ -230,7 +230,6 @@ bool xen_hvm_need_lapic(void)
 		return false;
 	return true;
 }
-EXPORT_SYMBOL_GPL(xen_hvm_need_lapic);
 
 static uint32_t __init xen_platform_hvm(void)
 {
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v4 2/5] x86: Add nopv parameter to disable PV extensions
  2019-07-01  5:19 [PATCH v4 0/5] misc fixes to PV extentions code Zhenzhong Duan
  2019-07-01  5:19 ` [PATCH v4 1/5] x86/xen: Mark xen_hvm_need_lapic() and xen_x2apic_para_available() as __init Zhenzhong Duan
@ 2019-07-01  5:19 ` Zhenzhong Duan
  2019-07-02 17:47   ` Boris Ostrovsky
  2019-07-01  5:19 ` [PATCH v4 3/5] Revert "xen: Introduce 'xen_nopv' to disable PV extensions for HVM guests." Zhenzhong Duan
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 10+ messages in thread
From: Zhenzhong Duan @ 2019-07-01  5:19 UTC (permalink / raw)
  To: linux-kernel
  Cc: xen-devel, boris.ostrovsky, jgross, sstabellini, tglx, mingo, bp,
	Zhenzhong Duan, Jan Kiszka

In virtualization environment, PV extensions (drivers, interrupts,
timers, etc) are enabled in the majority of use cases which is the
best option.

However, in some cases (kexec not fully working, benchmarking)
we want to disable PV extensions. As such introduce the
'nopv' parameter that will do it.

There are guest types which just won't work without PV extensions,
like Xen PV, Xen PVH and jailhouse. add a "ignore_nopv" member to
struct hypervisor_x86 set to true for those guest types and call
the detect functions only if nopv is false or ignore_nopv is true.

There is already 'xen_nopv' parameter for XEN platform but not for
others. 'xen_nopv' can then be removed with this change.

Suggested-by: Juergen Gross <jgross@suse.com>
Signed-off-by: Zhenzhong Duan <zhenzhong.duan@oracle.com>
Reviewed-by: Juergen Gross <jgross@suse.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Jan Kiszka <jan.kiszka@siemens.com>
Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: Stefano Stabellini <sstabellini@kernel.org>
---
 Documentation/admin-guide/kernel-parameters.txt |  5 +++++
 arch/x86/include/asm/hypervisor.h               |  3 +++
 arch/x86/kernel/cpu/hypervisor.c                | 11 +++++++++++
 arch/x86/kernel/jailhouse.c                     |  1 +
 arch/x86/xen/enlighten_pv.c                     |  1 +
 5 files changed, 21 insertions(+)

diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index 138f666..21e08af 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -5268,6 +5268,11 @@
 			improve timer resolution at the expense of processing
 			more timer interrupts.
 
+	nopv=		[X86,XEN,KVM,HYPER_V,VMWARE]
+			Disables the PV optimizations forcing the guest to run
+			as generic guest with no PV drivers. Currently support
+			XEN HVM, KVM, HYPER_V and VMWARE guest.
+
 	xirc2ps_cs=	[NET,PCMCIA]
 			Format:
 			<irq>,<irq_mask>,<io>,<full_duplex>,<do_sound>,<lockup_hack>[,<irq2>[,<irq3>[,<irq4>]]]
diff --git a/arch/x86/include/asm/hypervisor.h b/arch/x86/include/asm/hypervisor.h
index 8c5aaba..d75d2ea 100644
--- a/arch/x86/include/asm/hypervisor.h
+++ b/arch/x86/include/asm/hypervisor.h
@@ -52,6 +52,9 @@ struct hypervisor_x86 {
 
 	/* runtime callbacks */
 	struct x86_hyper_runtime runtime;
+
+	/* ignore nopv parameter */
+	bool ignore_nopv;
 };
 
 extern enum x86_hypervisor_type x86_hyper_type;
diff --git a/arch/x86/kernel/cpu/hypervisor.c b/arch/x86/kernel/cpu/hypervisor.c
index 479ca47..337ff07 100644
--- a/arch/x86/kernel/cpu/hypervisor.c
+++ b/arch/x86/kernel/cpu/hypervisor.c
@@ -54,6 +54,14 @@
 enum x86_hypervisor_type x86_hyper_type;
 EXPORT_SYMBOL(x86_hyper_type);
 
+bool __initdata nopv;
+static __init int parse_nopv(char *arg)
+{
+	nopv = true;
+	return 0;
+}
+early_param("nopv", parse_nopv);
+
 static inline const struct hypervisor_x86 * __init
 detect_hypervisor_vendor(void)
 {
@@ -61,6 +69,9 @@
 	uint32_t pri, max_pri = 0;
 
 	for (p = hypervisors; p < hypervisors + ARRAY_SIZE(hypervisors); p++) {
+		if (unlikely(nopv) && !(*p)->ignore_nopv)
+			continue;
+
 		pri = (*p)->detect();
 		if (pri > max_pri) {
 			max_pri = pri;
diff --git a/arch/x86/kernel/jailhouse.c b/arch/x86/kernel/jailhouse.c
index d96d563..880329f 100644
--- a/arch/x86/kernel/jailhouse.c
+++ b/arch/x86/kernel/jailhouse.c
@@ -217,4 +217,5 @@ static bool __init jailhouse_x2apic_available(void)
 	.detect			= jailhouse_detect,
 	.init.init_platform	= jailhouse_init_platform,
 	.init.x2apic_available	= jailhouse_x2apic_available,
+	.ignore_nopv		= true,
 };
diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c
index 4722ba2..5d16824 100644
--- a/arch/x86/xen/enlighten_pv.c
+++ b/arch/x86/xen/enlighten_pv.c
@@ -1463,4 +1463,5 @@ static uint32_t __init xen_platform_pv(void)
 	.detect                 = xen_platform_pv,
 	.type			= X86_HYPER_XEN_PV,
 	.runtime.pin_vcpu       = xen_pin_vcpu,
+	.ignore_nopv		= true,
 };
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v4 3/5] Revert "xen: Introduce 'xen_nopv' to disable PV extensions for HVM guests."
  2019-07-01  5:19 [PATCH v4 0/5] misc fixes to PV extentions code Zhenzhong Duan
  2019-07-01  5:19 ` [PATCH v4 1/5] x86/xen: Mark xen_hvm_need_lapic() and xen_x2apic_para_available() as __init Zhenzhong Duan
  2019-07-01  5:19 ` [PATCH v4 2/5] x86: Add nopv parameter to disable PV extensions Zhenzhong Duan
@ 2019-07-01  5:19 ` Zhenzhong Duan
  2019-07-01  5:19 ` [PATCH v4 4/5] x86/xen: Add 'nopv' support for HVM guest Zhenzhong Duan
  2019-07-01  5:19 ` [PATCH v4 5/5] xen: Add 'xen_nopv' parameter back for backward compatibility Zhenzhong Duan
  4 siblings, 0 replies; 10+ messages in thread
From: Zhenzhong Duan @ 2019-07-01  5:19 UTC (permalink / raw)
  To: linux-kernel
  Cc: xen-devel, boris.ostrovsky, jgross, sstabellini, tglx, mingo, bp,
	Zhenzhong Duan

This reverts commit 8d693b911bb9c57009c24cb1772d205b84c7985c.

Instead we use an unified parameter 'nopv' for all the hypervisor
platforms.

Signed-off-by: Zhenzhong Duan <zhenzhong.duan@oracle.com>
Reviewed-by: Juergen Gross <jgross@suse.com>
Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: Juergen Gross <jgross@suse.com>
Cc: Stefano Stabellini <sstabellini@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
---
 Documentation/admin-guide/kernel-parameters.txt |  4 ----
 arch/x86/xen/enlighten_hvm.c                    | 12 +-----------
 2 files changed, 1 insertion(+), 15 deletions(-)

diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index 21e08af..d5c3dcc 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -5251,10 +5251,6 @@
 			Disables the ticketlock slowpath using Xen PV
 			optimizations.
 
-	xen_nopv	[X86]
-			Disables the PV optimizations forcing the HVM guest to
-			run as generic HVM guest with no PV drivers.
-
 	xen_scrub_pages=	[XEN]
 			Boolean option to control scrubbing pages before giving them back
 			to Xen, for use by other domains. Can be also changed at runtime
diff --git a/arch/x86/xen/enlighten_hvm.c b/arch/x86/xen/enlighten_hvm.c
index ac4943c..7fcb4ea 100644
--- a/arch/x86/xen/enlighten_hvm.c
+++ b/arch/x86/xen/enlighten_hvm.c
@@ -210,18 +210,8 @@ static void __init xen_hvm_guest_init(void)
 #endif
 }
 
-static bool xen_nopv;
-static __init int xen_parse_nopv(char *arg)
-{
-       xen_nopv = true;
-       return 0;
-}
-early_param("xen_nopv", xen_parse_nopv);
-
 bool __init xen_hvm_need_lapic(void)
 {
-	if (xen_nopv)
-		return false;
 	if (xen_pv_domain())
 		return false;
 	if (!xen_hvm_domain())
@@ -233,7 +223,7 @@ bool __init xen_hvm_need_lapic(void)
 
 static uint32_t __init xen_platform_hvm(void)
 {
-	if (xen_pv_domain() || xen_nopv)
+	if (xen_pv_domain())
 		return 0;
 
 	return xen_cpuid_base();
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v4 4/5] x86/xen: Add 'nopv' support for HVM guest
  2019-07-01  5:19 [PATCH v4 0/5] misc fixes to PV extentions code Zhenzhong Duan
                   ` (2 preceding siblings ...)
  2019-07-01  5:19 ` [PATCH v4 3/5] Revert "xen: Introduce 'xen_nopv' to disable PV extensions for HVM guests." Zhenzhong Duan
@ 2019-07-01  5:19 ` Zhenzhong Duan
  2019-07-02 18:04   ` Boris Ostrovsky
  2019-07-01  5:19 ` [PATCH v4 5/5] xen: Add 'xen_nopv' parameter back for backward compatibility Zhenzhong Duan
  4 siblings, 1 reply; 10+ messages in thread
From: Zhenzhong Duan @ 2019-07-01  5:19 UTC (permalink / raw)
  To: linux-kernel
  Cc: xen-devel, boris.ostrovsky, jgross, sstabellini, tglx, mingo, bp,
	Zhenzhong Duan

PVH guest needs PV extentions to work, so 'nopv' parameter should be
ignored for PVH but not for HVM guest.

If PVH guest boots up via the Xen-PVH boot entry, xen_pvh is set early,
we know it's PVH guest and ignore 'nopv' parameter directly.

If PVH guest boots up via the normal boot entry same as HVM guest, it's
hard to distinguish PVH and HVM guest at that time.

To handle that case, add a new function xen_hvm_nopv_guest_late_init()
to detect PVH at a late time and panic itself if 'nopv' enabled for a
PVH guest.

Signed-off-by: Zhenzhong Duan <zhenzhong.duan@oracle.com>
Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: Juergen Gross <jgross@suse.com>
Cc: Stefano Stabellini <sstabellini@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
---
 arch/x86/xen/enlighten_hvm.c | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/arch/x86/xen/enlighten_hvm.c b/arch/x86/xen/enlighten_hvm.c
index 7fcb4ea..340dff8 100644
--- a/arch/x86/xen/enlighten_hvm.c
+++ b/arch/x86/xen/enlighten_hvm.c
@@ -25,6 +25,7 @@
 #include "mmu.h"
 #include "smp.h"
 
+extern bool nopv;
 static unsigned long shared_info_pfn;
 
 void xen_hvm_init_shared_info(void)
@@ -221,11 +222,36 @@ bool __init xen_hvm_need_lapic(void)
 	return true;
 }
 
+static __init void xen_hvm_nopv_guest_late_init(void)
+{
+#ifdef CONFIG_XEN_PVH
+	if (x86_platform.legacy.rtc || !x86_platform.legacy.no_vga)
+		return;
+
+	/* PVH detected. */
+	xen_pvh = true;
+
+	panic("nopv parameter isn't supported in PVH guest.");
+#endif
+}
+
+
 static uint32_t __init xen_platform_hvm(void)
 {
 	if (xen_pv_domain())
 		return 0;
 
+	if (xen_pvh_domain() && nopv) {
+		/* Guest booting via the Xen-PVH boot entry goes here */
+		pr_info("nopv parameter is ignored in PVH guest\n");
+	} else if (nopv) {
+		/*
+		 * Guest booting via normal boot entry (like via grub2) goes
+		 * here.
+		 */
+		x86_init.hyper.guest_late_init = xen_hvm_nopv_guest_late_init;
+		return 0;
+	}
 	return xen_cpuid_base();
 }
 
@@ -258,4 +284,5 @@ static __init void xen_hvm_guest_late_init(void)
 	.init.init_mem_mapping	= xen_hvm_init_mem_mapping,
 	.init.guest_late_init	= xen_hvm_guest_late_init,
 	.runtime.pin_vcpu       = xen_pin_vcpu,
+	.ignore_nopv            = true,
 };
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v4 5/5] xen: Add 'xen_nopv' parameter back for backward compatibility
  2019-07-01  5:19 [PATCH v4 0/5] misc fixes to PV extentions code Zhenzhong Duan
                   ` (3 preceding siblings ...)
  2019-07-01  5:19 ` [PATCH v4 4/5] x86/xen: Add 'nopv' support for HVM guest Zhenzhong Duan
@ 2019-07-01  5:19 ` Zhenzhong Duan
  2019-07-02 18:13   ` Boris Ostrovsky
  4 siblings, 1 reply; 10+ messages in thread
From: Zhenzhong Duan @ 2019-07-01  5:19 UTC (permalink / raw)
  To: linux-kernel
  Cc: xen-devel, boris.ostrovsky, jgross, sstabellini, tglx, mingo, bp,
	Zhenzhong Duan

Map 'xen_nopv' to 'nopv' and mark 'xen_nopv' obsolete in
kernel-parameters.txt

Signed-off-by: Zhenzhong Duan <zhenzhong.duan@oracle.com>
Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: Juergen Gross <jgross@suse.com>
Cc: Stefano Stabellini <sstabellini@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
---
 Documentation/admin-guide/kernel-parameters.txt | 6 ++++++
 arch/x86/xen/enlighten_hvm.c                    | 7 +++++++
 2 files changed, 13 insertions(+)

diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index d5c3dcc..34eb323 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -5264,6 +5264,12 @@
 			improve timer resolution at the expense of processing
 			more timer interrupts.
 
+	xen_nopv	[X86]
+			Disables the PV optimizations forcing the HVM guest to
+			run as generic HVM guest with no PV drivers.
+			This option is obsoleted by the "nopv" option, which
+			has equivalent effect for XEN platform.
+
 	nopv=		[X86,XEN,KVM,HYPER_V,VMWARE]
 			Disables the PV optimizations forcing the guest to run
 			as generic guest with no PV drivers. Currently support
diff --git a/arch/x86/xen/enlighten_hvm.c b/arch/x86/xen/enlighten_hvm.c
index 340dff8..5cdd608 100644
--- a/arch/x86/xen/enlighten_hvm.c
+++ b/arch/x86/xen/enlighten_hvm.c
@@ -211,6 +211,13 @@ static void __init xen_hvm_guest_init(void)
 #endif
 }
 
+static __init int xen_parse_nopv(char *arg)
+{
+	nopv = true;
+	return 0;
+}
+early_param("xen_nopv", xen_parse_nopv);
+
 bool __init xen_hvm_need_lapic(void)
 {
 	if (xen_pv_domain())
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH v4 2/5] x86: Add nopv parameter to disable PV extensions
  2019-07-01  5:19 ` [PATCH v4 2/5] x86: Add nopv parameter to disable PV extensions Zhenzhong Duan
@ 2019-07-02 17:47   ` Boris Ostrovsky
  0 siblings, 0 replies; 10+ messages in thread
From: Boris Ostrovsky @ 2019-07-02 17:47 UTC (permalink / raw)
  To: Zhenzhong Duan, linux-kernel
  Cc: xen-devel, jgross, sstabellini, tglx, mingo, bp, Jan Kiszka

On 7/1/19 1:19 AM, Zhenzhong Duan wrote:
>
> There is already 'xen_nopv' parameter for XEN platform but not for
> others. 'xen_nopv' can then be removed with this change.

This is no longer true.

-boris



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v4 4/5] x86/xen: Add 'nopv' support for HVM guest
  2019-07-01  5:19 ` [PATCH v4 4/5] x86/xen: Add 'nopv' support for HVM guest Zhenzhong Duan
@ 2019-07-02 18:04   ` Boris Ostrovsky
  0 siblings, 0 replies; 10+ messages in thread
From: Boris Ostrovsky @ 2019-07-02 18:04 UTC (permalink / raw)
  To: Zhenzhong Duan, linux-kernel
  Cc: xen-devel, jgross, sstabellini, tglx, mingo, bp

On 7/1/19 1:19 AM, Zhenzhong Duan wrote:
> PVH guest needs PV extentions to work, so 'nopv' parameter should be
> ignored for PVH but not for HVM guest.
>
> If PVH guest boots up via the Xen-PVH boot entry, xen_pvh is set early,
> we know it's PVH guest and ignore 'nopv' parameter directly.
>
> If PVH guest boots up via the normal boot entry same as HVM guest, it's
> hard to distinguish PVH and HVM guest at that time.
>
> To handle that case, add a new function xen_hvm_nopv_guest_late_init()
> to detect PVH at a late time and panic itself if 'nopv' enabled for a
> PVH guest.
>
> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@oracle.com>
> Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
> Cc: Juergen Gross <jgross@suse.com>
> Cc: Stefano Stabellini <sstabellini@kernel.org>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: Ingo Molnar <mingo@redhat.com>
> Cc: Borislav Petkov <bp@alien8.de>
> ---
>  arch/x86/xen/enlighten_hvm.c | 27 +++++++++++++++++++++++++++
>  1 file changed, 27 insertions(+)
>
> diff --git a/arch/x86/xen/enlighten_hvm.c b/arch/x86/xen/enlighten_hvm.c
> index 7fcb4ea..340dff8 100644
> --- a/arch/x86/xen/enlighten_hvm.c
> +++ b/arch/x86/xen/enlighten_hvm.c
> @@ -25,6 +25,7 @@
>  #include "mmu.h"
>  #include "smp.h"
>  
> +extern bool nopv;


I'd put this in arch/x86/include/asm/hypervisor.h


>  static unsigned long shared_info_pfn;
>  
>  void xen_hvm_init_shared_info(void)
> @@ -221,11 +222,36 @@ bool __init xen_hvm_need_lapic(void)
>  	return true;
>  }
>  
> +static __init void xen_hvm_nopv_guest_late_init(void)
> +{
> +#ifdef CONFIG_XEN_PVH
> +	if (x86_platform.legacy.rtc || !x86_platform.legacy.no_vga)
> +		return;
> +
> +	/* PVH detected. */
> +	xen_pvh = true;
> +
> +	panic("nopv parameter isn't supported in PVH guest.");
> +#endif
> +}
> +
> +
>  static uint32_t __init xen_platform_hvm(void)
>  {
>  	if (xen_pv_domain())
>  		return 0;
>  
> +	if (xen_pvh_domain() && nopv) {
> +		/* Guest booting via the Xen-PVH boot entry goes here */
> +		pr_info("nopv parameter is ignored in PVH guest\n");



                        nopv = false;

just in case nopv is used somewhere else later?


-boris

> +	} else if (nopv) {
> +		/*
> +		 * Guest booting via normal boot entry (like via grub2) goes
> +		 * here.
> +		 */
> +		x86_init.hyper.guest_late_init = xen_hvm_nopv_guest_late_init;
> +		return 0;
> +	}
>  	return xen_cpuid_base();
>  }
>  
> @@ -258,4 +284,5 @@ static __init void xen_hvm_guest_late_init(void)
>  	.init.init_mem_mapping	= xen_hvm_init_mem_mapping,
>  	.init.guest_late_init	= xen_hvm_guest_late_init,
>  	.runtime.pin_vcpu       = xen_pin_vcpu,
> +	.ignore_nopv            = true,
>  };


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v4 5/5] xen: Add 'xen_nopv' parameter back for backward compatibility
  2019-07-01  5:19 ` [PATCH v4 5/5] xen: Add 'xen_nopv' parameter back for backward compatibility Zhenzhong Duan
@ 2019-07-02 18:13   ` Boris Ostrovsky
  2019-07-03  2:14     ` Zhenzhong Duan
  0 siblings, 1 reply; 10+ messages in thread
From: Boris Ostrovsky @ 2019-07-02 18:13 UTC (permalink / raw)
  To: Zhenzhong Duan, linux-kernel
  Cc: xen-devel, jgross, sstabellini, tglx, mingo, bp

On 7/1/19 1:19 AM, Zhenzhong Duan wrote:
> Map 'xen_nopv' to 'nopv' and mark 'xen_nopv' obsolete in
> kernel-parameters.txt

I am not sure we want patch #3, why not do everything in a single patch?


>
> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@oracle.com>
> Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
> Cc: Juergen Gross <jgross@suse.com>
> Cc: Stefano Stabellini <sstabellini@kernel.org>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: Ingo Molnar <mingo@redhat.com>
> Cc: Borislav Petkov <bp@alien8.de>
> ---
>  Documentation/admin-guide/kernel-parameters.txt | 6 ++++++
>  arch/x86/xen/enlighten_hvm.c                    | 7 +++++++
>  2 files changed, 13 insertions(+)
>
> diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
> index d5c3dcc..34eb323 100644
> --- a/Documentation/admin-guide/kernel-parameters.txt
> +++ b/Documentation/admin-guide/kernel-parameters.txt
> @@ -5264,6 +5264,12 @@
>  			improve timer resolution at the expense of processing
>  			more timer interrupts.
>  
> +	xen_nopv	[X86]
> +			Disables the PV optimizations forcing the HVM guest to
> +			run as generic HVM guest with no PV drivers.
> +			This option is obsoleted by the "nopv" option, which
> +			has equivalent effect for XEN platform.
> +
>  	nopv=		[X86,XEN,KVM,HYPER_V,VMWARE]
>  			Disables the PV optimizations forcing the guest to run
>  			as generic guest with no PV drivers. Currently support
> diff --git a/arch/x86/xen/enlighten_hvm.c b/arch/x86/xen/enlighten_hvm.c
> index 340dff8..5cdd608 100644
> --- a/arch/x86/xen/enlighten_hvm.c
> +++ b/arch/x86/xen/enlighten_hvm.c
> @@ -211,6 +211,13 @@ static void __init xen_hvm_guest_init(void)
>  #endif
>  }
>  
> +static __init int xen_parse_nopv(char *arg)
> +{
> +	nopv = true;

pr_notice("\"xen_nopv\" is deprecated, please use \"nopv\" instead\n");


-boris

> +	return 0;
> +}
> +early_param("xen_nopv", xen_parse_nopv);
> +
>  bool __init xen_hvm_need_lapic(void)
>  {
>  	if (xen_pv_domain())


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v4 5/5] xen: Add 'xen_nopv' parameter back for backward compatibility
  2019-07-02 18:13   ` Boris Ostrovsky
@ 2019-07-03  2:14     ` Zhenzhong Duan
  0 siblings, 0 replies; 10+ messages in thread
From: Zhenzhong Duan @ 2019-07-03  2:14 UTC (permalink / raw)
  To: Boris Ostrovsky, linux-kernel
  Cc: xen-devel, jgross, sstabellini, tglx, mingo, bp


On 2019/7/3 2:13, Boris Ostrovsky wrote:
> On 7/1/19 1:19 AM, Zhenzhong Duan wrote:
>> Map 'xen_nopv' to 'nopv' and mark 'xen_nopv' obsolete in
>> kernel-parameters.txt
> I am not sure we want patch #3, why not do everything in a single patch?
>
Thanks for review. I'll fix all those based on your comments.

Zhenzhong


^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2019-07-03  2:15 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-07-01  5:19 [PATCH v4 0/5] misc fixes to PV extentions code Zhenzhong Duan
2019-07-01  5:19 ` [PATCH v4 1/5] x86/xen: Mark xen_hvm_need_lapic() and xen_x2apic_para_available() as __init Zhenzhong Duan
2019-07-01  5:19 ` [PATCH v4 2/5] x86: Add nopv parameter to disable PV extensions Zhenzhong Duan
2019-07-02 17:47   ` Boris Ostrovsky
2019-07-01  5:19 ` [PATCH v4 3/5] Revert "xen: Introduce 'xen_nopv' to disable PV extensions for HVM guests." Zhenzhong Duan
2019-07-01  5:19 ` [PATCH v4 4/5] x86/xen: Add 'nopv' support for HVM guest Zhenzhong Duan
2019-07-02 18:04   ` Boris Ostrovsky
2019-07-01  5:19 ` [PATCH v4 5/5] xen: Add 'xen_nopv' parameter back for backward compatibility Zhenzhong Duan
2019-07-02 18:13   ` Boris Ostrovsky
2019-07-03  2:14     ` Zhenzhong Duan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).