@@ -12,7 +12,6 @@
#define MAX_CPUS 4
static atomic_t isr_enter_count[MAX_CPUS];
-static atomic_t cpus_comp_count;
static void synic_sint_auto_eoi_isr(isr_regs_t *regs)
{
@@ -91,7 +90,7 @@ static void synic_test_prepare(void *ctx)
r = rdmsr(HV_X64_MSR_EOM);
if (r != 0) {
report("Hyper-V SynIC test, EOM read %#" PRIx64, false, r);
- goto ret;
+ return;
}
wrmsr(HV_X64_MSR_SIMP, (u64)virt_to_phys(alloc_page()) |
@@ -101,8 +100,6 @@ static void synic_test_prepare(void *ctx)
wrmsr(HV_X64_MSR_SCONTROL, HV_SYNIC_CONTROL_ENABLE);
synic_sints_prepare(smp_id());
-ret:
- atomic_inc(&cpus_comp_count);
}
static void synic_sints_test(int dst_vcpu)
@@ -125,7 +122,6 @@ static void synic_test(void *ctx)
irq_enable();
synic_sints_test(dst_vcpu);
- atomic_inc(&cpus_comp_count);
}
static void synic_test_cleanup(void *ctx)
@@ -142,7 +138,6 @@ static void synic_test_cleanup(void *ctx)
wrmsr(HV_X64_MSR_SCONTROL, 0);
wrmsr(HV_X64_MSR_SIMP, 0);
wrmsr(HV_X64_MSR_SIEFP, 0);
- atomic_inc(&cpus_comp_count);
}
int main(int ac, char **av)
@@ -156,40 +151,25 @@ int main(int ac, char **av)
smp_init();
enable_apic();
- synic_prepare_sint_vecs();
-
ncpus = cpu_count();
- if (ncpus > MAX_CPUS) {
- ncpus = MAX_CPUS;
- }
+ if (ncpus > MAX_CPUS)
+ report_abort("number cpus exceeds %d", MAX_CPUS);
printf("ncpus = %d\n", ncpus);
- atomic_set(&cpus_comp_count, 0);
- for (i = 0; i < ncpus; i++) {
- on_cpu_async(i, synic_test_prepare, (void *)read_cr3());
- }
+ synic_prepare_sint_vecs();
+
printf("prepare\n");
- while (atomic_read(&cpus_comp_count) != ncpus) {
- pause();
- }
+ on_cpus(synic_test_prepare, (void *)read_cr3());
- atomic_set(&cpus_comp_count, 0);
for (i = 0; i < ncpus; i++) {
printf("test %d -> %d\n", i, ncpus - 1 - i);
on_cpu_async(i, synic_test, (void *)(ulong)(ncpus - 1 - i));
}
- while (atomic_read(&cpus_comp_count) != ncpus) {
+ while (cpus_active() > 1)
pause();
- }
- atomic_set(&cpus_comp_count, 0);
- for (i = 0; i < ncpus; i++) {
- on_cpu_async(i, synic_test_cleanup, NULL);
- }
printf("cleanup\n");
- while (atomic_read(&cpus_comp_count) != ncpus) {
- pause();
- }
+ on_cpus(synic_test_cleanup, NULL);
ok = true;
for (i = 0; i < ncpus; ++i) {
Signed-off-by: Andrew Jones <drjones@redhat.com> --- x86/hyperv_synic.c | 36 ++++++++---------------------------- 1 file changed, 8 insertions(+), 28 deletions(-)