From: William Lee Irwin III Some of the parameters to __wait_on_bit() and __wait_on_bit_lock() are redundant, as the wait_bit_queue parameter holds the flags word and the bit number. This patch updates __wait_on_bit() and __wait_on_bit_lock() to fetch that information from the wait_bit_queue passed to them and so reduce the number of parameters so that -mregparm may be more effective. Incremental atop the complete out-of-lining of the contention cases and the fastcall and wait_on_bit_lock()/test_and_set_bit() fixes. Signed-off-by: Andrew Morton --- 25-akpm/fs/fs-writeback.c | 4 ++-- 25-akpm/include/linux/wait.h | 4 ++-- 25-akpm/kernel/wait.c | 18 +++++++++--------- 25-akpm/mm/filemap.c | 8 ++++---- 4 files changed, 17 insertions(+), 17 deletions(-) diff -puN fs/fs-writeback.c~reduce-number-of-parameters-to-__wait_on_bit-and-__wait_on_bit_lock fs/fs-writeback.c --- 25/fs/fs-writeback.c~reduce-number-of-parameters-to-__wait_on_bit-and-__wait_on_bit_lock 2004-09-21 01:57:14.468238312 -0700 +++ 25-akpm/fs/fs-writeback.c 2004-09-21 01:57:14.547226304 -0700 @@ -261,8 +261,8 @@ __writeback_single_inode(struct inode *i do { __iget(inode); spin_unlock(&inode_lock); - __wait_on_bit(wqh, &wq, &inode->i_state, __I_LOCK, - inode_wait, TASK_UNINTERRUPTIBLE); + __wait_on_bit(wqh, &wq, inode_wait, + TASK_UNINTERRUPTIBLE); iput(inode); spin_lock(&inode_lock); } while (inode->i_state & I_LOCK); diff -puN include/linux/wait.h~reduce-number-of-parameters-to-__wait_on_bit-and-__wait_on_bit_lock include/linux/wait.h --- 25/include/linux/wait.h~reduce-number-of-parameters-to-__wait_on_bit-and-__wait_on_bit_lock 2004-09-21 01:57:14.470238008 -0700 +++ 25-akpm/include/linux/wait.h 2004-09-21 01:57:14.548226152 -0700 @@ -140,8 +140,8 @@ void FASTCALL(__wake_up(wait_queue_head_ 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 *, void *, int)); -int FASTCALL(__wait_on_bit(wait_queue_head_t *, struct wait_bit_queue *, void *, int, int (*)(void *), unsigned)); -int FASTCALL(__wait_on_bit_lock(wait_queue_head_t *, struct wait_bit_queue *, void *, int, int (*)(void *), unsigned)); +int FASTCALL(__wait_on_bit(wait_queue_head_t *, struct wait_bit_queue *, int (*)(void *), unsigned)); +int FASTCALL(__wait_on_bit_lock(wait_queue_head_t *, struct wait_bit_queue *, int (*)(void *), unsigned)); void FASTCALL(wake_up_bit(void *, int)); int FASTCALL(out_of_line_wait_on_bit(void *, int, int (*)(void *), unsigned)); int FASTCALL(out_of_line_wait_on_bit_lock(void *, int, int (*)(void *), unsigned)); diff -puN kernel/wait.c~reduce-number-of-parameters-to-__wait_on_bit-and-__wait_on_bit_lock kernel/wait.c --- 25/kernel/wait.c~reduce-number-of-parameters-to-__wait_on_bit-and-__wait_on_bit_lock 2004-09-21 01:57:14.471237856 -0700 +++ 25-akpm/kernel/wait.c 2004-09-21 01:57:14.549226000 -0700 @@ -152,13 +152,13 @@ EXPORT_SYMBOL(wake_bit_function); */ int __sched fastcall __wait_on_bit(wait_queue_head_t *wq, struct wait_bit_queue *q, - void *word, int bit, int (*action)(void *), unsigned mode) + int (*action)(void *), unsigned mode) { int ret = 0; prepare_to_wait(wq, &q->wait, mode); - if (test_bit(bit, word)) - ret = (*action)(word); + if (test_bit(q->key.bit_nr, q->key.flags)) + ret = (*action)(q->key.flags); finish_wait(wq, &q->wait); return ret; } @@ -170,23 +170,23 @@ int __sched fastcall out_of_line_wait_on wait_queue_head_t *wq = bit_waitqueue(word, bit); DEFINE_WAIT_BIT(wait, word, bit); - return __wait_on_bit(wq, &wait, word, bit, action, mode); + return __wait_on_bit(wq, &wait, action, mode); } EXPORT_SYMBOL(out_of_line_wait_on_bit); int __sched fastcall __wait_on_bit_lock(wait_queue_head_t *wq, struct wait_bit_queue *q, - void *word, int bit, int (*action)(void *), unsigned mode) + int (*action)(void *), unsigned mode) { int ret = 0; do { prepare_to_wait_exclusive(wq, &q->wait, mode); - if (test_bit(bit, word)) { - if ((ret = (*action)(word))) + if (test_bit(q->key.bit_nr, q->key.flags)) { + if ((ret = (*action)(q->key.flags))) break; } - } while (test_and_set_bit(bit, word)); + } while (test_and_set_bit(q->key.bit_nr, q->key.flags)); finish_wait(wq, &q->wait); return ret; } @@ -198,7 +198,7 @@ int __sched fastcall out_of_line_wait_on wait_queue_head_t *wq = bit_waitqueue(word, bit); DEFINE_WAIT_BIT(wait, word, bit); - return __wait_on_bit_lock(wq, &wait, word, bit, action, mode); + return __wait_on_bit_lock(wq, &wait, action, mode); } EXPORT_SYMBOL(out_of_line_wait_on_bit_lock); diff -puN mm/filemap.c~reduce-number-of-parameters-to-__wait_on_bit-and-__wait_on_bit_lock mm/filemap.c --- 25/mm/filemap.c~reduce-number-of-parameters-to-__wait_on_bit-and-__wait_on_bit_lock 2004-09-21 01:57:14.473237552 -0700 +++ 25-akpm/mm/filemap.c 2004-09-21 01:57:14.602217944 -0700 @@ -384,8 +384,8 @@ void fastcall wait_on_page_bit(struct pa DEFINE_WAIT_BIT(wait, &page->flags, bit_nr); if (test_bit(bit_nr, &page->flags)) - __wait_on_bit(page_waitqueue(page), &wait, wait.key.flags, - bit_nr, sync_page, TASK_UNINTERRUPTIBLE); + __wait_on_bit(page_waitqueue(page), &wait, sync_page, + TASK_UNINTERRUPTIBLE); } EXPORT_SYMBOL(wait_on_page_bit); @@ -443,8 +443,8 @@ void fastcall __lock_page(struct page *p { DEFINE_WAIT_BIT(wait, &page->flags, PG_locked); - __wait_on_bit_lock(page_waitqueue(page), &wait, wait.key.flags, - PG_locked, sync_page, TASK_UNINTERRUPTIBLE); + __wait_on_bit_lock(page_waitqueue(page), &wait, sync_page, + TASK_UNINTERRUPTIBLE); } EXPORT_SYMBOL(__lock_page); _