[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v2] xen/arm: Add support for 16 bit VMIDs



Hi Julien,

>>
>> VMID space is increased to 16-bits from 8-bits in ARMv8 8.1 revision.
>> This allows more than 256 VMs to be supported by Xen.
>>
>> This change adds support for 16-bit VMIDs in Xen based on whether the
>> architecture supports it.
>>
>> Signed-off-by: Bhupinder Thakur <bhupinder.thakur@xxxxxxxxxx>
>> Reviewed-by: Julien Grall <julien.grall@xxxxxxx>
>> Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
>
>
> The tag reviewed-by has a strong meaning, it means that the person has fully 
> reviewed the code and he agrees with the modifications (i.e the code is good 
> to be pushed). For more details see a good description in in Linux doc (see 
> [1]).
>
> In this case, neither Stefano nor I gave it. So please drop them until one of 
> us formally gave him. (e.g Reviewed-by: Name <email>).
>

I will remove the reviewed-by tags. I will check the reference
mentioned by you for the guidelines.

>> @@ -19,6 +20,7 @@ static unsigned int __read_mostly p2m_root_order;
>>  static unsigned int __read_mostly p2m_root_level;
>>  #define P2M_ROOT_ORDER    p2m_root_order
>>  #define P2M_ROOT_LEVEL p2m_root_level
>> +static unsigned int __read_mostly max_vmid;
>
>
> I would much prefer if max_vmid and MAX_VMID are defined together.
>

will move the definitions together.

>
>> - * VTTBR_EL2 VMID field is 8 bits. Using a bitmap here limits us to
>> - * 256 concurrent domains.
>> + * VTTBR_EL2 VMID field is 8 or 16 bits. Aarch64 supports 16-bit VMID.
>> + * Using a bitmap here limits us to 256 or 65536 (for Aarch64) concurrent
>> + * domains. The bitmap space will be allocated dynamically based on
>> + * whether 8 or 16 bit VMIDs are supported.
>>   */
>> -static DECLARE_BITMAP(vmid_mask, MAX_VMID);
>> +static unsigned long *vmid_mask=NULL;
>
>
> Coding style here.
>
> vmid_mask = NULL;
>
> However, the NULL is not necessary here as global variable are initialized to 
> 0 by default.
>
ok.

>>
>> -void p2m_vmid_allocator_init(void)
>> +int p2m_vmid_allocator_init(void)
>>  {
>> -    set_bit(INVALID_VMID, vmid_mask);
>> +    int ret=0;
>
>
> Coding style;
>
> int ret = 0;

ok.

>
>> +
>> +#ifdef CONFIG_ARM_64
>> +
>> +    unsigned int cpu;
>> +
>> +    /*
>> +     * initialize max_vmid to 16 bits by default
>> +     */
>> +    max_vmid = MAX_VMID_16_BIT;
>
>
> This could be done at the declaration of max_vmid.
>

ok.

>> +
>> +    /*
>> +     * if any cpu does not support 16-bit VMID then restrict the
>> +     * max VMIDs which can be allocated to 256
>> +     */
>> +    for_each_online_cpu ( cpu )
>> +    {
>> +        const struct cpuinfo_arm *info = &cpu_data[cpu];
>> +
>> +        if ( info->mm64.vmid_bits != MM64_VMID_16_BITS_SUPPORT )
>> +        {
>> +            max_vmid = MAX_VMID_8_BIT;
>> +            break;
>> +        }
>> +    }
>
>
> I still think this is very confusing to consider 16-bit VMID by default as 
> this is an enhancement in a newer architecture.
>
> I would prefer to see the loop inverted, i.e checking whether all the CPUs 
> support 16-bit and set max_vmid to 16 bit if supported.
>
> If you disagree please explain why.
>
The reason for doing it this way was to avoid using another variable
which would tell whether the FOR loop ran to completion (only then the
max_vmid can be set to MAX_VMID_16_BIT). By inverting the check I
avoided that extra variable.

>
>> --- a/xen/arch/arm/setup.c
>> +++ b/xen/arch/arm/setup.c
>> @@ -789,7 +789,8 @@ void __init start_xen(unsigned long boot_phys_offset,
>>
>>      gic_init();
>>
>> -    p2m_vmid_allocator_init();
>> +    if ( p2m_vmid_allocator_init() != 0 )
>> +        panic("Could not allocate VMID bitmap space");
>
>
> I am not sure why we have to initialize the VMID allocator far before setting 
> up the stage-2 translation (see call setup_virt_paging).
>
> Overall, VMID are part of stage-2 subsystem. So I think it would be better to 
> move this call in setup_virt_paging.
>
> With that you could take advantage of the for_each_online loop in 
> setup_virt_paging and avoid to have go through again all CPUs.
>
> So what I would like to see is:
>    - Patch #1: move p2m_vmid_allocator_init in setup_virt_paging
>    - Patch #2: Add support for 16 bit VMIDs

The VMIDs are allocated from arch_init_memory () also (via
domain_create ()), which happens before setup_virt_paging ().


Regards,
Bhupinder

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.