IB/core: Integrate IB address resolution module into core
authorLeon Romanovsky <leonro@mellanox.com>
Thu, 19 May 2016 14:12:31 +0000 (17:12 +0300)
committerDoug Ledford <dledford@redhat.com>
Tue, 24 May 2016 18:40:13 +0000 (14:40 -0400)
IB address resolution is declared as a module (ib_addr.ko) which loads
itself before IB core module (ib_core.ko).

It causes to the scenario where IB netlink which is initialized by IB
core can't be used by ib_addr.ko.

In order to solve it, we are converting ib_addr.ko to be part of
IB core module.

Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Mark Bloch <markb@mellanox.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/core/Makefile
drivers/infiniband/core/addr.c
drivers/infiniband/core/core_priv.h
drivers/infiniband/core/device.c

index 26987d9d7e1cdccd5922322e34fd31466d8c064d..209838d2114dcda4b6e5c1d39448026147472f3c 100644 (file)
@@ -2,7 +2,7 @@ infiniband-$(CONFIG_INFINIBAND_ADDR_TRANS)      := rdma_cm.o
 user_access-$(CONFIG_INFINIBAND_ADDR_TRANS)    := rdma_ucm.o
 
 obj-$(CONFIG_INFINIBAND) +=            ib_core.o ib_mad.o ib_sa.o \
-                                       ib_cm.o iw_cm.o ib_addr.o \
+                                       ib_cm.o iw_cm.o \
                                        $(infiniband-y)
 obj-$(CONFIG_INFINIBAND_USER_MAD) +=   ib_umad.o
 obj-$(CONFIG_INFINIBAND_USER_ACCESS) +=        ib_uverbs.o ib_ucm.o \
@@ -10,7 +10,7 @@ obj-$(CONFIG_INFINIBAND_USER_ACCESS) +=       ib_uverbs.o ib_ucm.o \
 
 ib_core-y :=                   packer.o ud_header.o verbs.o cq.o rw.o sysfs.o \
                                device.o fmr_pool.o cache.o netlink.o \
-                               roce_gid_mgmt.o mr_pool.o
+                               roce_gid_mgmt.o mr_pool.o addr.o
 ib_core-$(CONFIG_INFINIBAND_USER_MEM) += umem.o
 ib_core-$(CONFIG_INFINIBAND_ON_DEMAND_PAGING) += umem_odp.o umem_rbtree.o
 
@@ -28,8 +28,6 @@ rdma_cm-$(CONFIG_INFINIBAND_ADDR_TRANS_CONFIGFS) += cma_configfs.o
 
 rdma_ucm-y :=                  ucma.o
 
-ib_addr-y :=                   addr.o
-
 ib_umad-y :=                   user_mad.o
 
 ib_ucm-y :=                    ucm.o
index 337353d86cfadec33064e10117539769fcc0f95d..3a203ee08cedf6cf76a1001b7772d629dd1482bc 100644 (file)
 #include <rdma/ib_addr.h>
 #include <rdma/ib.h>
 
-MODULE_AUTHOR("Sean Hefty");
-MODULE_DESCRIPTION("IB Address Translation");
-MODULE_LICENSE("Dual BSD/GPL");
-
 struct addr_req {
        struct list_head list;
        struct sockaddr_storage src_addr;
@@ -634,7 +630,7 @@ static struct notifier_block nb = {
        .notifier_call = netevent_callback
 };
 
-static int __init addr_init(void)
+int addr_init(void)
 {
        addr_wq = create_singlethread_workqueue("ib_addr");
        if (!addr_wq)
@@ -645,12 +641,9 @@ static int __init addr_init(void)
        return 0;
 }
 
-static void __exit addr_cleanup(void)
+void addr_cleanup(void)
 {
        rdma_addr_unregister_client(&self);
        unregister_netevent_notifier(&nb);
        destroy_workqueue(addr_wq);
 }
-
-module_init(addr_init);
-module_exit(addr_cleanup);
index eab32215756b935159355e22c8d9bf76f108f873..589f16ad7c72a353b70c5d51be21d91ab75f1f9f 100644 (file)
@@ -137,4 +137,7 @@ static inline bool rdma_is_upper_dev_rcu(struct net_device *dev,
        return _upper == upper;
 }
 
+int addr_init(void);
+void addr_cleanup(void);
+
 #endif /* _CORE_PRIV_H */
index 10979844026a01bda540a6f99d2cef0ef56b525f..805d72d67db1d6f6dab302a847f6e153b48cd334 100644 (file)
@@ -983,10 +983,18 @@ static int __init ib_core_init(void)
                goto err_sysfs;
        }
 
+       ret = addr_init();
+       if (ret) {
+               pr_warn("Could't init IB address resolution\n");
+               goto err_ibnl;
+       }
+
        ib_cache_setup();
 
        return 0;
 
+err_ibnl:
+       ibnl_cleanup();
 err_sysfs:
        class_unregister(&ib_class);
 err_comp:
@@ -999,6 +1007,7 @@ err:
 static void __exit ib_core_cleanup(void)
 {
        ib_cache_cleanup();
+       addr_cleanup();
        ibnl_cleanup();
        class_unregister(&ib_class);
        destroy_workqueue(ib_comp_wq);