Re: [patch] voluntary-preempt-2.6.8-rc3-O5

Ingo Molnar
2004-08-11T07:41:35Z

* Ingo Molnar <mingo@elte.hu> wrote:

> > (jackd/12427): 10882us non-preemptible critical section violated 400
> > us preempt threshold starting at kernel_fpu_begin+0x10/0x60 and ending
> > at fast_clear_page+0x75/0xa0
>
> to make sure this is a real latency and not some rdtsc weirdness, could
> you try the latest version of preempt-timing:
>
> http://redhat.com/~mingo/voluntary-preempt/preempt-timing-on-2.6.8-rc3-O5-A2
>
> this adds jiffies-based latency values to the printout, e.g.:

could you also apply the patch below? This splits up fast_clear_page()
overhead into 3 pieces to find out where the overhead comes from. Note
that this will likely cause 'reduced' latency printouts, but those are
not real because the touch_preempt_timing() lines dont show real
preemptible points. You should still get a larger latency in one of
those regions. The kernel-FPU code (which is triggered by the MMX ops)
could be another source of overhead - but 10 msecs is so large ...

(another thing: could you turn on CONFIG_DEBUG_HIGHMEM,
CONFIG_DEBUG_SPINLOCK and CONFIG_DEBUG_SPINLOCK_SLEEP? Lets make sure
that what we are seeing here is not somehow caused by atomicity
violations.)

Ingo

--- linux/arch/i386/lib/mmx.c.orig
+++ linux/arch/i386/lib/mmx.c
@@ -132,7 +132,9 @@ static void fast_clear_page(void *page)
{
int i;

+ touch_preempt_timing();
kernel_fpu_begin();
+ touch_preempt_timing();

__asm__ __volatile__ (
" pxor %%mm0, %%mm0\n" : :
@@ -158,7 +160,9 @@ static void fast_clear_page(void *page)
__asm__ __volatile__ (
" sfence \n" : :
);
+ touch_preempt_timing();
kernel_fpu_end();
+ touch_preempt_timing();
}

static void fast_copy_page(void *to, void *from)
@@ -260,8 +264,10 @@ static void fast_copy_page(void *to, voi
static void fast_clear_page(void *page)
{
int i;
-
+
+ touch_preempt_timing();
kernel_fpu_begin();
+ touch_preempt_timing();

__asm__ __volatile__ (
" pxor %%mm0, %%mm0\n" : :
@@ -290,7 +296,9 @@ static void fast_clear_page(void *page)
page+=128;
}

+ touch_preempt_timing();
kernel_fpu_end();
+ touch_preempt_timing();
}

static void fast_copy_page(void *to, void *from)