2002-01-15 09:13:23

by David Howells

[permalink] [raw]
Subject: [PATCH] need_resched abstraction


The attached patch abstracts access to need_resched in as many places as is
reasonable. It makes two replacements:

(1) testing current->need_resched:

if (current->need_resched) ...

is replaced with:

if (need_yield()) ...

(2) testing current->need_resched and immediately scheduling if set:

if (current->need_resched)
schedule();

is replaced with:

yield_point();

[since yield() is already defined to be something else].

David

_______________________________________________________________________________
diff -uNr linux-2.5.2/Documentation/DocBook/kernel-hacking.tmpl linux-yield-252/Documentation/DocBook/kernel-hacking.tmpl
--- linux-2.5.2/Documentation/DocBook/kernel-hacking.tmpl Tue Jan 15 08:19:49 2002
+++ linux-yield-252/Documentation/DocBook/kernel-hacking.tmpl Tue Jan 15 08:40:37 2002
@@ -371,8 +371,7 @@
</para>

<programlisting>
-if (current-&gt;need_resched)
- schedule(); /* Will sleep */
+yield_point(); /* Will sleep */
</programlisting>

<para>
diff -uNr linux-2.5.2/arch/arm/kernel/process.c linux-yield-252/arch/arm/kernel/process.c
--- linux-2.5.2/arch/arm/kernel/process.c Tue Jan 15 08:19:49 2002
+++ linux-yield-252/arch/arm/kernel/process.c Tue Jan 15 08:40:37 2002
@@ -91,7 +91,7 @@
if (!idle)
idle = arch_idle;
leds_event(led_idle_start);
- while (!current->need_resched)
+ while (!need_yield())
idle();
leds_event(led_idle_end);
schedule();
diff -uNr linux-2.5.2/arch/i386/kernel/apm.c linux-yield-252/arch/i386/kernel/apm.c
--- linux-2.5.2/arch/i386/kernel/apm.c Tue Jan 15 08:16:48 2002
+++ linux-yield-252/arch/i386/kernel/apm.c Tue Jan 15 08:40:37 2002
@@ -766,14 +766,14 @@

start_idle = jiffies;
while (1) {
- if (!current->need_resched) {
+ if (!need_yield()) {
if (jiffies - start_idle < HARD_IDLE_TIMEOUT) {
if (!current_cpu_data.hlt_works_ok)
continue;
if (hlt_counter)
continue;
__cli();
- if (!current->need_resched)
+ if (!need_yield())
safe_halt();
else
__sti();
diff -uNr linux-2.5.2/arch/i386/kernel/process.c linux-yield-252/arch/i386/kernel/process.c
--- linux-2.5.2/arch/i386/kernel/process.c Tue Jan 15 08:19:49 2002
+++ linux-yield-252/arch/i386/kernel/process.c Tue Jan 15 08:40:37 2002
@@ -81,7 +81,7 @@
{
if (current_cpu_data.hlt_works_ok && !hlt_counter) {
__cli();
- if (!current->need_resched)
+ if (!need_yield())
safe_halt();
else
__sti();
@@ -127,7 +127,7 @@
void (*idle)(void) = pm_idle;
if (!idle)
idle = default_idle;
- while (!current->need_resched)
+ while (!need_yield())
idle();
schedule();
check_pgt_cache();
diff -uNr linux-2.5.2/arch/i386/math-emu/fpu_entry.c linux-yield-252/arch/i386/math-emu/fpu_entry.c
--- linux-2.5.2/arch/i386/math-emu/fpu_entry.c Tue Jan 15 08:16:48 2002
+++ linux-yield-252/arch/i386/math-emu/fpu_entry.c Tue Jan 15 08:40:37 2002
@@ -559,7 +559,7 @@
RE_ENTRANT_CHECK_ON;
#endif /* DEBUG */

- if (FPU_lookahead && !current->need_resched)
+ if (FPU_lookahead && !need_yield())
{
FPU_ORIG_EIP = FPU_EIP - code_base;
if ( valid_prefix(&byte1, (u_char **)&FPU_EIP,
diff -uNr linux-2.5.2/arch/ia64/kernel/process.c linux-yield-252/arch/ia64/kernel/process.c
--- linux-2.5.2/arch/ia64/kernel/process.c Tue Jan 15 08:19:49 2002
+++ linux-yield-252/arch/ia64/kernel/process.c Tue Jan 15 08:40:37 2002
@@ -117,10 +117,10 @@

while (1) {
#ifdef CONFIG_SMP
- if (!current->need_resched)
+ if (!need_yield())
min_xtp();
#endif
- while (!current->need_resched)
+ while (!need_yield())
continue;
#ifdef CONFIG_SMP
normal_xtp();
diff -uNr linux-2.5.2/arch/m68k/kernel/process.c linux-yield-252/arch/m68k/kernel/process.c
--- linux-2.5.2/arch/m68k/kernel/process.c Tue Jan 15 08:19:49 2002
+++ linux-yield-252/arch/m68k/kernel/process.c Tue Jan 15 08:40:37 2002
@@ -56,7 +56,7 @@
static void default_idle(void)
{
while(1) {
- if (!current->need_resched)
+ if (!need_yield())
#if defined(MACH_ATARI_ONLY) && !defined(CONFIG_HADES)
/* block out HSYNC on the atari (falcon) */
__asm__("stop #0x2200" : : : "cc");
diff -uNr linux-2.5.2/arch/mips/kernel/process.c linux-yield-252/arch/mips/kernel/process.c
--- linux-2.5.2/arch/mips/kernel/process.c Tue Jan 15 08:19:49 2002
+++ linux-yield-252/arch/mips/kernel/process.c Tue Jan 15 08:40:37 2002
@@ -39,7 +39,7 @@
init_idle();

while (1) {
- while (!current->need_resched)
+ while (!need_yield())
if (cpu_wait)
(*cpu_wait)();
schedule();
diff -uNr linux-2.5.2/arch/mips/math-emu/cp1emu.c linux-yield-252/arch/mips/math-emu/cp1emu.c
--- linux-2.5.2/arch/mips/math-emu/cp1emu.c Tue Jan 15 08:16:51 2002
+++ linux-yield-252/arch/mips/math-emu/cp1emu.c Tue Jan 15 08:40:37 2002
@@ -1674,8 +1674,7 @@

oldepc = xcp->cp0_epc;
do {
- if (current->need_resched)
- schedule();
+ yield_point();

prevepc = xcp->cp0_epc;
insn = mips_get_word(xcp, REG_TO_VA(xcp->cp0_epc), &err);
diff -uNr linux-2.5.2/arch/mips64/kernel/process.c linux-yield-252/arch/mips64/kernel/process.c
--- linux-2.5.2/arch/mips64/kernel/process.c Tue Jan 15 08:19:49 2002
+++ linux-yield-252/arch/mips64/kernel/process.c Tue Jan 15 08:40:37 2002
@@ -35,7 +35,7 @@
init_idle();
current->nice = 20;
while (1) {
- while (!current->need_resched)
+ while (!need_yield())
if (wait_available)
__asm__("wait");
schedule();
diff -uNr linux-2.5.2/arch/mips64/math-emu/cp1emu.c linux-yield-252/arch/mips64/math-emu/cp1emu.c
--- linux-2.5.2/arch/mips64/math-emu/cp1emu.c Tue Jan 15 08:17:01 2002
+++ linux-yield-252/arch/mips64/math-emu/cp1emu.c Tue Jan 15 08:40:37 2002
@@ -1707,8 +1707,7 @@

oldepc = xcp->cp0_epc;
do {
- if (current->need_resched)
- schedule();
+ yield_point();

prevepc = xcp->cp0_epc;
insn = mips_get_word(xcp, REG_TO_VA(xcp->cp0_epc), &err);
diff -uNr linux-2.5.2/arch/parisc/kernel/process.c linux-yield-252/arch/parisc/kernel/process.c
--- linux-2.5.2/arch/parisc/kernel/process.c Tue Jan 15 08:19:49 2002
+++ linux-yield-252/arch/parisc/kernel/process.c Tue Jan 15 08:40:37 2002
@@ -73,7 +73,7 @@
current->nice = 20;

while (1) {
- while (!current->need_resched) {
+ while (!need_yield()) {
}
schedule();
check_pgt_cache();
diff -uNr linux-2.5.2/arch/ppc/kernel/idle.c linux-yield-252/arch/ppc/kernel/idle.c
--- linux-2.5.2/arch/ppc/kernel/idle.c Tue Jan 15 08:19:49 2002
+++ linux-yield-252/arch/ppc/kernel/idle.c Tue Jan 15 08:40:37 2002
@@ -71,10 +71,10 @@
}
}
#endif
- if (do_power_save && !current->need_resched)
+ if (do_power_save && !need_yield())
power_save();

- if (current->need_resched) {
+ if (need_yield()) {
schedule();
check_pgt_cache();
}
@@ -150,7 +150,7 @@

if ( atomic_read(&zero_cache_sz) >= zero_cache_water[0] )
return;
- while ( (atomic_read(&zero_cache_sz) < zero_cache_water[1]) && (!current->need_resched) )
+ while ( (atomic_read(&zero_cache_sz) < zero_cache_water[1]) && !need_yield() )
{
/*
* Mark a page as reserved so we can mess with it
@@ -161,8 +161,7 @@
if ( !pageptr )
return;

- if ( current->need_resched )
- schedule();
+ yield_point();

/*
* Make the page no cache so we don't blow our cache with 0's
@@ -181,8 +180,7 @@
*/
for ( bytecount = 0; bytecount < PAGE_SIZE ; bytecount += 4 )
{
- if ( current->need_resched )
- schedule();
+ yield_point();
*(unsigned long *)(bytecount + pageptr) = 0;
}

@@ -243,7 +241,7 @@
* -- Cort
*/
_nmask_and_or_msr(MSR_EE, 0);
- if (!current->need_resched)
+ if (!need_yield())
{
asm("mfspr %0,1008" : "=r" (hid0) :);
hid0 &= ~(HID0_NAP | HID0_SLEEP | HID0_DOZE);
diff -uNr linux-2.5.2/arch/s390/kernel/process.c linux-yield-252/arch/s390/kernel/process.c
--- linux-2.5.2/arch/s390/kernel/process.c Tue Jan 15 08:19:49 2002
+++ linux-yield-252/arch/s390/kernel/process.c Tue Jan 15 08:40:37 2002
@@ -60,7 +60,7 @@
wait_psw.mask = _WAIT_PSW_MASK;
wait_psw.addr = (unsigned long) &&idle_wakeup | 0x80000000L;
while(1) {
- if (current->need_resched) {
+ if (need_yield()) {
schedule();
check_pgt_cache();
continue;
diff -uNr linux-2.5.2/arch/s390x/kernel/process.c linux-yield-252/arch/s390x/kernel/process.c
--- linux-2.5.2/arch/s390x/kernel/process.c Tue Jan 15 08:19:49 2002
+++ linux-yield-252/arch/s390x/kernel/process.c Tue Jan 15 08:40:37 2002
@@ -60,7 +60,7 @@
wait_psw.mask = _WAIT_PSW_MASK;
wait_psw.addr = (unsigned long) &&idle_wakeup;
while(1) {
- if (current->need_resched) {
+ if (need_yield()) {
schedule();
check_pgt_cache();
continue;
diff -uNr linux-2.5.2/arch/sh/kernel/process.c linux-yield-252/arch/sh/kernel/process.c
--- linux-2.5.2/arch/sh/kernel/process.c Tue Jan 15 08:19:49 2002
+++ linux-yield-252/arch/sh/kernel/process.c Tue Jan 15 08:40:37 2002
@@ -44,11 +44,11 @@

while (1) {
if (hlt_counter) {
- if (current->need_resched)
+ if (need_yield())
break;
} else {
__cli();
- while (!current->need_resched) {
+ while (!need_yield()) {
__sti();
asm volatile("sleep" : : : "memory");
__cli();
diff -uNr linux-2.5.2/arch/sparc/kernel/process.c linux-yield-252/arch/sparc/kernel/process.c
--- linux-2.5.2/arch/sparc/kernel/process.c Tue Jan 15 08:19:49 2002
+++ linux-yield-252/arch/sparc/kernel/process.c Tue Jan 15 08:40:37 2002
@@ -106,7 +106,7 @@
{
/* endless idle loop with no priority at all */
while(1) {
- if(current->need_resched) {
+ if(need_yield()) {
schedule();
check_pgt_cache();
}
diff -uNr linux-2.5.2/arch/sparc64/kernel/process.c linux-yield-252/arch/sparc64/kernel/process.c
--- linux-2.5.2/arch/sparc64/kernel/process.c Tue Jan 15 08:19:50 2002
+++ linux-yield-252/arch/sparc64/kernel/process.c Tue Jan 15 08:40:37 2002
@@ -61,7 +61,7 @@
* But this requires writing back the contents of the
* L2 cache etc. so implement this later. -DaveM
*/
- while (!current->need_resched)
+ while (!need_yield())
barrier();

schedule();
@@ -80,7 +80,7 @@
int cpu_idle(void)
{
while(1) {
- if (current->need_resched != 0) {
+ if (need_yield()) {
unidle_me();
schedule();
check_pgt_cache();
diff -uNr linux-2.5.2/drivers/char/lp.c linux-yield-252/drivers/char/lp.c
--- linux-2.5.2/drivers/char/lp.c Tue Jan 15 08:19:50 2002
+++ linux-yield-252/drivers/char/lp.c Tue Jan 15 08:40:37 2002
@@ -367,7 +367,7 @@
= lp_negotiate (port,
lp_table[minor].best_mode);

- } else if (current->need_resched)
+ } else if (need_yield())
schedule ();

if (count) {
diff -uNr linux-2.5.2/drivers/char/mem.c linux-yield-252/drivers/char/mem.c
--- linux-2.5.2/drivers/char/mem.c Tue Jan 15 08:19:50 2002
+++ linux-yield-252/drivers/char/mem.c Tue Jan 15 08:40:37 2002
@@ -381,8 +381,7 @@
unsigned long unwritten = clear_user(buf, PAGE_SIZE);
if (unwritten)
return size + unwritten - PAGE_SIZE;
- if (current->need_resched)
- schedule();
+ yield_point();
buf += PAGE_SIZE;
size -= PAGE_SIZE;
} while (size);
diff -uNr linux-2.5.2/drivers/char/mwave/3780i.c linux-yield-252/drivers/char/mwave/3780i.c
--- linux-2.5.2/drivers/char/mwave/3780i.c Tue Jan 15 08:16:25 2002
+++ linux-yield-252/drivers/char/mwave/3780i.c Tue Jan 15 08:40:37 2002
@@ -68,11 +68,9 @@

static void PaceMsaAccess(unsigned short usDspBaseIO)
{
- if(current->need_resched)
- schedule();
+ yield_point();
udelay(100);
- if(current->need_resched)
- schedule();
+ yield_point();
}

unsigned short dsp3780I_ReadMsaCfg(unsigned short usDspBaseIO,
diff -uNr linux-2.5.2/drivers/char/ppdev.c linux-yield-252/drivers/char/ppdev.c
--- linux-2.5.2/drivers/char/ppdev.c Tue Jan 15 08:19:50 2002
+++ linux-yield-252/drivers/char/ppdev.c Tue Jan 15 08:40:37 2002
@@ -170,9 +170,7 @@
break;
}

- if (current->need_resched) {
- schedule ();
- }
+ yield_point();
}

kfree (kbuffer);
@@ -242,9 +240,7 @@
break;
}

- if (current->need_resched) {
- schedule ();
- }
+ yield_point();
}

kfree (kbuffer);
diff -uNr linux-2.5.2/drivers/char/random.c linux-yield-252/drivers/char/random.c
--- linux-2.5.2/drivers/char/random.c Tue Jan 15 08:16:22 2002
+++ linux-yield-252/drivers/char/random.c Tue Jan 15 08:40:37 2002
@@ -1313,7 +1313,7 @@
/*
* Check if we need to break out or reschedule....
*/
- if ((flags & EXTRACT_ENTROPY_USER) && current->need_resched) {
+ if ((flags & EXTRACT_ENTROPY_USER) && need_yield()) {
if (signal_pending(current)) {
if (ret == 0)
ret = -ERESTARTSYS;
diff -uNr linux-2.5.2/drivers/char/tty_io.c linux-yield-252/drivers/char/tty_io.c
--- linux-2.5.2/drivers/char/tty_io.c Tue Jan 15 08:19:51 2002
+++ linux-yield-252/drivers/char/tty_io.c Tue Jan 15 08:40:37 2002
@@ -712,8 +712,7 @@
ret = -ERESTARTSYS;
if (signal_pending(current))
break;
- if (current->need_resched)
- schedule();
+ yield_point();
}
}
if (written) {
diff -uNr linux-2.5.2/drivers/i2c/i2c-algo-bit.c linux-yield-252/drivers/i2c/i2c-algo-bit.c
--- linux-2.5.2/drivers/i2c/i2c-algo-bit.c Tue Jan 15 08:16:44 2002
+++ linux-yield-252/drivers/i2c/i2c-algo-bit.c Tue Jan 15 08:40:37 2002
@@ -50,7 +50,7 @@
/* might not like this, as they have an internal timeout of some mils */
/*
#define SLO_IO jif=jiffies;while(jiffies<=jif+i2c_table[minor].veryslow)\
- if (need_resched) schedule();
+ yield_point();
*/


@@ -120,8 +120,7 @@
if (start+adap->timeout <= jiffies) {
return -ETIMEDOUT;
}
- if (current->need_resched)
- schedule();
+ yield_point();
}
DEBSTAT(printk("needed %ld jiffies\n", jiffies-start));
#ifdef SLO_IO
diff -uNr linux-2.5.2/drivers/i2c/i2c-algo-ite.c linux-yield-252/drivers/i2c/i2c-algo-ite.c
--- linux-2.5.2/drivers/i2c/i2c-algo-ite.c Tue Jan 15 08:16:44 2002
+++ linux-yield-252/drivers/i2c/i2c-algo-ite.c Tue Jan 15 08:40:37 2002
@@ -67,7 +67,7 @@
/* might not like this, as they have an internal timeout of some mils */
/*
#define SLO_IO jif=jiffies;while(jiffies<=jif+i2c_table[minor].veryslow)\
- if (need_resched) schedule();
+ yield_point();
*/


diff -uNr linux-2.5.2/drivers/md/md.c linux-yield-252/drivers/md/md.c
--- linux-2.5.2/drivers/md/md.c Tue Jan 15 08:19:51 2002
+++ linux-yield-252/drivers/md/md.c Tue Jan 15 08:40:37 2002
@@ -3458,8 +3458,7 @@
* about not overloading the IO subsystem. (things like an
* e2fsck being done on the RAID array should execute fast)
*/
- if (current->need_resched)
- schedule();
+ yield_point();

currspeed = (j-mddev->resync_mark_cnt)/2/((jiffies-mddev->resync_mark)/HZ +1) +1;

diff -uNr linux-2.5.2/drivers/media/radio/radio-sf16fmi.c linux-yield-252/drivers/media/radio/radio-sf16fmi.c
--- linux-2.5.2/drivers/media/radio/radio-sf16fmi.c Tue Jan 15 08:16:46 2002
+++ linux-yield-252/drivers/media/radio/radio-sf16fmi.c Tue Jan 15 08:40:37 2002
@@ -94,8 +94,7 @@
for(i=0; i< 100; i++)
{
udelay(1400);
- if(current->need_resched)
- schedule();
+ yield_point();
}
/* If this becomes allowed use it ...
current->state = TASK_UNINTERRUPTIBLE;
@@ -121,8 +120,7 @@
for(i=0; i< 100; i++)
{
udelay(1400);
- if(current->need_resched)
- schedule();
+ yield_point();
}
/* If this becomes allowed use it ...
current->state = TASK_UNINTERRUPTIBLE;
diff -uNr linux-2.5.2/drivers/media/video/c-qcam.c linux-yield-252/drivers/media/video/c-qcam.c
--- linux-2.5.2/drivers/media/video/c-qcam.c Tue Jan 15 08:16:46 2002
+++ linux-yield-252/drivers/media/video/c-qcam.c Tue Jan 15 08:40:37 2002
@@ -425,8 +425,7 @@
wantlen -= t;
if (t < s)
break;
- if (current->need_resched)
- schedule();
+ yield_point();
}

len = outptr;
@@ -445,8 +444,7 @@
int l;
do {
l = qcam_read_bytes(q, tmpbuf, 3);
- if (current->need_resched)
- schedule();
+ yield_point();
} while (l && (tmpbuf[0] == 0x7e || tmpbuf[1] == 0x7e || tmpbuf[2] == 0x7e));
if (force_rgb) {
if (tmpbuf[0] != 0xe || tmpbuf[1] != 0x0 || tmpbuf[2] != 0xf)
@@ -478,8 +476,7 @@
int l;
do {
l = qcam_read_bytes(q, tmpbuf, 1);
- if (current->need_resched)
- schedule();
+ yield_point();
} while (l && tmpbuf[0] == 0x7e);
l = qcam_read_bytes(q, tmpbuf+1, 2);
if (force_rgb) {
diff -uNr linux-2.5.2/drivers/media/video/cpia.c linux-yield-252/drivers/media/video/cpia.c
--- linux-2.5.2/drivers/media/video/cpia.c Tue Jan 15 08:19:51 2002
+++ linux-yield-252/drivers/media/video/cpia.c Tue Jan 15 08:40:37 2002
@@ -2147,8 +2147,7 @@
/* loop until image ready */
do_command(cam, CPIA_COMMAND_GetCameraStatus,0,0,0,0);
while (cam->params.status.streamState != STREAM_READY) {
- if (current->need_resched)
- schedule();
+ yield_point();

current->state = TASK_INTERRUPTIBLE;

@@ -2163,8 +2162,7 @@
}

/* grab image from camera */
- if (current->need_resched)
- schedule();
+ yield_point();

oldjif = jiffies;
image_size = cam->ops->streamRead(cam->lowlevel_data,
@@ -2189,8 +2187,7 @@
/* decompress and convert image to by copying it from
* raw_image to decompressed_frame
*/
- if (current->need_resched)
- schedule();
+ yield_point();

cam->image_size = parse_picture(cam, image_size);
if (cam->image_size <= 0)
diff -uNr linux-2.5.2/drivers/media/video/cpia_pp.c linux-yield-252/drivers/media/video/cpia_pp.c
--- linux-2.5.2/drivers/media/video/cpia_pp.c Tue Jan 15 08:16:46 2002
+++ linux-yield-252/drivers/media/video/cpia_pp.c Tue Jan 15 08:40:37 2002
@@ -392,7 +392,7 @@
endseen = 0;
block_size = PARPORT_CHUNK_SIZE;
while( !cam->image_complete ) {
- if(current->need_resched) schedule();
+ yield_point();

new_bytes = cpia_pp_read(cam->port, buffer, block_size );
if( new_bytes <= 0 ) {
diff -uNr linux-2.5.2/drivers/media/video/saa5249.c linux-yield-252/drivers/media/video/saa5249.c
--- linux-2.5.2/drivers/media/video/saa5249.c Tue Jan 15 08:16:46 2002
+++ linux-yield-252/drivers/media/video/saa5249.c Tue Jan 15 08:40:37 2002
@@ -127,11 +127,7 @@
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#endif

-#define RESCHED \
- do { \
- if (current->need_resched) \
- schedule(); \
- } while (0)
+#define RESCHED do { yield_point(); } while(0)

static struct video_device saa_template; /* Declared near bottom */

diff -uNr linux-2.5.2/drivers/mtd/chips/amd_flash.c linux-yield-252/drivers/mtd/chips/amd_flash.c
--- linux-2.5.2/drivers/mtd/chips/amd_flash.c Tue Jan 15 08:16:46 2002
+++ linux-yield-252/drivers/mtd/chips/amd_flash.c Tue Jan 15 08:40:37 2002
@@ -889,7 +889,7 @@

times_left = 500000;
while (times_left-- && flash_is_busy(map, adr, private->interleave)) {
- if (current->need_resched) {
+ if (need_yield()) {
spin_unlock_bh(chip->mutex);
schedule();
spin_lock_bh(chip->mutex);
@@ -1126,7 +1126,7 @@
/* Latency issues. Drop the lock, wait a while and retry */
spin_unlock_bh(chip->mutex);

- if (current->need_resched)
+ if (need_yield())
schedule();
else
udelay(1);
diff -uNr linux-2.5.2/drivers/mtd/devices/doc2000.c linux-yield-252/drivers/mtd/devices/doc2000.c
--- linux-2.5.2/drivers/mtd/devices/doc2000.c Tue Jan 15 08:16:46 2002
+++ linux-yield-252/drivers/mtd/devices/doc2000.c Tue Jan 15 08:40:37 2002
@@ -97,7 +97,7 @@
DEBUG(MTD_DEBUG_LEVEL2, "_DoC_WaitReady timed out.\n");
return -EIO;
}
- if (current->need_resched) {
+ if (need_yield()) {
set_current_state(TASK_UNINTERRUPTIBLE);
schedule_timeout(1);
}
diff -uNr linux-2.5.2/drivers/parport/ieee1284.c linux-yield-252/drivers/parport/ieee1284.c
--- linux-2.5.2/drivers/parport/ieee1284.c Tue Jan 15 08:16:44 2002
+++ linux-yield-252/drivers/parport/ieee1284.c Tue Jan 15 08:40:37 2002
@@ -128,7 +128,7 @@
return 0;
if (signal_pending (current))
return -EINTR;
- if (current->need_resched)
+ if (need_yield())
break;
if (i >= 2)
udelay (5);
diff -uNr linux-2.5.2/drivers/parport/ieee1284_ops.c linux-yield-252/drivers/parport/ieee1284_ops.c
--- linux-2.5.2/drivers/parport/ieee1284_ops.c Tue Jan 15 08:16:43 2002
+++ linux-yield-252/drivers/parport/ieee1284_ops.c Tue Jan 15 08:40:37 2002
@@ -136,7 +136,7 @@
/* Let another process run if it needs to. */
if (time_before (jiffies, expire))
if (!parport_yield_blocking (dev)
- && current->need_resched)
+ && need_yield())
schedule ();
}
stop:
diff -uNr linux-2.5.2/drivers/parport/parport_pc.c linux-yield-252/drivers/parport/parport_pc.c
--- linux-2.5.2/drivers/parport/parport_pc.c Tue Jan 15 08:16:43 2002
+++ linux-yield-252/drivers/parport/parport_pc.c Tue Jan 15 08:40:37 2002
@@ -596,7 +596,7 @@
unsigned char ecrval = inb (ECONTROL (port));
int i = 0;

- if (current->need_resched && time_before (jiffies, expire))
+ if (need_yield() && time_before (jiffies, expire))
/* Can't yield the port. */
schedule ();

@@ -622,7 +622,7 @@
}
ecrval = inb (ECONTROL (port));
if (!(ecrval & (1<<2))) {
- if (current->need_resched &&
+ if (need_yield() &&
time_before (jiffies, expire))
schedule ();

@@ -746,8 +746,7 @@
}
/* Is serviceIntr set? */
if (!(inb (ECONTROL (port)) & (1<<2))) {
- if (current->need_resched)
- schedule ();
+ yield_point();

goto false_alarm;
}
@@ -758,9 +757,7 @@
count = get_dma_residue(port->dma);
release_dma_lock(dmaflag);

- if (current->need_resched)
- /* Can't yield the port. */
- schedule ();
+ yield_point(); /* Can't yield the port. */

/* Anyone else waiting for the port? */
if (port->waithead) {
@@ -1093,7 +1090,7 @@
long int expire = jiffies + port->cad->timeout;
unsigned char ecrval = inb (ECONTROL (port));

- if (current->need_resched && time_before (jiffies, expire))
+ if (need_yield() && time_before (jiffies, expire))
/* Can't yield the port. */
schedule ();

@@ -1130,7 +1127,7 @@
}
ecrval = inb (ECONTROL (port));
if (!(ecrval & (1<<2))) {
- if (current->need_resched &&
+ if (need_yield() &&
time_before (jiffies, expire)) {
schedule ();
}
diff -uNr linux-2.5.2/drivers/sound/via82cxxx_audio.c linux-yield-252/drivers/sound/via82cxxx_audio.c
--- linux-2.5.2/drivers/sound/via82cxxx_audio.c Tue Jan 15 08:16:34 2002
+++ linux-yield-252/drivers/sound/via82cxxx_audio.c Tue Jan 15 08:40:37 2002
@@ -1995,7 +1995,7 @@
/* just to be a nice neighbor */
/* Thomas Sailer:
* But also to ourselves, release semaphore if we do so */
- if (current->need_resched) {
+ if (need_yield()) {
up(&card->syscall_sem);
schedule ();
ret = via_syscall_down (card, nonblock);
@@ -2171,7 +2171,7 @@
/* just to be a nice neighbor */
/* Thomas Sailer:
* But also to ourselves, release semaphore if we do so */
- if (current->need_resched) {
+ if (need_yield()) {
up(&card->syscall_sem);
schedule ();
ret = via_syscall_down (card, nonblock);
diff -uNr linux-2.5.2/fs/jbd/commit.c linux-yield-252/fs/jbd/commit.c
--- linux-2.5.2/fs/jbd/commit.c Tue Jan 15 08:19:54 2002
+++ linux-yield-252/fs/jbd/commit.c Tue Jan 15 08:40:37 2002
@@ -224,14 +224,13 @@
}
} while (jh != last_jh);

- if (bufs || current->need_resched) {
+ if (bufs || need_yield()) {
jbd_debug(2, "submit %d writes\n", bufs);
spin_unlock(&journal_datalist_lock);
unlock_journal(journal);
if (bufs)
ll_rw_block(WRITE, bufs, wbuf);
- if (current->need_resched)
- schedule();
+ yield_point();
journal_brelse_array(wbuf, bufs);
lock_journal(journal);
spin_lock(&journal_datalist_lock);
@@ -458,8 +457,7 @@
bh->b_end_io = journal_end_buffer_io_sync;
submit_bh(WRITE, bh);
}
- if (current->need_resched)
- schedule();
+ yield_point();
lock_journal(journal);

/* Force a new descriptor to be generated next
diff -uNr linux-2.5.2/fs/jffs2/background.c linux-yield-252/fs/jffs2/background.c
--- linux-2.5.2/fs/jffs2/background.c Tue Jan 15 08:19:55 2002
+++ linux-yield-252/fs/jffs2/background.c Tue Jan 15 08:40:37 2002
@@ -127,8 +127,7 @@
schedule();
}

- if (current->need_resched)
- schedule();
+ yield_point();

/* Put_super will send a SIGKILL and then wait on the sem.
*/
diff -uNr linux-2.5.2/fs/jffs2/erase.c linux-yield-252/fs/jffs2/erase.c
--- linux-2.5.2/fs/jffs2/erase.c Tue Jan 15 08:19:55 2002
+++ linux-yield-252/fs/jffs2/erase.c Tue Jan 15 08:40:37 2002
@@ -131,8 +131,7 @@

jffs2_erase_block(c, jeb);
/* Be nice */
- if (current->need_resched)
- schedule();
+ yield_point();
spin_lock_bh(&c->erase_completion_lock);
}
spin_unlock_bh(&c->erase_completion_lock);
diff -uNr linux-2.5.2/fs/jffs2/nodemgmt.c linux-yield-252/fs/jffs2/nodemgmt.c
--- linux-2.5.2/fs/jffs2/nodemgmt.c Tue Jan 15 08:16:02 2002
+++ linux-yield-252/fs/jffs2/nodemgmt.c Tue Jan 15 08:40:37 2002
@@ -101,8 +101,7 @@
if (ret)
return ret;

- if (current->need_resched)
- schedule();
+ yield_point();

if (signal_pending(current))
return -EINTR;
diff -uNr linux-2.5.2/fs/namei.c linux-yield-252/fs/namei.c
--- linux-2.5.2/fs/namei.c Tue Jan 15 08:19:55 2002
+++ linux-yield-252/fs/namei.c Tue Jan 15 08:40:37 2002
@@ -339,7 +339,7 @@
goto loop;
if (current->total_link_count >= 40)
goto loop;
- if (current->need_resched) {
+ if (need_yield()) {
current->state = TASK_RUNNING;
schedule();
}
diff -uNr linux-2.5.2/fs/reiserfs/inode.c linux-yield-252/fs/reiserfs/inode.c
--- linux-2.5.2/fs/reiserfs/inode.c Tue Jan 15 08:19:55 2002
+++ linux-yield-252/fs/reiserfs/inode.c Tue Jan 15 08:40:37 2002
@@ -808,8 +808,7 @@
/* inserting indirect pointers for a hole can take a
** long time. reschedule if needed
*/
- if (current->need_resched)
- schedule() ;
+ yield_point();

retval = search_for_position_by_key (inode->i_sb, &key, &path);
if (retval == IO_ERROR) {
diff -uNr linux-2.5.2/include/asm-arm/arch-arc/system.h linux-yield-252/include/asm-arm/arch-arc/system.h
--- linux-2.5.2/include/asm-arm/arch-arc/system.h Tue Jan 15 08:16:07 2002
+++ linux-yield-252/include/asm-arm/arch-arc/system.h Tue Jan 15 08:40:37 2002
@@ -10,7 +10,7 @@

static void arch_idle(void)
{
- while (!current->need_resched && !hlt_counter);
+ while (!need_yield() && !hlt_counter);
}

static inline void arch_reset(char mode)
diff -uNr linux-2.5.2/include/asm-arm/arch-cl7500/system.h linux-yield-252/include/asm-arm/arch-cl7500/system.h
--- linux-2.5.2/include/asm-arm/arch-cl7500/system.h Tue Jan 15 08:16:07 2002
+++ linux-yield-252/include/asm-arm/arch-cl7500/system.h Tue Jan 15 08:40:37 2002
@@ -10,7 +10,7 @@

static void arch_idle(void)
{
- while (!current->need_resched && !hlt_counter)
+ while (!need_yield() && !hlt_counter)
iomd_writeb(0, IOMD_SUSMODE);
}

diff -uNr linux-2.5.2/include/asm-arm/arch-ebsa110/system.h linux-yield-252/include/asm-arm/arch-ebsa110/system.h
--- linux-2.5.2/include/asm-arm/arch-ebsa110/system.h Tue Jan 15 08:16:07 2002
+++ linux-yield-252/include/asm-arm/arch-ebsa110/system.h Tue Jan 15 08:40:37 2002
@@ -17,7 +17,7 @@
* will stop our MCLK signal (which provides the clock for the glue
* logic, and therefore the timer interrupt).
*
- * Instead, we spin, waiting for either hlt_counter or need_resched
+ * Instead, we spin, waiting for either hlt_counter or need_yield()
* to be set. If we have been spinning for 2cs, then we drop the
* core clock down to the memory clock.
*/
@@ -28,13 +28,13 @@
start_idle = jiffies;

do {
- if (current->need_resched || hlt_counter)
+ if (need_yield() || hlt_counter)
goto slow_out;
} while (time_before(jiffies, start_idle + HZ/50));

cpu_do_idle(IDLE_CLOCK_SLOW);

- while (!current->need_resched && !hlt_counter) {
+ while (!need_yield() && !hlt_counter) {
/* do nothing slowly */
}

diff -uNr linux-2.5.2/include/asm-arm/arch-ebsa285/system.h linux-yield-252/include/asm-arm/arch-ebsa285/system.h
--- linux-2.5.2/include/asm-arm/arch-ebsa285/system.h Tue Jan 15 08:16:07 2002
+++ linux-yield-252/include/asm-arm/arch-ebsa285/system.h Tue Jan 15 08:40:37 2002
@@ -20,14 +20,14 @@
start_idle = jiffies;

do {
- if (current->need_resched || hlt_counter)
+ if (need_yield() || hlt_counter)
goto slow_out;
cpu_do_idle(IDLE_WAIT_FAST);
} while (time_before(jiffies, start_idle + HZ/50));

cpu_do_idle(IDLE_CLOCK_SLOW);

- while (!current->need_resched && !hlt_counter) {
+ while (!need_yield() && !hlt_counter) {
cpu_do_idle(IDLE_WAIT_SLOW);
}

diff -uNr linux-2.5.2/include/asm-arm/arch-nexuspci/system.h linux-yield-252/include/asm-arm/arch-nexuspci/system.h
--- linux-2.5.2/include/asm-arm/arch-nexuspci/system.h Tue Jan 15 08:16:07 2002
+++ linux-yield-252/include/asm-arm/arch-nexuspci/system.h Tue Jan 15 08:40:37 2002
@@ -16,7 +16,7 @@

static void arch_idle(void)
{
- while (!current->need_resched && !hlt_counter)
+ while (!need_yield() && !hlt_counter)
cpu_do_idle(IDLE_WAIT_SLOW);
}

diff -uNr linux-2.5.2/include/asm-arm/arch-rpc/system.h linux-yield-252/include/asm-arm/arch-rpc/system.h
--- linux-2.5.2/include/asm-arm/arch-rpc/system.h Tue Jan 15 08:16:07 2002
+++ linux-yield-252/include/asm-arm/arch-rpc/system.h Tue Jan 15 08:40:37 2002
@@ -18,14 +18,14 @@
start_idle = jiffies;

do {
- if (current->need_resched || hlt_counter)
+ if (need_yield() || hlt_counter)
goto slow_out;
cpu_do_idle(IDLE_WAIT_FAST);
} while (time_before(jiffies, start_idle + HZ/50));

cpu_do_idle(IDLE_CLOCK_SLOW);

- while (!current->need_resched && !hlt_counter) {
+ while (!need_yield() && !hlt_counter) {
cpu_do_idle(IDLE_WAIT_SLOW);
}

diff -uNr linux-2.5.2/include/asm-arm/arch-sa1100/system.h linux-yield-252/include/asm-arm/arch-sa1100/system.h
--- linux-2.5.2/include/asm-arm/arch-sa1100/system.h Tue Jan 15 08:16:07 2002
+++ linux-yield-252/include/asm-arm/arch-sa1100/system.h Tue Jan 15 08:40:37 2002
@@ -10,7 +10,7 @@
if (!hlt_counter) {
int flags;
local_irq_save(flags);
- if (!current->need_resched)
+ if (!need_yield())
cpu_do_idle(0);
local_irq_restore(flags);
}
diff -uNr linux-2.5.2/include/asm-arm/arch-tbox/system.h linux-yield-252/include/asm-arm/arch-tbox/system.h
--- linux-2.5.2/include/asm-arm/arch-tbox/system.h Tue Jan 15 08:16:07 2002
+++ linux-yield-252/include/asm-arm/arch-tbox/system.h Tue Jan 15 08:40:37 2002
@@ -13,14 +13,14 @@
start_idle = jiffies;

do {
- if (current->need_resched || hlt_counter)
+ if (need_yield() || hlt_counter)
goto slow_out;
cpu_do_idle(IDLE_WAIT_FAST);
} while (time_before(jiffies, start_idle + HZ/50));

cpu_do_idle(IDLE_CLOCK_SLOW);

- while (!current->need_resched && !hlt_counter) {
+ while (!need_yield() && !hlt_counter) {
cpu_do_idle(IDLE_WAIT_SLOW);
}

diff -uNr linux-2.5.2/include/linux/mtd/cfi.h linux-yield-252/include/linux/mtd/cfi.h
--- linux-2.5.2/include/linux/mtd/cfi.h Tue Jan 15 08:16:03 2002
+++ linux-yield-252/include/linux/mtd/cfi.h Tue Jan 15 08:40:37 2002
@@ -368,7 +368,7 @@
static inline void cfi_udelay(int us)
{
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
- if (current->need_resched) {
+ if (need_yield()) {
unsigned long t = us * HZ / 1000000;
if (t < 1)
t = 1;
diff -uNr linux-2.5.2/include/linux/sched.h linux-yield-252/include/linux/sched.h
--- linux-2.5.2/include/linux/sched.h Tue Jan 15 08:19:56 2002
+++ linux-yield-252/include/linux/sched.h Tue Jan 15 08:45:38 2002
@@ -25,6 +25,7 @@
#include <linux/signal.h>
#include <linux/securebits.h>
#include <linux/fs_struct.h>
+#include <linux/compiler.h>

struct exec_domain;

@@ -669,6 +670,17 @@
{
return (p->sigpending != 0);
}
+
+static inline int need_yield(void)
+{
+ return unlikely(current->need_resched != 0);
+}
+
+static inline void yield_point(void)
+{
+ if (need_yield())
+ schedule();
+}

/*
* Re-calculate pending state from the set of locally pending
diff -uNr linux-2.5.2/kernel/printk.c linux-yield-252/kernel/printk.c
--- linux-2.5.2/kernel/printk.c Tue Jan 15 08:19:57 2002
+++ linux-yield-252/kernel/printk.c Tue Jan 15 08:40:37 2002
@@ -524,7 +524,7 @@
*/
void console_conditional_schedule(void)
{
- if (console_may_schedule && current->need_resched) {
+ if (console_may_schedule && need_yield()) {
set_current_state(TASK_RUNNING);
schedule();
}
diff -uNr linux-2.5.2/kernel/sched.c linux-yield-252/kernel/sched.c
--- linux-2.5.2/kernel/sched.c Tue Jan 15 08:19:57 2002
+++ linux-yield-252/kernel/sched.c Tue Jan 15 08:40:37 2002
@@ -531,7 +531,7 @@
spin_unlock_irq(&rq->lock);

reacquire_kernel_lock(current);
- if (unlikely(current->need_resched))
+ if (need_yield())
goto need_resched_back;
return;
}
diff -uNr linux-2.5.2/kernel/softirq.c linux-yield-252/kernel/softirq.c
--- linux-2.5.2/kernel/softirq.c Tue Jan 15 08:19:57 2002
+++ linux-yield-252/kernel/softirq.c Tue Jan 15 08:40:37 2002
@@ -387,8 +387,7 @@

while (softirq_pending(cpu)) {
do_softirq();
- if (current->need_resched)
- schedule();
+ yield_point();
}

__set_current_state(TASK_INTERRUPTIBLE);
diff -uNr linux-2.5.2/mm/filemap.c linux-yield-252/mm/filemap.c
--- linux-2.5.2/mm/filemap.c Tue Jan 15 08:19:57 2002
+++ linux-yield-252/mm/filemap.c Tue Jan 15 08:40:37 2002
@@ -290,7 +290,7 @@

page_cache_release(page);

- if (current->need_resched) {
+ if (need_yield()) {
__set_current_state(TASK_RUNNING);
schedule();
}
@@ -400,7 +400,7 @@
}

page_cache_release(page);
- if (current->need_resched) {
+ if (need_yield()) {
__set_current_state(TASK_RUNNING);
schedule();
}
diff -uNr linux-2.5.2/mm/swapfile.c linux-yield-252/mm/swapfile.c
--- linux-2.5.2/mm/swapfile.c Tue Jan 15 08:19:57 2002
+++ linux-yield-252/mm/swapfile.c Tue Jan 15 08:40:37 2002
@@ -696,7 +696,7 @@
* interactive performance. Interruptible check on
* signal_pending() would be nice, but changes the spec?
*/
- if (current->need_resched)
+ if (need_yield())
schedule();
}

diff -uNr linux-2.5.2/mm/vmscan.c linux-yield-252/mm/vmscan.c
--- linux-2.5.2/mm/vmscan.c Tue Jan 15 08:19:57 2002
+++ linux-yield-252/mm/vmscan.c Tue Jan 15 08:40:37 2002
@@ -300,7 +300,7 @@

counter = mmlist_nr;
do {
- if (unlikely(current->need_resched)) {
+ if (need_yield()) {
__set_current_state(TASK_RUNNING);
schedule();
}
@@ -345,7 +345,7 @@
while (--max_scan >= 0 && (entry = inactive_list.prev) != &inactive_list) {
struct page * page;

- if (unlikely(current->need_resched)) {
+ if (need_yield()) {
spin_unlock(&pagemap_lru_lock);
__set_current_state(TASK_RUNNING);
schedule();
@@ -625,8 +625,7 @@

for (i = pgdat->nr_zones-1; i >= 0; i--) {
zone = pgdat->node_zones + i;
- if (unlikely(current->need_resched))
- schedule();
+ yield_point();
if (!zone->need_balance)
continue;
if (!try_to_free_pages(zone, GFP_KSWAPD, 0)) {
diff -uNr linux-2.5.2/net/sunrpc/sched.c linux-yield-252/net/sunrpc/sched.c
--- linux-2.5.2/net/sunrpc/sched.c Tue Jan 15 08:19:57 2002
+++ linux-yield-252/net/sunrpc/sched.c Tue Jan 15 08:40:37 2002
@@ -721,7 +721,7 @@

__rpc_execute(task);

- if (++count >= 200 || current->need_resched) {
+ if (++count >= 200 || need_yield()) {
count = 0;
schedule();
}


2002-01-15 09:30:24

by Jeff Garzik

[permalink] [raw]
Subject: Re: [PATCH] need_resched abstraction

Call me picky but I like the name cond_resched() ;-)
--
Jeff Garzik | Alternate titles for LOTR:
Building 1024 | Fast Times at Uruk-Hai
MandrakeSoft | The Took, the Elf, His Daughter and Her Lover
| Samwise Gamgee: International Hobbit of Mystery

2002-01-16 03:03:46

by Rusty Russell

[permalink] [raw]
Subject: Re: [PATCH] need_resched abstraction

On Tue, 15 Jan 2002 04:29:54 -0500
Jeff Garzik <[email protected]> wrote:

> Call me picky but I like the name cond_resched() ;-)

... And I prefer maybe_schedule().

Cheers,
Rusty.
--
Anyone who quotes me in their sig is an idiot. -- Rusty Russell.

2002-01-16 03:06:46

by Linus Torvalds

[permalink] [raw]
Subject: Re: [PATCH] need_resched abstraction


On Wed, 16 Jan 2002, Rusty Russell wrote:
> On Tue, 15 Jan 2002 04:29:54 -0500
> Jeff Garzik <[email protected]> wrote:
>
> > Call me picky but I like the name cond_resched() ;-)
>
> ... And I prefer maybe_schedule().

I made everybody unhappy by changing the names of _both_ "cond_yield()"
and "need_yield()". So there.

My tree calls them "cond_resched()" and "need_resched()" respectively.

Nyaah, nyaah, nyaah.

Linus "management skill: saying 'Nyaah' really load" Torvalds

2002-01-16 05:17:07

by Rusty Russell

[permalink] [raw]
Subject: Re: [PATCH] need_resched abstraction

In message <[email protected]> you
write:
>
> On Wed, 16 Jan 2002, Rusty Russell wrote:
> > ... And I prefer maybe_schedule().
>
> My tree calls them "cond_resched()" and "need_resched()" respectively.

Bastard! Then please apply (thanks to Andrew Morton):

diff -urN -I \$.*\$ --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.3-pre1/drivers/block/ll_rw_blk.c working-2.5.3-pre1-ll/drivers/block/ll_rw_blk.c
--- linux-2.5.3-pre1/drivers/block/ll_rw_blk.c Tue Jan 15 17:25:32 2002
+++ working-2.5.3-pre1-ll/drivers/block/ll_rw_blk.c Wed Jan 16 16:15:10 2002
@@ -996,6 +996,7 @@
if (++rl->count >= batch_requests &&waitqueue_active(&rl->wait))
wake_up(&rl->wait);
}
+ cond_resched();
}

/*
diff -urN -I \$.*\$ --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.3-pre1/fs/buffer.c working-2.5.3-pre1-ll/fs/buffer.c
--- linux-2.5.3-pre1/fs/buffer.c Tue Jan 15 17:25:47 2002
+++ working-2.5.3-pre1-ll/fs/buffer.c Wed Jan 16 16:15:10 2002
@@ -250,12 +250,19 @@
struct buffer_head * next;
int nr;

- next = lru_list[index];
nr = nr_buffers_type[index];
+repeat:
+ next = lru_list[index];
while (next && --nr >= 0) {
struct buffer_head *bh = next;
next = bh->b_next_free;

+ if (dev == NODEV && need_resched()) {
+ spin_unlock(&lru_list_lock);
+ cond_resched();
+ spin_lock(&lru_list_lock);
+ goto repeat;
+ }
if (!buffer_locked(bh)) {
if (refile)
__refile_buffer(bh);
@@ -1180,8 +1187,10 @@
struct buffer_head * bh = __getblk(bdev, block, size);

touch_buffer(bh);
- if (buffer_uptodate(bh))
+ if (buffer_uptodate(bh)) {
+ cond_resched();
return bh;
+ }
ll_rw_block(READ, 1, &bh);
wait_on_buffer(bh);
if (buffer_uptodate(bh))
diff -urN -I \$.*\$ --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.3-pre1/fs/dcache.c working-2.5.3-pre1-ll/fs/dcache.c
--- linux-2.5.3-pre1/fs/dcache.c Tue Jan 15 17:25:47 2002
+++ working-2.5.3-pre1-ll/fs/dcache.c Wed Jan 16 16:15:10 2002
@@ -84,6 +84,7 @@
iput(inode);
} else
spin_unlock(&dcache_lock);
+ cond_resched();
}

/*
diff -urN -I \$.*\$ --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.3-pre1/fs/jbd/commit.c working-2.5.3-pre1-ll/fs/jbd/commit.c
--- linux-2.5.3-pre1/fs/jbd/commit.c Tue Jan 15 17:25:48 2002
+++ working-2.5.3-pre1-ll/fs/jbd/commit.c Wed Jan 16 16:15:10 2002
@@ -212,6 +212,16 @@
__journal_remove_journal_head(bh);
refile_buffer(bh);
__brelse(bh);
+ if (need_resched()) {
+ if (commit_transaction->t_sync_datalist)
+ commit_transaction->t_sync_datalist =
+ next_jh;
+ if (bufs)
+ break;
+ spin_unlock(&journal_datalist_lock);
+ cond_resched();
+ goto write_out_data;
+ }
}
}
if (bufs == ARRAY_SIZE(wbuf)) {
diff -urN -I \$.*\$ --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.3-pre1/fs/proc/array.c working-2.5.3-pre1-ll/fs/proc/array.c
--- linux-2.5.3-pre1/fs/proc/array.c Wed Jan 16 10:52:29 2002
+++ working-2.5.3-pre1-ll/fs/proc/array.c Wed Jan 16 16:15:10 2002
@@ -419,6 +419,8 @@
pte_t page = *pte;
struct page *ptpage;

+ cond_resched();
+
address += PAGE_SIZE;
pte++;
if (pte_none(page))
diff -urN -I \$.*\$ --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.3-pre1/fs/proc/generic.c working-2.5.3-pre1-ll/fs/proc/generic.c
--- linux-2.5.3-pre1/fs/proc/generic.c Sat Sep 8 03:53:59 2001
+++ working-2.5.3-pre1-ll/fs/proc/generic.c Wed Jan 16 16:15:10 2002
@@ -98,7 +98,9 @@
retval = n;
break;
}
-
+
+ cond_resched();
+
/* This is a hack to allow mangling of file pos independent
* of actual bytes read. Simply place the data at page,
* return the bytes, and set `start' to the desired offset
diff -urN -I \$.*\$ --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.3-pre1/mm/filemap.c working-2.5.3-pre1-ll/mm/filemap.c
--- linux-2.5.3-pre1/mm/filemap.c Wed Jan 16 10:52:30 2002
+++ working-2.5.3-pre1-ll/mm/filemap.c Wed Jan 16 16:15:10 2002
@@ -603,6 +603,7 @@
UnlockPage(page);

page_cache_release(page);
+ cond_resched();
spin_lock(&pagecache_lock);
}
spin_unlock(&pagecache_lock);
@@ -1386,6 +1387,9 @@
offset &= ~PAGE_CACHE_MASK;

page_cache_release(page);
+
+ cond_resched();
+
if (ret == nr && desc->count)
continue;
break;
@@ -3019,6 +3023,8 @@
SetPageReferenced(page);
UnlockPage(page);
page_cache_release(page);
+
+ cond_resched();

if (status < 0)
break;
--
Anyone who quotes me in their sig is an idiot. -- Rusty Russell.