浏览代码

x86: Add a 'pause' instruction in __udelay() for QEMU target

When running SMP configuration on QEMU (tcg mode, no kvm), there is
a busy loop in start_aps(), calling udelay(), that waits for APs to
show up online. However, there is a chance that VCPU1 will be timeout
waiting, IOW the secondary VCPUs haven't started their execution yet.

This patch adds a 'pause' instruction in __udelay() only for QEMU
target, to give other VCPUs a chance to run. When QEMU sees the
'pause' instruction, it will yeild the execution to other CPUs.

Signed-off-by: Miao Yan <yanmiaobest@gmail.com>
Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
Acked-by: Simon Glass <sjg@chromium.org>
Tested-by: Simon Glass <sjg@chromium.org>
Miao Yan 9 年之前
父节点
当前提交
417576c2f1
共有 1 个文件被更改,包括 8 次插入0 次删除
  1. 8 0
      arch/x86/lib/tsc_timer.c

+ 8 - 0
arch/x86/lib/tsc_timer.c

@@ -355,7 +355,15 @@ void __udelay(unsigned long usec)
 	stop = now + usec * get_tbclk_mhz();
 
 	while ((int64_t)(stop - get_ticks()) > 0)
+#if defined(CONFIG_QEMU) && defined(CONFIG_SMP)
+		/*
+		 * Add a 'pause' instruction on qemu target,
+		 * to give other VCPUs a chance to run.
+		 */
+		asm volatile("pause");
+#else
 		;
+#endif
 }
 
 int timer_init(void)