mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
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@amd.com> Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
This commit is contained in:
1 parent
245e47cf8d
commit
3ef9211896
3 files changed
+35
-85
No files matched your search
+35
-11
@@ -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;
|
||||
|
||||
return remove_shm_holes_for_domU(kinfo, ext_regions);
|
||||
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;
|
||||
|
||||
out:
|
||||
rangeset_destroy(mem_holes);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static int __init find_host_extended_regions(const struct kernel_info *kinfo,
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||