From: Dan Chen <crimsun@email.unc.edu>
To: linux-kernel@vger.kernel.org
Subject: [RFC][PATCH] #define yield() for 2.4 scheduler (anticipating O(1))
Date: Fri, 1 Mar 2002 11:32:37 -0500 [thread overview]
Message-ID: <20020301163237.GC16716@opeth.ath.cx> (raw)
[-- Attachment #1.1: Type: text/plain, Size: 348 bytes --]
In response to Rik's post concerning a #define yield(), I've done a
quick egrep over the 2.4.19-pre2 tree and modified as necessary. This is
a strict search and replace. Thanks to Rik and Davide for assistance.
Please correct me if I erred.
--
Dan Chen crimsun@email.unc.edu
GPG key: www.unc.edu/~crimsun/pubkey.gpg.asc
[-- Attachment #1.2: yield.diff --]
[-- Type: text/plain, Size: 13814 bytes --]
diff -uNr linux.orig/arch/alpha/mm/fault.c linux/arch/alpha/mm/fault.c
--- linux.orig/arch/alpha/mm/fault.c Mon Sep 17 19:15:02 2001
+++ linux/arch/alpha/mm/fault.c Fri Mar 1 11:05:19 2002
@@ -196,8 +196,7 @@
*/
out_of_memory:
if (current->pid == 1) {
- current->policy |= SCHED_YIELD;
- schedule();
+ yield();
down_read(&mm->mmap_sem);
goto survive;
}
diff -uNr linux.orig/arch/i386/mm/fault.c linux/arch/i386/mm/fault.c
--- linux.orig/arch/i386/mm/fault.c Thu Feb 28 21:59:44 2002
+++ linux/arch/i386/mm/fault.c Fri Mar 1 11:03:47 2002
@@ -86,8 +86,7 @@
out_of_memory:
if (current->pid == 1) {
- current->policy |= SCHED_YIELD;
- schedule();
+ yield();
goto survive;
}
goto bad_area;
diff -uNr linux.orig/arch/ia64/mm/fault.c linux/arch/ia64/mm/fault.c
--- linux.orig/arch/ia64/mm/fault.c Thu Feb 28 21:59:59 2002
+++ linux/arch/ia64/mm/fault.c Fri Mar 1 11:17:26 2002
@@ -196,8 +196,7 @@
out_of_memory:
up_read(&mm->mmap_sem);
if (current->pid == 1) {
- current->policy |= SCHED_YIELD;
- schedule();
+ yield();
down_read(&mm->mmap_sem);
goto survive;
}
diff -uNr linux.orig/arch/ppc/mm/fault.c linux/arch/ppc/mm/fault.c
--- linux.orig/arch/ppc/mm/fault.c Tue Oct 2 12:12:44 2001
+++ linux/arch/ppc/mm/fault.c Fri Mar 1 11:06:02 2002
@@ -197,8 +197,7 @@
out_of_memory:
up_read(&mm->mmap_sem);
if (current->pid == 1) {
- current->policy |= SCHED_YIELD;
- schedule();
+ yield();
down_read(&mm->mmap_sem);
goto survive;
}
diff -uNr linux.orig/arch/sh/mm/fault.c linux/arch/sh/mm/fault.c
--- linux.orig/arch/sh/mm/fault.c Mon Oct 15 16:36:48 2001
+++ linux/arch/sh/mm/fault.c Fri Mar 1 11:15:44 2002
@@ -207,8 +207,7 @@
out_of_memory:
up_read(&mm->mmap_sem);
if (current->pid == 1) {
- current->policy |= SCHED_YIELD;
- schedule();
+ yield();
down_read(&mm->mmap_sem);
goto survive;
}
diff -uNr linux.orig/drivers/char/drm-4.0/ffb_drv.c linux/drivers/char/drm-4.0/ffb_drv.c
--- linux.orig/drivers/char/drm-4.0/ffb_drv.c Thu Feb 28 21:59:45 2002
+++ linux/drivers/char/drm-4.0/ffb_drv.c Fri Mar 1 10:59:38 2002
@@ -710,8 +710,7 @@
/* Contention */
atomic_inc(&dev->total_sleeps);
current->state = TASK_INTERRUPTIBLE;
- current->policy |= SCHED_YIELD;
- schedule();
+ yield();
if (signal_pending(current)) {
ret = -ERESTARTSYS;
break;
diff -uNr linux.orig/drivers/char/drm-4.0/tdfx_drv.c linux/drivers/char/drm-4.0/tdfx_drv.c
--- linux.orig/drivers/char/drm-4.0/tdfx_drv.c Thu Feb 28 21:59:45 2002
+++ linux/drivers/char/drm-4.0/tdfx_drv.c Fri Mar 1 11:01:46 2002
@@ -578,10 +578,7 @@
/* Contention */
atomic_inc(&dev->total_sleeps);
-#if 1
- current->policy |= SCHED_YIELD;
-#endif
- schedule();
+ yield();
if (signal_pending(current)) {
ret = -ERESTARTSYS;
break;
@@ -604,8 +601,7 @@
when dev->last_context == lock.context
NOTE WE HOLD THE LOCK THROUGHOUT THIS
TIME! */
- current->policy |= SCHED_YIELD;
- schedule();
+ yield();
current->state = TASK_RUNNING;
remove_wait_queue(&dev->context_wait, &entry);
if (signal_pending(current)) {
diff -uNr linux.orig/drivers/ide/ataraid.c linux/drivers/ide/ataraid.c
--- linux.orig/drivers/ide/ataraid.c Thu Oct 25 16:58:35 2001
+++ linux/drivers/ide/ataraid.c Fri Mar 1 11:03:28 2002
@@ -123,8 +123,7 @@
ptr=kmalloc(sizeof(struct buffer_head),GFP_NOIO);
if (!ptr) {
__set_current_state(TASK_RUNNING);
- current->policy |= SCHED_YIELD;
- schedule();
+ yield();
}
}
return ptr;
@@ -139,8 +138,7 @@
ptr=kmalloc(sizeof(struct ataraid_bh_private),GFP_NOIO);
if (!ptr) {
__set_current_state(TASK_RUNNING);
- current->policy |= SCHED_YIELD;
- schedule();
+ yield();
}
}
return ptr;
diff -uNr linux.orig/fs/buffer.c linux/fs/buffer.c
--- linux.orig/fs/buffer.c Thu Feb 28 22:00:02 2002
+++ linux/fs/buffer.c Fri Mar 1 10:29:52 2002
@@ -735,9 +735,8 @@
wakeup_bdflush();
try_to_free_pages(zone, GFP_NOFS, 0);
run_task_queue(&tq_disk);
- current->policy |= SCHED_YIELD;
__set_current_state(TASK_RUNNING);
- schedule();
+ yield();
}
void init_buffer(struct buffer_head *bh, bh_end_io_t *handler, void *private)
diff -uNr linux.orig/fs/jbd/journal.c linux/fs/jbd/journal.c
--- linux.orig/fs/jbd/journal.c Thu Feb 28 21:59:47 2002
+++ linux/fs/jbd/journal.c Fri Mar 1 10:40:34 2002
@@ -460,8 +460,7 @@
printk (KERN_NOTICE __FUNCTION__
": ENOMEM at get_unused_buffer_head, "
"trying again.\n");
- current->policy |= SCHED_YIELD;
- schedule();
+ yield();
}
} while (!new_bh);
/* keep subsequent assertions sane */
@@ -1541,8 +1540,7 @@
last_warning = jiffies;
}
- current->policy |= SCHED_YIELD;
- schedule();
+ yield();
}
}
@@ -1600,8 +1598,7 @@
last_warning = jiffies;
}
while (ret == 0) {
- current->policy |= SCHED_YIELD;
- schedule();
+ yield();
ret = kmem_cache_alloc(journal_head_cache, GFP_NOFS);
}
}
diff -uNr linux.orig/fs/jbd/revoke.c linux/fs/jbd/revoke.c
--- linux.orig/fs/jbd/revoke.c Thu Feb 28 21:59:47 2002
+++ linux/fs/jbd/revoke.c Fri Mar 1 10:42:04 2002
@@ -137,8 +137,7 @@
if (!journal_oom_retry)
return -ENOMEM;
jbd_debug(1, "ENOMEM in " __FUNCTION__ ", retrying.\n");
- current->policy |= SCHED_YIELD;
- schedule();
+ yield();
goto repeat;
}
diff -uNr linux.orig/fs/jbd/transaction.c linux/fs/jbd/transaction.c
--- linux.orig/fs/jbd/transaction.c Thu Feb 28 21:59:47 2002
+++ linux/fs/jbd/transaction.c Fri Mar 1 10:42:39 2002
@@ -1379,8 +1379,7 @@
do {
old_handle_count = transaction->t_handle_count;
set_current_state(TASK_RUNNING);
- current->policy |= SCHED_YIELD;
- schedule();
+ yield();
} while (old_handle_count != transaction->t_handle_count);
}
diff -uNr linux.orig/fs/locks.c linux/fs/locks.c
--- linux.orig/fs/locks.c Thu Oct 11 10:52:18 2001
+++ linux/fs/locks.c Fri Mar 1 10:32:16 2002
@@ -445,8 +445,7 @@
/* Let the blocked process remove waiter from the
* block list when it gets scheduled.
*/
- current->policy |= SCHED_YIELD;
- schedule();
+ yield();
} else {
/* Remove waiter from the block list, because by the
* time it wakes up blocker won't exist any more.
diff -uNr linux.orig/fs/nfs/pagelist.c linux/fs/nfs/pagelist.c
--- linux.orig/fs/nfs/pagelist.c Thu Feb 28 21:59:38 2002
+++ linux/fs/nfs/pagelist.c Fri Mar 1 10:35:36 2002
@@ -96,8 +96,7 @@
continue;
if (signalled() && (server->flags & NFS_MOUNT_INTR))
return ERR_PTR(-ERESTARTSYS);
- current->policy = SCHED_YIELD;
- schedule();
+ yield();
}
/* Initialize the request struct. Initially, we assume a
diff -uNr linux.orig/fs/reiserfs/buffer2.c linux/fs/reiserfs/buffer2.c
--- linux.orig/fs/reiserfs/buffer2.c Thu Feb 28 21:59:38 2002
+++ linux/fs/reiserfs/buffer2.c Fri Mar 1 10:37:11 2002
@@ -33,8 +33,7 @@
buffer_journal_dirty(bh) ? ' ' : '!');
}
run_task_queue(&tq_disk);
- current->policy |= SCHED_YIELD;
- schedule();
+ yield();
}
if (repeat_counter > 30000000) {
reiserfs_warning("vs-3051: done waiting, ignore vs-3050 messages for (%b)\n", bh) ;
diff -uNr linux.orig/fs/reiserfs/journal.c linux/fs/reiserfs/journal.c
--- linux.orig/fs/reiserfs/journal.c Thu Feb 28 21:59:47 2002
+++ linux/fs/reiserfs/journal.c Fri Mar 1 10:36:44 2002
@@ -149,8 +149,7 @@
}
bn = allocate_bitmap_node(p_s_sb) ;
if (!bn) {
- current->policy |= SCHED_YIELD ;
- schedule() ;
+ yield();
goto repeat ;
}
return bn ;
diff -uNr linux.orig/include/linux/sched.h linux/include/linux/sched.h
--- linux.orig/include/linux/sched.h Thu Feb 28 22:00:03 2002
+++ linux/include/linux/sched.h Fri Mar 1 10:26:20 2002
@@ -122,6 +122,15 @@
*/
#define SCHED_YIELD 0x10
+/*
+ * Anticipating inclusion of Ingo's O(1) scheduler...
+ */
+#define yield() \
+ do { \
+ current->policy |= SCHED_YIELD; \
+ schedule(); \
+ } while (0)
+
struct sched_param {
int sched_priority;
};
diff -uNr linux.orig/init/do_mounts.c linux/init/do_mounts.c
--- linux.orig/init/do_mounts.c Thu Feb 28 22:00:03 2002
+++ linux/init/do_mounts.c Fri Mar 1 10:43:15 2002
@@ -526,10 +526,8 @@
pid = kernel_thread(do_linuxrc, "/linuxrc", SIGCHLD);
if (pid > 0) {
- while (pid != wait(&i)) {
- current->policy |= SCHED_YIELD;
- schedule();
- }
+ while (pid != wait(&i))
+ yield();
}
if (MAJOR(real_root_dev) != RAMDISK_MAJOR
|| MINOR(real_root_dev) != 0) {
diff -uNr linux.orig/kernel/softirq.c linux/kernel/softirq.c
--- linux.orig/kernel/softirq.c Wed Oct 31 13:26:02 2001
+++ linux/kernel/softirq.c Fri Mar 1 10:48:46 2002
@@ -260,8 +260,7 @@
while (test_and_set_bit(TASKLET_STATE_SCHED, &t->state)) {
current->state = TASK_RUNNING;
do {
- current->policy |= SCHED_YIELD;
- schedule();
+ yield();
} while (test_bit(TASKLET_STATE_SCHED, &t->state));
}
tasklet_unlock_wait(t);
@@ -405,10 +404,8 @@
CLONE_FS | CLONE_FILES | CLONE_SIGNAL) < 0)
printk("spawn_ksoftirqd() failed for cpu %d\n", cpu);
else {
- while (!ksoftirqd_task(cpu_logical_map(cpu))) {
- current->policy |= SCHED_YIELD;
- schedule();
- }
+ while (!ksoftirqd_task(cpu_logical_map(cpu)))
+ yield();
}
}
diff -uNr linux.orig/mm/highmem.c linux/mm/highmem.c
--- linux.orig/mm/highmem.c Thu Feb 28 21:59:39 2002
+++ linux/mm/highmem.c Fri Mar 1 10:51:22 2002
@@ -354,9 +354,8 @@
/* we need to wait I/O completion */
run_task_queue(&tq_disk);
- current->policy |= SCHED_YIELD;
__set_current_state(TASK_RUNNING);
- schedule();
+ yield();
goto repeat_alloc;
}
@@ -392,9 +391,8 @@
/* we need to wait I/O completion */
run_task_queue(&tq_disk);
- current->policy |= SCHED_YIELD;
__set_current_state(TASK_RUNNING);
- schedule();
+ yield();
goto repeat_alloc;
}
diff -uNr linux.orig/mm/oom_kill.c linux/mm/oom_kill.c
--- linux.orig/mm/oom_kill.c Sat Nov 3 20:05:25 2001
+++ linux/mm/oom_kill.c Fri Mar 1 10:51:35 2002
@@ -188,8 +188,7 @@
* killing itself before someone else gets the chance to ask
* for more memory.
*/
- current->policy |= SCHED_YIELD;
- schedule();
+ yield();
return;
}
diff -uNr linux.orig/mm/page_alloc.c linux/mm/page_alloc.c
--- linux.orig/mm/page_alloc.c Thu Feb 28 22:00:03 2002
+++ linux/mm/page_alloc.c Fri Mar 1 10:49:38 2002
@@ -429,9 +429,8 @@
return NULL;
/* Yield for kswapd, and try again */
- current->policy |= SCHED_YIELD;
__set_current_state(TASK_RUNNING);
- schedule();
+ yield();
goto rebalance;
}
diff -uNr linux.orig/net/ipv4/tcp_output.c linux/net/ipv4/tcp_output.c
--- linux.orig/net/ipv4/tcp_output.c Thu Feb 28 21:59:39 2002
+++ linux/net/ipv4/tcp_output.c Fri Mar 1 10:52:55 2002
@@ -1009,8 +1009,7 @@
skb = alloc_skb(MAX_TCP_HEADER, GFP_KERNEL);
if (skb)
break;
- current->policy |= SCHED_YIELD;
- schedule();
+ yield();
}
/* Reserve space for headers and prepare control bits. */
diff -uNr linux.orig/net/sched/sch_generic.c linux/net/sched/sch_generic.c
--- linux.orig/net/sched/sch_generic.c Fri Aug 18 13:26:25 2000
+++ linux/net/sched/sch_generic.c Fri Mar 1 10:58:07 2002
@@ -475,10 +475,8 @@
dev_watchdog_down(dev);
- while (test_bit(__LINK_STATE_SCHED, &dev->state)) {
- current->policy |= SCHED_YIELD;
- schedule();
- }
+ while (test_bit(__LINK_STATE_SCHED, &dev->state))
+ yield();
spin_unlock_wait(&dev->xmit_lock);
}
diff -uNr linux.orig/net/socket.c linux/net/socket.c
--- linux.orig/net/socket.c Thu Feb 28 21:59:39 2002
+++ linux/net/socket.c Fri Mar 1 10:51:51 2002
@@ -148,8 +148,7 @@
while (atomic_read(&net_family_lockct) != 0) {
spin_unlock(&net_family_lock);
- current->policy |= SCHED_YIELD;
- schedule();
+ yield();
spin_lock(&net_family_lock);
}
diff -uNr linux.orig/net/sunrpc/sched.c linux/net/sunrpc/sched.c
--- linux.orig/net/sunrpc/sched.c Thu Feb 28 21:59:48 2002
+++ linux/net/sunrpc/sched.c Fri Mar 1 10:57:30 2002
@@ -773,8 +773,7 @@
}
if (flags & RPC_TASK_ASYNC)
return NULL;
- current->policy |= SCHED_YIELD;
- schedule();
+ yield();
} while (!signalled());
return NULL;
@@ -1115,8 +1114,7 @@
__rpc_schedule();
if (all_tasks) {
dprintk("rpciod_killall: waiting for tasks to exit\n");
- current->policy |= SCHED_YIELD;
- schedule();
+ yield();
}
}
@@ -1186,8 +1184,7 @@
* wait briefly before checking the process id.
*/
current->sigpending = 0;
- current->policy |= SCHED_YIELD;
- schedule();
+ yield();
/*
* Display a message if we're going to wait longer.
*/
diff -uNr linux.orig/net/unix/af_unix.c linux/net/unix/af_unix.c
--- linux.orig/net/unix/af_unix.c Thu Feb 28 21:59:48 2002
+++ linux/net/unix/af_unix.c Fri Mar 1 10:52:34 2002
@@ -565,10 +565,8 @@
addr->hash)) {
write_unlock(&unix_table_lock);
/* Sanity yield. It is unusual case, but yet... */
- if (!(ordernum&0xFF)) {
- current->policy |= SCHED_YIELD;
- schedule();
- }
+ if (!(ordernum&0xFF))
+ yield();
goto retry;
}
addr->hash ^= sk->type;
[-- Attachment #2: Type: application/pgp-signature, Size: 232 bytes --]
next reply other threads:[~2002-03-01 16:35 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-03-01 16:32 Dan Chen [this message]
2002-03-01 18:03 ` [RFC][PATCH] #define yield() for 2.4 scheduler (anticipating O(1)) Davide Libenzi
2002-03-01 18:58 ` Mike Fedyk
2002-03-01 19:03 ` Dan Chen
2002-03-01 21:18 ` Bongani Hlope
2002-03-01 21:13 ` Rik van Riel
2002-03-02 17:38 ` Dan Chen
2002-03-01 22:28 ` Ken Brownfield
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=20020301163237.GC16716@opeth.ath.cx \
--to=crimsun@email.unc.edu \
--cc=linux-kernel@vger.kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox