|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v2 3/6] xen/arm: switch find_domU_holes to rangesets
remove_shm_holes_for_domU() is unnecessarily complex: it re-creates the
extended regions from scratch.
Move the rangeset into find_domU_holes() and create the extended regions
only once. This makes is simpler to further manipulate the rangeset for
removing other regions.
Remove now-unused remove_shm_holes_for_domU().
Signed-off-by: Stewart Hildebrand <stewart.hildebrand@xxxxxxx>
Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
---
v1->v2:
* add Stefano's R-b
---
xen/arch/arm/domain_build.c | 46 ++++++++++++-----
xen/arch/arm/include/asm/static-shmem.h | 9 ----
xen/arch/arm/static-shmem.c | 65 -------------------------
3 files changed, 35 insertions(+), 85 deletions(-)
diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index 2f2b021dec3e..05a77a4f92c6 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -933,34 +933,58 @@ static int __init find_domU_holes(const struct
kernel_info *kinfo,
struct membanks *ext_regions)
{
unsigned int i;
- uint64_t bankend;
const uint64_t bankbase[] = GUEST_RAM_BANK_BASES;
const uint64_t banksize[] = GUEST_RAM_BANK_SIZES;
const struct membanks *kinfo_mem = kernel_info_get_mem_const(kinfo);
- int res = -ENOENT;
+ struct rangeset *mem_holes;
+ int res;
+
+ mem_holes = rangeset_new(NULL, NULL, 0);
+ if ( !mem_holes )
+ return -ENOMEM;
for ( i = 0; i < GUEST_RAM_BANKS; i++ )
{
- struct membank *ext_bank = &(ext_regions->bank[ext_regions->nr_banks]);
+ uint64_t bankend, start, size = 0;
- ext_bank->start = ROUNDUP(bankbase[i] + kinfo_mem->bank[i].size,
SZ_2M);
+ start = ROUNDUP(bankbase[i] + kinfo_mem->bank[i].size, SZ_2M);
bankend = ~0ULL >> (64 - p2m_ipa_bits);
bankend = min(bankend, bankbase[i] + banksize[i] - 1);
- if ( bankend > ext_bank->start )
- ext_bank->size = bankend - ext_bank->start + 1;
+
+ if ( bankend > start )
+ size = bankend - start + 1;
/* 64MB is the minimum size of an extended region */
- if ( ext_bank->size < MB(64) )
+ if ( size < MB(64) )
continue;
- ext_regions->nr_banks++;
- res = 0;
+
+ res = rangeset_add_range(mem_holes, PFN_DOWN(start),
PFN_DOWN(bankend));
+ if ( res )
+ {
+ printk(XENLOG_ERR "Failed to add: %#"PRIx64"->%#"PRIx64"\n",
+ start, start + size - 1);
+ goto out;
+ }
}
+ /* Remove static shared memory regions */
+ res = remove_shm_from_rangeset(kinfo, mem_holes);
if ( res )
- return res;
+ goto out;
+
+ res = rangeset_report_ranges(mem_holes, 0,
+ PFN_DOWN((1ULL << p2m_ipa_bits) - 1),
+ add_ext_regions, ext_regions);
+ if ( res )
+ ext_regions->nr_banks = 0;
+ else if ( !ext_regions->nr_banks )
+ res = -ENOENT;
- return remove_shm_holes_for_domU(kinfo, ext_regions);
+ out:
+ rangeset_destroy(mem_holes);
+
+ return res;
}
static int __init find_host_extended_regions(const struct kernel_info *kinfo,
diff --git a/xen/arch/arm/include/asm/static-shmem.h
b/xen/arch/arm/include/asm/static-shmem.h
index 4034cec32f87..6a4c33cca8c2 100644
--- a/xen/arch/arm/include/asm/static-shmem.h
+++ b/xen/arch/arm/include/asm/static-shmem.h
@@ -27,9 +27,6 @@ void init_sharedmem_pages(void);
int remove_shm_from_rangeset(const struct kernel_info *kinfo,
struct rangeset *rangeset);
-int remove_shm_holes_for_domU(const struct kernel_info *kinfo,
- struct membanks *ext_regions);
-
int make_shm_resv_memory_node(const struct kernel_info *kinfo, int addrcells,
int sizecells);
@@ -73,12 +70,6 @@ static inline int remove_shm_from_rangeset(const struct
kernel_info *kinfo,
return 0;
}
-static inline int remove_shm_holes_for_domU(const struct kernel_info *kinfo,
- struct membanks *ext_regions)
-{
- return 0;
-}
-
static inline int make_shm_resv_memory_node(const struct kernel_info *kinfo,
int addrcells, int sizecells)
{
diff --git a/xen/arch/arm/static-shmem.c b/xen/arch/arm/static-shmem.c
index 1f8441d92046..32ec6d4bc69f 100644
--- a/xen/arch/arm/static-shmem.c
+++ b/xen/arch/arm/static-shmem.c
@@ -822,71 +822,6 @@ int __init remove_shm_from_rangeset(const struct
kernel_info *kinfo,
return 0;
}
-int __init remove_shm_holes_for_domU(const struct kernel_info *kinfo,
- struct membanks *ext_regions)
-{
- const struct membanks *shm_mem = kernel_info_get_shm_mem_const(kinfo);
- struct rangeset *guest_holes;
- unsigned int i;
- paddr_t start;
- paddr_t end;
- int res;
-
- /* No static shared memory region. */
- if ( shm_mem->nr_banks == 0 )
- return 0;
-
- dt_dprintk("Remove static shared memory holes from extended regions of
DomU\n");
-
- guest_holes = rangeset_new(NULL, NULL, 0);
- if ( !guest_holes )
- return -ENOMEM;
-
- /* Copy extended regions sets into the rangeset */
- for ( i = 0; i < ext_regions->nr_banks; i++ )
- {
- start = ext_regions->bank[i].start;
- end = start + ext_regions->bank[i].size;
-
- res = rangeset_add_range(guest_holes, PFN_DOWN(start),
- PFN_DOWN(end - 1));
- if ( res )
- {
- printk(XENLOG_ERR
- "Failed to add: %#"PRIpaddr"->%#"PRIpaddr", error: %d\n",
- start, end, res);
- goto out;
- }
- }
-
- /* Remove static shared memory regions */
- res = remove_shm_from_rangeset(kinfo, guest_holes);
- if ( res )
- goto out;
-
- /*
- * Take the interval of memory starting from the first extended region bank
- * start address and ending to the end of the last extended region bank.
- */
- i = ext_regions->nr_banks - 1;
- start = ext_regions->bank[0].start;
- end = ext_regions->bank[i].start + ext_regions->bank[i].size - 1;
-
- /* Reset original extended regions to hold new value */
- ext_regions->nr_banks = 0;
- res = rangeset_report_ranges(guest_holes, PFN_DOWN(start), PFN_DOWN(end),
- add_ext_regions, ext_regions);
- if ( res )
- ext_regions->nr_banks = 0;
- else if ( !ext_regions->nr_banks )
- res = -ENOENT;
-
- out:
- rangeset_destroy(guest_holes);
-
- return res;
-}
-
void __init shm_mem_node_fill_reg_range(const struct kernel_info *kinfo,
__be32 *reg, int *nr_cells,
int addrcells, int sizecells)
--
2.49.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |