diff mbox series

[v3,1/3] xen/arm: fix nr_pdxs calculation

Message ID 20190603220245.22750-1-sstabellini@kernel.org (mailing list archive)
State New, archived
Headers show
Series [v3,1/3] xen/arm: fix nr_pdxs calculation | expand

Commit Message

Stefano Stabellini June 3, 2019, 10:02 p.m. UTC
pfn_to_pdx expects an address, not a size, as a parameter. Specifically,
it expects the end address, then the masks calculations compensate for
any holes between start and end. Thus, we should pass the end address to
pfn_to_pdx.

The initial pdx is stored in frametable_base_pdx, so we can subtract the
result of pfn_to_pdx(start_address) from nr_pdxs; we know that we don't
need to cover any memory in the range 0-start in the frametable.

Remove the variable `nr_pages' because it is unused.

Signed-off-by: Stefano Stabellini <stefanos@xilinx.com>
CC: JBeulich@suse.com
---
Changes in v3:
- improve commit message

Changes in v2:
- use mfn_to_pdx and maddr_to_mfn along with mfn_add()
---
 xen/arch/arm/mm.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Julien Grall June 4, 2019, 5 p.m. UTC | #1
Hi Stefano,

On 6/3/19 11:02 PM, Stefano Stabellini wrote:
> pfn_to_pdx expects an address, not a size, as a parameter. Specifically,
> it expects the end address, then the masks calculations compensate for
> any holes between start and end. Thus, we should pass the end address to
> pfn_to_pdx.
> 
> The initial pdx is stored in frametable_base_pdx, so we can subtract the
> result of pfn_to_pdx(start_address) from nr_pdxs; we know that we don't
> need to cover any memory in the range 0-start in the frametable.
> 
> Remove the variable `nr_pages' because it is unused.
> 
> Signed-off-by: Stefano Stabellini <stefanos@xilinx.com>

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

Cheers,
diff mbox series

Patch

diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
index 6ac169ce27..22ed91b5c9 100644
--- a/xen/arch/arm/mm.c
+++ b/xen/arch/arm/mm.c
@@ -886,8 +886,8 @@  void __init setup_xenheap_mappings(unsigned long base_mfn,
 /* Map a frame table to cover physical addresses ps through pe */
 void __init setup_frametable_mappings(paddr_t ps, paddr_t pe)
 {
-    unsigned long nr_pages = (pe - ps) >> PAGE_SHIFT;
-    unsigned long nr_pdxs = pfn_to_pdx(nr_pages);
+    unsigned long nr_pdxs = mfn_to_pdx(mfn_add(maddr_to_mfn(pe), -1)) -
+                            mfn_to_pdx(maddr_to_mfn(ps)) + 1;
     unsigned long frametable_size = nr_pdxs * sizeof(struct page_info);
     mfn_t base_mfn;
     const unsigned long mapping_size = frametable_size < MB(32) ? MB(2) : MB(32);