[openib-general] [PATCH] Consolidate access to ib_agent_port_list

Krishna Kumar krkumar at us.ibm.com
Mon Oct 25 13:11:11 PDT 2004


Hi,

This patch is similar to one for MAD that I sent some time earlier.

I could also have split the search routine into two, a get_by_dev
and a get_by_agent, but I felt it was too cumbursome.

Thanks,

- KK

--- ib_agent.c.org	2004-10-25 12:37:56.000000000 -0700
+++ ib_agent.c	2004-10-25 12:42:55.000000000 -0700
@@ -303,12 +303,52 @@
 					      slid, mad, mad_response);
 }

+static inline struct ib_agent_port_private *
+__ib_get_agent_mad(struct ib_device *device, int port_num,
+		   struct ib_mad_agent *mad_agent)
+{
+	struct ib_agent_port_private *entry;
+
+	BUG_ON(!spin_is_locked(&ib_agent_port_list_lock);
+	BUG_ON(!(!!device ^ !!mad_agent));  /* Exactly one MUST be (!NULL) */
+
+	if (device) {
+		list_for_each_entry(entry, &ib_agent_port_list, port_list) {
+			if (entry->dr_smp_agent->device == device &&
+			    entry->port_num == port_num)
+				return entry;
+		}
+	} else {
+		list_for_each_entry(entry, &ib_agent_port_list, port_list) {
+			if ((entry->dr_smp_agent == mad_agent) ||
+			    (entry->lr_smp_agent == mad_agent) ||
+			    (entry->perf_mgmt_agent == mad_agent))
+				return entry;
+		}
+	}
+	return NULL;
+}
+
+static inline struct ib_agent_port_private *
+ib_get_agent_mad(struct ib_device *device, int port_num,
+		 struct ib_mad_agent *mad_agent)
+{
+	struct ib_agent_port_private *entry;
+	unsigned long flags;
+
+	spin_lock_irqsave(&ib_agent_port_list_lock, flags);
+	entry = __ib_get_agent_mad(device, port_num, mad_agent);
+	spin_unlock_irqrestore(&ib_agent_port_list_lock, flags);
+
+	return entry;
+}
+
 void agent_mad_send(struct ib_mad_agent *mad_agent,
 		    struct ib_mad *mad,
 		    struct ib_grh *grh,
 		    struct ib_mad_recv_wc *mad_recv_wc)
 {
-	struct ib_agent_port_private *entry, *port_priv = NULL;
+	struct ib_agent_port_private *port_priv;
 	struct ib_agent_send_wr *agent_send_wr;
 	struct ib_sge gather_list;
 	struct ib_send_wr send_wr;
@@ -318,16 +358,7 @@
 	unsigned long flags;

 	/* Find matching MAD agent */
-	spin_lock_irqsave(&ib_agent_port_list_lock, flags);
-	list_for_each_entry(entry, &ib_agent_port_list, port_list) {
-		if ((entry->dr_smp_agent == mad_agent) ||
-		    (entry->lr_smp_agent == mad_agent) ||
-		    (entry->perf_mgmt_agent == mad_agent)) {
-			port_priv = entry;
-			break;
-		}
-	}
-	spin_unlock_irqrestore(&ib_agent_port_list_lock, flags);
+	port_priv = ib_get_agent_mad(NULL, 0, mad_agent);
 	if (!port_priv) {
 		printk(KERN_ERR SPFX "agent_mad_send: no matching MAD agent %p\n",
 		       mad_agent);
@@ -524,22 +555,13 @@
 static void agent_send_handler(struct ib_mad_agent *mad_agent,
 			       struct ib_mad_send_wc *mad_send_wc)
 {
-	struct ib_agent_port_private	*entry, *port_priv = NULL;
+	struct ib_agent_port_private	*port_priv;
 	struct ib_agent_send_wr		*agent_send_wr;
 	struct list_head                *send_wr;
 	unsigned long                   flags;

 	/* Find matching MAD agent */
-	spin_lock_irqsave(&ib_agent_port_list_lock, flags);
-	list_for_each_entry(entry, &ib_agent_port_list, port_list) {
-		if ((entry->dr_smp_agent == mad_agent) ||
-		    (entry->lr_smp_agent == mad_agent) ||
-		    (entry->perf_mgmt_agent == mad_agent)) {
-			port_priv = entry;
-			break;
-		}
-	}
-	spin_unlock_irqrestore(&ib_agent_port_list_lock, flags);
+	port_priv = ib_get_agent_mad(NULL, 0, mad_agent);
 	if (!port_priv) {
 		printk(KERN_ERR SPFX "agent_send_handler: no matching MAD agent "
 		       "%p\n", mad_agent);
@@ -579,20 +601,10 @@
 static void agent_recv_handler(struct ib_mad_agent *mad_agent,
 			       struct ib_mad_recv_wc *mad_recv_wc)
 {
-	struct ib_agent_port_private *entry, *port_priv = NULL;
-	unsigned long flags;
+	struct ib_agent_port_private *port_priv;

 	/* Find matching MAD agent */
-	spin_lock_irqsave(&ib_agent_port_list_lock, flags);
-	list_for_each_entry(entry, &ib_agent_port_list, port_list) {
-		if ((entry->dr_smp_agent == mad_agent) ||
-		    (entry->lr_smp_agent == mad_agent) ||
-		    (entry->perf_mgmt_agent == mad_agent)) {
-			port_priv = entry;
-			break;
-		}
-	}
-	spin_unlock_irqrestore(&ib_agent_port_list_lock, flags);
+	port_priv = ib_get_agent_mad(NULL, 0, mad_agent);
 	if (!port_priv) {
 		printk(KERN_ERR SPFX "agent_recv_handler: no matching MAD agent %p\n",
 		       mad_agent);
@@ -615,20 +627,12 @@
 		.addr = 0,
 		.size = (unsigned long) high_memory - PAGE_OFFSET
 	};
-	struct ib_agent_port_private *entry, *port_priv = NULL;
+	struct ib_agent_port_private *port_priv;
 	struct ib_mad_reg_req reg_req;
 	unsigned long flags;

 	/* First, check if port already open for SMI */
-	spin_lock_irqsave(&ib_agent_port_list_lock, flags);
-	list_for_each_entry(entry, &ib_agent_port_list, port_list) {
-		if (entry->dr_smp_agent->device == device &&
-		    entry->port_num == port_num) {
-			port_priv = entry;
-			break;
-		}
-	}
-	spin_unlock_irqrestore(&ib_agent_port_list_lock, flags);
+	port_priv = ib_get_agent_mad(device, port_num, NULL);
 	if (port_priv) {
 		printk(KERN_DEBUG SPFX "%s port %d already open\n",
 		       device->name, port_num);
@@ -729,21 +733,14 @@

 static int ib_agent_port_close(struct ib_device *device, int port_num)
 {
-	struct ib_agent_port_private *entry, *port_priv = NULL;
+	struct ib_agent_port_private *port_priv;
 	unsigned long flags;

 	spin_lock_irqsave(&ib_agent_port_list_lock, flags);
-	list_for_each_entry(entry, &ib_agent_port_list, port_list) {
-		if (entry->dr_smp_agent->device == device &&
-		    entry->port_num == port_num) {
-			port_priv = entry;
-			break;
-		}
-	}
-
+	port_priv = __ib_get_agent_mad(NULL, 0, mad_agent);
 	if (port_priv == NULL) {
-		printk(KERN_ERR SPFX "Port %d not found\n", port_num);
 		spin_unlock_irqrestore(&ib_agent_port_list_lock, flags);
+		printk(KERN_ERR SPFX "Port %d not found\n", port_num);
 		return -ENODEV;
 	}





More information about the general mailing list