Re: [patch] voluntary-preempt-2.6.9-rc1-bk4-R1

From: Ingo Molnar
Date: Thu Sep 09 2004 - 01:27:43 EST



* Mark_H_Johnson@xxxxxxxxxxxx <Mark_H_Johnson@xxxxxxxxxxxx> wrote:

> Not quite sure where to add touch_preempt_timing() calls - somewhere in the
> loop in ide_outsl and ide_insl? [so we keep resetting the start /end
> times?]

> 00000001 0.002ms (+0.000ms): ata_output_data (taskfile_output_data)
> 00000001 0.003ms (+0.542ms): ide_outsl (ata_output_data)
> 00000001 0.545ms (+0.000ms): kunmap_atomic (ide_multwrite)

yeah, i'd add it to ide_outsl. Something like the patch below. (it
compiles but is untested otherwise.)

another possibility besides DMA starvation is starvation between CPUs.
The only way to exclude DMA as a source of CPU starvation would be to
try a maxcpus=1 test using the SMP kernel. You dont even have to run the
RT-latency tester for this - just the disk read/write workload should
trigger the latency traces!

Ingo

--- linux/drivers/ide/ide-iops.c.orig
+++ linux/drivers/ide/ide-iops.c
@@ -56,7 +56,15 @@ static u32 ide_inl (unsigned long port)

static void ide_insl (unsigned long port, void *addr, u32 count)
{
- insl(port, addr, count);
+ unsigned int chunk, offset = 0;
+
+ while (count) {
+ chunk = min(128U, count);
+ insl(port, addr + offset, chunk);
+ count -= chunk;
+ offset += chunk;
+ touch_preempt_timing();
+ }
}

static void ide_outb (u8 val, unsigned long port)
@@ -86,7 +94,15 @@ static void ide_outl (u32 val, unsigned

static void ide_outsl (unsigned long port, void *addr, u32 count)
{
- outsl(port, addr, count);
+ unsigned int chunk, offset = 0;
+
+ while (count) {
+ chunk = min(128U, count);
+ outsl(port, addr + offset, chunk);
+ count -= chunk;
+ offset += chunk;
+ touch_preempt_timing();
+ }
}

void default_hwif_iops (ide_hwif_t *hwif)
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/