[rds-commits] zab commits r134 - trunk/linux/net/rds

svn-commits@oss.oracle.com svn-commits at oss.oracle.com
Wed Jul 26 17:22:46 CDT 2006


Author: zab
Date: 2006-07-26 17:22:45 -0500 (Wed, 26 Jul 2006)
New Revision: 134

Modified:
   trunk/linux/net/rds/ib.h
   trunk/linux/net/rds/ib_cm.c
   trunk/linux/net/rds/ib_recv.c
   trunk/linux/net/rds/ib_ring.c
Log:
Stop hanging on IB conn shutdown. 

The IB ring rework forgot to wake the empty wait queue as the rings emptied.
This fixes that up so that the thread will be woken as ring entries are freed
after the qp is disconnected.


Modified: trunk/linux/net/rds/ib.h
===================================================================
--- trunk/linux/net/rds/ib.h	2006-07-14 21:37:50 UTC (rev 133)
+++ trunk/linux/net/rds/ib.h	2006-07-26 22:22:45 UTC (rev 134)
@@ -102,7 +102,6 @@
 void rds_ib_inc_process_acks(struct rds_connection *conn,
 			      struct rds_incoming *inc, u16 nr);
 void rds_ib_recv_cq_comp_handler(struct ib_cq *cq, void *context);
-extern wait_queue_head_t rds_ib_empty_wait;
 void rds_ib_recv_init_ring(struct rds_ib_connection *ic);
 void rds_ib_recv_clear_ring(struct rds_ib_connection *ic);
 
@@ -113,6 +112,7 @@
 void rds_ib_ring_unalloc(struct rds_ib_work_ring *ring, u32 val);
 int rds_ib_ring_empty(struct rds_ib_work_ring *ring);
 u32 rds_ib_ring_oldest(struct rds_ib_work_ring *ring);
+extern wait_queue_head_t rds_ib_ring_empty_wait;
 
 /* ib_send.c */
 int rds_ib_xmit(struct rds_connection *conn, struct rds_message *rm,

Modified: trunk/linux/net/rds/ib_cm.c
===================================================================
--- trunk/linux/net/rds/ib_cm.c	2006-07-14 21:37:50 UTC (rev 133)
+++ trunk/linux/net/rds/ib_cm.c	2006-07-26 22:22:45 UTC (rev 134)
@@ -377,7 +377,7 @@
 		rdsdebug("disconnectiong cm %p\n", ic->i_cm_id);
 		rdma_disconnect(ic->i_cm_id);
 		/* XXX can this ever hang indefinitely? */
-		wait_event(rds_ib_empty_wait,
+		wait_event(rds_ib_ring_empty_wait,
 			   rds_ib_ring_empty(&ic->i_send_ring) &&
 			   rds_ib_ring_empty(&ic->i_recv_ring));
 

Modified: trunk/linux/net/rds/ib_recv.c
===================================================================
--- trunk/linux/net/rds/ib_recv.c	2006-07-14 21:37:50 UTC (rev 133)
+++ trunk/linux/net/rds/ib_recv.c	2006-07-26 22:22:45 UTC (rev 134)
@@ -30,7 +30,6 @@
 #include "ib.h"
 
 static kmem_cache_t *rds_ib_incoming_slab;
-DECLARE_WAIT_QUEUE_HEAD(rds_ib_empty_wait);
 
 static void rds_ib_recv_free_page(struct rds_ib_recv_work *recv)
 {

Modified: trunk/linux/net/rds/ib_ring.c
===================================================================
--- trunk/linux/net/rds/ib_ring.c	2006-07-14 21:37:50 UTC (rev 133)
+++ trunk/linux/net/rds/ib_ring.c	2006-07-26 22:22:45 UTC (rev 134)
@@ -25,6 +25,11 @@
 #include "rds.h"
 #include "ib.h"
 
+/*
+ * This only happens on shutdown.
+ */
+DECLARE_WAIT_QUEUE_HEAD(rds_ib_ring_empty_wait);
+
 void rds_ib_ring_init(struct rds_ib_work_ring *ring, u32 nr)
 {
 	/* XXX lockdep class */
@@ -60,12 +65,24 @@
 	return ret;
 }
 
+static int rds_ib_ring_empty_locked(struct rds_ib_work_ring *ring)
+{
+	assert_spin_locked(&ring->w_lock);
+	rdsdebug("ring %p nr %d free %u\n", ring, ring->w_nr, ring->w_nr_free);
+	return ring->w_nr_free == ring->w_nr;
+}
+
 static u32 rds_ib_ring_free_locked(struct rds_ib_work_ring *ring, u32 val)
 {
 	assert_spin_locked(&ring->w_lock);
 
 	BUG_ON(ring->w_nr_free + val > ring->w_nr);
 	ring->w_nr_free += val;
+
+	if (rds_ib_ring_empty_locked(ring) &&
+	    waitqueue_active(&rds_ib_ring_empty_wait))
+		wake_up(&rds_ib_ring_empty_wait);
+
 	return ring->w_nr_free;
 }
 
@@ -101,8 +118,7 @@
 	int ret;
 
 	spin_lock_irqsave(&ring->w_lock, flags);
-	ret = ring->w_nr_free == ring->w_nr;
-	rdsdebug("ring %p nr %d free %u\n", ring, ring->w_nr, ring->w_nr_free);
+	ret = rds_ib_ring_empty_locked(ring);
 	spin_unlock_irqrestore(&ring->w_lock, flags);
 
 	return ret;




More information about the rds-commits mailing list