[openib-general] [PATCH] Combine ib_agent into ib_mad module

Hal Rosenstock halr at voltaire.com
Tue Oct 26 09:55:50 PDT 2004


Combine ib_agent into ib_mad module
The only downside of this currently is that when removing some module
which uses the AL will cause the AL to be removed. Is there a way to
stop a dependency from unloading ?

Index: ib_agent.c
===================================================================
--- ib_agent.c	(revision 1073)
+++ ib_agent.c	(working copy)
@@ -29,12 +29,7 @@
 #include <asm/bug.h>
 
 
-MODULE_LICENSE("Dual BSD/GPL");
-MODULE_DESCRIPTION("kernel IB agents (SMA and PMA)");
-MODULE_AUTHOR("Sean Hefty");
-MODULE_AUTHOR("Hal Rosenstock");
 
-
 static spinlock_t ib_agent_port_list_lock = SPIN_LOCK_UNLOCKED;
 static LIST_HEAD(ib_agent_port_list);
 
@@ -619,7 +614,7 @@
 	ib_free_recv_mad(mad_recv_wc);
 }
 
-static int ib_agent_port_open(struct ib_device *device, int port_num,
+int ib_agent_port_open(struct ib_device *device, int port_num,
 			      int phys_port_cnt)
 {
 	int ret;
@@ -732,7 +727,7 @@
 	return ret;
 }
 
-static int ib_agent_port_close(struct ib_device *device, int port_num)
+int ib_agent_port_close(struct ib_device *device, int port_num)
 {
 	struct ib_agent_port_private *port_priv;
 	unsigned long flags;
@@ -757,103 +752,3 @@
 	return 0;
 }
 
-static void ib_agent_init_device(struct ib_device *device)
-{
-	int ret, num_ports, cur_port, i, ret2;
-	struct ib_device_attr device_attr;
-
-	ret = ib_query_device(device, &device_attr);
-	if (ret) {
-		printk(KERN_ERR SPFX "Couldn't query device %s\n", device->name);
-		goto error_device_query;
-	}
-
-	if (device->node_type == IB_NODE_SWITCH) {
-		num_ports = 1;
-		cur_port = 0;
-	} else {
-		num_ports = device_attr.phys_port_cnt;
-		cur_port = 1;
-	}
-
-	for (i = 0; i < num_ports; i++, cur_port++) {
-		ret = ib_agent_port_open(device, cur_port, num_ports);
-		if (ret) {
-			printk(KERN_ERR SPFX "Couldn't open %s port %d\n",
-			       device->name, cur_port);
-			goto error_device_open;
-		}
-	}
-
-	goto error_device_query;
-
-error_device_open:
-	while (i > 0) {
-		cur_port--;
-		ret2 = ib_agent_port_close(device, cur_port);
-		if (ret2) {
-			printk(KERN_ERR SPFX "Couldn't close %s port %d\n",
-			       device->name, cur_port);
-		}
-		i--;
-	}
-
-error_device_query:
-	return;
-}
-                                                                                
-static void ib_agent_remove_device(struct ib_device *device)
-{
-	int ret, i, num_ports, cur_port, ret2;
-	struct ib_device_attr device_attr;
-
-	ret = ib_query_device(device, &device_attr);
-	if (ret) {
-		printk(KERN_ERR SPFX "Couldn't query device %s\n", device->name);
-		goto error_device_query;
-	}
-
-	if (device->node_type == IB_NODE_SWITCH) {
-		num_ports = 1;
-		cur_port = 0;
-	} else {
-		num_ports = device_attr.phys_port_cnt;
-		cur_port = 1;
-	}
-	for (i = 0; i < num_ports; i++, cur_port++) {
-		ret2 = ib_agent_port_close(device, cur_port);
-		if (ret2) {
-			printk(KERN_ERR SPFX "Couldn't close %s port %d\n",
-			       device->name, cur_port);
-			if (!ret)
-				ret = ret2;
-		}
-	}
-                                                                                
-error_device_query:
-	return;
-}
-
-static struct ib_client ib_agent_client = {
-        .name = "ib_agent",
-        .add = ib_agent_init_device,
-        .remove = ib_agent_remove_device
-};
-                                                                                
-static int __init ib_agent_init(void)
-{
-        if (ib_register_client(&ib_agent_client)) {
-                printk(KERN_ERR SPFX "Couldn't register ib_agent
client\n");
-                return -EINVAL;
-        }
-                                                                                
-        return 0;
-}
-                                                                                
-static void __exit ib_agent_exit(void)
-{
-	ib_unregister_client(&ib_agent_client);
-}
-
-module_init(ib_agent_init);
-module_exit(ib_agent_exit);
Index: ib_mad.c
===================================================================
--- ib_mad.c	(revision 1071)
+++ ib_mad.c	(working copy)
@@ -1917,6 +1917,12 @@
 	return 0;
 }
 
+
+extern int ib_agent_port_open(struct ib_device *device, int port_num,
+			      int phys_port_cnt);
+extern int ib_agent_port_close(struct ib_device *device, int port_num);
+
+
 static void ib_mad_init_device(struct ib_device *device)
 {
 	int ret, num_ports, cur_port, i, ret2;
@@ -1942,6 +1948,12 @@
 			       device->name, cur_port);
 			goto error_device_open;
 		}
+		ret = ib_agent_port_open(device, cur_port, num_ports);
+		if (ret) {
+			printk(KERN_ERR PFX "Couldn't open %s port %d for agents\n",
+			       device->name, cur_port);
+			goto error_device_open;
+		}
 	}
 
 	goto error_device_query;
@@ -1949,6 +1961,11 @@
 error_device_open:
 	while (i > 0) {
 		cur_port--;
+		ret2 = ib_agent_port_close(device, cur_port);
+		if (ret2) {
+			printk(KERN_ERR PFX "Couldn't close %s port %d for agent\n",
+			       device->name, cur_port);
+		}
 		ret2 = ib_mad_port_close(device, cur_port);
 		if (ret2) {
 			printk(KERN_ERR PFX "Couldn't close %s port %d\n",
@@ -1980,6 +1997,13 @@
 		cur_port = 1;
 	}
 	for (i = 0; i < num_ports; i++, cur_port++) {
+		ret2 = ib_agent_port_close(device, cur_port);
+		if (ret2) {
+			printk(KERN_ERR PFX "Couldn't close %s port %d for agent\n",
+			       device->name, cur_port);
+			if (!ret)
+				ret = ret2;
+		}
 		ret2 = ib_mad_port_close(device, cur_port);
 		if (ret2) {
 			printk(KERN_ERR PFX "Couldn't close %s port %d\n",
@@ -2022,6 +2046,7 @@
 		ret = -EINVAL;
 		goto error2;
 	}
+
 	return 0;
 
 error2:
Index: Makefile
===================================================================
--- Makefile	(revision 1071)
+++ Makefile	(working copy)
@@ -2,10 +2,8 @@
 
 obj-$(CONFIG_INFINIBAND_ACCESS_LAYER) += \
     ib_al.o \
-    ib_agt.o 
+    ib_al_test.o
 
 ib_al-objs := \
-    ib_mad.o
-
-ib_agt-objs := \
+    ib_mad.o \
     ib_agent.o
Index: README
===================================================================
--- README	(revision 1071)
+++ README	(working copy)
@@ -42,7 +42,6 @@
 
 6. You are now ready to run the new access layer as follows:
 	/sbin/modprobe ib_mthca
-	/sbin/modprobe ib_al (This can be skipped)
-	/sbin/modprobe ib_agt
+	/sbin/modprobe ib_al
 Note that starting ib_al does not cause ib_mthca to be started.
 






More information about the general mailing list