__wake_up(): why wq_write_lock_irqsave()?

From: Manfred Spraul (manfreds@colorfullife.com)
Date: Sun Apr 30 2000 - 11:10:05 EST


I made a quick benchmark of the pipe code, and noticed that if I
(K6/200, kernel compiled for 586 SMP)

* enable rwlocks for wait-queues
* use wq_read_lock instead of wq_write_lock_irqsave() in wake_up

pipe read (write) operations get 21 (41) cpu ticks faster. The only
wait-queue call in pipe_read is one call to wake_up.

wake_up calls should be very common, so what about enabling that
optimization? Or is there a problem with wq_read_lock in wake_up()?
Noone should call add_wait_queu()/remove_wait_queue() from an interrupt.

This patch should also speed up UP kernels: we avoid the "cli" in
__wake_up.

--
	Manfred

// $Header$ // Kernel Version: // VERSION = 2 // PATCHLEVEL = 3 // SUBLEVEL = 99 // EXTRAVERSION = -pre6 --- 2.3/kernel/sched.c Thu Apr 27 11:27:26 2000 +++ build-2.3/kernel/sched.c Sun Apr 30 17:44:51 2000 @@ -645,12 +645,11 @@ { struct list_head *tmp, *head; struct task_struct *p; - unsigned long flags; if (!q) goto out; - wq_write_lock_irqsave(&q->lock, flags); + wq_read_lock(&q->lock); #if WAITQUEUE_DEBUG CHECK_MAGIC_WQHEAD(q); @@ -682,7 +681,7 @@ break; } } - wq_write_unlock_irqrestore(&q->lock, flags); + wq_read_unlock(&q->lock); out: return; } --- 2.3/include/linux/wait.h Sun Feb 27 08:57:12 2000 +++ build-2.3/include/linux/wait.h Sun Apr 30 17:49:47 2000 @@ -59,7 +59,7 @@ * decoupled in the new architecture, lightweight 'simple' spinlocks give * us slightly better latencies and smaller waitqueue structure size. */ -#define USE_RW_WAIT_QUEUE_SPINLOCK 0 +#define USE_RW_WAIT_QUEUE_SPINLOCK 1 #if USE_RW_WAIT_QUEUE_SPINLOCK # define wq_lock_t rwlock_t

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sun Apr 30 2000 - 21:00:18 EST