diff options
author | jhb <jhb@FreeBSD.org> | 2003-12-03 14:55:31 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2003-12-03 14:55:31 +0000 |
commit | 907202ec1f57f255a3cb7245df54cf0e74dc5e43 (patch) | |
tree | 43e2b5c4b744220483a5d1abfee49180d1fc4324 /sys | |
parent | e57603da9f15ad23d90b15e7ad5464e3b5398310 (diff) | |
download | FreeBSD-src-907202ec1f57f255a3cb7245df54cf0e74dc5e43.zip FreeBSD-src-907202ec1f57f255a3cb7245df54cf0e74dc5e43.tar.gz |
Export a few SMP related symbols in UP kernels as well. This is needed to
aid other kernel code, especially code which can be in a module such as
the acpi_cpu(4) driver, to work properly with both SMP and UP kernels.
The exported symbols include mp_ncpus, all_cpus, mp_maxid, smp_started, and
the smp_rendezvous() function. This also means that CPU_ABSENT() is now
always implemented the same on all kernels.
Approved by: re (scottl)
Diffstat (limited to 'sys')
-rw-r--r-- | sys/conf/files | 2 | ||||
-rw-r--r-- | sys/kern/subr_smp.c | 36 | ||||
-rw-r--r-- | sys/sys/smp.h | 13 |
3 files changed, 44 insertions, 7 deletions
diff --git a/sys/conf/files b/sys/conf/files index 8eee001..710fb63 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -1152,7 +1152,7 @@ kern/subr_prof.c standard kern/subr_rman.c standard kern/subr_sbuf.c standard kern/subr_scanf.c standard -kern/subr_smp.c optional smp +kern/subr_smp.c standard kern/subr_taskqueue.c standard kern/subr_trap.c standard kern/subr_turnstile.c standard diff --git a/sys/kern/subr_smp.c b/sys/kern/subr_smp.c index b6fd97f..b3b81ac 100644 --- a/sys/kern/subr_smp.c +++ b/sys/kern/subr_smp.c @@ -48,10 +48,13 @@ __FBSDID("$FreeBSD$"); #include <machine/smp.h> +#ifdef SMP volatile u_int stopped_cpus; volatile u_int started_cpus; void (*cpustop_restartfunc)(void); +#endif + int mp_ncpus; volatile int smp_started; @@ -73,6 +76,7 @@ int smp_cpus = 1; /* how many cpu's running */ SYSCTL_INT(_kern_smp, OID_AUTO, cpus, CTLFLAG_RD, &smp_cpus, 0, "Number of CPUs online"); +#ifdef SMP /* Enable forwarding of a signal to a process running on a different CPU */ static int forward_signal_enabled = 1; SYSCTL_INT(_kern_smp, OID_AUTO, forward_signal_enabled, CTLFLAG_RW, @@ -331,3 +335,35 @@ smp_rendezvous(void (* setup_func)(void *), /* release lock */ mtx_unlock_spin(&smp_rv_mtx); } +#else /* !SMP */ + +/* + * Provide dummy SMP support for UP kernels. Modules that need to use SMP + * APIs will still work using this dummy support. + */ +static void +mp_setvariables_for_up(void *dummy) +{ + mp_ncpus = 1; + mp_maxid = PCPU_GET(cpuid); + all_cpus = PCPU_GET(cpumask); + KASSERT(PCPU_GET(cpuid) == 0, ("UP must have a CPU ID of zero")); +} +SYSINIT(cpu_mp_setvariables, SI_SUB_TUNABLES, SI_ORDER_FIRST, + mp_setvariables_for_up, NULL) + +void +smp_rendezvous(void (* setup_func)(void *), + void (* action_func)(void *), + void (* teardown_func)(void *), + void *arg) +{ + + if (setup_func != NULL) + setup_func(arg); + if (action_func != NULL) + action_func(arg); + if (teardown_func != NULL) + teardown_func(arg); +} +#endif /* SMP */ diff --git a/sys/sys/smp.h b/sys/sys/smp.h index 24ef367..cd96ebe 100644 --- a/sys/sys/smp.h +++ b/sys/sys/smp.h @@ -45,14 +45,16 @@ struct cpu_top { extern struct cpu_top *smp_topology; extern void (*cpustop_restartfunc)(void); -extern int mp_ncpus; extern int smp_active; -extern volatile int smp_started; extern int smp_cpus; -extern u_int all_cpus; extern volatile u_int started_cpus; extern volatile u_int stopped_cpus; +#endif /* SMP */ + +extern u_int all_cpus; extern u_int mp_maxid; +extern int mp_ncpus; +extern volatile int smp_started; /* * Macro allowing us to determine whether a CPU is absent at any given @@ -61,6 +63,7 @@ extern u_int mp_maxid; */ #define CPU_ABSENT(x_cpu) ((all_cpus & (1 << (x_cpu))) == 0) +#ifdef SMP /* * Machine dependent functions used to initialize MP support. * @@ -92,13 +95,11 @@ void forward_roundrobin(void); int restart_cpus(u_int); int stop_cpus(u_int); void smp_rendezvous_action(void); +#endif /* SMP */ void smp_rendezvous(void (*)(void *), void (*)(void *), void (*)(void *), void *arg); -#else /* SMP */ -#define CPU_ABSENT(x_cpu) (0) -#endif /* SMP */ #endif /* !LOCORE */ #endif /* _KERNEL */ #endif /* _SYS_SMP_H_ */ |