From: Luca Fancellu <Luca.Fancellu@arm.com>
To: Michal Orzel <michal.orzel@amd.com>
Cc: Xen-devel <xen-devel@lists.xenproject.org>,
Stefano Stabellini <sstabellini@kernel.org>,
Julien Grall <julien@xen.org>,
Bertrand Marquis <Bertrand.Marquis@arm.com>,
Volodymyr Babchuk <Volodymyr_Babchuk@epam.com>
Subject: Re: [PATCH v2 6/7] xen/arm: Implement the logic for static shared memory from Xen heap
Date: Mon, 20 May 2024 12:44:26 +0000 [thread overview]
Message-ID: <03C2DB73-2B91-4E74-9CBE-ACA21CDA0783@arm.com> (raw)
In-Reply-To: <cbe1fb4a-9c2b-48eb-acb0-6726aecdfe85@amd.com>
Hi Michal,
> On 20 May 2024, at 12:16, Michal Orzel <michal.orzel@amd.com> wrote:
>
> Hi Luca,
>
> On 15/05/2024 16:26, Luca Fancellu wrote:
>>
>>
>> This commit implements the logic to have the static shared memory banks
>> from the Xen heap instead of having the host physical address passed from
>> the user.
>>
>> When the host physical address is not supplied, the physical memory is
>> taken from the Xen heap using allocate_domheap_memory, the allocation
>> needs to occur at the first handled DT node and the allocated banks
>> need to be saved somewhere, so introduce the 'shm_heap_banks' static
>> global variable of type 'struct meminfo' that will hold the banks
>> allocated from the heap, its field .shmem_extra will be used to point
>> to the bootinfo shared memory banks .shmem_extra space, so that there
>> is not further allocation of memory and every bank in shm_heap_banks
>> can be safely identified by the shm_id to reconstruct its traceability
>> and if it was allocated or not.
> NIT for the future: it's better to split 10 lines long sentence into multiple ones.
> Otherwise it reads difficult.
I’ll do,
>>
>> xen/arch/arm/static-shmem.c | 186 ++++++++++++++++++++++++++++++------
>> 1 file changed, 155 insertions(+), 31 deletions(-)
>>
>> diff --git a/xen/arch/arm/static-shmem.c b/xen/arch/arm/static-shmem.c
>> index ddaacbc77740..9c3a83042d8b 100644
>> --- a/xen/arch/arm/static-shmem.c
>> +++ b/xen/arch/arm/static-shmem.c
>> @@ -9,6 +9,22 @@
>> #include <asm/static-memory.h>
>> #include <asm/static-shmem.h>
>>
>> +typedef struct {
>> + struct domain *d;
>> + paddr_t gbase;
>> + const char *role_str;
> You could swap role_str and gbase to avoid a 4B hole on arm32
Sure I will,
>
>> + struct shmem_membank_extra *bank_extra_info;
>> +} alloc_heap_pages_cb_extra;
>> +
>> +static struct meminfo __initdata shm_heap_banks = {
>> + .common.max_banks = NR_MEM_BANKS
> Do we expect that many banks?
Not really, but I was trying to don’t introduce another type, do you think it’s better instead to
introduce a new type only here, with a lower amount of banks?
Because if we take struct shared_meminfo, we would waste mem for its ‘extra’ member.
>>
>> static int __init assign_shared_memory(struct domain *d, paddr_t gbase,
>> + bool bank_from_heap,
>> const struct membank *shm_bank)
>> {
>> mfn_t smfn;
>> @@ -109,10 +138,7 @@ static int __init assign_shared_memory(struct domain *d, paddr_t gbase,
>> psize = shm_bank->size;
>> nr_borrowers = shm_bank->shmem_extra->nr_shm_borrowers;
>>
>> - printk("%pd: allocate static shared memory BANK %#"PRIpaddr"-%#"PRIpaddr".\n",
>> - d, pbase, pbase + psize);
>> -
>> - smfn = acquire_shared_memory_bank(d, pbase, psize);
>> + smfn = acquire_shared_memory_bank(d, pbase, psize, bank_from_heap);
>> if ( mfn_eq(smfn, INVALID_MFN) )
>> return -EINVAL;
>>
>> @@ -183,6 +209,7 @@ append_shm_bank_to_domain(struct kernel_info *kinfo, paddr_t start,
>>
>> static int __init handle_shared_mem_bank(struct domain *d, paddr_t gbase,
>> const char *role_str,
>> + bool bank_from_heap,
>> const struct membank *shm_bank)
>> {
>> bool owner_dom_io = true;
>> @@ -192,6 +219,9 @@ static int __init handle_shared_mem_bank(struct domain *d, paddr_t gbase,
>> pbase = shm_bank->start;
>> psize = shm_bank->size;
>>
>> + printk("%pd: SHMEM map from %s: mphys 0x%"PRIpaddr" -> gphys 0x%"PRIpaddr", size 0x%"PRIpaddr"\n",
>> + d, bank_from_heap ? "Xen heap" : "Host", pbase, gbase, psize);
> This looks more like a debug print since I don't expect user to want to see a machine address.
printk(XENLOG_DEBUG ?
>>
>> int __init process_shm(struct domain *d, struct kernel_info *kinfo,
>> const struct dt_device_node *node)
>> {
>> @@ -265,37 +329,97 @@ int __init process_shm(struct domain *d, struct kernel_info *kinfo,
>> pbase = boot_shm_bank->start;
>> psize = boot_shm_bank->size;
>>
>> - if ( INVALID_PADDR == pbase )
>> - {
>> - printk("%pd: host physical address must be chosen by users at the moment", d);
>> - return -EINVAL;
>> - }
>> + /* "role" property is optional */
>> + dt_property_read_string(shm_node, "role", &role_str);
> This function returns a value but you seem to ignore it
Sure, I’ll handle that
>>
>> - ret = handle_shared_mem_bank(d, gbase, role_str, boot_shm_bank);
>> - if ( ret )
>> - return ret;
>> + if ( !alloc_bank )
>> + {
>> + alloc_heap_pages_cb_extra cb_arg = { d, gbase, role_str,
>> + boot_shm_bank->shmem_extra };
>> +
>> + /* shm_id identified bank is not yet allocated */
>> + if ( !allocate_domheap_memory(NULL, psize, save_map_heap_pages,
>> + &cb_arg) )
>> + {
>> + printk(XENLOG_ERR
>> + "Failed to allocate (%"PRIpaddr"MB) pages as static shared memory from heap\n",
> Why limiting to MB?
I think I used it from domain_build.c, do you think it’s better to limit it on KB instead?
>>
>> + for ( ; alloc_bank < end_bank; alloc_bank++ )
>> + {
>> + if ( strncmp(shm_id, alloc_bank->shmem_extra->shm_id,
>> + MAX_SHM_ID_LENGTH) != 0 )
> shm_id has been already validated above, hence no need for a safe version of strcmp
>
I always try to use the safe version, even when redundant, I feel that if someone is copying part of the code,
at least it would copy a safe version. Anyway I will change it if it’s not desirable.
Cheers,
Luca
next prev parent reply other threads:[~2024-05-20 12:45 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-15 14:26 [PATCH v2 0/7] Static shared memory followup v2 - pt2 Luca Fancellu
2024-05-15 14:26 ` [PATCH v2 1/7] xen/arm: Lookup bootinfo shm bank during the mapping Luca Fancellu
2024-05-16 13:05 ` Michal Orzel
2024-05-15 14:26 ` [PATCH v2 2/7] xen/arm: Wrap shared memory mapping code in one function Luca Fancellu
2024-05-16 13:19 ` Michal Orzel
2024-05-16 13:24 ` Luca Fancellu
2024-05-15 14:26 ` [PATCH v2 3/7] xen/p2m: put reference for level 2 superpage Luca Fancellu
2024-05-16 13:42 ` Michal Orzel
2024-05-15 14:26 ` [PATCH v2 4/7] xen/arm: Parse xen,shared-mem when host phys address is not provided Luca Fancellu
2024-05-20 9:34 ` Michal Orzel
2024-05-15 14:26 ` [PATCH v2 5/7] xen/arm: Rework heap page allocation outside allocate_bank_memory Luca Fancellu
2024-05-20 9:42 ` Michal Orzel
2024-05-15 14:26 ` [PATCH v2 6/7] xen/arm: Implement the logic for static shared memory from Xen heap Luca Fancellu
2024-05-20 11:16 ` Michal Orzel
2024-05-20 12:44 ` Luca Fancellu [this message]
2024-05-20 13:01 ` Michal Orzel
2024-05-20 13:11 ` Luca Fancellu
2024-05-20 13:13 ` Michal Orzel
2024-05-15 14:26 ` [PATCH v2 7/7] xen/docs: Describe static shared memory when host address is not provided Luca Fancellu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=03C2DB73-2B91-4E74-9CBE-ACA21CDA0783@arm.com \
--to=luca.fancellu@arm.com \
--cc=Bertrand.Marquis@arm.com \
--cc=Volodymyr_Babchuk@epam.com \
--cc=julien@xen.org \
--cc=michal.orzel@amd.com \
--cc=sstabellini@kernel.org \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.