On 11/07/18 13:06, Jan Beulich wrote: > In order to be able to service #MC on offlined CPUs, GDT, IDT, stack,
For clarity, I'd phrase this as "CPUs, the GDT, ..." to help visually separate CPUs as it isn't a part of the rest of the list. > --- a/xen/arch/x86/genapic/x2apic.c > +++ b/xen/arch/x86/genapic/x2apic.c > @@ -201,18 +201,25 @@ static int update_clusterinfo( > if ( !cluster_cpus_spare ) > cluster_cpus_spare = xzalloc(cpumask_t); > if ( !cluster_cpus_spare || > - !alloc_cpumask_var(&per_cpu(scratch_mask, cpu)) ) > + !cond_alloc_cpumask_var(&per_cpu(scratch_mask, cpu)) ) > err = -ENOMEM; > break; > case CPU_UP_CANCELED: > case CPU_DEAD: > + case CPU_REMOVE: > + if ( park_offline_cpus == (action != CPU_REMOVE) ) > + break; > if ( per_cpu(cluster_cpus, cpu) ) > { > cpumask_clear_cpu(cpu, per_cpu(cluster_cpus, cpu)); > if ( cpumask_empty(per_cpu(cluster_cpus, cpu)) ) > + { > xfree(per_cpu(cluster_cpus, cpu)); > + per_cpu(cluster_cpus, cpu) = NULL; > + } > } > free_cpumask_var(per_cpu(scratch_mask, cpu)); > + clear_cpumask_var(&per_cpu(scratch_mask, cpu)); freeing and NULL-ing the pointer at the same time is already a common pattern How about introducing /* Free an allocation, and zero the pointer to it. */ #define XFREE(p) ({ typeof(*p) *_p = (p); xfree(_p); _p = NULL; }) and a similar wrapper for FREE_CPUMASK_VAR(p) which takes care of the NULL-ing as well? In time as these start to get used more widely, it should reduce the chances of double-freeing in cleanup paths. > @@ -63,6 +63,8 @@ static cpumask_t scratch_cpu0mask; > cpumask_t cpu_online_map __read_mostly; > EXPORT_SYMBOL(cpu_online_map); > > +bool __read_mostly park_offline_cpus; > + > unsigned int __read_mostly nr_sockets; > cpumask_t **__read_mostly socket_cpumask; > static cpumask_t *secondary_socket_cpumask; > @@ -887,7 +889,7 @@ static void cleanup_cpu_root_pgt(unsigne > } > } > > -static void cpu_smpboot_free(unsigned int cpu) > +static void cpu_smpboot_free(unsigned int cpu, bool all) Perhaps "remove" or "remove_cpu", to match the CPU_REMOVE terminology? Also, we probably want a comment here explaining the difference between parking and removing in terms of what infrastructure needs to remain valid. ~Andrew _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel