mirror of
https://github.com/freebsd/freebsd-src.git
synced 2024-12-03 14:48:57 +00:00
Merge r264984
Retire smp_active. It was racey and caused demonstrated problems with the cpufreq code. Replace its use with smp_started. There's at least one userland tool that still looks at the kern.smp.active sysctl, so preserve it but point it to smp_started as well. Obtained from: Netflix, Inc.
This commit is contained in:
parent
ea656e48f8
commit
b181a6ec32
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/stable/10/; revision=265606
@ -771,7 +771,6 @@ init_secondary(void)
|
||||
if (smp_cpus == mp_ncpus) {
|
||||
/* enable IPI's, tlb shootdown, freezes etc */
|
||||
atomic_store_rel_int(&smp_started, 1);
|
||||
smp_active = 1; /* historic */
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -597,7 +597,7 @@ cpu_reset()
|
||||
cpuset_t map;
|
||||
u_int cnt;
|
||||
|
||||
if (smp_active) {
|
||||
if (smp_started) {
|
||||
map = all_cpus;
|
||||
CPU_CLR(PCPU_GET(cpuid), &map);
|
||||
CPU_NAND(&map, &stopped_cpus);
|
||||
|
@ -212,7 +212,6 @@ init_secondary(int cpu)
|
||||
if (smp_cpus == mp_ncpus) {
|
||||
/* enable IPI's, tlb shootdown, freezes etc */
|
||||
atomic_store_rel_int(&smp_started, 1);
|
||||
smp_active = 1;
|
||||
}
|
||||
|
||||
mtx_unlock_spin(&ap_boot_mtx);
|
||||
|
@ -805,7 +805,6 @@ init_secondary(void)
|
||||
if (smp_cpus == mp_ncpus) {
|
||||
/* enable IPI's, tlb shootdown, freezes etc */
|
||||
atomic_store_rel_int(&smp_started, 1);
|
||||
smp_active = 1; /* historic */
|
||||
}
|
||||
|
||||
mtx_unlock_spin(&ap_boot_mtx);
|
||||
|
@ -619,7 +619,7 @@ cpu_reset()
|
||||
cpuset_t map;
|
||||
u_int cnt;
|
||||
|
||||
if (smp_active) {
|
||||
if (smp_started) {
|
||||
map = all_cpus;
|
||||
CPU_CLR(PCPU_GET(cpuid), &map);
|
||||
CPU_NAND(&map, &stopped_cpus);
|
||||
|
@ -655,7 +655,6 @@ init_secondary(void)
|
||||
if (smp_cpus == mp_ncpus) {
|
||||
/* enable IPI's, tlb shootdown, freezes etc */
|
||||
atomic_store_rel_int(&smp_started, 1);
|
||||
smp_active = 1; /* historic */
|
||||
}
|
||||
|
||||
mtx_unlock_spin(&ap_boot_mtx);
|
||||
|
@ -455,7 +455,7 @@ cpu_mp_unleash(void *dummy)
|
||||
mp_ncpus, cpus, smp_cpus);
|
||||
}
|
||||
|
||||
smp_active = 1;
|
||||
/* XXX Atomic set operation? */
|
||||
smp_started = 1;
|
||||
|
||||
/*
|
||||
|
@ -268,7 +268,7 @@ cf_set_method(device_t dev, const struct cf_level *level, int priority)
|
||||
* switching the main CPU. XXXTODO: Need to think more about how to
|
||||
* handle having different CPUs at different frequencies.
|
||||
*/
|
||||
if (mp_ncpus > 1 && !smp_active) {
|
||||
if (mp_ncpus > 1 && !smp_started) {
|
||||
device_printf(dev, "rejecting change, SMP not started yet\n");
|
||||
error = ENXIO;
|
||||
goto out;
|
||||
|
@ -59,6 +59,9 @@ cpuset_t logical_cpus_mask;
|
||||
|
||||
void (*cpustop_restartfunc)(void);
|
||||
#endif
|
||||
|
||||
static int sysctl_kern_smp_active(SYSCTL_HANDLER_ARGS);
|
||||
|
||||
/* This is used in modules that need to work in both SMP and UP. */
|
||||
cpuset_t all_cpus;
|
||||
|
||||
@ -78,9 +81,8 @@ SYSCTL_INT(_kern_smp, OID_AUTO, maxid, CTLFLAG_RD|CTLFLAG_CAPRD, &mp_maxid, 0,
|
||||
SYSCTL_INT(_kern_smp, OID_AUTO, maxcpus, CTLFLAG_RD|CTLFLAG_CAPRD, &mp_maxcpus,
|
||||
0, "Max number of CPUs that the system was compiled for.");
|
||||
|
||||
int smp_active = 0; /* are the APs allowed to run? */
|
||||
SYSCTL_INT(_kern_smp, OID_AUTO, active, CTLFLAG_RW, &smp_active, 0,
|
||||
"Number of Auxillary Processors (APs) that were successfully started");
|
||||
SYSCTL_PROC(_kern_smp, OID_AUTO, active, CTLFLAG_RD | CTLTYPE_INT, NULL, 0,
|
||||
sysctl_kern_smp_active, "I", "Indicates system is running in SMP mode");
|
||||
|
||||
int smp_disabled = 0; /* has smp been disabled? */
|
||||
SYSCTL_INT(_kern_smp, OID_AUTO, disabled, CTLFLAG_RDTUN|CTLFLAG_CAPRD,
|
||||
@ -831,3 +833,15 @@ quiesce_all_cpus(const char *wmesg, int prio)
|
||||
|
||||
return quiesce_cpus(all_cpus, wmesg, prio);
|
||||
}
|
||||
|
||||
/* Extra care is taken with this sysctl because the data type is volatile */
|
||||
static int
|
||||
sysctl_kern_smp_active(SYSCTL_HANDLER_ARGS)
|
||||
{
|
||||
int error, active;
|
||||
|
||||
active = smp_started;
|
||||
error = SYSCTL_OUT(req, &active, sizeof(active));
|
||||
return (error);
|
||||
}
|
||||
|
||||
|
@ -317,7 +317,6 @@ smp_init_secondary(u_int32_t cpuid)
|
||||
|
||||
if (smp_cpus == mp_ncpus) {
|
||||
atomic_store_rel_int(&smp_started, 1);
|
||||
smp_active = 1;
|
||||
}
|
||||
|
||||
mtx_unlock_spin(&ap_boot_mtx);
|
||||
|
@ -267,7 +267,7 @@ cpu_mp_unleash(void *dummy)
|
||||
/* Let the APs get into the scheduler */
|
||||
DELAY(10000);
|
||||
|
||||
smp_active = 1;
|
||||
/* XXX Atomic set operation? */
|
||||
smp_started = 1;
|
||||
}
|
||||
|
||||
|
@ -291,7 +291,6 @@ cpu_mp_start(void)
|
||||
KASSERT(!isjbus || mp_ncpus <= IDR_JALAPENO_MAX_BN_PAIRS,
|
||||
("%s: can only IPI a maximum of %d JBus-CPUs",
|
||||
__func__, IDR_JALAPENO_MAX_BN_PAIRS));
|
||||
smp_active = 1;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -71,7 +71,6 @@ struct cpu_group *smp_topo_2level(int l2share, int l2count, int l1share,
|
||||
struct cpu_group *smp_topo_find(struct cpu_group *top, int cpu);
|
||||
|
||||
extern void (*cpustop_restartfunc)(void);
|
||||
extern int smp_active;
|
||||
extern int smp_cpus;
|
||||
extern volatile cpuset_t started_cpus;
|
||||
extern volatile cpuset_t stopped_cpus;
|
||||
@ -141,7 +140,7 @@ cpu_next(int i)
|
||||
* cpu_mp_start() will be called so that MP can be enabled. This function
|
||||
* should do things such as startup secondary processors. It should also
|
||||
* setup mp_ncpus, all_cpus, and smp_cpus. It should also ensure that
|
||||
* smp_active and smp_started are initialized at the appropriate time.
|
||||
* smp_started is initialized at the appropriate time.
|
||||
* Once cpu_mp_start() returns, machine independent MP startup code will be
|
||||
* executed and a simple message will be output to the console. Finally,
|
||||
* cpu_mp_announce() will be called so that machine dependent messages about
|
||||
|
Loading…
Reference in New Issue
Block a user