From: William Lee Irwin III <wli@holomorphy.com>
To: Andrew Morton <akpm@osdl.org>
Cc: Oleg Nesterov <oleg@tv-sign.ru>, linux-kernel@vger.kernel.org
Subject: [2/4] consolidate bit waiting code patterns
Date: Fri, 27 Aug 2004 22:35:57 -0700 [thread overview]
Message-ID: <20040828053557.GC2793@holomorphy.com> (raw)
In-Reply-To: <20040828053112.GB2793@holomorphy.com>
On Fri, Aug 27, 2004 at 10:31:12PM -0700, William Lee Irwin III wrote:
> Eliminate specialized page and bh waitqueue hashing structures in favor
> of a standardized structure, using wake_up_bit() to wake waiters using
> the standardized wait_bit_key structure.
Consolidate bit waiting code patterns for page waitqueues using
__wait_on_bit() and __wait_on_bit_lock().
Index: mm1-2.6.9-rc1/kernel/fork.c
===================================================================
--- mm1-2.6.9-rc1.orig/kernel/fork.c 2004-08-27 22:02:13.647509296 -0700
+++ mm1-2.6.9-rc1/kernel/fork.c 2004-08-27 22:15:35.543602560 -0700
@@ -250,6 +250,40 @@
}
EXPORT_SYMBOL(__wake_up_bit);
+int __sched __wait_on_bit(wait_queue_head_t *wq, struct wait_bit_queue *q,
+ unsigned long *word,
+ int bit, int (*wait)(unsigned long *), unsigned mode)
+{
+ int ret;
+
+ prepare_to_wait(wq, &q->wait, mode);
+ if (test_bit(bit, word)) {
+ if ((ret = (*wait)(word)))
+ return ret;
+ }
+ finish_wait(wq, &q->wait);
+ return 0;
+}
+EXPORT_SYMBOL(__wait_on_bit);
+
+int __sched __wait_on_bit_lock(wait_queue_head_t *wq, struct wait_bit_queue *q,
+ unsigned long *word, int bit,
+ int (*wait)(unsigned long *), unsigned mode)
+{
+ int ret;
+
+ while (test_and_set_bit(bit, word)) {
+ prepare_to_wait_exclusive(wq, &q->wait, mode);
+ if (test_bit(bit, word)) {
+ if ((ret = (*wait)(word)))
+ return ret;
+ }
+ }
+ finish_wait(wq, &q->wait);
+ return 0;
+}
+EXPORT_SYMBOL(__wait_on_bit_lock);
+
void __init fork_init(unsigned long mempages)
{
#ifndef __HAVE_ARCH_TASK_STRUCT_ALLOCATOR
Index: mm1-2.6.9-rc1/mm/filemap.c
===================================================================
--- mm1-2.6.9-rc1.orig/mm/filemap.c 2004-08-27 22:02:05.772706448 -0700
+++ mm1-2.6.9-rc1/mm/filemap.c 2004-08-27 22:15:35.551601344 -0700
@@ -132,9 +132,11 @@
}
EXPORT_SYMBOL(remove_from_page_cache);
-static inline int sync_page(struct page *page)
+static int sync_page(unsigned long *word)
{
struct address_space *mapping;
+ struct page *page
+ = container_of((page_flags_t *)word, struct page, flags);
/*
* FIXME, fercrissake. What is this barrier here for?
@@ -142,7 +144,8 @@
smp_mb();
mapping = page_mapping(page);
if (mapping && mapping->a_ops && mapping->a_ops->sync_page)
- return mapping->a_ops->sync_page(page);
+ mapping->a_ops->sync_page(page);
+ io_schedule();
return 0;
}
@@ -362,19 +365,18 @@
return &zone->wait_table[hash_ptr(page, zone->wait_table_bits)];
}
+static inline void wake_up_page(struct page *page, int bit)
+{
+ __wake_up_bit(page_waitqueue(page), (unsigned long *)&page->flags, bit);
+}
+
void fastcall wait_on_page_bit(struct page *page, int bit_nr)
{
- wait_queue_head_t *waitqueue = page_waitqueue(page);
DEFINE_WAIT_BIT(wait, (unsigned long *)&page->flags, bit_nr);
- prepare_to_wait(waitqueue, &wait.wait, TASK_UNINTERRUPTIBLE);
- if (test_bit(bit_nr, &page->flags)) {
- sync_page(page);
- io_schedule();
- }
- finish_wait(waitqueue, &wait.wait);
+ __wait_on_bit(page_waitqueue(page), &wait, wait.key.flags,
+ bit_nr, sync_page, TASK_UNINTERRUPTIBLE);
}
-
EXPORT_SYMBOL(wait_on_page_bit);
/**
@@ -394,12 +396,11 @@
*/
void fastcall unlock_page(struct page *page)
{
- unsigned long *word = (unsigned long *)&page->flags;
smp_mb__before_clear_bit();
if (!TestClearPageLocked(page))
BUG();
smp_mb__after_clear_bit();
- __wake_up_bit(page_waitqueue(page), word, PG_locked);
+ wake_up_page(page, PG_locked);
}
EXPORT_SYMBOL(unlock_page);
@@ -410,13 +411,12 @@
*/
void end_page_writeback(struct page *page)
{
- unsigned long *word = (unsigned long *)&page->flags;
if (!TestClearPageReclaim(page) || rotate_reclaimable_page(page)) {
if (!test_clear_page_writeback(page))
BUG();
smp_mb__after_clear_bit();
}
- __wake_up_bit(page_waitqueue(page), word, PG_writeback);
+ wake_up_page(page, PG_writeback);
}
EXPORT_SYMBOL(end_page_writeback);
@@ -431,19 +431,11 @@
*/
void fastcall __lock_page(struct page *page)
{
- wait_queue_head_t *wqh = page_waitqueue(page);
DEFINE_WAIT_BIT(wait, (unsigned long *)&page->flags, PG_locked);
- while (TestSetPageLocked(page)) {
- prepare_to_wait_exclusive(wqh, &wait.wait, TASK_UNINTERRUPTIBLE);
- if (PageLocked(page)) {
- sync_page(page);
- io_schedule();
- }
- }
- finish_wait(wqh, &wait.wait);
+ __wait_on_bit_lock(page_waitqueue(page), &wait, wait.key.flags,
+ PG_locked, sync_page, TASK_UNINTERRUPTIBLE);
}
-
EXPORT_SYMBOL(__lock_page);
/*
Index: mm1-2.6.9-rc1/include/linux/wait.h
===================================================================
--- mm1-2.6.9-rc1.orig/include/linux/wait.h 2004-08-27 22:02:21.778273232 -0700
+++ mm1-2.6.9-rc1/include/linux/wait.h 2004-08-27 22:15:35.554600888 -0700
@@ -139,6 +139,8 @@
extern void FASTCALL(__wake_up_locked(wait_queue_head_t *q, unsigned int mode));
extern void FASTCALL(__wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr));
void FASTCALL(__wake_up_bit(wait_queue_head_t *, unsigned long *, int));
+int FASTCALL(__wait_on_bit(wait_queue_head_t *, struct wait_bit_queue *, unsigned long *, int, int (*)(unsigned long *), unsigned));
+int FASTCALL(__wait_on_bit_lock(wait_queue_head_t *, struct wait_bit_queue *, unsigned long *, int, int (*)(unsigned long *), unsigned));
#define wake_up(x) __wake_up(x, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 1, NULL)
#define wake_up_nr(x, nr) __wake_up(x, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, nr, NULL)
next prev parent reply other threads:[~2004-08-28 5:36 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-08-26 8:47 2.6.9-rc1-mm1 Andrew Morton
2004-08-26 11:07 ` 2.6.9-rc1-mm1 Con Kolivas
2004-08-26 14:28 ` 2.6.9-rc1-mm1 Jurriaan
2004-08-26 18:25 ` 2.6.9-rc1-mm1 Thomas Davis
2004-08-26 14:36 ` 2.6.9-rc1-mm1 Rafael J. Wysocki
2004-08-26 14:45 ` 2.6.9-rc1-mm1 Felipe Alfaro Solana
2004-08-26 15:35 ` 2.6.9-rc1-mm1 Rafael J. Wysocki
2004-08-26 16:38 ` 2.6.9-rc1-mm1 Con Kolivas
2004-08-26 20:36 ` 2.6.9-rc1-mm1 Rafael J. Wysocki
2004-08-26 20:55 ` 2.6.9-rc1-mm1 Martin J. Bligh
2004-08-26 23:19 ` 2.6.9-rc1-mm1 Con Kolivas
2004-08-26 23:43 ` 2.6.9-rc1-mm1 Martin J. Bligh
2004-08-27 0:37 ` 2.6.9-rc1-mm1 Nuno Silva
2004-08-27 0:46 ` 2.6.9-rc1-mm1 Con Kolivas
2004-08-27 0:51 ` 2.6.9-rc1-mm1 Martin J. Bligh
2004-08-27 0:55 ` 2.6.9-rc1-mm1 Con Kolivas
2004-08-27 0:58 ` 2.6.9-rc1-mm1 Rick Lindsley
2004-08-27 20:54 ` 2.6.9-rc1-mm1 Rafael J. Wysocki
2004-08-27 21:54 ` 2.6.9-rc1-mm1 Rick Lindsley
2004-08-27 22:29 ` 2.6.9-rc1-mm1 Rafael J. Wysocki
2004-09-03 21:11 ` schedstat-2.6.8.1 [was: Re: 2.6.9-rc1-mm1] Rafael J. Wysocki
2004-09-08 7:09 ` Rick Lindsley
2004-09-04 18:35 ` 2.6.9-rc1-mm1 Rafael J. Wysocki
2004-09-08 8:10 ` 2.6.9-rc1-mm1 Rick Lindsley
2004-09-04 23:10 ` latency.c [was: Re: 2.6.9-rc1-mm1] Rafael J. Wysocki
2004-09-08 8:12 ` Rick Lindsley
2004-09-08 12:02 ` Rafael J. Wysocki
2004-08-26 20:51 ` 2.6.9-rc1-mm1 Martin J. Bligh
2004-08-27 1:43 ` 2.6.9-rc1-mm1 Nick Piggin
2004-08-26 12:06 ` 2.6.9-rc1-mm1 Denis Vlasenko
2004-08-26 19:40 ` 2.6.9-rc1-mm1 Sam Ravnborg
2004-08-26 17:58 ` 2.6.9-rc1-mm1 (compile stats) John Cherry
2004-08-26 18:53 ` 2.6.9-rc1-mm1 - undefined references - [PATCH] Paolo Ornati
2004-08-28 8:54 ` Adrian Bunk
2004-08-28 9:45 ` Paolo Ornati
2004-08-26 22:46 ` 2.6.9-rc1-mm1 Rafael J. Wysocki
2004-08-26 22:50 ` 2.6.9-rc1-mm1 Andrew Morton
2004-08-26 23:53 ` 2.6.9-rc1-mm1 Tomasz Torcz
[not found] ` <20040827043132.GJ2793@holomorphy.com>
2004-08-27 21:42 ` 2.6.9-rc1-mm1 William Lee Irwin III
2004-08-28 5:26 ` [0/4] standardized waitqueue hashing William Lee Irwin III
2004-08-28 5:31 ` [1/4] standardize bit waiting data type William Lee Irwin III
2004-08-28 5:35 ` William Lee Irwin III [this message]
2004-08-28 5:37 ` [3/4] eliminate bh waitqueue hashtable William Lee Irwin III
2004-08-28 5:38 ` [4/4] eliminate inode " William Lee Irwin III
2004-08-28 6:17 ` [1/4] standardize bit waiting data type Andrew Morton
2004-08-28 6:34 ` William Lee Irwin III
2004-08-28 6:40 ` Andrew Morton
2004-08-28 6:48 ` William Lee Irwin III
2004-08-28 9:20 ` William Lee Irwin III
2004-08-28 9:22 ` [2/4] consolidate bit waiting code patterns William Lee Irwin III
2004-08-28 9:23 ` [3/4] eliminate bh waitqueue hashtable William Lee Irwin III
2004-08-28 9:24 ` [4/4] eliminate inode " William Lee Irwin III
2004-08-28 9:43 ` [3/4] eliminate bh " Andrew Morton
2004-08-28 9:34 ` [2/4] consolidate bit waiting code patterns Andrew Morton
2004-08-28 9:51 ` William Lee Irwin III
2004-08-28 9:39 ` Andrew Morton
2004-08-28 9:51 ` William Lee Irwin III
2004-08-28 9:18 ` [1/4] standardize bit waiting data type Christoph Hellwig
2004-08-28 9:20 ` William Lee Irwin III
2004-08-28 9:06 ` [patch] 2.6.9-rc1-mm1: megaraid_mbox.c compile error with gcc 3.4 Adrian Bunk
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=20040828053557.GC2793@holomorphy.com \
--to=wli@holomorphy.com \
--cc=akpm@osdl.org \
--cc=linux-kernel@vger.kernel.org \
--cc=oleg@tv-sign.ru \
/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