mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
- Merge a fix fixup for the last lazyfix removal
- Sync xen with i386 about the ipi_send_cpu() usage
This commit is contained in:
parent
77bdc950f4
commit
ef6146b9a3
2 changed files with 28 additions and 54 deletions
|
|
@ -153,7 +153,6 @@ static cpumask_t hyperthreading_cpus_mask;
|
|||
|
||||
extern void Xhypervisor_callback(void);
|
||||
extern void failsafe_callback(void);
|
||||
extern void pmap_lazyfix_action(void);
|
||||
|
||||
struct cpu_group *
|
||||
cpu_topo(void)
|
||||
|
|
@ -340,24 +339,16 @@ iv_invlcache(uintptr_t a, uintptr_t b)
|
|||
atomic_add_int(&smp_tlb_wait, 1);
|
||||
}
|
||||
|
||||
static void
|
||||
iv_lazypmap(uintptr_t a, uintptr_t b)
|
||||
{
|
||||
pmap_lazyfix_action();
|
||||
atomic_add_int(&smp_tlb_wait, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* These start from "IPI offset" APIC_IPI_INTS
|
||||
*/
|
||||
static call_data_func_t *ipi_vectors[6] =
|
||||
static call_data_func_t *ipi_vectors[5] =
|
||||
{
|
||||
iv_rendezvous,
|
||||
iv_invltlb,
|
||||
iv_invlpg,
|
||||
iv_invlrng,
|
||||
iv_invlcache,
|
||||
iv_lazypmap,
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -956,6 +947,30 @@ start_ap(int apic_id)
|
|||
return 0; /* return FAILURE */
|
||||
}
|
||||
|
||||
/*
|
||||
* send an IPI to a specific CPU.
|
||||
*/
|
||||
static void
|
||||
ipi_send_cpu(int cpu, u_int ipi)
|
||||
{
|
||||
u_int bitmap, old_pending, new_pending;
|
||||
|
||||
if (IPI_IS_BITMAPED(ipi)) {
|
||||
bitmap = 1 << ipi;
|
||||
ipi = IPI_BITMAP_VECTOR;
|
||||
do {
|
||||
old_pending = cpu_ipi_pending[cpu];
|
||||
new_pending = old_pending | bitmap;
|
||||
} while (!atomic_cmpset_int(&cpu_ipi_pending[cpu],
|
||||
old_pending, new_pending));
|
||||
if (!old_pending)
|
||||
ipi_pcpu(cpu, RESCHEDULE_VECTOR);
|
||||
} else {
|
||||
KASSERT(call_data != NULL, ("call_data not set"));
|
||||
ipi_pcpu(cpu, CALL_FUNCTION_VECTOR);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Flush the TLB on all other CPU's
|
||||
*/
|
||||
|
|
@ -1098,14 +1113,6 @@ void
|
|||
ipi_selected(cpumask_t cpus, u_int ipi)
|
||||
{
|
||||
int cpu;
|
||||
u_int bitmap = 0;
|
||||
u_int old_pending;
|
||||
u_int new_pending;
|
||||
|
||||
if (IPI_IS_BITMAPED(ipi)) {
|
||||
bitmap = 1 << ipi;
|
||||
ipi = IPI_BITMAP_VECTOR;
|
||||
}
|
||||
|
||||
/*
|
||||
* IPI_STOP_HARD maps to a NMI and the trap handler needs a bit
|
||||
|
|
@ -1115,23 +1122,11 @@ ipi_selected(cpumask_t cpus, u_int ipi)
|
|||
if (ipi == IPI_STOP_HARD)
|
||||
atomic_set_int(&ipi_nmi_pending, cpus);
|
||||
|
||||
CTR3(KTR_SMP, "%s: cpus: %x ipi: %x", __func__, cpus, ipi);
|
||||
while ((cpu = ffs(cpus)) != 0) {
|
||||
cpu--;
|
||||
cpus &= ~(1 << cpu);
|
||||
|
||||
if (bitmap) {
|
||||
do {
|
||||
old_pending = cpu_ipi_pending[cpu];
|
||||
new_pending = old_pending | bitmap;
|
||||
} while (!atomic_cmpset_int(&cpu_ipi_pending[cpu],
|
||||
old_pending, new_pending));
|
||||
if (!old_pending)
|
||||
ipi_pcpu(cpu, RESCHEDULE_VECTOR);
|
||||
} else {
|
||||
KASSERT(call_data != NULL, ("call_data not set"));
|
||||
ipi_pcpu(cpu, CALL_FUNCTION_VECTOR);
|
||||
}
|
||||
CTR3(KTR_SMP, "%s: cpu: %d ipi: %x", __func__, cpu, ipi);
|
||||
ipi_send_cpu(cpu, ipi);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1141,14 +1136,6 @@ ipi_selected(cpumask_t cpus, u_int ipi)
|
|||
void
|
||||
ipi_cpu(int cpu, u_int ipi)
|
||||
{
|
||||
u_int bitmap = 0;
|
||||
u_int old_pending;
|
||||
u_int new_pending;
|
||||
|
||||
if (IPI_IS_BITMAPED(ipi)) {
|
||||
bitmap = 1 << ipi;
|
||||
ipi = IPI_BITMAP_VECTOR;
|
||||
}
|
||||
|
||||
/*
|
||||
* IPI_STOP_HARD maps to a NMI and the trap handler needs a bit
|
||||
|
|
@ -1159,19 +1146,7 @@ ipi_cpu(int cpu, u_int ipi)
|
|||
atomic_set_int(&ipi_nmi_pending, 1 << cpu);
|
||||
|
||||
CTR3(KTR_SMP, "%s: cpu: %d ipi: %x", __func__, cpu, ipi);
|
||||
|
||||
if (bitmap) {
|
||||
do {
|
||||
old_pending = cpu_ipi_pending[cpu];
|
||||
new_pending = old_pending | bitmap;
|
||||
} while (!atomic_cmpset_int(&cpu_ipi_pending[cpu],
|
||||
old_pending, new_pending));
|
||||
if (!old_pending)
|
||||
ipi_pcpu(cpu, RESCHEDULE_VECTOR);
|
||||
} else {
|
||||
KASSERT(call_data != NULL, ("call_data not set"));
|
||||
ipi_pcpu(cpu, CALL_FUNCTION_VECTOR);
|
||||
}
|
||||
ipi_send_cpu(cpu, ipi);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -1706,7 +1706,6 @@ pmap_release(pmap_t pmap)
|
|||
mtx_lock(&createdelete_lock);
|
||||
#endif
|
||||
|
||||
pmap_lazyfix(pmap);
|
||||
mtx_lock_spin(&allpmaps_lock);
|
||||
LIST_REMOVE(pmap, pm_list);
|
||||
mtx_unlock_spin(&allpmaps_lock);
|
||||
|
|
|
|||
Loading…
Reference in a new issue