summaryrefslogtreecommitdiffstats
path: root/sys/i386/include/mptable.h
diff options
context:
space:
mode:
authortegge <tegge@FreeBSD.org>1998-05-17 22:12:14 +0000
committertegge <tegge@FreeBSD.org>1998-05-17 22:12:14 +0000
commit4347025be3ee2eaf0c12f7838df60ccaad126267 (patch)
tree35c785e270e1950f43a8dd00138cc297f3c02026 /sys/i386/include/mptable.h
parent902ca8e68b9388df5776d79f4fe4a9f26c7c8577 (diff)
downloadFreeBSD-src-4347025be3ee2eaf0c12f7838df60ccaad126267.zip
FreeBSD-src-4347025be3ee2eaf0c12f7838df60ccaad126267.tar.gz
Add forwarding of roundrobin to other cpus. This gives a more regular
update of cpu usage as shown by top when one process is cpu bound (no system calls) while the system is otherwise idle (except for top). Don't attempt to switch to the BSP in boot(). If the system was idle when an interrupt caused a panic, this won't work. Instead, switch to the BSP in cpu_reset. Remove some spurious forward_statclock/forward_hardclock warnings.
Diffstat (limited to 'sys/i386/include/mptable.h')
-rw-r--r--sys/i386/include/mptable.h58
1 files changed, 48 insertions, 10 deletions
diff --git a/sys/i386/include/mptable.h b/sys/i386/include/mptable.h
index 7b58b87..c5e392a 100644
--- a/sys/i386/include/mptable.h
+++ b/sys/i386/include/mptable.h
@@ -22,7 +22,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: mp_machdep.c,v 1.74 1998/05/11 01:06:06 dyson Exp $
+ * $Id: mp_machdep.c,v 1.75 1998/05/17 18:53:17 tegge Exp $
*/
#include "opt_smp.h"
@@ -312,6 +312,8 @@ extern pt_entry_t SMP_prvpt[];
/* Private page pointer to curcpu's PTD, used during BSP init */
extern pd_entry_t *my_idlePTD;
+struct pcb stoppcbs[NCPU];
+
static int smp_started; /* has the system started? */
/*
@@ -2009,13 +2011,10 @@ stop_cpus(u_int map)
if (!smp_started)
return 0;
- /* send IPI to all CPUs in map */
- stopped_cpus = 0;
-
/* send the Xcpustop IPI to all CPUs in map */
selected_apic_ipi(map, XCPUSTOP_OFFSET, APIC_DELMODE_FIXED);
-
- while (stopped_cpus != map)
+
+ while ((stopped_cpus & map) != map)
/* spin */ ;
return 1;
@@ -2043,9 +2042,8 @@ restart_cpus(u_int map)
started_cpus = map; /* signal other cpus to restart */
- while (started_cpus) /* wait for each to clear its bit */
+ while ((stopped_cpus & map) != 0) /* wait for each to clear its bit */
/* spin */ ;
- stopped_cpus = 0;
return 1;
}
@@ -2075,6 +2073,11 @@ int forward_signal_enabled = 1;
SYSCTL_INT(_machdep, OID_AUTO, forward_signal_enabled, CTLFLAG_RW,
&forward_signal_enabled, 0, "");
+/* Enable forwarding of roundrobin to all other cpus */
+int forward_roundrobin_enabled = 1;
+SYSCTL_INT(_machdep, OID_AUTO, forward_roundrobin_enabled, CTLFLAG_RW,
+ &forward_roundrobin_enabled, 0, "");
+
/*
* This is called once the rest of the system is up and running and we're
* ready to let the AP's out of the pen.
@@ -2296,9 +2299,11 @@ forward_statclock(int pscnt)
while (checkstate_probed_cpus != map) {
/* spin */
i++;
- if (i == 1000000) {
+ if (i == 100000) {
+#ifdef BETTER_CLOCK_DIAGNOSTIC
printf("forward_statclock: checkstate %x\n",
checkstate_probed_cpus);
+#endif
break;
}
}
@@ -2369,9 +2374,11 @@ forward_hardclock(int pscnt)
while (checkstate_probed_cpus != map) {
/* spin */
i++;
- if (i == 1000000) {
+ if (i == 100000) {
+#ifdef BETTER_CLOCK_DIAGNOSTIC
printf("forward_hardclock: checkstate %x\n",
checkstate_probed_cpus);
+#endif
break;
}
}
@@ -2475,6 +2482,37 @@ forward_signal(struct proc *p)
}
}
+void
+forward_roundrobin(void)
+{
+ u_int map;
+ int i;
+
+ if (!smp_started || !invltlb_ok || cold || panicstr)
+ return;
+ if (!forward_roundrobin_enabled)
+ return;
+ resched_cpus |= other_cpus;
+ map = other_cpus & ~stopped_cpus ;
+#if 1
+ selected_apic_ipi(map, XCPUAST_OFFSET, APIC_DELMODE_FIXED);
+#else
+ (void) all_but_self_ipi(XCPUAST_OFFSET);
+#endif
+ i = 0;
+ while ((checkstate_need_ast & map) != 0) {
+ /* spin */
+ i++;
+ if (i > 100000) {
+#if 0
+ printf("forward_roundrobin: dropped ast 0x%x\n",
+ checkstate_need_ast & map);
+#endif
+ break;
+ }
+ }
+}
+
#ifdef APIC_INTR_REORDER
/*
OpenPOWER on IntegriCloud