From: Manfred Spraul <manfred@colorfullife.com>
To: "Stephen C. Tweedie" <sct@redhat.com>
Cc: lord@sgi.com, "Benjamin C.R. LaHaise" <blah@kvack.org>,
David Woodhouse <dwmw2@infradead.org>,
linux-kernel@vger.rutgers.edu, linux-mm@kvack.org
Subject: Re: kmap_kiobuf()
Date: Wed, 28 Jun 2000 21:06:34 +0200 [thread overview]
Message-ID: <395A4CBA.D217F0FE@colorfullife.com> (raw)
In-Reply-To: 20000628190612.E2392@redhat.com
[-- Attachment #1: Type: text/plain, Size: 652 bytes --]
"Stephen C. Tweedie" wrote:
>
> Hi,
>
> On Wed, Jun 28, 2000 at 11:52:40AM -0500, lord@sgi.com wrote:
> >
> > I am not a VM guy either, Ben, is the cost of the TLB flush mostly in
> > the synchronization between CPUs, or is it just expensive anyway you
> > look at it?
>
> The TLB IPI is by far the biggest factor here.
>
I tried it on my Dual Pentium II/350, 100 MHz FSB:
* an empty IPI returns after ~ 1630 cpu ticks.
* a tlb flush IPI needs ~ 2130 cpu ticks.
The computer was idle, and obviously I only measure the cost as seen
from the primary cpu, I don't know how long the second cpu needs until
it returns from the interrupt.
--
Manfred
[-- Attachment #2: patch-newperf --]
[-- Type: text/plain, Size: 3609 bytes --]
--- 2.4/drivers/net/dummy.c Sat Jun 24 11:07:56 2000
+++ build-2.4/drivers/net/dummy.c Wed Jun 28 20:55:44 2000
@@ -132,17 +132,171 @@
dummy_init(dev);
return 0;
}
-
static struct net_device dev_dummy = {
"",
0, 0, 0, 0,
0x0, 0,
0, 0, 0, NULL, dummy_probe };
+/* kernel benchmark hook (C) Manfred Spraul manfreds@colorfullife.com */
+
+int p_shift = -1;
+MODULE_PARM (p_shift, "1i");
+MODULE_PARM_DESC(p_shift, "Shift for the profile buffer");
+
+#define STAT_TABLELEN 16384
+static unsigned long totals[STAT_TABLELEN];
+static unsigned int overflows;
+
+static unsigned long long stime;
+static void start_measure(void)
+{
+ __asm__ __volatile__ (
+ ".align 64\n\t"
+ "pushal\n\t"
+ "cpuid\n\t"
+ "popal\n\t"
+ "rdtsc\n\t"
+ "movl %%eax,(%0)\n\t"
+ "movl %%edx,4(%0)\n\t"
+ : /* no output */
+ : "c"(&stime)
+ : "eax", "edx", "memory" );
+}
+
+static void end_measure(void)
+{
+static unsigned long long etime;
+ __asm__ __volatile__ (
+ "pushal\n\t"
+ "cpuid\n\t"
+ "popal\n\t"
+ "rdtsc\n\t"
+ "movl %%eax,(%0)\n\t"
+ "movl %%edx,4(%0)\n\t"
+ : /* no output */
+ : "c"(&etime)
+ : "eax", "edx", "memory" );
+ {
+ unsigned long time = (unsigned long)(etime-stime);
+ time >>= p_shift;
+ if(time < STAT_TABLELEN) {
+ totals[time]++;
+ } else {
+ overflows++;
+ }
+ }
+}
+
+static void clean_buf(void)
+{
+ memset(totals,0,sizeof(totals));
+ overflows = 0;
+}
+
+static void print_line(unsigned long* array)
+{
+ int i;
+ for(i=0;i<32;i++) {
+ if((i%32)==16)
+ printk(":");
+ printk("%lx ",array[i]);
+ }
+}
+
+static void print_buf(char* caption)
+{
+ int i, other = 0;
+ printk("Results - %s - shift %d",
+ caption, p_shift);
+
+ for(i=0;i<STAT_TABLELEN;i+=32) {
+ int j;
+ int local = 0;
+ for(j=0;j<32;j++)
+ local += totals[i+j];
+
+ if(local) {
+ printk("\n%3x: ",i);
+ print_line(&totals[i]);
+ other += local;
+ }
+ }
+ printk("\nOverflows: %d.\n",
+ overflows);
+ printk("Sum: %ld\n",other+overflows);
+}
+
+static void return_immediately(void* dummy)
+{
+ return;
+}
+
+/* gross hack */
+static unsigned long mmu_cr4_features;
+
+static void do_flush_tlb(void* dummy)
+{
+ __flush_tlb_all();
+}
+
int init_module(void)
{
/* Find a name for this unit */
- int err=dev_alloc_name(&dev_dummy,"dummy%d");
+ int err;
+
+ if(p_shift != -1) {
+ int i;
+ /* empty test measurement: */
+ printk("******** kernel cpu benchmark activated **********\n");
+ clean_buf();
+ schedule_timeout(100);
+ for(i=0;i<100;i++) {
+ start_measure();
+ return_immediately(NULL);
+ return_immediately(NULL);
+ return_immediately(NULL);
+ return_immediately(NULL);
+ end_measure();
+ }
+ print_buf("zero");
+ clean_buf();
+ schedule_timeout(100);
+ for(i=0;i<100;i++) {
+ start_measure();
+ return_immediately(NULL);
+ return_immediately(NULL);
+ smp_call_function(return_immediately,NULL,1,1);
+ return_immediately(NULL);
+ return_immediately(NULL);
+ end_measure();
+ }
+ print_buf("empty smp call");
+ clean_buf();
+ {
+ int tmp;
+ __asm__ __volatile__(
+ "movl %%cr4,%0\n\t"
+ "movl %0,%1\n\t"
+ : "=&r"(tmp)
+ : "m" (mmu_cr4_features));
+ }
+ schedule_timeout(100);
+ for(i=0;i<100;i++) {
+ start_measure();
+ return_immediately(NULL);
+ return_immediately(NULL);
+ smp_call_function(do_flush_tlb,NULL,1,1);
+ return_immediately(NULL);
+ return_immediately(NULL);
+ end_measure();
+ }
+ print_buf("tlb flush");
+ clean_buf();
+ return -EINVAL;
+ }
+
+ err=dev_alloc_name(&dev_dummy,"dummy%d");
if(err<0)
return err;
if (register_netdev(&dev_dummy) != 0)
next prev parent reply other threads:[~2000-06-28 19:06 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2000-06-28 16:52 kmap_kiobuf() lord
2000-06-28 18:06 ` kmap_kiobuf() Stephen C. Tweedie
2000-06-28 19:06 ` Manfred Spraul [this message]
2000-06-28 21:05 ` kmap_kiobuf() Andi Kleen
-- strict thread matches above, loose matches on Subject: below --
2000-06-28 20:16 kmap_kiobuf() lord
2000-06-28 21:22 ` kmap_kiobuf() Benjamin C.R. LaHaise
2000-06-29 9:34 ` kmap_kiobuf() Stephen C. Tweedie
2000-06-29 13:45 ` kmap_kiobuf() Steve Lord
2000-06-28 15:54 kmap_kiobuf() lord
2000-06-28 16:06 ` kmap_kiobuf() David Woodhouse
2000-06-28 16:24 ` kmap_kiobuf() Benjamin C.R. LaHaise
2000-06-28 18:07 ` kmap_kiobuf() Stephen C. Tweedie
2000-06-28 18:45 ` kmap_kiobuf() David Woodhouse
2000-06-29 9:09 ` kmap_kiobuf() Stephen C. Tweedie
2000-06-28 17:46 ` kmap_kiobuf() Stephen C. Tweedie
2000-06-28 15:41 kmap_kiobuf() David Woodhouse
2000-06-28 17:44 ` kmap_kiobuf() Stephen C. Tweedie
2000-06-29 10:52 ` kmap_kiobuf() Stephen C. Tweedie
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=395A4CBA.D217F0FE@colorfullife.com \
--to=manfred@colorfullife.com \
--cc=blah@kvack.org \
--cc=dwmw2@infradead.org \
--cc=linux-kernel@vger.rutgers.edu \
--cc=linux-mm@kvack.org \
--cc=lord@sgi.com \
--cc=sct@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.