Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id ; Tue, 15 Jan 2002 04:13:23 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id ; Tue, 15 Jan 2002 04:13:17 -0500 Received: from dell-paw-3.cambridge.redhat.com ([195.224.55.237]:11254 "HELO executor.cambridge.redhat.com") by vger.kernel.org with SMTP id ; Tue, 15 Jan 2002 04:13:10 -0500 To: torvalds@transmeta.com Cc: dhowells@redhat.com, linux-kernel@vger.kernel.org Subject: [PATCH] need_resched abstraction User-Agent: EMH/1.14.1 SEMI/1.14.3 (Ushinoya) FLIM/1.14.3 (=?ISO-8859-4?Q?Unebigory=F2mae?=) APEL/10.3 Emacs/21.1 (i386-redhat-linux-gnu) MULE/5.0 (SAKAKI) MIME-Version: 1.0 (generated by SEMI 1.14.3 - "Ushinoya") Content-Type: text/plain; charset=US-ASCII Date: Tue, 15 Jan 2002 09:13:08 +0000 Message-ID: <23480.1011085988@warthog.cambridge.redhat.com> From: David Howells Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org 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 @@ -if (current->need_resched) - schedule(); /* Will sleep */ +yield_point(); /* Will sleep */ 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 #include #include +#include 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(); } - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/