|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC 30/49] xen: let vcpu_create() select processor
On 29/03/2019 20:17, Andrew Cooper wrote:
> On 29/03/2019 15:09, Juergen Gross wrote:
>> Today there are two distinct scenarios for vcpu_create(): either for
>> creation of idle-domain vcpus (vcpuid == processor) or for creation of
>> "normal" domain vcpus (including dom0), where the caller selects the
>> initial processor on a round-robin scheme of the allowed processors
>> (allowed being based on cpupool and affinities).
>>
>> Instead of passing the initial processor to vcpu_create() and passing
>> on to sched_init_vcpu() let sched_init_vcpu() do the processor
>> selection. For supporting dom0 vcpu creation use the node_affinity of
>> the domain as a base for selecting the processors. User domains will
>> have initially all nodes set, so this is no different behavior compared
>> to today.
>>
>> Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
>
> Good riddance to the parameter! This will definitely simply some of my
> further domcreate changes.
>
>> index d9836779d1..d5294b0d26 100644
>> --- a/xen/arch/arm/domain_build.c
>> +++ b/xen/arch/arm/domain_build.c
>> @@ -1986,12 +1986,11 @@ static int __init construct_domain(struct domain *d,
>> struct kernel_info *kinfo)
>> }
>> #endif
>>
>> - for ( i = 1, cpu = 0; i < d->max_vcpus; i++ )
>> + for ( i = 1; i < d->max_vcpus; i++ )
>> {
>> - cpu = cpumask_cycle(cpu, &cpu_online_map);
>> - if ( vcpu_create(d, i, cpu) == NULL )
>> + if ( vcpu_create(d, i) == NULL )
>> {
>> - printk("Failed to allocate dom0 vcpu %d on pcpu %d\n", i, cpu);
>> + printk("Failed to allocate dom0 vcpu %d\n", i);
>
> Mind adjusting this to d0v%u as it is changing anyway?
Okay.
>
>> diff --git a/xen/common/schedule.c b/xen/common/schedule.c
>> index ae2a6d0323..9b5527c1eb 100644
>> --- a/xen/common/schedule.c
>> +++ b/xen/common/schedule.c
>> @@ -318,14 +318,40 @@ static struct sched_item *sched_alloc_item(struct vcpu
>> *v)
>> return NULL;
>> }
>>
>> -int sched_init_vcpu(struct vcpu *v, unsigned int processor)
>> +static unsigned int sched_select_initial_cpu(struct vcpu *v)
>> +{
>> + struct domain *d = v->domain;
>> + nodeid_t node;
>> + cpumask_t cpus;
>> +
>> + cpumask_clear(&cpus);
>> + for_each_node_mask ( node, d->node_affinity )
>> + cpumask_or(&cpus, &cpus, &node_to_cpumask(node));
>> + cpumask_and(&cpus, &cpus, cpupool_domain_cpumask(d));
>> + if ( cpumask_empty(&cpus) )
>> + cpumask_copy(&cpus, cpupool_domain_cpumask(d));
>> +
>> + if ( v->vcpu_id == 0 )
>> + return cpumask_first(&cpus);
>> +
>> + /* We can rely on previous vcpu being available. */
>
> Only if you ASSERT(!is_idle_domain(d)), which is safe given the sole caller.
>
> idle->vcpu[] can be sparse in some corner cases.
>
> Ideally with both of these suggestions, Acked-by: Andrew Cooper
> <andrew.cooper3@xxxxxxxxxx>
Thanks.
Juergen
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |