hv: smp: fix an isuue about SMP sync

Now BSP may launch VMs before APs have not done its initilization,
for example, sched_control for per-cpu. However, when we initilize
the vcpu thread data, it will access the object (scheduler) of the
sched_control of APs. As a result, it will trigger the PF.

This patch would waits each physical has done its initilization before
to continue to execute.

Tracked-On: #5929
Signed-off-by: Li Fei1 <fei1.li@intel.com>
This commit is contained in:
Li Fei1 2021-04-19 11:12:58 +08:00 committed by wenlingz
parent 5f281df548
commit 6137347411
1 changed files with 5 additions and 10 deletions

View File

@ -259,6 +259,7 @@ void init_pcpu_post(uint16_t pcpu_id)
*/
reserve_buffer_for_ept_pages();
pcpu_sync = ALL_CPUS_MASK;
/* Start all secondary cores */
startup_paddr = prepare_trampoline();
if (!start_pcpus(AP_MASK)) {
@ -276,9 +277,6 @@ void init_pcpu_post(uint16_t pcpu_id)
timer_init();
ptdev_init();
/* Wait for boot processor to signal all secondary cores to continue */
wait_sync_change(&pcpu_sync, 0UL);
}
if (!init_software_sram(pcpu_id == BSP_CPU_ID)) {
@ -296,6 +294,10 @@ void init_pcpu_post(uint16_t pcpu_id)
enable_smap();
init_keylocker();
bitmap_clear_lock(pcpu_id, &pcpu_sync);
/* Waiting for each pCPU has done its initialization before to continue */
wait_sync_change(&pcpu_sync, 0UL);
}
static uint16_t get_pcpu_id_from_lapic_id(uint32_t lapic_id)
@ -362,10 +364,6 @@ bool start_pcpus(uint64_t mask)
uint16_t pcpu_id = get_pcpu_id();
uint64_t expected_start_mask = mask;
/* secondary cpu start up will wait for pcpu_sync -> 0UL */
pcpu_sync = 1UL;
cpu_write_memory_barrier();
i = ffs64(expected_start_mask);
while (i != INVALID_BIT_INDEX) {
bitmap_clear_nolock(i, &expected_start_mask);
@ -378,9 +376,6 @@ bool start_pcpus(uint64_t mask)
i = ffs64(expected_start_mask);
}
/* Trigger event to allow secondary CPUs to continue */
pcpu_sync = 0UL;
return ((pcpu_active_bitmap & mask) == mask);
}