[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 3/3] xen/sched: fix cpu hotplug
On 02.08.2022 15:36, Juergen Gross wrote: > --- a/xen/common/sched/cpupool.c > +++ b/xen/common/sched/cpupool.c > @@ -419,6 +419,8 @@ static int cpupool_alloc_affin_masks(struct > affinity_masks *masks) > return 0; > > free_cpumask_var(masks->hard); > + memset(masks, 0, sizeof(*masks)); FREE_CPUMASK_VAR()? > @@ -1031,10 +1041,23 @@ static int cf_check cpu_callback( > { > unsigned int cpu = (unsigned long)hcpu; > int rc = 0; > + static struct cpu_rm_data *mem; When you mentioned your plan, I was actually envisioning a slightly different model: Instead of doing the allocation at CPU_DOWN_PREPARE, allocate a single instance during boot, which would never be freed. Did you consider such, and it turned out worse? I guess the main obstacle would be figuring an upper bound for sr->granularity, but of course schedule_cpu_rm_alloc(), besides the allocations, also does quite a bit of filling in values, which can't be done up front. > switch ( action ) > { > case CPU_DOWN_FAILED: > + if ( system_state <= SYS_STATE_active ) > + { > + if ( mem ) > + { > + if ( memchr_inv(&mem->affinity, 0, sizeof(mem->affinity)) ) > + cpupool_free_affin_masks(&mem->affinity); I don't think the conditional is really needed - it merely avoids two xfree(NULL) invocations at the expense of readability here. Plus - wouldn't this better be part of ... > + schedule_cpu_rm_free(mem, cpu); ... this anyway? > @@ -1042,12 +1065,32 @@ static int cf_check cpu_callback( > case CPU_DOWN_PREPARE: > /* Suspend/Resume don't change assignments of cpus to cpupools. */ > if ( system_state <= SYS_STATE_active ) > + { > rc = cpupool_cpu_remove_prologue(cpu); > + if ( !rc ) > + { > + ASSERT(!mem); > + mem = schedule_cpu_rm_alloc(cpu); > + rc = mem ? cpupool_alloc_affin_masks(&mem->affinity) : > -ENOMEM; Ah - here you actually want a non-boolean return value. No need to change that then in the earlier patch (albeit of course a change there could be easily accommodated here). Along the lines of the earlier comment this 2nd allocation may also want to move into schedule_cpu_rm_alloc(). If other users of the function don't need the extra allocations, perhaps by adding a bool parameter. Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |