The branch main has been updated by markj:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=fa02551dc8a029a74eb374c418dbb5401d53c2db

commit fa02551dc8a029a74eb374c418dbb5401d53c2db
Author:     Mark Johnston <ma...@freebsd.org>
AuthorDate: 2025-07-21 13:33:00 +0000
Commit:     Mark Johnston <ma...@freebsd.org>
CommitDate: 2025-07-21 14:57:52 +0000

    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
---
 sys/amd64/acpica/acpi_wakeup.c |  18 -----
 sys/amd64/amd64/apic_vector.S  |   3 -
 sys/amd64/amd64/cpu_switch.S   |   4 +-
 sys/amd64/amd64/exec_machdep.c |   2 -
 sys/amd64/amd64/machdep.c      |   9 +--
 sys/amd64/amd64/pmap.c         | 177 -----------------------------------------
 sys/amd64/amd64/support.S      |  20 +----
 sys/amd64/amd64/trap.c         |   6 --
 sys/amd64/conf/MINIMALUP       |   4 -
 sys/amd64/include/param.h      |   2 -
 sys/amd64/include/smp.h        |   3 -
 sys/conf/files.amd64           |   4 +-
 12 files changed, 12 insertions(+), 240 deletions(-)

diff --git a/sys/amd64/acpica/acpi_wakeup.c b/sys/amd64/acpica/acpi_wakeup.c
index 51d6d5e36840..99565fbb69ca 100644
--- a/sys/amd64/acpica/acpi_wakeup.c
+++ b/sys/amd64/acpica/acpi_wakeup.c
@@ -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
diff --git a/sys/amd64/amd64/apic_vector.S b/sys/amd64/amd64/apic_vector.S
index 5bb877a174f7..e98bae9eb6c5 100644
--- a/sys/amd64/amd64/apic_vector.S
+++ b/sys/amd64/amd64/apic_vector.S
@@ -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 */
diff --git a/sys/amd64/amd64/cpu_switch.S b/sys/amd64/amd64/cpu_switch.S
index a053f6c70af1..d7e954f573b0 100644
--- a/sys/amd64/amd64/cpu_switch.S
+++ b/sys/amd64/amd64/cpu_switch.S
@@ -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
diff --git a/sys/amd64/amd64/exec_machdep.c b/sys/amd64/amd64/exec_machdep.c
index da68289e2c83..6752b716deb5 100644
--- a/sys/amd64/amd64/exec_machdep.c
+++ b/sys/amd64/amd64/exec_machdep.c
@@ -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>
diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c
index f46462b39fa3..37c7056f649c 100644
--- a/sys/amd64/amd64/machdep.c
+++ b/sys/amd64/amd64/machdep.c
@@ -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);
 
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index b2bfe633adcc..cd8ab58a07ab 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -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;
diff --git a/sys/amd64/amd64/support.S b/sys/amd64/amd64/support.S
index c95696bbe7ef..870cd255abb7 100644
--- a/sys/amd64/amd64/support.S
+++ b/sys/amd64/amd64/support.S
@@ -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
 
diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c
index eefddad2f142..d9a5f7096a6e 100644
--- a/sys/amd64/amd64/trap.c
+++ b/sys/amd64/amd64/trap.c
@@ -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");
 }
 
diff --git a/sys/amd64/conf/MINIMALUP b/sys/amd64/conf/MINIMALUP
deleted file mode 100644
index 0dbddbe5b341..000000000000
--- a/sys/amd64/conf/MINIMALUP
+++ /dev/null
@@ -1,4 +0,0 @@
-include        MINIMAL
-ident          MINIMALUP
-nooptions      SMP
-nooptions      NUMA
diff --git a/sys/amd64/include/param.h b/sys/amd64/include/param.h
index 1bbb302259d6..5a9c3162e14c 100644
--- a/sys/amd64/include/param.h
+++ b/sys/amd64/include/param.h
@@ -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_ */
diff --git a/sys/amd64/include/smp.h b/sys/amd64/include/smp.h
index 26eb227211da..bff92570ff82 100644
--- a/sys/amd64/include/smp.h
+++ b/sys/amd64/include/smp.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_ */
diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64
index 678d288c2d86..80548320c3fc 100644
--- a/sys/conf/files.amd64
+++ b/sys/conf/files.amd64
@@ -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

Reply via email to