Whamcloud - gitweb
LU-9667 lnet: Add LNet net sysfs structure
authorSonia <sonia.sharma@intel.com>
Fri, 25 May 2018 05:06:27 +0000 (22:06 -0700)
committerSonia Sharma <sharmaso@whamcloud.com>
Wed, 29 May 2019 07:08:15 +0000 (03:08 -0400)
Adding APIs to create ksets, kobjects
and the attribute files for net sysfs directory
structure.

Callback functions for the LNet NI attributes
are added to be used to display statistics.

Change-Id: Id777dd799ab95d96f84d9513b7fb470bc5502ab6
Test-Parameters: forbuildonly
Signed-off-by: Sonia Sharma <sharmaso@whamcloud.com>
Reviewed-on: https://review.whamcloud.com/31744
Tested-by: Jenkins
Reviewed-by: Amir Shehata <ashehata@whamcloud.com>
Reviewed-by: James Simmons <uja.ornl@yahoo.com>
lnet/include/lnet/lib-types.h
lnet/include/lnet/lnet-sysfs.h
lnet/lnet/api-ni.c
lnet/lnet/config.c
lnet/lnet/lnet-sysfs.c
lnet/lnet/module.c

index bd1df1e..d81ac00 100644 (file)
@@ -415,6 +415,9 @@ struct lnet_net {
 
        /* network state */
        enum lnet_net_state     net_state;
+
+       /* Sysfs kset for each network*/
+       struct kset             *nwid_kset;
 };
 
 struct lnet_ni {
@@ -503,6 +506,12 @@ struct lnet_ni {
         */
        char                    *ni_interfaces[LNET_INTERFACES_NUM];
        struct net              *ni_net_ns;     /* original net namespace */
+
+       /* Sysfs kobjects */
+       struct kobject          *ni_kobj;
+       struct kobject          stats_kobj;
+
+       struct completion       stats_kobj_unregister;
 };
 
 #define LNET_PROTO_PING_MATCHBITS      0x8000000000000000LL
@@ -1144,6 +1153,8 @@ struct lnet {
        /* recovery eq handler */
        struct lnet_handle_eq           ln_mt_eqh;
 
+       /* Sysfs kobject for net */
+       struct kobject                  *ln_net_kobj;
 };
 
 #endif
index a47c09b..59d3b52 100644 (file)
@@ -74,4 +74,46 @@ ssize_t lnet_attr_store(struct kobject *kobj, struct attribute *attr,
 
 extern const struct sysfs_ops lnet_sysfs_ops;
 
+/*
+ * lnet_net_sysfs_setup
+ *
+ * Setup the sysfs hierarchy for lnet network stats.
+ * Create kset for the net.
+ *
+ * net_id - net_type of the network being added
+ * net - network added to the lnet
+ */
+int lnet_net_sysfs_setup(__u32 net_id, struct lnet_net *net);
+
+/*
+ * lnet_ni_sysfs_setup
+ *
+ * Create kobject for the NI under the kset of the network
+ * that this NI is part of. Create the attribute files
+ * for this NI as well.
+ *
+ * ni - NI for which stats are being created
+ */
+int lnet_ni_sysfs_setup(struct lnet_ni *ni, char *iface);
+
+/*
+ * lnet_net_sysfs_cleanup
+ *
+ * Cleanup the sysfs kset for this network.
+ *
+ * net - network being cleaned up from lnet
+ */
+void lnet_net_sysfs_cleanup(struct lnet_net *net);
+
+/*
+ * lnet_ni_sysfs_cleanup
+ *
+ * Cleanup the sysfs hierarchy for this NI stats.
+ * Remove the kobject for the NI and the
+ * attribute files for the NI.
+ *
+ * ni - NI for which stats are being cleaned up
+ */
+void lnet_ni_sysfs_cleanup(struct lnet_ni *ni);
+
 #endif
index c06065b..cdba4ea 100644 (file)
@@ -2522,9 +2522,19 @@ LNetNIInit(lnet_pid_t requested_pid)
                return rc;
        }
 
+       LASSERT(lnet_kobj);
+
+       the_lnet.ln_net_kobj = kobject_create_and_add("net", lnet_kobj);
+       if (!the_lnet.ln_net_kobj) {
+               mutex_unlock(&the_lnet.ln_api_mutex);
+               CERROR("kobject for net could not be created\n");
+               return -ENOMEM;
+       }
+
        rc = lnet_prepare(requested_pid);
        if (rc != 0) {
                mutex_unlock(&the_lnet.ln_api_mutex);
+               kobject_put(the_lnet.ln_net_kobj);
                return rc;
        }
 
@@ -2632,6 +2642,7 @@ err_empty_list:
                list_del_init(&net->net_list);
                lnet_net_free(net);
        }
+       kobject_put(the_lnet.ln_net_kobj);
        return rc;
 }
 EXPORT_SYMBOL(LNetNIInit);
@@ -2672,6 +2683,7 @@ LNetNIFini()
                lnet_destroy_routes();
                lnet_shutdown_lndnets();
                lnet_unprepare();
+               kobject_put(the_lnet.ln_net_kobj);
        }
 
        mutex_unlock(&the_lnet.ln_api_mutex);
index cc102cb..12b2442 100644 (file)
@@ -37,6 +37,7 @@
 #include <linux/nsproxy.h>
 #include <net/net_namespace.h>
 #include <lnet/lib-lnet.h>
+#include <lnet/lnet-sysfs.h>
 
 /* tmp struct for parsing routes */
 struct lnet_text_buf {
@@ -320,6 +321,9 @@ lnet_ni_free(struct lnet_ni *ni)
        if (ni->ni_net_ns != NULL)
                put_net(ni->ni_net_ns);
 
+       /* clean up the sysfs kobjects for this NI */
+       lnet_ni_sysfs_cleanup(ni);
+
        LIBCFS_FREE(ni, sizeof(*ni));
 }
 
@@ -352,6 +356,9 @@ lnet_net_free(struct lnet_net *net)
                LIBCFS_FREE(net->net_cpts,
                            sizeof(*net->net_cpts) * net->net_ncpts);
 
+       /* clean up the sysfs kobjects for this net*/
+       lnet_net_sysfs_cleanup(net);
+
        LIBCFS_FREE(net, sizeof(*net));
 }
 
@@ -359,6 +366,7 @@ struct lnet_net *
 lnet_net_alloc(__u32 net_id, struct list_head *net_list)
 {
        struct lnet_net         *net;
+       int                     rc;
 
        if (!lnet_net_unique(net_id, net_list, NULL)) {
                CERROR("Duplicate net %s. Ignore\n",
@@ -373,6 +381,15 @@ lnet_net_alloc(__u32 net_id, struct list_head *net_list)
                return NULL;
        }
 
+       /* setup the sysfs kobjects for net*/
+       rc = lnet_net_sysfs_setup(net_id, net);
+       if (rc != 0) {
+               CERROR("Could not setup sysfs kobjects for net %s\n",
+                      libcfs_net2str(net_id));
+               LIBCFS_FREE(net, sizeof(*net));
+               return NULL;
+       }
+
        INIT_LIST_HEAD(&net->net_list);
        INIT_LIST_HEAD(&net->net_ni_list);
        INIT_LIST_HEAD(&net->net_ni_added);
@@ -396,7 +413,7 @@ lnet_net_alloc(__u32 net_id, struct list_head *net_list)
 static int
 lnet_ni_add_interface(struct lnet_ni *ni, char *iface)
 {
-       int niface = 0;
+       int niface = 0, rc = 0;
 
        if (ni == NULL)
                return -ENOMEM;
@@ -432,6 +449,13 @@ lnet_ni_add_interface(struct lnet_ni *ni, char *iface)
        strncpy(ni->ni_interfaces[niface], iface,
                strlen(iface) + 1);
 
+       /* setup the sysfs kobjects for NI*/
+       rc = lnet_ni_sysfs_setup(ni, iface);
+       if (rc != 0) {
+               CERROR("Could not setup sysfs kobjects for ni %s\n", iface);
+               return -ENOMEM;
+       }
+
        return 0;
 }
 
index 0f2bab9..c7a01ce 100644 (file)
@@ -62,3 +62,402 @@ const struct sysfs_ops lnet_sysfs_ops = {
        .store = lnet_attr_store,
 };
 EXPORT_SYMBOL_GPL(lnet_sysfs_ops);
+
+/*
+ * LNet NI stats attribute callback functions
+ */
+static ssize_t total_send_count_show(struct kobject *kobj,
+                                    struct attribute *attr, char *buf)
+{
+       struct lnet_ni *ni = container_of(kobj, struct lnet_ni, stats_kobj);
+       int count = lnet_sum_stats(&ni->ni_stats, LNET_STATS_TYPE_SEND);
+
+       return snprintf(buf, PAGE_SIZE, "%d\n", count);
+}
+LNET_RO_ATTR(total_send_count);
+
+static ssize_t total_recv_count_show(struct kobject *kobj,
+                                    struct attribute *attr, char *buf)
+{
+       struct lnet_ni *ni = container_of(kobj, struct lnet_ni, stats_kobj);
+       int count = lnet_sum_stats(&ni->ni_stats, LNET_STATS_TYPE_RECV);
+
+       return snprintf(buf, PAGE_SIZE, "%d\n", count);
+}
+LNET_RO_ATTR(total_recv_count);
+
+static ssize_t total_drop_count_show(struct kobject *kobj,
+                                    struct attribute *attr, char *buf)
+{
+       struct lnet_ni *ni = container_of(kobj, struct lnet_ni, stats_kobj);
+       int count = lnet_sum_stats(&ni->ni_stats, LNET_STATS_TYPE_DROP);
+
+       return snprintf(buf, PAGE_SIZE, "%d\n", count);
+}
+LNET_RO_ATTR(total_drop_count);
+
+static ssize_t get_send_count_show(struct kobject *kobj,
+                                  struct attribute *attr, char *buf)
+{
+       struct lnet_ni *ni = container_of(kobj, struct lnet_ni, stats_kobj);
+       int count = atomic_read(&ni->ni_stats.el_send_stats.co_get_count);
+
+       return snprintf(buf, PAGE_SIZE, "%d\n", count);
+}
+LNET_RO_ATTR(get_send_count);
+
+static ssize_t put_send_count_show(struct kobject *kobj,
+                                  struct attribute *attr, char *buf)
+{
+       struct lnet_ni *ni = container_of(kobj, struct lnet_ni, stats_kobj);
+       int count = atomic_read(&ni->ni_stats.el_send_stats.co_put_count);
+
+       return snprintf(buf, PAGE_SIZE, "%d\n", count);
+}
+LNET_RO_ATTR(put_send_count);
+
+static ssize_t reply_send_count_show(struct kobject *kobj,
+                                    struct attribute *attr, char *buf)
+{
+       struct lnet_ni *ni = container_of(kobj, struct lnet_ni, stats_kobj);
+       int count = atomic_read(&ni->ni_stats.el_send_stats.co_reply_count);
+
+       return snprintf(buf, PAGE_SIZE, "%d\n", count);
+}
+LNET_RO_ATTR(reply_send_count);
+
+static ssize_t ack_send_count_show(struct kobject *kobj,
+                                  struct attribute *attr, char *buf)
+{
+       struct lnet_ni *ni = container_of(kobj, struct lnet_ni, stats_kobj);
+       int count = atomic_read(&ni->ni_stats.el_send_stats.co_ack_count);
+
+       return snprintf(buf, PAGE_SIZE, "%d\n", count);
+}
+LNET_RO_ATTR(ack_send_count);
+
+static ssize_t hello_send_count_show(struct kobject *kobj,
+                                    struct attribute *attr, char *buf)
+{
+       struct lnet_ni *ni = container_of(kobj, struct lnet_ni, stats_kobj);
+       int count = atomic_read(&ni->ni_stats.el_send_stats.co_hello_count);
+
+       return snprintf(buf, PAGE_SIZE, "%d\n", count);
+}
+LNET_RO_ATTR(hello_send_count);
+
+static ssize_t get_recv_count_show(struct kobject *kobj,
+                                  struct attribute *attr, char *buf)
+{
+       struct lnet_ni *ni = container_of(kobj, struct lnet_ni, stats_kobj);
+       int count = atomic_read(&ni->ni_stats.el_recv_stats.co_get_count);
+
+       return snprintf(buf, PAGE_SIZE, "%d\n", count);
+}
+LNET_RO_ATTR(get_recv_count);
+
+static ssize_t put_recv_count_show(struct kobject *kobj,
+                                  struct attribute *attr, char *buf)
+{
+       struct lnet_ni *ni = container_of(kobj, struct lnet_ni, stats_kobj);
+       int count = atomic_read(&ni->ni_stats.el_recv_stats.co_put_count);
+
+       return snprintf(buf, PAGE_SIZE, "%d\n", count);
+}
+LNET_RO_ATTR(put_recv_count);
+
+static ssize_t reply_recv_count_show(struct kobject *kobj,
+                                    struct attribute *attr, char *buf)
+{
+       struct lnet_ni *ni = container_of(kobj, struct lnet_ni, stats_kobj);
+       int count = atomic_read(&ni->ni_stats.el_recv_stats.co_reply_count);
+
+       return snprintf(buf, PAGE_SIZE, "%d\n", count);
+}
+LNET_RO_ATTR(reply_recv_count);
+
+static ssize_t ack_recv_count_show(struct kobject *kobj,
+                                  struct attribute *attr, char *buf)
+{
+       struct lnet_ni *ni = container_of(kobj, struct lnet_ni, stats_kobj);
+       int count = atomic_read(&ni->ni_stats.el_recv_stats.co_ack_count);
+
+       return snprintf(buf, PAGE_SIZE, "%d\n", count);
+}
+LNET_RO_ATTR(ack_recv_count);
+
+static ssize_t hello_recv_count_show(struct kobject *kobj,
+                                    struct attribute *attr, char *buf)
+{
+       struct lnet_ni *ni = container_of(kobj, struct lnet_ni, stats_kobj);
+       int count = atomic_read(&ni->ni_stats.el_recv_stats.co_hello_count);
+
+       return snprintf(buf, PAGE_SIZE, "%d\n", count);
+}
+LNET_RO_ATTR(hello_recv_count);
+
+static ssize_t get_drop_count_show(struct kobject *kobj,
+                                  struct attribute *attr, char *buf)
+{
+       struct lnet_ni *ni = container_of(kobj, struct lnet_ni, stats_kobj);
+       int count = atomic_read(&ni->ni_stats.el_drop_stats.co_get_count);
+
+       return snprintf(buf, PAGE_SIZE, "%d\n", count);
+}
+LNET_RO_ATTR(get_drop_count);
+
+static ssize_t put_drop_count_show(struct kobject *kobj,
+                                  struct attribute *attr, char *buf)
+{
+       struct lnet_ni *ni = container_of(kobj, struct lnet_ni, stats_kobj);
+       int count = atomic_read(&ni->ni_stats.el_drop_stats.co_put_count);
+
+       return snprintf(buf, PAGE_SIZE, "%d\n", count);
+}
+LNET_RO_ATTR(put_drop_count);
+
+static ssize_t reply_drop_count_show(struct kobject *kobj,
+                                    struct attribute *attr, char *buf)
+{
+       struct lnet_ni *ni = container_of(kobj, struct lnet_ni, stats_kobj);
+       int count = atomic_read(&ni->ni_stats.el_drop_stats.co_reply_count);
+
+       return snprintf(buf, PAGE_SIZE, "%d\n", count);
+}
+LNET_RO_ATTR(reply_drop_count);
+
+static ssize_t ack_drop_count_show(struct kobject *kobj,
+                                  struct attribute *attr, char *buf)
+{
+       struct lnet_ni *ni = container_of(kobj, struct lnet_ni, stats_kobj);
+       int count = atomic_read(&ni->ni_stats.el_drop_stats.co_ack_count);
+
+       return snprintf(buf, PAGE_SIZE, "%d\n", count);
+}
+LNET_RO_ATTR(ack_drop_count);
+
+static ssize_t hello_drop_count_show(struct kobject *kobj,
+                                    struct attribute *attr, char *buf)
+{
+       struct lnet_ni *ni = container_of(kobj, struct lnet_ni, stats_kobj);
+       int count = atomic_read(&ni->ni_stats.el_drop_stats.co_hello_count);
+
+       return snprintf(buf, PAGE_SIZE, "%d\n", count);
+}
+LNET_RO_ATTR(hello_drop_count);
+
+static ssize_t local_interrupt_show(struct kobject *kobj,
+                                   struct attribute *attr, char *buf)
+{
+       struct lnet_ni *ni = container_of(kobj, struct lnet_ni, stats_kobj);
+       int count = atomic_read(&ni->ni_hstats.hlt_local_interrupt);
+
+       return snprintf(buf, PAGE_SIZE, "%d\n", count);
+}
+LNET_RO_ATTR(local_interrupt);
+
+static ssize_t local_dropped_show(struct kobject *kobj,
+                                 struct attribute *attr, char *buf)
+{
+       struct lnet_ni *ni = container_of(kobj, struct lnet_ni, stats_kobj);
+       int count = atomic_read(&ni->ni_hstats.hlt_local_dropped);
+
+       return snprintf(buf, PAGE_SIZE, "%d\n", count);
+}
+LNET_RO_ATTR(local_dropped);
+
+static ssize_t local_aborted_show(struct kobject *kobj,
+                                 struct attribute *attr, char *buf)
+{
+       struct lnet_ni *ni = container_of(kobj, struct lnet_ni, stats_kobj);
+       int count = atomic_read(&ni->ni_hstats.hlt_local_aborted);
+
+       return snprintf(buf, PAGE_SIZE, "%d\n", count);
+}
+LNET_RO_ATTR(local_aborted);
+
+static ssize_t local_no_route_show(struct kobject *kobj,
+                                  struct attribute *attr, char *buf)
+{
+       struct lnet_ni *ni = container_of(kobj, struct lnet_ni, stats_kobj);
+       int count = atomic_read(&ni->ni_hstats.hlt_local_no_route);
+
+       return snprintf(buf, PAGE_SIZE, "%d\n", count);
+}
+LNET_RO_ATTR(local_no_route);
+
+static ssize_t local_timeout_show(struct kobject *kobj,
+                                 struct attribute *attr, char *buf)
+{
+       struct lnet_ni *ni = container_of(kobj, struct lnet_ni, stats_kobj);
+       int count = atomic_read(&ni->ni_hstats.hlt_local_timeout);
+
+       return snprintf(buf, PAGE_SIZE, "%d\n", count);
+}
+LNET_RO_ATTR(local_timeout);
+
+static ssize_t local_error_show(struct kobject *kobj,
+                               struct attribute *attr, char *buf)
+{
+       struct lnet_ni *ni = container_of(kobj, struct lnet_ni, stats_kobj);
+       int count = atomic_read(&ni->ni_hstats.hlt_local_error);
+
+       return snprintf(buf, PAGE_SIZE, "%d\n", count);
+}
+LNET_RO_ATTR(local_error);
+
+static ssize_t ni_reset_show(struct kobject *kobj, struct attribute *attr,
+                            char *buf)
+{
+       struct lnet_ni *ni = container_of(kobj, struct lnet_ni, stats_kobj);
+
+       if (!lnet_sum_stats(&ni->ni_stats, LNET_STATS_TYPE_SEND) &&
+           !lnet_sum_stats(&ni->ni_stats, LNET_STATS_TYPE_RECV) &&
+           !lnet_sum_stats(&ni->ni_stats, LNET_STATS_TYPE_DROP))
+               return sprintf(buf, "%d\n", 0);
+       else
+               return sprintf(buf, "%d\n", 1);
+}
+
+static ssize_t ni_reset_store(struct kobject *kobj, struct attribute *attr,
+                             const char *buffer, size_t len)
+{
+       struct lnet_ni *ni = container_of(kobj, struct lnet_ni, stats_kobj);
+
+       memset(&ni->ni_stats.el_send_stats, 0,
+               sizeof(ni->ni_stats.el_send_stats));
+       memset(&ni->ni_stats.el_recv_stats, 0,
+              sizeof(ni->ni_stats.el_recv_stats));
+       memset(&ni->ni_stats.el_drop_stats, 0,
+              sizeof(ni->ni_stats.el_drop_stats));
+       memset(&ni->ni_hstats, 0, sizeof(ni->ni_hstats));
+
+       return len;
+}
+LNET_RW_ATTR(ni_reset);
+
+static struct attribute *lnet_ni_stats_attrs[] = {
+       &lnet_attr_total_send_count.attr,
+       &lnet_attr_total_recv_count.attr,
+       &lnet_attr_total_drop_count.attr,
+       &lnet_attr_get_send_count.attr,
+       &lnet_attr_put_send_count.attr,
+       &lnet_attr_reply_send_count.attr,
+       &lnet_attr_ack_send_count.attr,
+       &lnet_attr_hello_send_count.attr,
+       &lnet_attr_get_recv_count.attr,
+       &lnet_attr_put_recv_count.attr,
+       &lnet_attr_reply_recv_count.attr,
+       &lnet_attr_ack_recv_count.attr,
+       &lnet_attr_hello_recv_count.attr,
+       &lnet_attr_get_drop_count.attr,
+       &lnet_attr_put_drop_count.attr,
+       &lnet_attr_reply_drop_count.attr,
+       &lnet_attr_ack_drop_count.attr,
+       &lnet_attr_hello_drop_count.attr,
+       &lnet_attr_local_interrupt.attr,
+       &lnet_attr_local_dropped.attr,
+       &lnet_attr_local_aborted.attr,
+       &lnet_attr_local_no_route.attr,
+       &lnet_attr_local_timeout.attr,
+       &lnet_attr_local_error.attr,
+       &lnet_attr_ni_reset.attr,
+       NULL,
+};
+
+static void ni_sysfs_release(struct kobject *kobj)
+{
+       struct lnet_ni *ni = container_of(kobj, struct lnet_ni, stats_kobj);
+
+       complete(&ni->stats_kobj_unregister);
+}
+
+static struct kobj_type ni_stats_ktype = {
+       .sysfs_ops      = &lnet_sysfs_ops,
+       .release        = ni_sysfs_release,
+       .default_attrs  = lnet_ni_stats_attrs,
+};
+
+int lnet_net_sysfs_setup(__u32 net_id, struct lnet_net *net)
+{
+       struct lnet_net *net_l = NULL;
+       const char *nw = libcfs_net2str(net_id);
+       int rc = 0;
+
+       if (LNET_NETTYP(net_id) == LOLND)
+               return rc;
+
+       if (lnet_net_unique(net_id, &the_lnet.ln_nets, &net_l)) {
+               net->nwid_kset = kset_create_and_add(nw, NULL,
+                                                    the_lnet.ln_net_kobj);
+               if (!net->nwid_kset) {
+                       CERROR("Cannot add new kset for %s\n", nw);
+                       return -ENOMEM;
+               }
+       } else
+               net->nwid_kset = kset_get(net_l->nwid_kset);
+
+       return rc;
+}
+
+int lnet_ni_sysfs_setup(struct lnet_ni *ni, char *iface)
+{
+       struct lnet_net *net = ni->ni_net;
+       struct lnet_net *net_l;
+       int rc = 0;
+
+       if (LNET_NETTYP(net->net_id) == LOLND)
+               return rc;
+
+       if (lnet_net_unique(net->net_id, &the_lnet.ln_nets, &net_l))
+               net_l = net;
+
+       if (!lnet_ni_unique_net(&net_l->net_ni_list, ni->ni_interfaces[0]))
+               return rc;
+
+       ni->ni_kobj = kobject_create_and_add(iface, &net_l->nwid_kset->kobj);
+       if (!ni->ni_kobj) {
+               CERROR("Cannot create kobject for %s\n", iface);
+               return -ENOMEM;
+       }
+
+       ni->ni_kobj->kset = kset_get(net_l->nwid_kset);
+
+       init_completion(&ni->stats_kobj_unregister);
+
+       rc = kobject_init_and_add(&ni->stats_kobj, &ni_stats_ktype,
+                                 ni->ni_kobj, "%s", "stats");
+       if (rc) {
+               CERROR("Cannot create kobject for stats under %s\n", iface);
+               kobject_put(ni->ni_kobj);
+       }
+
+       return rc;
+}
+
+void lnet_ni_sysfs_cleanup(struct lnet_ni *ni)
+{
+       struct lnet_net *net = ni->ni_net;
+
+       if (LNET_NETTYP(net->net_id) == LOLND)
+               return;
+
+       kobject_put(&ni->stats_kobj);
+       wait_for_completion(&ni->stats_kobj_unregister);
+       kobject_put(ni->ni_kobj);
+}
+
+void lnet_net_sysfs_cleanup(struct lnet_net *net)
+{
+       struct lnet_net *net_l;
+
+       if (LNET_NETTYP(net->net_id) == LOLND)
+               return;
+
+       if (!lnet_net_unique(net->net_id, &the_lnet.ln_nets, &net_l)) {
+               kset_put(net_l->nwid_kset);
+               return;
+       }
+
+       kset_unregister(net->nwid_kset);
+}
index bfa6e12..2598858 100644 (file)
@@ -56,6 +56,7 @@ lnet_configure(void *arg)
                if (rc != 1)
                        goto out;
 
+
                rc = LNetNIInit(LNET_PID_LUSTRE);
                if (rc >= 0) {
                        the_lnet.ln_niinit_self = 1;