|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] xen/device-tree: Allow exact match for overlapping regions
Hi Julien,
> On 13 Nov 2024, at 14:01, Julien Grall <julien@xxxxxxx> wrote:
>
> Hi Luca,
>
> On 06/11/2024 13:41, Luca Fancellu wrote:
>> There are some cases where the device tree exposes a memory range
>> in both /memreserve/ and reserved-memory node, in this case the
>> current code will stop Xen to boot since it will find that the
>> latter range is clashing with the already recorded /memreserve/
>> ranges.
>> Furthermore, u-boot lists boot modules ranges, such as ramdisk,
>> in the /memreserve/ part and even in this case this will prevent
>> Xen to boot since it will see that the module memory range that
>> it is going to add in 'add_boot_module' clashes with a /memreserve/
>> range.
>> When Xen populate the data structure that tracks the memory ranges,
>> it also adds a memory type described in 'enum membank_type', so
>> in order to fix this behavior, allow the 'check_reserved_regions_overlap'
>> function to check for exact memory range match given a specific memory
>> type; allowing reserved-memory node ranges and boot modules to have an
>> exact match with ranges from /memreserve/.
>> While there, set a type for the memory recorded during ACPI boot.
>
> I am a bit confused which you mention only ACPI boot. Isn't the path also
> used when booting using Device-Tree?
right, maybe this should be:
“While there, set a type for the memory recorded using meminfo_add_bank() from
eft-boot.h."
>>
>> static bool __init meminfo_overlap_check(const struct membanks *mem,
>> paddr_t region_start,
>> - paddr_t region_size)
>> + paddr_t region_size,
>> + enum membank_type allow_match_type)
>
> Looking at the callers, you only seem to pass MEMBANK_FDT_RESVMEM or
> MEMBANK_NONE. So I wonder whether it actually make sense to introduce
> MEMBANK_NONE. Wouldn't it be better to have a boolean indicating whether we
> are looking for FDT_RESVMEM?
I wanted to give a more generic approach, but you are right, we could have a
boolean like allow_match_memreserve.
>
>> {
>> paddr_t bank_start = INVALID_PADDR, bank_end = 0;
>> paddr_t region_end = region_start + region_size;
>> @@ -113,12 +114,16 @@ static bool __init meminfo_overlap_check(const struct
>> membanks *mem,
>> if ( INVALID_PADDR == bank_start || region_end <= bank_start ||
>> region_start >= bank_end )
>> continue;
>> - else
>> - {
>> - printk("Region: [%#"PRIpaddr", %#"PRIpaddr") overlapping with
>> bank[%u]: [%#"PRIpaddr", %#"PRIpaddr")\n",
>> - region_start, region_end, i, bank_start, bank_end);
>> - return true;
>> - }
>> +
>> + if ( (allow_match_type != MEMBANK_NONE) &&
>> + (region_start == bank_start) && (region_end == bank_end) &&
>
> Why is this only an exact match?
Apparently what we are fixing is only a case where memreserve regions matches
exactly modules or reserved_mem nodes.
>
>> + (allow_match_type == mem->bank[i].type) )
>> + continue;
>> +
>> + printk("Region: [%#"PRIpaddr", %#"PRIpaddr") overlapping with
>> bank[%u]: [%#"PRIpaddr", %#"PRIpaddr")\n",
>> + region_start, region_end, i, bank_start, bank_end);
>> + return true;
>> +
>> }
>> return false;
>> @@ -169,9 +174,14 @@ void __init fw_unreserved_regions(paddr_t s, paddr_t e,
>> * with the existing reserved memory regions defined in bootinfo.
>> * Return true if the input physical address range is overlapping with any
>> * existing reserved memory regions, otherwise false.
>> + * The 'allow_match_type' parameter can be used to allow exact match of a
>> + * region with another memory region already recorded, but it needs to be
>> used
>> + * only on memory regions that allows a type (reserved_mem, acpi). For all
>> the
>> + * other cases, passing 'MEMBANK_NONE' will disable the exact match.
>> */
>> bool __init check_reserved_regions_overlap(paddr_t region_start,
>> - paddr_t region_size)
>> + paddr_t region_size,
>> + enum membank_type
>> allow_match_type)
>> {
>> const struct membanks *mem_banks[] = {
>> bootinfo_get_reserved_mem(),
>> @@ -190,8 +200,21 @@ bool __init check_reserved_regions_overlap(paddr_t
>> region_start,
>> * shared memory banks (when static shared memory feature is enabled)
>> */
>> for ( i = 0; i < ARRAY_SIZE(mem_banks); i++ )
>> - if ( meminfo_overlap_check(mem_banks[i], region_start, region_size)
>> )
>> + {
>> + enum membank_type type = allow_match_type;
>> +
>> +#ifdef CONFIG_STATIC_SHM
>> + /*
>> + * Static shared memory banks don't have a type, so for them disable
>> + * the exact match check.
>> + */
>
> This feels a bit of a hack. Why can't we had a default type like you did in
> meminfo_add_bank()?
This is the structure:
struct membank {
paddr_t start;
paddr_t size;
union {
enum membank_type type;
#ifdef CONFIG_STATIC_SHM
struct shmem_membank_extra *shmem_extra;
#endif
};
};
we did that in order to save space when static shared memory is not enabled, so
we can’t have the
type for these banks because we are already writing shmem_extra.
We could remove the union but in that case we would waste space when static
shared memory is
enabled.
Cheers,
Luca
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |