[openib-general] IPoIB new multicast API patches oops

Sean Hefty sean.hefty at intel.com
Mon Nov 13 11:05:47 PST 2006


I have not been able to reproduce this crash on my systems, and even
instrumenting the code isn't helping me to locate the issue.  Can you
apply the following patch on top of the previous patches, and let me
know if you get any additional output?

- Sean
---
diff --git a/drivers/infiniband/core/multicast.c b/drivers/infiniband/core/multicast.c
index 88a9edf..b3bc4c6 100644
--- a/drivers/infiniband/core/multicast.c
+++ b/drivers/infiniband/core/multicast.c
@@ -81,6 +81,12 @@ enum mcast_state {
 	MCAST_ERROR
 };
 
+enum mcast_debug {
+	MCAST_DEBUG_IDLE,
+	MCAST_DEBUG_JOINING,
+	MCAST_DEBUG_LEAVING,
+};
+
 struct mcast_member;
 
 struct mcast_group {
@@ -97,6 +103,7 @@ struct mcast_group {
 	enum mcast_state	state;
 	struct ib_sa_query	*query;
 	int			query_id;
+	enum mcast_debug	debug_state;
 };
 
 struct mcast_member {
@@ -179,6 +186,7 @@ static void release_group(struct mcast_g
 	if (atomic_dec_and_test(&group->refcount)) {
 		rb_erase(&group->node, &port->table);
 		spin_unlock_irqrestore(&port->lock, flags);
+		BUG_ON(group->debug_state != MCAST_DEBUG_IDLE);
 		kfree(group);
 		deref_port(port);
 	} else
@@ -319,6 +327,8 @@ static int send_join(struct mcast_group 
 	struct mcast_port *port = group->port;
 	int ret;
 
+	BUG_ON(group->debug_state != MCAST_DEBUG_IDLE);
+	group->debug_state = MCAST_DEBUG_JOINING;
 	ret = ib_sa_mcmember_rec_query(&sa_client, port->dev->device,
 				       port->port_num, IB_MGMT_METHOD_SET,
 				       &member->multicast.rec,
@@ -341,6 +351,8 @@ static int send_leave(struct mcast_group
 	rec = group->rec;
 	rec.join_state = leave_state;
 
+	BUG_ON(group->debug_state != MCAST_DEBUG_IDLE);
+	group->debug_state = MCAST_DEBUG_LEAVING;
 	ret = ib_sa_mcmember_rec_query(&sa_client, port->dev->device,
 				       port->port_num, IB_SA_METHOD_DELETE, &rec,
 				       IB_SA_MCMEMBER_REC_MGID     |
@@ -493,6 +505,8 @@ static void join_handler(int status, str
 {
 	struct mcast_group *group = context;
 
+	BUG_ON(group->debug_state != MCAST_DEBUG_JOINING);
+	group->debug_state = MCAST_DEBUG_IDLE;
 	if (status)
 		process_join_error(group, status);
 	else {
@@ -510,6 +524,10 @@ static void join_handler(int status, str
 static void leave_handler(int status, struct ib_sa_mcmember_rec *rec,
 			  void *context)
 {
+	struct mcast_group *group = context;
+
+	BUG_ON(group->debug_state != MCAST_DEBUG_LEAVING);
+	group->debug_state = MCAST_DEBUG_IDLE;
 	mcast_work_handler(context);
 }
 





More information about the general mailing list