Re: [0.5/2] scheduler caller profiling
From: Oleg Nesterov
Date: Mon May 03 2004 - 07:18:34 EST
Hello.
William Lee Irwin III wrote:
> This patch creates a new scheduling entrypoint, wake_up_filtered(), and
> uses it in page waitqueue hashing to discriminate between the waiters
> on various pages. One of the sources of the thundering herds was
> identified as the page waitqueue hashing by a priori methods and
> empirically confirmed using the scheduler caller profiling patch.
How about this (untested, of course) idea:
struct wait_bit_queue {
unsigned long *flags;
int bit_nr;
wait_queue_t wait;
};
#define DEFINE_WAIT_BIT(name, flags, bit_nr) \
struct wait_bit_queue name = { \
.flags = flags, \
.bit_nr = bit_nr, \
.wait = { \
.task = current, \
.func = wake_bit_function, \
.task_list = LIST_HEAD_INIT(name.wait.task_list), \
}, \
}
int wake_bit_function(wait_queue_t *wait, unsigned mode, int sync)
{
struct wait_bit_queue *wait_bit =
container_of(wait, struct wait_bit_queue, wait);
if (test_bit(wait_bit->bit_nr, &wait_bit->flags))
return 0;
return autoremove_wake_function(wait, mode, sync);
}
This way only waiters must be modified:
void fastcall wait_on_page_bit(struct page *page, int bit_nr)
{
wait_queue_head_t *waitqueue = page_waitqueue(page);
DEFINE_WAIT_BIT(wait, &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_buffer() can use DEFINE_WAIT_BIT(wait, &bh->b_state, BH_Lock)
Oleg.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/