|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH V5 09/10] xen/arm: make domain_max_vcpus return value from vgic_ops
> On May 31, 2015, at 21:35, Julien Grall <julien.grall@xxxxxxxxxx> wrote:
>
> Hi Chen,
>
> On 30/05/2015 12:07, Chen Baozi wrote:
>> From: Chen Baozi <baozich@xxxxxxxxx>
>>
>> When a guest uses vGICv2, the maximum number of vCPU it can support
>> should not be as many as MAX_VIRT_CPUS, which is 128 at the moment.
>> So the domain_max_vcpus should return the value according to the vGIC
>> the domain uses.
>>
>> We didn't keep it as the old static inline form because it will break
>> compilation when access the member of struct domain:
>>
>> In file included from xen/include/xen/domain.h:6:0,
>> from xen/include/xen/sched.h:10,
>> from arm64/asm-offsets.c:10:
>> xen/include/asm/domain.h: In function âdomain_max_vcpusâ:
>> xen/include/asm/domain.h:266:10: error: dereferencing pointer to incomplete
>> type
>> if (d->arch.vgic.version == GIC_V2)
>> ^
>>
>> Signed-off-by: Chen Baozi <baozich@xxxxxxxxx>
>> ---
>> xen/arch/arm/domain.c | 5 +++++
>> xen/arch/arm/domain_build.c | 2 +-
>> xen/arch/arm/vgic-v2.c | 6 ++++++
>> xen/arch/arm/vgic-v3.c | 6 ++++++
>> xen/include/asm-arm/domain.h | 5 +----
>> xen/include/asm-arm/gic.h | 3 +++
>> xen/include/asm-arm/vgic.h | 2 ++
>> 7 files changed, 24 insertions(+), 5 deletions(-)
>>
>> diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c
>> index 0cf147c..c638ff5 100644
>> --- a/xen/arch/arm/domain.c
>> +++ b/xen/arch/arm/domain.c
>> @@ -890,6 +890,11 @@ void vcpu_block_unless_event_pending(struct vcpu *v)
>> vcpu_unblock(current);
>> }
>>
>> +unsigned int domain_max_vcpus(const struct domain *d)
>> +{
>> + return d->arch.vgic.handler->get_max_vcpus();
>
> As long as we keep MAX_VIRT_VCPUS in the common vGIC drivers, we need to make
> sure that we don't return a superior value because technically, with your
> changes, the vGICv3 could support more than 128 vCPUs...
>
> I would do: return min(MAX_VIRT_CPUS, d->arch...)
>
>> +}
>> +
>> /*
>> * Local variables:
>> * mode: C
>> diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
>> index 5591d82..88cfcee 100644
>> --- a/xen/arch/arm/domain_build.c
>> +++ b/xen/arch/arm/domain_build.c
>> @@ -769,7 +769,7 @@ static int make_cpus_node(const struct domain *d, void
>> *fdt,
>> * is enough for the current max vcpu number.
>> */
>> mpidr_aff = vcpuid_to_vaffinity(cpu);
>> - DPRINT("Create cpu@%x node\n", mpidr_aff);
>> + DPRINT("Create cpu@%x (logical CPUID: %d) node\n", mpidr_aff, cpu);
>
> This change belongs to patch #7...
>
>>
>> snprintf(buf, sizeof(buf), "cpu@%x", mpidr_aff);
>> res = fdt_begin_node(fdt, buf);
>> diff --git a/xen/arch/arm/vgic-v2.c b/xen/arch/arm/vgic-v2.c
>> index 17a3c9f..206d289 100644
>> --- a/xen/arch/arm/vgic-v2.c
>> +++ b/xen/arch/arm/vgic-v2.c
>> @@ -508,6 +508,11 @@ static struct vcpu *vgic_v2_get_target_vcpu(struct vcpu
>> *v, unsigned int irq)
>> return v_target;
>> }
>>
>> +static int vgic_v2_get_max_vcpus(void)
>> +{
>> + return GICV2_MAX_CPUS;
>> +}
>> +
>> static int vgic_v2_get_irq_priority(struct vcpu *v, unsigned int irq)
>> {
>> int priority;
>> @@ -594,6 +599,7 @@ const struct vgic_ops vgic_v2_ops = {
>> .domain_init = vgic_v2_domain_init,
>> .get_irq_priority = vgic_v2_get_irq_priority,
>> .get_target_vcpu = vgic_v2_get_target_vcpu,
>> + .get_max_vcpus = vgic_v2_get_max_vcpus,
>> };
>>
>> /*
>> diff --git a/xen/arch/arm/vgic-v3.c b/xen/arch/arm/vgic-v3.c
>> index 21d8d3f..e79b010 100644
>> --- a/xen/arch/arm/vgic-v3.c
>> +++ b/xen/arch/arm/vgic-v3.c
>> @@ -1048,6 +1048,11 @@ static int vgic_v3_emulate_sysreg(struct
>> cpu_user_regs *regs, union hsr hsr)
>> }
>> }
>>
>> +static int vgic_v3_get_max_vcpus(void)
>> +{
>> + return GICV3_MAX_CPUS;
>> +};
>> +
>> static const struct mmio_handler_ops vgic_rdistr_mmio_handler = {
>> .read_handler = vgic_v3_rdistr_mmio_read,
>> .write_handler = vgic_v3_rdistr_mmio_write,
>> @@ -1220,6 +1225,7 @@ const struct vgic_ops vgic_v3_ops = {
>> .get_irq_priority = vgic_v3_get_irq_priority,
>> .get_target_vcpu = vgic_v3_get_target_vcpu,
>> .emulate_sysreg = vgic_v3_emulate_sysreg,
>> + .get_max_vcpus = vgic_v3_get_max_vcpus,
>> };
>>
>> /*
>> diff --git a/xen/include/asm-arm/domain.h b/xen/include/asm-arm/domain.h
>> index b7b5cd2..b525bec 100644
>> --- a/xen/include/asm-arm/domain.h
>> +++ b/xen/include/asm-arm/domain.h
>> @@ -261,10 +261,7 @@ struct arch_vcpu
>> void vcpu_show_execution_state(struct vcpu *);
>> void vcpu_show_registers(const struct vcpu *);
>>
>> -static inline unsigned int domain_max_vcpus(const struct domain *d)
>> -{
>> - return MAX_VIRT_CPUS;
>> -}
>> +unsigned int domain_max_vcpus(const struct domain *);
>>
>> /*
>> * Due to the restriction of GICv3, the number of vCPUs in AFF0 is
>> diff --git a/xen/include/asm-arm/gic.h b/xen/include/asm-arm/gic.h
>> index c6ef4bf..55f99cd 100644
>> --- a/xen/include/asm-arm/gic.h
>> +++ b/xen/include/asm-arm/gic.h
>> @@ -18,6 +18,9 @@
>> #ifndef __ASM_ARM_GIC_H__
>> #define __ASM_ARM_GIC_H__
>>
>> +#define GICV2_MAX_CPUS 8
>> +#define GICV3_MAX_CPUS 128
>
> This doesn't need to be exported and can go in each vGIC driver.
>
> Furthermore, technically, the vGICv3 driver is able to support more than 128
> vCPUs...
>
>> +
>> #define NR_GIC_LOCAL_IRQS NR_LOCAL_IRQS
>> #define NR_GIC_SGI 16
>> #define MAX_RDIST_COUNT 4
>> diff --git a/xen/include/asm-arm/vgic.h b/xen/include/asm-arm/vgic.h
>> index 2f413e1..1157b04 100644
>> --- a/xen/include/asm-arm/vgic.h
>> +++ b/xen/include/asm-arm/vgic.h
>> @@ -110,6 +110,8 @@ struct vgic_ops {
>> struct vcpu *(*get_target_vcpu)(struct vcpu *v, unsigned int irq);
>> /* vGIC sysreg emulation */
>> int (*emulate_sysreg)(struct cpu_user_regs *regs, union hsr hsr);
>> + /* Get the maximum number of vCPU supported */
>> + int (*get_max_vcpus)(void);
>
> Why did you create a function? The value never change so a field value would
> have been betterâ
But is it appropriate that we define a field value in a struct called vgic_ops?
I
thought âXXX_opsâ refers to a struct that is made up by function points. (FIXME)
Cheers,
Baozi.
Attachment:
signature.asc _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |