mirror of
https://github.com/opnsense/src.git
synced 2026-06-11 01:30:30 -04:00
amd64: Remove support for "nooptions SMP"
It does not appear to get much, if any, testing, and doesn't seem to be worth the maintenance overhead. Virtually all amd64 hardware has multiple cores. The CPU and memory usage overhead of the SMP option in single-vCPU VMs is quite marginal and not worth maintaining. Reviewed by: alc (pmap.c), kib Differential Revision: https://reviews.freebsd.org/D51403 Differential Revision: https://reviews.freebsd.org/D51345
This commit is contained in:
parent
860f20cc13
commit
fa02551dc8
12 changed files with 12 additions and 240 deletions
|
|
@ -54,10 +54,8 @@
|
|||
|
||||
#include <x86/apicreg.h>
|
||||
#include <x86/apicvar.h>
|
||||
#ifdef SMP
|
||||
#include <machine/smp.h>
|
||||
#include <machine/vmparam.h>
|
||||
#endif
|
||||
|
||||
#include <contrib/dev/acpica/include/acpi.h>
|
||||
|
||||
|
|
@ -73,19 +71,13 @@ extern int acpi_resume_beep;
|
|||
extern int acpi_reset_video;
|
||||
extern int acpi_susp_bounce;
|
||||
|
||||
#ifdef SMP
|
||||
extern struct susppcb **susppcbs;
|
||||
static cpuset_t suspcpus;
|
||||
#else
|
||||
static struct susppcb **susppcbs;
|
||||
#endif
|
||||
|
||||
static void acpi_stop_beep(void *);
|
||||
|
||||
#ifdef SMP
|
||||
static int acpi_wakeup_ap(struct acpi_softc *, int);
|
||||
static void acpi_wakeup_cpus(struct acpi_softc *);
|
||||
#endif
|
||||
|
||||
#define ACPI_WAKEPT_PAGES 7
|
||||
|
||||
|
|
@ -103,7 +95,6 @@ acpi_stop_beep(void *arg)
|
|||
timer_spkr_release();
|
||||
}
|
||||
|
||||
#ifdef SMP
|
||||
static int
|
||||
acpi_wakeup_ap(struct acpi_softc *sc, int cpu)
|
||||
{
|
||||
|
|
@ -177,7 +168,6 @@ acpi_wakeup_cpus(struct acpi_softc *sc)
|
|||
outb(CMOS_DATA, mpbiosreason);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
int
|
||||
acpi_sleep_machdep(struct acpi_softc *sc, int state)
|
||||
|
|
@ -190,10 +180,8 @@ acpi_sleep_machdep(struct acpi_softc *sc, int state)
|
|||
if (sc->acpi_wakeaddr == 0ul)
|
||||
return (-1); /* couldn't alloc wake memory */
|
||||
|
||||
#ifdef SMP
|
||||
suspcpus = all_cpus;
|
||||
CPU_CLR(PCPU_GET(cpuid), &suspcpus);
|
||||
#endif
|
||||
|
||||
if (acpi_resume_beep != 0)
|
||||
timer_spkr_acquire();
|
||||
|
|
@ -208,12 +196,10 @@ acpi_sleep_machdep(struct acpi_softc *sc, int state)
|
|||
pcb = &susppcbs[0]->sp_pcb;
|
||||
if (savectx(pcb)) {
|
||||
fpususpend(susppcbs[0]->sp_fpususpend);
|
||||
#ifdef SMP
|
||||
if (!CPU_EMPTY(&suspcpus) && suspend_cpus(suspcpus) == 0) {
|
||||
device_printf(sc->acpi_dev, "Failed to suspend APs\n");
|
||||
return (0); /* couldn't sleep */
|
||||
}
|
||||
#endif
|
||||
hw_ibrs_ibpb_active = 0;
|
||||
hw_ssb_active = 0;
|
||||
cpu_stdext_feature3 = 0;
|
||||
|
|
@ -278,16 +264,12 @@ acpi_wakeup_machdep(struct acpi_softc *sc, int state, int sleep_result,
|
|||
PCPU_SET(switchtime, 0);
|
||||
PCPU_SET(switchticks, ticks);
|
||||
lapic_xapic_mode();
|
||||
#ifdef SMP
|
||||
if (!CPU_EMPTY(&suspcpus))
|
||||
acpi_wakeup_cpus(sc);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef SMP
|
||||
if (!CPU_EMPTY(&suspcpus))
|
||||
resume_cpus(suspcpus);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Re-read cpu_stdext_feature3, which was zeroed-out
|
||||
|
|
|
|||
|
|
@ -157,7 +157,6 @@ IDTVEC(spuriousint)
|
|||
jmp doreti
|
||||
#endif
|
||||
|
||||
#ifdef SMP
|
||||
/*
|
||||
* Global address space TLB shootdown.
|
||||
*/
|
||||
|
|
@ -264,5 +263,3 @@ IDTVEC(justreturn)
|
|||
INTR_HANDLER justreturn1
|
||||
call as_lapic_eoi
|
||||
jmp doreti
|
||||
|
||||
#endif /* SMP */
|
||||
|
|
|
|||
|
|
@ -136,7 +136,7 @@ ctx_switch_fpusave_done:
|
|||
movq %r15,TD_LOCK(%r13) /* Release the old thread */
|
||||
sw1:
|
||||
leaq TD_MD_PCB(%r12),%r8
|
||||
#if defined(SCHED_ULE) && defined(SMP)
|
||||
#if defined(SCHED_ULE)
|
||||
movq $blocked_lock, %rdx
|
||||
movq TD_LOCK(%r12),%rcx
|
||||
cmpq %rcx, %rdx
|
||||
|
|
@ -492,7 +492,7 @@ ENTRY(resumectx)
|
|||
END(resumectx)
|
||||
|
||||
/* Wait for the new thread to become unblocked */
|
||||
#if defined(SCHED_ULE) && defined(SMP)
|
||||
#if defined(SCHED_ULE)
|
||||
sw1wait:
|
||||
1:
|
||||
pause
|
||||
|
|
|
|||
|
|
@ -59,9 +59,7 @@
|
|||
#include <sys/reg.h>
|
||||
#include <sys/rwlock.h>
|
||||
#include <sys/signalvar.h>
|
||||
#ifdef SMP
|
||||
#include <sys/smp.h>
|
||||
#endif
|
||||
#include <sys/syscallsubr.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sysent.h>
|
||||
|
|
|
|||
|
|
@ -38,7 +38,6 @@
|
|||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#include "opt_atpic.h"
|
||||
#include "opt_cpu.h"
|
||||
#include "opt_ddb.h"
|
||||
|
|
@ -82,9 +81,7 @@
|
|||
#include <sys/rwlock.h>
|
||||
#include <sys/sched.h>
|
||||
#include <sys/signalvar.h>
|
||||
#ifdef SMP
|
||||
#include <sys/smp.h>
|
||||
#endif
|
||||
#include <sys/syscallsubr.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sysent.h>
|
||||
|
|
@ -132,9 +129,7 @@
|
|||
#include <machine/tss.h>
|
||||
#include <x86/ucode.h>
|
||||
#include <x86/ifunc.h>
|
||||
#ifdef SMP
|
||||
#include <machine/smp.h>
|
||||
#endif
|
||||
#ifdef FDT
|
||||
#include <x86/fdt.h>
|
||||
#endif
|
||||
|
|
@ -149,6 +144,10 @@
|
|||
#include <isa/rtc.h>
|
||||
#include <x86/init.h>
|
||||
|
||||
#ifndef SMP
|
||||
#error amd64 requires options SMP
|
||||
#endif
|
||||
|
||||
/* Sanity check for __curthread() */
|
||||
CTASSERT(offsetof(struct pcpu, pc_curthread) == 0);
|
||||
|
||||
|
|
|
|||
|
|
@ -162,9 +162,7 @@
|
|||
#include <machine/msan.h>
|
||||
#include <machine/pcb.h>
|
||||
#include <machine/specialreg.h>
|
||||
#ifdef SMP
|
||||
#include <machine/smp.h>
|
||||
#endif
|
||||
#include <machine/sysarch.h>
|
||||
#include <machine/tss.h>
|
||||
|
||||
|
|
@ -3045,7 +3043,6 @@ pmap_update_pde_invalidate(pmap_t pmap, vm_offset_t va, pd_entry_t newpde)
|
|||
* XXX TODO
|
||||
*/
|
||||
|
||||
#ifdef SMP
|
||||
/*
|
||||
* Interrupt the cpus that are executing in the guest context.
|
||||
* This will force the vcpu to exit and the cached EPT mappings
|
||||
|
|
@ -3503,168 +3500,6 @@ pmap_update_pde(pmap_t pmap, vm_offset_t va, pd_entry_t *pde, pd_entry_t newpde)
|
|||
}
|
||||
sched_unpin();
|
||||
}
|
||||
#else /* !SMP */
|
||||
/*
|
||||
* Normal, non-SMP, invalidation functions.
|
||||
*/
|
||||
void
|
||||
pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
|
||||
{
|
||||
struct invpcid_descr d;
|
||||
struct pmap_pcid *pcidp;
|
||||
uint64_t kcr3, ucr3;
|
||||
uint32_t pcid;
|
||||
|
||||
if (pmap->pm_type == PT_RVI || pmap->pm_type == PT_EPT) {
|
||||
pmap->pm_eptgen++;
|
||||
return;
|
||||
}
|
||||
KASSERT(pmap->pm_type == PT_X86,
|
||||
("pmap_invalidate_range: unknown type %d", pmap->pm_type));
|
||||
|
||||
if (pmap == kernel_pmap || pmap == PCPU_GET(curpmap)) {
|
||||
invlpg(va);
|
||||
if (pmap == PCPU_GET(curpmap) && pmap_pcid_enabled &&
|
||||
pmap->pm_ucr3 != PMAP_NO_CR3) {
|
||||
critical_enter();
|
||||
pcid = pmap_get_pcid(pmap);
|
||||
if (invpcid_works) {
|
||||
d.pcid = pcid | PMAP_PCID_USER_PT;
|
||||
d.pad = 0;
|
||||
d.addr = va;
|
||||
invpcid(&d, INVPCID_ADDR);
|
||||
} else {
|
||||
kcr3 = pmap->pm_cr3 | pcid | CR3_PCID_SAVE;
|
||||
ucr3 = pmap->pm_ucr3 | pcid |
|
||||
PMAP_PCID_USER_PT | CR3_PCID_SAVE;
|
||||
pmap_pti_pcid_invlpg(ucr3, kcr3, va);
|
||||
}
|
||||
critical_exit();
|
||||
}
|
||||
} else if (pmap_pcid_enabled) {
|
||||
pcidp = zpcpu_get(pmap->pm_pcidp);
|
||||
pcidp->pm_gen = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
|
||||
{
|
||||
struct invpcid_descr d;
|
||||
struct pmap_pcid *pcidp;
|
||||
vm_offset_t addr;
|
||||
uint64_t kcr3, ucr3;
|
||||
uint32_t pcid;
|
||||
|
||||
if (pmap->pm_type == PT_RVI || pmap->pm_type == PT_EPT) {
|
||||
pmap->pm_eptgen++;
|
||||
return;
|
||||
}
|
||||
KASSERT(pmap->pm_type == PT_X86,
|
||||
("pmap_invalidate_range: unknown type %d", pmap->pm_type));
|
||||
|
||||
if (pmap == kernel_pmap || pmap == PCPU_GET(curpmap)) {
|
||||
for (addr = sva; addr < eva; addr += PAGE_SIZE)
|
||||
invlpg(addr);
|
||||
if (pmap == PCPU_GET(curpmap) && pmap_pcid_enabled &&
|
||||
pmap->pm_ucr3 != PMAP_NO_CR3) {
|
||||
critical_enter();
|
||||
pcid = pmap_get_pcid(pmap);
|
||||
if (invpcid_works) {
|
||||
d.pcid = pcid | PMAP_PCID_USER_PT;
|
||||
d.pad = 0;
|
||||
d.addr = sva;
|
||||
for (; d.addr < eva; d.addr += PAGE_SIZE)
|
||||
invpcid(&d, INVPCID_ADDR);
|
||||
} else {
|
||||
kcr3 = pmap->pm_cr3 | pcid | CR3_PCID_SAVE;
|
||||
ucr3 = pmap->pm_ucr3 | pcid |
|
||||
PMAP_PCID_USER_PT | CR3_PCID_SAVE;
|
||||
pmap_pti_pcid_invlrng(ucr3, kcr3, sva, eva);
|
||||
}
|
||||
critical_exit();
|
||||
}
|
||||
} else if (pmap_pcid_enabled) {
|
||||
pcidp = zpcpu_get(pmap->pm_pcidp);
|
||||
pcidp->pm_gen = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
pmap_invalidate_all(pmap_t pmap)
|
||||
{
|
||||
struct invpcid_descr d;
|
||||
struct pmap_pcid *pcidp;
|
||||
uint64_t kcr3, ucr3;
|
||||
uint32_t pcid;
|
||||
|
||||
if (pmap->pm_type == PT_RVI || pmap->pm_type == PT_EPT) {
|
||||
pmap->pm_eptgen++;
|
||||
return;
|
||||
}
|
||||
KASSERT(pmap->pm_type == PT_X86,
|
||||
("pmap_invalidate_all: unknown type %d", pmap->pm_type));
|
||||
|
||||
if (pmap == kernel_pmap) {
|
||||
if (pmap_pcid_enabled && invpcid_works) {
|
||||
bzero(&d, sizeof(d));
|
||||
invpcid(&d, INVPCID_CTXGLOB);
|
||||
} else {
|
||||
invltlb_glob();
|
||||
}
|
||||
} else if (pmap == PCPU_GET(curpmap)) {
|
||||
if (pmap_pcid_enabled) {
|
||||
critical_enter();
|
||||
pcid = pmap_get_pcid(pmap);
|
||||
if (invpcid_works) {
|
||||
d.pcid = pcid;
|
||||
d.pad = 0;
|
||||
d.addr = 0;
|
||||
invpcid(&d, INVPCID_CTX);
|
||||
if (pmap->pm_ucr3 != PMAP_NO_CR3) {
|
||||
d.pcid |= PMAP_PCID_USER_PT;
|
||||
invpcid(&d, INVPCID_CTX);
|
||||
}
|
||||
} else {
|
||||
kcr3 = pmap->pm_cr3 | pcid;
|
||||
if (pmap->pm_ucr3 != PMAP_NO_CR3) {
|
||||
ucr3 = pmap->pm_ucr3 | pcid |
|
||||
PMAP_PCID_USER_PT;
|
||||
pmap_pti_pcid_invalidate(ucr3, kcr3);
|
||||
} else
|
||||
load_cr3(kcr3);
|
||||
}
|
||||
critical_exit();
|
||||
} else {
|
||||
invltlb();
|
||||
}
|
||||
} else if (pmap_pcid_enabled) {
|
||||
pcidp = zpcpu_get(pmap->pm_pcidp);
|
||||
pcidp->pm_gen = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
pmap_invalidate_cache(void)
|
||||
{
|
||||
|
||||
wbinvd();
|
||||
}
|
||||
|
||||
static void
|
||||
pmap_update_pde(pmap_t pmap, vm_offset_t va, pd_entry_t *pde, pd_entry_t newpde)
|
||||
{
|
||||
struct pmap_pcid *pcidp;
|
||||
|
||||
pmap_update_pde_store(pmap, pde, newpde);
|
||||
if (pmap == kernel_pmap || pmap == PCPU_GET(curpmap))
|
||||
pmap_update_pde_invalidate(pmap, va, newpde);
|
||||
else {
|
||||
pcidp = zpcpu_get(pmap->pm_pcidp);
|
||||
pcidp->pm_gen = 0;
|
||||
}
|
||||
}
|
||||
#endif /* !SMP */
|
||||
|
||||
static void
|
||||
pmap_invalidate_pde_page(pmap_t pmap, vm_offset_t va, pd_entry_t pde)
|
||||
|
|
@ -10358,17 +10193,9 @@ pmap_activate_sw(struct thread *td)
|
|||
return;
|
||||
}
|
||||
cpuid = PCPU_GET(cpuid);
|
||||
#ifdef SMP
|
||||
CPU_SET_ATOMIC(cpuid, &pmap->pm_active);
|
||||
#else
|
||||
CPU_SET(cpuid, &pmap->pm_active);
|
||||
#endif
|
||||
pmap_activate_sw_mode(td, pmap, cpuid);
|
||||
#ifdef SMP
|
||||
CPU_CLR_ATOMIC(cpuid, &oldpmap->pm_active);
|
||||
#else
|
||||
CPU_CLR(cpuid, &oldpmap->pm_active);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -10409,11 +10236,7 @@ pmap_activate_boot(pmap_t pmap)
|
|||
MPASS(pmap != kernel_pmap);
|
||||
|
||||
cpuid = PCPU_GET(cpuid);
|
||||
#ifdef SMP
|
||||
CPU_SET_ATOMIC(cpuid, &pmap->pm_active);
|
||||
#else
|
||||
CPU_SET(cpuid, &pmap->pm_active);
|
||||
#endif
|
||||
PCPU_SET(curpmap, pmap);
|
||||
if (pti) {
|
||||
kcr3 = pmap->pm_cr3;
|
||||
|
|
|
|||
|
|
@ -934,10 +934,7 @@ ENTRY(casueword32_nosmap)
|
|||
ja fusufault
|
||||
|
||||
movl %esi,%eax /* old */
|
||||
#ifdef SMP
|
||||
lock
|
||||
#endif
|
||||
cmpxchgl %ecx,(%rdi) /* new = %ecx */
|
||||
lock cmpxchgl %ecx,(%rdi) /* new = %ecx */
|
||||
setne %cl
|
||||
|
||||
/*
|
||||
|
|
@ -971,10 +968,7 @@ ENTRY(casueword32_smap)
|
|||
|
||||
movl %esi,%eax /* old */
|
||||
stac
|
||||
#ifdef SMP
|
||||
lock
|
||||
#endif
|
||||
cmpxchgl %ecx,(%rdi) /* new = %ecx */
|
||||
lock cmpxchgl %ecx,(%rdi) /* new = %ecx */
|
||||
clac
|
||||
setne %cl
|
||||
|
||||
|
|
@ -1014,10 +1008,7 @@ ENTRY(casueword_nosmap)
|
|||
ja fusufault
|
||||
|
||||
movq %rsi,%rax /* old */
|
||||
#ifdef SMP
|
||||
lock
|
||||
#endif
|
||||
cmpxchgq %rcx,(%rdi) /* new = %rcx */
|
||||
lock cmpxchgq %rcx,(%rdi) /* new = %rcx */
|
||||
setne %cl
|
||||
|
||||
/*
|
||||
|
|
@ -1045,10 +1036,7 @@ ENTRY(casueword_smap)
|
|||
|
||||
movq %rsi,%rax /* old */
|
||||
stac
|
||||
#ifdef SMP
|
||||
lock
|
||||
#endif
|
||||
cmpxchgq %rcx,(%rdi) /* new = %rcx */
|
||||
lock cmpxchgq %rcx,(%rdi) /* new = %rcx */
|
||||
clac
|
||||
setne %cl
|
||||
|
||||
|
|
|
|||
|
|
@ -87,9 +87,7 @@ PMC_SOFT_DEFINE( , , page_fault, write);
|
|||
#include <x86/mca.h>
|
||||
#include <machine/md_var.h>
|
||||
#include <machine/pcb.h>
|
||||
#ifdef SMP
|
||||
#include <machine/smp.h>
|
||||
#endif
|
||||
#include <machine/stack.h>
|
||||
#include <machine/trap.h>
|
||||
#include <machine/tss.h>
|
||||
|
|
@ -900,11 +898,9 @@ trap_diag(struct trapframe *frame, vm_offset_t eva)
|
|||
printf("\n\nFatal trap %d: %s while in %s mode\n", type,
|
||||
type < nitems(trap_msg) ? trap_msg[type] : UNKNOWN,
|
||||
TRAPF_USERMODE(frame) ? "user" : "kernel");
|
||||
#ifdef SMP
|
||||
/* two separate prints in case of a trap on an unmapped page */
|
||||
printf("cpuid = %d; ", PCPU_GET(cpuid));
|
||||
printf("apic id = %02x\n", PCPU_GET(apic_id));
|
||||
#endif
|
||||
if (type == T_PAGEFLT) {
|
||||
printf("fault virtual address = 0x%lx\n", eva);
|
||||
printf("fault code = %s %s %s%s%s, %s\n",
|
||||
|
|
@ -1025,11 +1021,9 @@ dblfault_handler(struct trapframe *frame)
|
|||
frame->tf_cs, frame->tf_ss, frame->tf_ds, frame->tf_es,
|
||||
frame->tf_fs, frame->tf_gs,
|
||||
rdmsr(MSR_FSBASE), rdmsr(MSR_GSBASE), rdmsr(MSR_KGSBASE));
|
||||
#ifdef SMP
|
||||
/* two separate prints in case of a trap on an unmapped page */
|
||||
printf("cpuid = %d; ", PCPU_GET(cpuid));
|
||||
printf("apic id = %02x\n", PCPU_GET(apic_id));
|
||||
#endif
|
||||
panic("double fault");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +0,0 @@
|
|||
include MINIMAL
|
||||
ident MINIMALUP
|
||||
nooptions SMP
|
||||
nooptions NUMA
|
||||
|
|
@ -150,8 +150,6 @@
|
|||
(((va) >= kva_layout.dmap_low && (va) < kva_layout.dmap_high) || \
|
||||
((va) >= kva_layout.km_low && (va) < kva_layout.km_high))
|
||||
|
||||
#ifdef SMP
|
||||
#define SC_TABLESIZE 1024 /* Must be power of 2. */
|
||||
#endif
|
||||
|
||||
#endif /* !_AMD64_INCLUDE_PARAM_H_ */
|
||||
|
|
|
|||
|
|
@ -13,8 +13,6 @@
|
|||
|
||||
#ifdef _KERNEL
|
||||
|
||||
#ifdef SMP
|
||||
|
||||
#ifndef LOCORE
|
||||
|
||||
#include <x86/x86_smp.h>
|
||||
|
|
@ -39,7 +37,6 @@ void invlop_handler(void);
|
|||
int start_all_aps(void);
|
||||
|
||||
#endif /* !LOCORE */
|
||||
#endif /* SMP */
|
||||
|
||||
#endif /* _KERNEL */
|
||||
#endif /* _MACHINE_SMP_H_ */
|
||||
|
|
|
|||
|
|
@ -84,8 +84,8 @@ amd64/amd64/xen-locore.S optional xenhvm \
|
|||
amd64/amd64/machdep.c standard
|
||||
amd64/amd64/mem.c optional mem
|
||||
amd64/amd64/minidump_machdep.c standard
|
||||
amd64/amd64/mp_machdep.c optional smp
|
||||
amd64/amd64/mpboot.S optional smp
|
||||
amd64/amd64/mp_machdep.c standard
|
||||
amd64/amd64/mpboot.S standard
|
||||
amd64/amd64/pmap.c standard
|
||||
amd64/amd64/ptrace_machdep.c standard
|
||||
amd64/amd64/support.S standard
|
||||
|
|
|
|||
Loading…
Reference in a new issue