[openib-general] Re: [PATH] problem dlopen libibverbs.so
Michael S. Tsirkin
mst at mellanox.co.il
Thu Jul 21 07:16:47 PDT 2005
Quoting r. Roland Dreier <rolandd at cisco.com>:
> I was thinking the same thing -- lazy initialization of libibverbs
> when it is first use. So yes, such a patch would be useful.
OK. Here goes. Works fine for me. Gleb, can you please verify that it
helps in your setup?
---
Lazy initialization of libibverbs on ibv_get_devices.
Signed-off-by: Michael S. Tsirkin <mst at mellanox.co.il>
Index: libibverbs/src/device.c
===================================================================
--- libibverbs/src/device.c (revision 2894)
+++ libibverbs/src/device.c (working copy)
@@ -46,8 +46,12 @@
#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: libibverbs/src/ibverbs.h
===================================================================
--- libibverbs/src/ibverbs.h (revision 2894)
+++ libibverbs/src/ibverbs.h (working copy)
@@ -50,11 +50,10 @@ struct ibv_driver {
ibv_driver_init_func init_func;
};
-extern Dlist *device_list;
-
extern int ibv_init_mem_map(void);
extern int ibv_lock_range(void *base, size_t size);
extern int ibv_unlock_range(void *base, size_t size);
+extern struct dlist * ibverbs_init(void);
#define IBV_INIT_CMD(cmd, size, opcode) \
do { \
Index: libibverbs/src/init.c
===================================================================
--- libibverbs/src/init.c (revision 2894)
+++ libibverbs/src/init.c (working copy)
@@ -50,12 +50,10 @@
# 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,7 @@ 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,13 +185,15 @@ 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));
device_list = dlist_new(sizeof (struct ibv_device));
if (!driver_list || !device_list) {
@@ -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;
}
--
MST
More information about the general
mailing list