On 02/16/2016 07:11 PM, Andrew Cooper wrote:
snip
+ }
+
+ barrier(); /* MUST do it after get_cpu_maps. */
+ total_cpus = num_online_cpus() - 1;
+
+ if ( total_cpus )
+ {
+ printk(XENLOG_DEBUG "%s: CPU%u - IPIing the %u CPUs.\n", p->name,
+ cpu, total_cpus);
+ smp_call_function(reschedule_fn, NULL, 0);
+ }
+ (void)xsplice_do_single(total_cpus);
+
+ ASSERT(local_irq_is_enabled());
+
+ put_cpu_maps();
+
+ printk(XENLOG_DEBUG "%s finished with rc=%d\n", p->name, p->rc);
+ }
+ else
+ {
+ /* Wait for all CPUs to rendezvous. */
+ while ( xsplice_work.do_work && !xsplice_work.ready )
+ {
+ cpu_relax();
+ smp_rmb();
+ }
+
What happens here if the rendezvous initiator times out? Looks like we
will spin forever waiting for do_work which will never drop back to 0.
xsplice_do_wait() sets do_work to 0 on a timeout.
--
Ross Lagerwall
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel