]> git.openfabrics.org - ~shefty/libibverbs.git/commitdiff
Lazy initialization of libibverbs on ibv_get_devices
authorMichael S. Tsirkin <mst@mellanox.co.il>
Mon, 25 Jul 2005 22:25:59 +0000 (22:25 +0000)
committerRoland Dreier <rolandd@cisco.com>
Thu, 9 Nov 2006 19:35:57 +0000 (11:35 -0800)
Signed-off-by: Michael S. Tsirkin <mst@mellanox.co.il>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
src/device.c
src/ibverbs.h
src/init.c

index 120507a5d17a9a7b08adb1e880c8a8cf80fae76b..4df506d56c2c0735b4220a98c61ab0953bad034e 100644 (file)
 
 #include "ibverbs.h"
 
+static struct dlist *device_list;
+
 struct dlist *ibv_get_devices(void)
 {
+       if (!device_list)
+               device_list = ibverbs_init();
        return device_list;
 }
 
index 1f754f320749f230ac3950b24d321786273f038d..58565c82b12abf9db206220c33e9f54f3fd263da 100644 (file)
@@ -50,7 +50,7 @@ struct ibv_driver {
        ibv_driver_init_func init_func;
 };
 
-extern Dlist *device_list;
+extern struct dlist *ibverbs_init(void);
 
 extern int ibv_init_mem_map(void);
 extern int ibv_lock_range(void *base, size_t size);
index e57482feb3b56921a72f7b0e69a39b1ed4427457..4a0ee2f81c1fae63233f159df549c049238944ed 100644 (file)
 #  define OPENIB_DRIVER_PATH_ENV "OPENIB_DRIVER_PATH"
 #endif
 
-Dlist *device_list;
-
 static char default_path[] = DRIVER_PATH;
 static const char *user_path;
 
-static Dlist *driver_list;
+static struct dlist *driver_list;
 
 static void load_driver(char *so_path)
 {
@@ -112,7 +110,8 @@ static void find_drivers(char *dir)
                load_driver(so_glob.gl_pathv[i]);
 }
 
-static void init_drivers(struct sysfs_class_device *verbs_dev)
+static void init_drivers(struct sysfs_class_device *verbs_dev,
+                        struct dlist *device_list)
 {
        struct sysfs_class_device *ib_dev; 
        struct sysfs_attribute *attr;
@@ -187,11 +186,12 @@ static int check_abi_version(void)
 }
 
 
-static void INIT ibverbs_init(void)
+struct dlist *ibverbs_init(void)
 {
        char *wr_path, *dir;
        struct sysfs_class *cls;
-       Dlist *verbs_dev_list;
+       struct dlist *verbs_dev_list;
+       struct dlist *device_list;
        struct sysfs_class_device *verbs_dev;
 
        driver_list = dlist_new(sizeof (struct ibv_driver));
@@ -202,7 +202,7 @@ static void INIT ibverbs_init(void)
        }
 
        if (ibv_init_mem_map())
-               return;
+               return NULL;
 
        /*
         * Check if a driver is statically linked, and if so load it first.
@@ -227,18 +227,20 @@ static void INIT ibverbs_init(void)
        cls = sysfs_open_class("infiniband_verbs");
        if (!cls) {
                fprintf(stderr, PFX "Fatal: couldn't open sysfs class 'infiniband_verbs'.\n");
-               return;
+               return NULL;
        }
 
        if (check_abi_version())
-               return;
+               return NULL;
 
        verbs_dev_list = sysfs_get_class_devices(cls);
        if (!verbs_dev_list) {
                fprintf(stderr, PFX "Fatal: no infiniband class devices found.\n");
-               return;
+               return NULL;
        }
 
        dlist_for_each_data(verbs_dev_list, verbs_dev, struct sysfs_class_device)
-               init_drivers(verbs_dev);
+               init_drivers(verbs_dev, device_list);
+
+       return device_list;
 }