rds: per-rm flush_wait waitq
authorChris Mason <chris.mason@oracle.com>
Wed, 21 Apr 2010 20:09:28 +0000 (13:09 -0700)
committerAndy Grover <andy.grover@oracle.com>
Thu, 9 Sep 2010 01:12:27 +0000 (18:12 -0700)
This removes a global waitqueue used to wait for rds messages
and replaces it with a waitqueue inside the rds_message struct.

The global waitqueue turns into a global lock and significantly
bottlenecks operations on large machines.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
net/rds/message.c
net/rds/rds.h

index 4cb1ed704153a27c7d0f6af1296074c264a297c6..96e2bf7dc77e85ec381a7982612cb2b2d441d001 100644 (file)
@@ -35,8 +35,6 @@
 
 #include "rds.h"
 
-static DECLARE_WAIT_QUEUE_HEAD(rds_message_flush_waitq);
-
 static unsigned int    rds_exthdr_size[__RDS_EXTHDR_MAX] = {
 [RDS_EXTHDR_NONE]      = 0,
 [RDS_EXTHDR_VERSION]   = sizeof(struct rds_ext_header_version),
@@ -226,6 +224,7 @@ struct rds_message *rds_message_alloc(unsigned int extra_len, gfp_t gfp)
        INIT_LIST_HEAD(&rm->m_sock_item);
        INIT_LIST_HEAD(&rm->m_conn_item);
        spin_lock_init(&rm->m_rs_lock);
+       init_waitqueue_head(&rm->m_flush_wait);
 
 out:
        return rm;
@@ -399,14 +398,14 @@ int rds_message_inc_copy_to_user(struct rds_incoming *inc,
  */
 void rds_message_wait(struct rds_message *rm)
 {
-       wait_event_interruptible(rds_message_flush_waitq,
+       wait_event_interruptible(rm->m_flush_wait,
                        !test_bit(RDS_MSG_MAPPED, &rm->m_flags));
 }
 
 void rds_message_unmapped(struct rds_message *rm)
 {
        clear_bit(RDS_MSG_MAPPED, &rm->m_flags);
-       wake_up_interruptible(&rds_message_flush_waitq);
+       wake_up_interruptible(&rm->m_flush_wait);
 }
 EXPORT_SYMBOL_GPL(rds_message_unmapped);
 
index b57cb50c1f225975318f7bac6b810a9900508a04..c22bd7b49460bc95b7d8fb75b0df0fc6c5e9e43d 100644 (file)
@@ -301,6 +301,8 @@ struct rds_message {
         *   -> rs->rs_lock
         */
        spinlock_t              m_rs_lock;
+       wait_queue_head_t       m_flush_wait;
+
        struct rds_sock         *m_rs;
 
        /* cookie to send to remote, in rds header */