All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3] xen: arm: Support <32MB frametables
@ 2015-08-21 21:30 Chris Brand
  2015-08-27  0:44 ` Julien Grall
  0 siblings, 1 reply; 4+ messages in thread
From: Chris Brand @ 2015-08-21 21:30 UTC (permalink / raw)
  To: xen-devel; +Cc: Julien Grall, Stefano Stabellini, Ian Campbell

setup_frametable_mappings() rounds frametable_size up to a multiple
of 32MB. This is wasteful on systems with less than 4GB of RAM,
although it does allow the "contig" bit to be set in the PTEs.

Where the frametable is less than 32MB in size, instead round up
to a multiple of 2MB, not setting the "contig" bit in the PTEs.

Signed-off-by: Chris Brand <chris.brand@broadcom.com>
---
Changed in v2: merged create_32mb_mappings() and create_2mb_mappings()
into create_mappings(). A side-effect is to fix the bug in v1 for
ARM64 systems with <4GB RAM.

Changed in v3: Ensure that the granularity variable is used even
in a non-debug build.

 xen/arch/arm/mm.c | 37 ++++++++++++++++++++++---------------
 1 file changed, 22 insertions(+), 15 deletions(-)

diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
index ae0f34c3c480..36300d4402b2 100644
--- a/xen/arch/arm/mm.c
+++ b/xen/arch/arm/mm.c
@@ -628,25 +628,31 @@ void __cpuinit mmu_init_secondary_cpu(void)
 }
 
 /* Create Xen's mappings of memory.
- * Base and virt must be 32MB aligned and size a multiple of 32MB.
+ * Mapping_size must be either 2MB or 32MB.
+ * Base and virt must be mapping_size aligned.
+ * Size must be a multiple of mapping_size.
  * second must be a contiguous set of second level page tables
  * covering the region starting at virt_offset. */
-static void __init create_32mb_mappings(lpae_t *second,
-                                        unsigned long virt_offset,
-                                        unsigned long base_mfn,
-                                        unsigned long nr_mfns)
+static void __init create_mappings(lpae_t *second,
+                                   unsigned long virt_offset,
+                                   unsigned long base_mfn,
+                                   unsigned long nr_mfns,
+                                   unsigned int mapping_size)
 {
     unsigned long i, count;
+    const unsigned long granularity = mapping_size >> PAGE_SHIFT;
     lpae_t pte, *p;
 
-    ASSERT(!((virt_offset >> PAGE_SHIFT) % (16 * LPAE_ENTRIES)));
-    ASSERT(!(base_mfn % (16 * LPAE_ENTRIES)));
-    ASSERT(!(nr_mfns % (16 * LPAE_ENTRIES)));
+    ASSERT((mapping_size == MB(2)) || (mapping_size == MB(32)));
+    ASSERT(!((virt_offset >> PAGE_SHIFT) % granularity));
+    ASSERT(!(base_mfn % granularity));
+    ASSERT(!(nr_mfns % granularity));
 
     count = nr_mfns / LPAE_ENTRIES;
     p = second + second_linear_offset(virt_offset);
     pte = mfn_to_xen_entry(base_mfn, WRITEALLOC);
-    pte.pt.contig = 1;  /* These maps are in 16-entry contiguous chunks. */
+    if ( granularity == 16 * LPAE_ENTRIES )
+        pte.pt.contig = 1;  /* These maps are in 16-entry contiguous chunks. */
     for ( i = 0; i < count; i++ )
     {
         write_pte(p + i, pte);
@@ -660,7 +666,7 @@ static void __init create_32mb_mappings(lpae_t *second,
 void __init setup_xenheap_mappings(unsigned long base_mfn,
                                    unsigned long nr_mfns)
 {
-    create_32mb_mappings(xen_second, XENHEAP_VIRT_START, base_mfn, nr_mfns);
+    create_mappings(xen_second, XENHEAP_VIRT_START, base_mfn, nr_mfns, MB(32));
 
     /* Record where the xenheap is, for translation routines. */
     xenheap_virt_end = XENHEAP_VIRT_START + nr_mfns * PAGE_SIZE;
@@ -749,6 +755,7 @@ void __init setup_frametable_mappings(paddr_t ps, paddr_t pe)
     unsigned long nr_pdxs = pfn_to_pdx(nr_pages);
     unsigned long frametable_size = nr_pdxs * sizeof(struct page_info);
     unsigned long base_mfn;
+    const unsigned long mapping_size = frametable_size < MB(32) ? MB(2) : MB(32);
 #ifdef CONFIG_ARM_64
     lpae_t *second, pte;
     unsigned long nr_second, second_base;
@@ -756,9 +763,8 @@ void __init setup_frametable_mappings(paddr_t ps, paddr_t pe)
 #endif
 
     frametable_base_pdx = pfn_to_pdx(ps >> PAGE_SHIFT);
-
-    /* Round up to 32M boundary */
-    frametable_size = (frametable_size + 0x1ffffff) & ~0x1ffffff;
+    /* Round up to 2M or 32M boundary, as appropriate. */
+    frametable_size = ROUNDUP(frametable_size, mapping_size);
     base_mfn = alloc_boot_pages(frametable_size >> PAGE_SHIFT, 32<<(20-12));
 
 #ifdef CONFIG_ARM_64
@@ -771,9 +777,10 @@ void __init setup_frametable_mappings(paddr_t ps, paddr_t pe)
         pte.pt.table = 1;
         write_pte(&xen_first[first_table_offset(FRAMETABLE_VIRT_START)+i], pte);
     }
-    create_32mb_mappings(second, 0, base_mfn, frametable_size >> PAGE_SHIFT);
+    create_mappings(second, 0, base_mfn, frametable_size >> PAGE_SHIFT, mapping_size);
 #else
-    create_32mb_mappings(xen_second, FRAMETABLE_VIRT_START, base_mfn, frametable_size >> PAGE_SHIFT);
+    create_mappings(xen_second, FRAMETABLE_VIRT_START,
+                    base_mfn, frametable_size >> PAGE_SHIFT, mapping_size);
 #endif
 
     memset(&frame_table[0], 0, nr_pdxs * sizeof(struct page_info));
-- 
1.9.1

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

* Re: [PATCH v3] xen: arm: Support <32MB frametables
  2015-08-21 21:30 [PATCH v3] xen: arm: Support <32MB frametables Chris Brand
@ 2015-08-27  0:44 ` Julien Grall
  2015-09-01 15:43   ` Ian Campbell
  0 siblings, 1 reply; 4+ messages in thread
From: Julien Grall @ 2015-08-27  0:44 UTC (permalink / raw)
  To: Chris Brand, xen-devel; +Cc: Stefano Stabellini, Ian Campbell

Hi Chris,

On 21/08/2015 14:30, Chris Brand wrote:
> setup_frametable_mappings() rounds frametable_size up to a multiple
> of 32MB. This is wasteful on systems with less than 4GB of RAM,
> although it does allow the "contig" bit to be set in the PTEs.
>
> Where the frametable is less than 32MB in size, instead round up
> to a multiple of 2MB, not setting the "contig" bit in the PTEs.
>
> Signed-off-by: Chris Brand <chris.brand@broadcom.com>

Reviewed-by: Julien Grall <julien.grall@citrix.com>

Regards,

-- 
Julien Grall

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

* Re: [PATCH v3] xen: arm: Support <32MB frametables
  2015-08-27  0:44 ` Julien Grall
@ 2015-09-01 15:43   ` Ian Campbell
  2015-09-11 14:10     ` Ian Campbell
  0 siblings, 1 reply; 4+ messages in thread
From: Ian Campbell @ 2015-09-01 15:43 UTC (permalink / raw)
  To: Julien Grall, Chris Brand, xen-devel; +Cc: Stefano Stabellini

On Wed, 2015-08-26 at 17:44 -0700, Julien Grall wrote:
> Hi Chris,
> 
> On 21/08/2015 14:30, Chris Brand wrote:
> > setup_frametable_mappings() rounds frametable_size up to a multiple
> > of 32MB. This is wasteful on systems with less than 4GB of RAM,
> > although it does allow the "contig" bit to be set in the PTEs.
> > 
> > Where the frametable is less than 32MB in size, instead round up
> > to a multiple of 2MB, not setting the "contig" bit in the PTEs.
> > 
> > Signed-off-by: Chris Brand <chris.brand@broadcom.com>
> 
> Reviewed-by: Julien Grall <julien.grall@citrix.com>

Acked-by: Ian Campbell <ian.campbell@citrix.com>

Chris, please ping me if I haven't applied this within some reasonable
period after the tree opens for 4.7 development.

Ian.

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

* Re: [PATCH v3] xen: arm: Support <32MB frametables
  2015-09-01 15:43   ` Ian Campbell
@ 2015-09-11 14:10     ` Ian Campbell
  0 siblings, 0 replies; 4+ messages in thread
From: Ian Campbell @ 2015-09-11 14:10 UTC (permalink / raw)
  To: Julien Grall, Chris Brand, xen-devel; +Cc: Stefano Stabellini

On Tue, 2015-09-01 at 16:43 +0100, Ian Campbell wrote:
> On Wed, 2015-08-26 at 17:44 -0700, Julien Grall wrote:
> > Hi Chris,
> > 
> > On 21/08/2015 14:30, Chris Brand wrote:
> > > setup_frametable_mappings() rounds frametable_size up to a multiple
> > > of 32MB. This is wasteful on systems with less than 4GB of RAM,
> > > although it does allow the "contig" bit to be set in the PTEs.
> > > 
> > > Where the frametable is less than 32MB in size, instead round up
> > > to a multiple of 2MB, not setting the "contig" bit in the PTEs.
> > > 
> > > Signed-off-by: Chris Brand <chris.brand@broadcom.com>
> > 
> > Reviewed-by: Julien Grall <julien.grall@citrix.com>
> 
> Acked-by: Ian Campbell <ian.campbell@citrix.com>
> 
> Chris, please ping me if I haven't applied this within some reasonable
> period after the tree opens for 4.7 development.

Applied.

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

end of thread, other threads:[~2015-09-11 14:10 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-08-21 21:30 [PATCH v3] xen: arm: Support <32MB frametables Chris Brand
2015-08-27  0:44 ` Julien Grall
2015-09-01 15:43   ` Ian Campbell
2015-09-11 14:10     ` Ian Campbell

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.