PERFORCE change 84391 for review
John Baldwin
jhb at FreeBSD.org
Tue Sep 27 13:39:33 PDT 2005
http://perforce.freebsd.org/chv.cgi?CH=84391
Change 84391 by jhb at jhb_slimer on 2005/09/27 20:39:25
Robert's IPI interrupt counts.
Affected files ...
.. //depot/projects/smpng/sys/i386/i386/apic_vector.s#15 edit
.. //depot/projects/smpng/sys/i386/i386/mp_machdep.c#86 edit
.. //depot/projects/smpng/sys/i386/include/smptests.h#8 edit
.. //depot/projects/smpng/sys/notes#58 edit
Differences ...
==== //depot/projects/smpng/sys/i386/i386/apic_vector.s#15 (text+ko) ====
@@ -151,14 +151,20 @@
movl $KDSEL, %eax /* Kernel data selector */
movl %eax, %ds
-#ifdef COUNT_XINVLTLB_HITS
+#if defined(COUNT_XINVLTLB_HITS) || defined(COUNT_IPIS)
pushl %fs
movl $KPSEL, %eax /* Private space selector */
movl %eax, %fs
movl PCPU(CPUID), %eax
popl %fs
+#ifdef COUNT_XINVLTLB_HITS
incl xhits_gbl(,%eax,4)
-#endif /* COUNT_XINVLTLB_HITS */
+#endif
+#ifdef COUNT_IPIS
+ movl ipi_invltlb_counts(,%eax,4),%eax
+ incl (%eax)
+#endif
+#endif
movl %cr3, %eax /* invalidate the TLB */
movl %eax, %cr3
@@ -184,14 +190,20 @@
movl $KDSEL, %eax /* Kernel data selector */
movl %eax, %ds
-#ifdef COUNT_XINVLTLB_HITS
+#if defined(COUNT_XINVLTLB_HITS) || defined(COUNT_IPIS)
pushl %fs
movl $KPSEL, %eax /* Private space selector */
movl %eax, %fs
movl PCPU(CPUID), %eax
popl %fs
+#ifdef COUNT_XINVLTLB_HITS
incl xhits_pg(,%eax,4)
-#endif /* COUNT_XINVLTLB_HITS */
+#endif
+#ifdef COUNT_IPIS
+ movl ipi_invlpg_counts(,%eax,4),%eax
+ incl (%eax)
+#endif
+#endif
movl smp_tlb_addr1, %eax
invlpg (%eax) /* invalidate single page */
@@ -218,14 +230,20 @@
movl $KDSEL, %eax /* Kernel data selector */
movl %eax, %ds
-#ifdef COUNT_XINVLTLB_HITS
+#if defined(COUNT_XINVLTLB_HITS) || defined(COUNT_IPIS)
pushl %fs
movl $KPSEL, %eax /* Private space selector */
movl %eax, %fs
movl PCPU(CPUID), %eax
popl %fs
+#ifdef COUNT_XINVLTLB_HITS
incl xhits_rng(,%eax,4)
-#endif /* COUNT_XINVLTLB_HITS */
+#endif
+#ifdef COUNT_IPIS
+ movl ipi_invlrng_counts(,%eax,4),%eax
+ incl (%eax)
+#endif
+#endif
movl smp_tlb_addr1, %edx
movl smp_tlb_addr2, %eax
@@ -322,10 +340,11 @@
test %eax, %eax
jnz 2f
- movl CNAME(cpustop_restartfunc), %eax
+ xorl %eax, %eax
+ lock
+ xchgl CNAME(cpustop_restartfunc), %eax
test %eax, %eax
jz 2f
- movl $0, CNAME(cpustop_restartfunc) /* One-shot */
call *%eax
2:
@@ -354,6 +373,11 @@
movl $KPSEL, %eax
movl %eax, %fs
+#ifdef COUNT_IPIS
+ movl PCPU(CPUID), %eax
+ movl ipi_rendezvous_counts(,%eax,4), %eax
+ incl (%eax)
+#endif
call smp_rendezvous_action
movl lapic, %eax
@@ -374,6 +398,11 @@
movl $KPSEL, %eax
movl %eax, %fs
+#ifdef COUNT_IPIS
+ movl PCPU(CPUID), %eax
+ movl ipi_lazyfix_counts(,%eax,4), %eax
+ incl (%eax)
+#endif
call pmap_lazyfix_action
movl lapic, %eax
==== //depot/projects/smpng/sys/i386/i386/mp_machdep.c#86 (text+ko) ====
@@ -181,6 +181,19 @@
volatile cpumask_t ipi_nmi_pending;
#endif
+#ifdef COUNT_IPIS
+/* Interrupt counts. */
+#ifdef IPI_PREEMPTION
+static u_long *ipi_preempt_counts[MAXCPU];
+#endif
+static u_long *ipi_ast_counts[MAXCPU];
+u_long *ipi_invltlb_counts[MAXCPU];
+u_long *ipi_invlrng_counts[MAXCPU];
+u_long *ipi_invlpg_counts[MAXCPU];
+u_long *ipi_rendezvous_counts[MAXCPU];
+u_long *ipi_lazypmap_counts[MAXCPU];
+#endif
+
/*
* Local data and functions.
*/
@@ -953,16 +966,16 @@
}
#ifdef COUNT_XINVLTLB_HITS
-u_int xhits_gbl[MAXCPU];
-u_int xhits_pg[MAXCPU];
-u_int xhits_rng[MAXCPU];
+u_long xhits_gbl[MAXCPU];
+u_long xhits_pg[MAXCPU];
+u_long xhits_rng[MAXCPU];
SYSCTL_NODE(_debug, OID_AUTO, xhits, CTLFLAG_RW, 0, "");
SYSCTL_OPAQUE(_debug_xhits, OID_AUTO, global, CTLFLAG_RW, &xhits_gbl,
- sizeof(xhits_gbl), "IU", "");
+ sizeof(xhits_gbl), "LU", "");
SYSCTL_OPAQUE(_debug_xhits, OID_AUTO, page, CTLFLAG_RW, &xhits_pg,
- sizeof(xhits_pg), "IU", "");
+ sizeof(xhits_pg), "LU", "");
SYSCTL_OPAQUE(_debug_xhits, OID_AUTO, range, CTLFLAG_RW, &xhits_rng,
- sizeof(xhits_rng), "IU", "");
+ sizeof(xhits_rng), "LU", "");
u_int ipi_global;
u_int ipi_page;
@@ -1123,7 +1136,6 @@
}
}
-
void
ipi_bitmap_handler(struct clockframe frame)
{
@@ -1134,6 +1146,9 @@
#ifdef IPI_PREEMPTION
if (ipi_bitmap & IPI_PREEMPT) {
+#ifdef COUNT_IPIS
+ *ipi_preempt_counts[cpu]++;
+#endif
mtx_lock_spin(&sched_lock);
/* Don't preempt the idle thread */
if (curthread->td_priority < PRI_MIN_IDLE) {
@@ -1147,7 +1162,12 @@
}
#endif
- /* Nothing to do for AST */
+ if (ipi_bitmap & IPI_AST) {
+#ifdef COUNT_IPIS
+ *ipi_ast_counts[cpu]++;
+#endif
+ /* Nothing to do for AST */
+ }
}
/*
@@ -1449,3 +1469,37 @@
__asm __volatile("sti; hlt" : : : "memory");
return (retval);
}
+
+#ifdef COUNT_IPIS
+/*
+ * Setup interrupt counters for IPI handlers.
+ */
+static void
+mp_ipi_intrcnt(void *dummy)
+{
+ char buf[64];
+ int i;
+
+ for (i = 0; i < mp_maxid; i++) {
+ if (CPU_ABSENT(i))
+ continue;
+ snprintf(buf, sizeof(buf), "cpu%d: invltlb", i);
+ intrcnt_add(buf, &ipi_invltlb_counts[i]);
+ snprintf(buf, sizeof(buf), "cpu%d: invlrng", i);
+ intrcnt_add(buf, &ipi_invlrng_counts[i]);
+ snprintf(buf, sizeof(buf), "cpu%d: invlpg", i);
+ intrcnt_add(buf, &ipi_invlpg_counts[i]);
+#ifdef IPI_PREEMPTION
+ snprintf(buf, sizeof(buf), "cpu%d: preempt", i);
+ intrcnt_add(buf, &ipi_preempt_counts[i]);
+#endif
+ snprintf(buf, sizeof(buf), "cpu%d: ast", i);
+ intrcnt_add(buf, &ipi_ast_counts[i]);
+ snprintf(buf, sizeof(buf), "cpu%d: rendezvous", i);
+ intrcnt_add(buf, &ipi_rendezvous_counts[i]);
+ snprintf(buf, sizeof(buf), "cpu%d: lazypmap", i);
+ intrcnt_add(buf, &ipi_lazypmap_counts[i]);
+ }
+}
+SYSINIT(mp_ipi_intrcnt, SI_SUB_INTR, SI_ORDER_MIDDLE, mp_ipi_intrcnt, NULL)
+#endif
==== //depot/projects/smpng/sys/i386/include/smptests.h#8 (text+ko) ====
@@ -40,12 +40,18 @@
#define CPUSTOP_ON_DDBBREAK
/*
- * Misc. counters.
+ * TLB counters.
*
#define COUNT_XINVLTLB_HITS
*/
/*
+ * Per-CPU IPI interrupt counters.
+ *
+ */
+#define COUNT_IPIS
+
+/*
* Address of POST hardware port.
* Defining this enables POSTCODE macros.
*
==== //depot/projects/smpng/sys/notes#58 (text+ko) ====
@@ -76,6 +76,8 @@
- fork counts?
- Add a cache-line padded mtx_aligned union and use it for the mutex pools.
- Robert wants intrcnt's for IPIs
+ - off by default, but can be enabled with COUNT_IPIS in smptests.h
+ - untested
- Fix free race in eventhandlers:
> In the macro "_EVENTHANDLER_INVOKE" in the file
> "/sys/sys/eventhandler.h", you unlock the list lock
More information about the p4-projects
mailing list