All of lore.kernel.org
 help / color / mirror / Atom feed
From: Olaf Hering <olaf@aepfle.de>
To: Konrad Rzeszutek Wilk <konrad@kernel.org>
Cc: Keir Fraser <keir.xen@gmail.com>, xen-devel@lists.xen.org
Subject: Re: fixed location of share info page in HVM guests
Date: Tue, 23 Oct 2012 21:49:29 +0200	[thread overview]
Message-ID: <20121023194928.GA24083@aepfle.de> (raw)
In-Reply-To: <20120831234222.GA22460@localhost.localdomain>

On Fri, Aug 31, Konrad Rzeszutek Wilk wrote:

> On Tue, Aug 28, 2012 at 02:35:19PM +0100, Keir Fraser wrote:
> > On 28/08/2012 13:42, "Olaf Hering" <olaf@aepfle.de> wrote:
> > 
> > > On Tue, Aug 28, Keir Fraser wrote:
> > > 
> > >> Okay, that was a bit too clever, trying to hide between IOAPIC and LAPIC
> > >> pages. How about a bit lower in memory -- FE700000-FE7FFFFF?
> > >> 
> > >> Everything in range FC000000-FFFFFFFF should already be marked
> > >> E820_RESERVED. You can test that, and also see
> > >> tools/firmware/hvmloader/e820.c:build_e820_table() (and note that
> > >> RESERVED_MEMBASE == FC000000).
> > > 
> > > Yes, FC000000-FFFFFFFF has already an E820_RESERVED entry. Within that
> > > range the kernel finds the IOAPIC, LAPIC and the HPET, perhaps because
> > > they are listed in the ACPI table or because they are found by other
> > > ways.
> > 
> > Yes they are all listed in various ACPI tables.
> > 
> > > To make the location of the of the shared pages configurable from the
> > > tools, does tools/firmware/hvmloader/acpi/dsdt.asl have a way to
> > > describe such special region? Maybe the kernel parses that table early
> 
> Isn't there also a magic string of said structure? If so we should also
> check for the magic string to make sure we are mapping the proper
> "thing." It can be done similary to how iBFT or EBDA is found.

I will have a look if ACPI can be used that early, for the time being a
hardcoded address is used. This is the proposed kernel change, against
3.7-rc2. The open question is when to switch from early_ioremap to
ioremap. Then the change to drivers/xen/platform-pci.c can be removed.

Olaf

 xen PVonHVM: move shared_info to reserved memory area

---
 arch/x86/include/asm/xen/hypervisor.h |  2 ++
 arch/x86/xen/enlighten.c              | 53 ++++++++++++++++++++++++++---------
 arch/x86/xen/suspend.c                |  2 +-
 arch/x86/xen/xen-ops.h                |  2 +-
 drivers/xen/platform-pci.c            |  2 ++
 include/xen/events.h                  |  2 ++
 6 files changed, 48 insertions(+), 15 deletions(-)

diff --git a/arch/x86/include/asm/xen/hypervisor.h b/arch/x86/include/asm/xen/hypervisor.h
index 66d0fff..e29a02b 100644
--- a/arch/x86/include/asm/xen/hypervisor.h
+++ b/arch/x86/include/asm/xen/hypervisor.h
@@ -34,6 +34,8 @@
 #define _ASM_X86_XEN_HYPERVISOR_H
 
 /* arch/i386/kernel/setup.c */
+#define HVM_SHARED_INFO_ADDR 0xFE700000UL
+
 extern struct shared_info *HYPERVISOR_shared_info;
 extern struct start_info *xen_start_info;
 
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
index e3497f2..b051c3f 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -103,7 +103,6 @@ struct shared_info xen_dummy_shared_info;
 
 void *xen_initial_gdt;
 
-RESERVE_BRK(shared_info_page_brk, PAGE_SIZE);
 __read_mostly int xen_have_vector_callback;
 EXPORT_SYMBOL_GPL(xen_have_vector_callback);
 
@@ -1497,38 +1496,66 @@ asmlinkage void __init xen_start_kernel(void)
 #endif
 }
 
-void __ref xen_hvm_init_shared_info(void)
+#ifdef CONFIG_XEN_PVHVM
+static struct shared_info *xen_hvm_shared_info;
+
+static void xen_hvm_connect_shared_info(unsigned long pfn)
 {
-	int cpu;
 	struct xen_add_to_physmap xatp;
-	static struct shared_info *shared_info_page = 0;
 
-	if (!shared_info_page)
-		shared_info_page = (struct shared_info *)
-			extend_brk(PAGE_SIZE, PAGE_SIZE);
 	xatp.domid = DOMID_SELF;
 	xatp.idx = 0;
 	xatp.space = XENMAPSPACE_shared_info;
-	xatp.gpfn = __pa(shared_info_page) >> PAGE_SHIFT;
+	xatp.gpfn = pfn;
 	if (HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp))
 		BUG();
 
-	HYPERVISOR_shared_info = (struct shared_info *)shared_info_page;
+}
+static void xen_hvm_set_shared_info(struct shared_info *sip)
+{
+	int cpu;
+
+	HYPERVISOR_shared_info = sip;
 
 	/* xen_vcpu is a pointer to the vcpu_info struct in the shared_info
 	 * page, we use it in the event channel upcall and in some pvclock
 	 * related functions. We don't need the vcpu_info placement
 	 * optimizations because we don't use any pv_mmu or pv_irq op on
 	 * HVM.
-	 * When xen_hvm_init_shared_info is run at boot time only vcpu 0 is
-	 * online but xen_hvm_init_shared_info is run at resume time too and
+	 * When xen_hvm_set_shared_info is run at boot time only vcpu 0 is
+	 * online but xen_hvm_set_shared_info is run at resume time too and
 	 * in that case multiple vcpus might be online. */
 	for_each_online_cpu(cpu) {
 		per_cpu(xen_vcpu, cpu) = &HYPERVISOR_shared_info->vcpu_info[cpu];
 	}
 }
 
-#ifdef CONFIG_XEN_PVHVM
+/* Reconnect the shared_info pfn to a (new) mfn */
+void xen_hvm_resume_shared_info(void)
+{
+	xen_hvm_connect_shared_info(HVM_SHARED_INFO_ADDR >> PAGE_SHIFT);
+}
+
+/* Update shared_info address */
+void __devinit xen_hvm_init_shared_info(void)
+{
+	struct shared_info *early;
+
+	early = xen_hvm_shared_info;
+	xen_hvm_shared_info = ioremap(HVM_SHARED_INFO_ADDR, PAGE_SIZE);
+	xen_hvm_set_shared_info(xen_hvm_shared_info);
+	wmb();
+	early_iounmap(early, PAGE_SIZE);
+}
+
+/* Obtain an address to the pfn in reserved area */
+static void __init xen_hvm_early_init_shared_info(void)
+{
+	xen_hvm_shared_info = early_ioremap(HVM_SHARED_INFO_ADDR, PAGE_SIZE);
+	xen_hvm_connect_shared_info(HVM_SHARED_INFO_ADDR >> PAGE_SHIFT);
+	xen_hvm_set_shared_info(xen_hvm_shared_info);
+}
+
 static void __init init_hvm_pv_info(void)
 {
 	int major, minor;
@@ -1578,7 +1605,7 @@ static void __init xen_hvm_guest_init(void)
 {
 	init_hvm_pv_info();
 
-	xen_hvm_init_shared_info();
+	xen_hvm_early_init_shared_info();
 
 	if (xen_feature(XENFEAT_hvm_callback_vector))
 		xen_have_vector_callback = 1;
diff --git a/arch/x86/xen/suspend.c b/arch/x86/xen/suspend.c
index 45329c8..ae8a00c 100644
--- a/arch/x86/xen/suspend.c
+++ b/arch/x86/xen/suspend.c
@@ -30,7 +30,7 @@ void xen_arch_hvm_post_suspend(int suspend_cancelled)
 {
 #ifdef CONFIG_XEN_PVHVM
 	int cpu;
-	xen_hvm_init_shared_info();
+	xen_hvm_resume_shared_info();
 	xen_callback_vector();
 	xen_unplug_emulated_devices();
 	if (xen_feature(XENFEAT_hvm_safe_pvclock)) {
diff --git a/arch/x86/xen/xen-ops.h b/arch/x86/xen/xen-ops.h
index a95b417..d2e73d1 100644
--- a/arch/x86/xen/xen-ops.h
+++ b/arch/x86/xen/xen-ops.h
@@ -40,7 +40,7 @@ void xen_enable_syscall(void);
 void xen_vcpu_restore(void);
 
 void xen_callback_vector(void);
-void xen_hvm_init_shared_info(void);
+void xen_hvm_resume_shared_info(void);
 void xen_unplug_emulated_devices(void);
 
 void __init xen_build_dynamic_phys_to_machine(void);
diff --git a/drivers/xen/platform-pci.c b/drivers/xen/platform-pci.c
index 97ca359..989365f 100644
--- a/drivers/xen/platform-pci.c
+++ b/drivers/xen/platform-pci.c
@@ -138,6 +138,8 @@ static int __devinit platform_pci_init(struct pci_dev *pdev,
 	platform_mmio = mmio_addr;
 	platform_mmiolen = mmio_len;
 
+	xen_hvm_init_shared_info();
+
 	if (!xen_have_vector_callback) {
 		ret = xen_allocate_irq(pdev);
 		if (ret) {
diff --git a/include/xen/events.h b/include/xen/events.h
index c6bfe01..58c8431 100644
--- a/include/xen/events.h
+++ b/include/xen/events.h
@@ -58,6 +58,8 @@ void notify_remote_via_irq(int irq);
 
 void xen_irq_resume(void);
 
+void xen_hvm_init_shared_info(void);
+
 /* Clear an irq's pending state, in preparation for polling on it */
 void xen_clear_irq_pending(int irq);
 void xen_set_irq_pending(int irq);
-- 
1.7.12.4

  reply	other threads:[~2012-10-23 19:49 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-08-27 17:55 fixed location of share info page in HVM guests Olaf Hering
2012-08-27 18:10 ` Keir Fraser
2012-08-27 21:32   ` Olaf Hering
2012-08-27 21:51     ` Keir Fraser
2012-08-27 21:56       ` Olaf Hering
2012-08-28  0:13         ` Keir Fraser
2012-08-28  8:23           ` Olaf Hering
2012-08-28 11:40             ` Keir Fraser
2012-08-28 12:42               ` Olaf Hering
2012-08-28 13:35                 ` Keir Fraser
2012-08-31 23:43                   ` Konrad Rzeszutek Wilk
2012-10-23 19:49                     ` Olaf Hering [this message]
2012-10-24  7:31                       ` Jan Beulich
2012-10-24 14:54                         ` Olaf Hering
2012-10-22 18:50               ` Olaf Hering
2012-10-22 12:15                 ` Keir Fraser
2012-10-23  7:34                 ` Jan Beulich
2012-10-23 20:27                   ` Olaf Hering

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=20121023194928.GA24083@aepfle.de \
    --to=olaf@aepfle.de \
    --cc=keir.xen@gmail.com \
    --cc=konrad@kernel.org \
    --cc=xen-devel@lists.xen.org \
    /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.