mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-07-04 11:07:51 +00:00
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:
parent
5f281df548
commit
6137347411
@ -259,6 +259,7 @@ void init_pcpu_post(uint16_t pcpu_id)
|
|||||||
*/
|
*/
|
||||||
reserve_buffer_for_ept_pages();
|
reserve_buffer_for_ept_pages();
|
||||||
|
|
||||||
|
pcpu_sync = ALL_CPUS_MASK;
|
||||||
/* Start all secondary cores */
|
/* Start all secondary cores */
|
||||||
startup_paddr = prepare_trampoline();
|
startup_paddr = prepare_trampoline();
|
||||||
if (!start_pcpus(AP_MASK)) {
|
if (!start_pcpus(AP_MASK)) {
|
||||||
@ -276,9 +277,6 @@ void init_pcpu_post(uint16_t pcpu_id)
|
|||||||
|
|
||||||
timer_init();
|
timer_init();
|
||||||
ptdev_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)) {
|
if (!init_software_sram(pcpu_id == BSP_CPU_ID)) {
|
||||||
@ -296,6 +294,10 @@ void init_pcpu_post(uint16_t pcpu_id)
|
|||||||
enable_smap();
|
enable_smap();
|
||||||
|
|
||||||
init_keylocker();
|
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)
|
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();
|
uint16_t pcpu_id = get_pcpu_id();
|
||||||
uint64_t expected_start_mask = mask;
|
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);
|
i = ffs64(expected_start_mask);
|
||||||
while (i != INVALID_BIT_INDEX) {
|
while (i != INVALID_BIT_INDEX) {
|
||||||
bitmap_clear_nolock(i, &expected_start_mask);
|
bitmap_clear_nolock(i, &expected_start_mask);
|
||||||
@ -378,9 +376,6 @@ bool start_pcpus(uint64_t mask)
|
|||||||
i = ffs64(expected_start_mask);
|
i = ffs64(expected_start_mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Trigger event to allow secondary CPUs to continue */
|
|
||||||
pcpu_sync = 0UL;
|
|
||||||
|
|
||||||
return ((pcpu_active_bitmap & mask) == mask);
|
return ((pcpu_active_bitmap & mask) == mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user