From: David Howells <dhowells@redhat.com>
To: torvalds@transmeta.com
Cc: dhowells@redhat.com, linux-kernel@vger.kernel.org
Subject: [PATCH] need_resched abstraction
Date: Tue, 15 Jan 2002 09:13:08 +0000 [thread overview]
Message-ID: <23480.1011085988@warthog.cambridge.redhat.com> (raw)
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->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();
}
next reply other threads:[~2002-01-15 9:13 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-01-15 9:13 David Howells [this message]
2002-01-15 9:29 ` [PATCH] need_resched abstraction Jeff Garzik
2002-01-16 3:03 ` Rusty Russell
2002-01-16 3:06 ` Linus Torvalds
2002-01-16 5:16 ` Rusty Russell
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=23480.1011085988@warthog.cambridge.redhat.com \
--to=dhowells@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@transmeta.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.