Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1160435

[Patch V4 02/16] xen: save linear p2m list address in shared info structure

From Juergen Gross <jgross@suse.com>
Newsgroups linux.kernel
Subject [Patch V4 02/16] xen: save linear p2m list address in shared info structure
Date 2015-06-08 14:10 +0200
Message-ID <pz42n-6vb-39@gated-at.bofh.it> (permalink)
References <pz42l-6vb-1@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


The virtual address of the linear p2m list should be stored in the
shared info structure read by the Xen tools to be able to support
64 bit pv-domains larger than 512 GB. Additionally the linear p2m
list interface includes a generation count which is changed prior
to and after each mapping change of the p2m list. Reading the
generation count the Xen tools can detect changes of the mappings
and re-read the p2m list eventually.

Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: David Vrabel <david.vrabel@citrix.com>
---
 arch/x86/xen/p2m.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c
index b47124d..703f803 100644
--- a/arch/x86/xen/p2m.c
+++ b/arch/x86/xen/p2m.c
@@ -262,6 +262,10 @@ void xen_setup_mfn_list_list(void)
 	HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list =
 		virt_to_mfn(p2m_top_mfn);
 	HYPERVISOR_shared_info->arch.max_pfn = xen_max_p2m_pfn;
+	HYPERVISOR_shared_info->arch.p2m_generation = 0;
+	HYPERVISOR_shared_info->arch.p2m_vaddr = (unsigned long)xen_p2m_addr;
+	HYPERVISOR_shared_info->arch.p2m_cr3 =
+		xen_pfn_to_cr3(virt_to_mfn(swapper_pg_dir));
 }
 
 /* Set up p2m_top to point to the domain-builder provided p2m pages */
@@ -477,8 +481,12 @@ static pte_t *alloc_p2m_pmd(unsigned long addr, pte_t *pte_pg)
 
 		ptechk = lookup_address(vaddr, &level);
 		if (ptechk == pte_pg) {
+			HYPERVISOR_shared_info->arch.p2m_generation++;
+			wmb(); /* Tools are synchronizing via p2m_generation. */
 			set_pmd(pmdp,
 				__pmd(__pa(pte_newpg[i]) | _KERNPG_TABLE));
+			wmb(); /* Tools are synchronizing via p2m_generation. */
+			HYPERVISOR_shared_info->arch.p2m_generation++;
 			pte_newpg[i] = NULL;
 		}
 
@@ -576,8 +584,12 @@ static bool alloc_p2m(unsigned long pfn)
 		spin_lock_irqsave(&p2m_update_lock, flags);
 
 		if (pte_pfn(*ptep) == p2m_pfn) {
+			HYPERVISOR_shared_info->arch.p2m_generation++;
+			wmb(); /* Tools are synchronizing via p2m_generation. */
 			set_pte(ptep,
 				pfn_pte(PFN_DOWN(__pa(p2m)), PAGE_KERNEL));
+			wmb(); /* Tools are synchronizing via p2m_generation. */
+			HYPERVISOR_shared_info->arch.p2m_generation++;
 			if (mid_mfn)
 				mid_mfn[mididx] = virt_to_mfn(p2m);
 			p2m = NULL;
@@ -629,6 +641,11 @@ bool __set_phys_to_machine(unsigned long pfn, unsigned long mfn)
 		return true;
 	}
 
+	/*
+	 * The interface requires atomic updates on p2m elements.
+	 * xen_safe_write_ulong() is using __put_user which does an atomic
+	 * store via asm().
+	 */
 	if (likely(!xen_safe_write_ulong(xen_p2m_addr + pfn, mfn)))
 		return true;
 
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

[Patch V4 00/16] xen: support pv-domains larger than 512GB Juergen Gross <jgross@suse.com> - 2015-06-08 14:10 +0200
  [Patch V4 06/16] xen: split counting of extra memory pages from remapping Juergen Gross <jgross@suse.com> - 2015-06-08 14:10 +0200
  [Patch V4 11/16] xen: check for initrd conflicting with e820 map Juergen Gross <jgross@suse.com> - 2015-06-08 14:10 +0200
  [Patch V4 09/16] xen: check for kernel memory conflicting with memory layout Juergen Gross <jgross@suse.com> - 2015-06-08 14:10 +0200
  [Patch V4 01/16] xen: sync with xen headers Juergen Gross <jgross@suse.com> - 2015-06-08 14:10 +0200
  [Patch V4 16/16] xen: remove no longer needed p2m.h Juergen Gross <jgross@suse.com> - 2015-06-08 14:10 +0200
  [Patch V4 14/16] xen: move p2m list if conflicting with e820 map Juergen Gross <jgross@suse.com> - 2015-06-08 14:10 +0200
    Re: [Xen-devel] [Patch V4 14/16] xen: move p2m list if conflicting  with e820 map David Vrabel <david.vrabel@citrix.com> - 2015-06-11 13:10 +0200
  [Patch V4 07/16] xen: check memory area against e820 map Juergen Gross <jgross@suse.com> - 2015-06-08 14:10 +0200
  [Patch V4 10/16] xen: check pre-allocated page tables for conflict with memory map Juergen Gross <jgross@suse.com> - 2015-06-08 14:10 +0200
  [Patch V4 15/16] xen: allow more than 512 GB of RAM for 64 bit pv-domains Juergen Gross <jgross@suse.com> - 2015-06-08 14:10 +0200
  [Patch V4 02/16] xen: save linear p2m list address in shared info structure Juergen Gross <jgross@suse.com> - 2015-06-08 14:10 +0200
  [Patch V4 08/16] xen: find unused contiguous memory area Juergen Gross <jgross@suse.com> - 2015-06-08 14:10 +0200
  [Patch V4 13/16] xen: add explicit memblock_reserve() calls for special pages Juergen Gross <jgross@suse.com> - 2015-06-08 14:10 +0200
  [Patch V4 12/16] mm: provide early_memremap_ro to establish read-only mapping Juergen Gross <jgross@suse.com> - 2015-06-08 14:10 +0200

csiph-web