Adding new generic LND peer and conn structure.
These structs will be used by the sysfs APIs to
create LND sysfs structure.
Create lnd kobject and lnd peers kset in
lnet_register_lnd() and change its return type
to int to take care of error handling.
With this patch, ko2iblnd_tunables_init() and
ksocklnd_tunables_init() are changed to have
return type as void since both these functions
always return 0.
Change-Id: Ibeb9a7d2fcc9c7b12a733cf783fd57537de952c4
Test-Parameters: forbuildonly
Signed-off-by: Sonia Sharma <sonia.sharma@intel.com>
Reviewed-on: https://review.whamcloud.com/32664
Reviewed-by: Amir Shehata <ashehata@whamcloud.com>
Tested-by: Jenkins
Reviewed-by: James Simmons <uja.ornl@yahoo.com>
Reviewed-by: Sonia Sharma <sharmaso@whamcloud.com>
int lnet_cpt_of_md(struct lnet_libmd *md, unsigned int offset);
unsigned int lnet_get_lnd_timeout(void);
-void lnet_register_lnd(struct lnet_lnd *lnd);
+int lnet_register_lnd(struct lnet_lnd *lnd, char *lnd_name);
void lnet_unregister_lnd(struct lnet_lnd *lnd);
int lnet_connect(struct socket **sockp, lnet_nid_t peer_nid,
struct lnet_lnd {
/* fields managed by portals */
- struct list_head lnd_list; /* stash in the LND table */
- int lnd_refcount; /* # active instances */
+ struct list_head lnd_list; /* stash in the LND table */
+ int lnd_refcount; /* # active instances */
/* fields initialized by the LND */
- __u32 lnd_type;
+ __u32 lnd_type;
+
+ /* Sysfs kobject */
+ struct kobject *lnd_kobj;
+ struct kset *lnd_peers_kset;
int (*lnd_startup)(struct lnet_ni *ni);
void (*lnd_shutdown)(struct lnet_ni *ni);
extern struct kobject *lnet_kobj; /* Sysfs lnet kobject */
+struct sysfs_lnd_conn {
+ struct kobject stats_kobj;
+ struct kobj_type *stats_ktype;
+ struct completion stats_kobj_unregister;
+};
+
+struct sysfs_lnd_peer {
+ /* sysfs peer nid object */
+ struct kobject *peer_ni_kobj;
+ /* sysfs local nid object */
+ struct kobject *local_ni_kobj;
+ struct kobject stats_kobj;
+ struct kobj_type *stats_ktype;
+ struct completion stats_kobj_unregister;
+ /* sysfs conn kobject */
+ struct kobject *peer_conns_kobj;
+};
+
struct lnet_attr {
struct attribute attr;
ssize_t (*show)(struct kobject *kobj, struct attribute *attr,
kgnilnd_insert_sysctl();
kgnilnd_proc_init();
- lnet_register_lnd(&the_kgnilnd);
+ rc = lnet_register_lnd(&the_kgnilnd, "kgnilnd");
- return 0;
+ return rc;
}
MODULE_AUTHOR("Cray, Inc. <nic@cray.com>");
ibm_u.putack.ibpam_rd.rd_frags[IBLND_MAX_RDMA_FRAGS])
<= IBLND_MSG_SIZE);
- rc = kiblnd_tunables_init();
- if (rc != 0)
- return rc;
+ kiblnd_tunables_init();
- lnet_register_lnd(&the_o2iblnd);
+ rc = lnet_register_lnd(&the_o2iblnd, "ko2iblnd");
- return 0;
+ return rc;
}
MODULE_AUTHOR("OpenSFS, Inc. <http://www.lustre.org/>");
/* in-progress connection state */
struct kib_connvars *ibc_connvars;
+ /* sysfs lnd conn structure */
+ struct sysfs_lnd_conn ibc_sysfs;
};
#define IBLND_CONN_INIT 0 /* being initialised */
__u16 ibp_max_frags;
/* max_peer_credits */
__u16 ibp_queue_depth;
+ /* sysfs lnd peer structure */
+ struct sysfs_lnd_peer ibp_sysfs;
};
#ifndef HAVE_IB_INC_RKEY
void kiblnd_fmr_pool_unmap(struct kib_fmr *fmr, int status);
int kiblnd_tunables_setup(struct lnet_ni *ni);
-int kiblnd_tunables_init(void);
+void kiblnd_tunables_init(void);
int kiblnd_connd (void *arg);
int kiblnd_scheduler(void *arg);
return 0;
}
-int
+void
kiblnd_tunables_init(void)
{
default_tunables.lnd_version = CURRENT_LND_VERSION;
default_tunables.lnd_fmr_cache = fmr_cache;
default_tunables.lnd_ntx = ntx;
default_tunables.lnd_conns_per_peer = conns_per_peer;
- return 0;
}
the_ksocklnd.lnd_query = ksocknal_query;
the_ksocklnd.lnd_accept = ksocknal_accept;
- rc = ksocknal_tunables_init();
- if (rc != 0)
- return rc;
+ ksocknal_tunables_init();
- lnet_register_lnd(&the_ksocklnd);
+ rc = lnet_register_lnd(&the_ksocklnd, "ksocklnd");
- return 0;
+ return rc;
}
MODULE_AUTHOR("OpenSFS, Inc. <http://www.lustre.org/>");
int ksnc_tx_scheduled;
/* time stamp of the last posted TX */
time64_t ksnc_tx_last_post;
+ /* sysfs lnd conn structure */
+ struct sysfs_lnd_conn ksnc_sysfs;
};
struct ksock_route {
struct lnet_ni *ksnp_ni; /* which network */
int ksnp_n_passive_ips; /* # of... */
__u32 ksnp_passive_ips[LNET_INTERFACES_NUM]; /* preferred local interfaces */
+ struct sysfs_lnd_peer ksnp_sysfs; /* sysfs lnd peer structure */
};
struct ksock_connreq {
extern int ksocknal_lib_get_conn_tunables(struct ksock_conn *conn, int *txmem,
int *rxmem, int *nagle);
-extern int ksocknal_tunables_init(void);
+extern void ksocknal_tunables_init(void);
extern void ksocknal_lib_csum_tx(struct ksock_tx *tx);
struct ksock_tunables ksocknal_tunables;
-int ksocknal_tunables_init(void)
+void ksocknal_tunables_init(void)
{
/* initialize ksocknal_tunables structure */
if (*ksocknal_tunables.ksnd_zc_min_payload < (2 << 10))
*ksocknal_tunables.ksnd_zc_min_payload = (2 << 10);
-
- return 0;
};
}
EXPORT_SYMBOL(lnet_get_lnd_timeout);
-void
-lnet_register_lnd(struct lnet_lnd *lnd)
+int
+lnet_register_lnd(struct lnet_lnd *lnd, char *lnd_name)
{
mutex_lock(&the_lnet.ln_lnd_mutex);
CDEBUG(D_NET, "%s LND registered\n", libcfs_lnd2str(lnd->lnd_type));
mutex_unlock(&the_lnet.ln_lnd_mutex);
+
+ if (lnd->lnd_type == LOLND)
+ return 0;
+
+ /* Create sysfs kobject and kset for lnd and lnd_peers */
+ lnd->lnd_kobj = kobject_create_and_add(lnd_name, lnet_kobj);
+ if (!lnd->lnd_kobj) {
+ CERROR("sysfs kobject for %s could not be created\n", lnd_name);
+ return -ENOMEM;
+ }
+
+ lnd->lnd_peers_kset = kset_create_and_add("peers", NULL, lnd->lnd_kobj);
+ if (!lnd->lnd_peers_kset) {
+ CERROR("sysfs kobject for %s peers could not be created\n",
+ lnd_name);
+ kobject_put(lnd->lnd_kobj);
+ return -ENOMEM;
+ }
+
+ return 0;
}
EXPORT_SYMBOL(lnet_register_lnd);
void
lnet_unregister_lnd(struct lnet_lnd *lnd)
{
+ kset_put(lnd->lnd_peers_kset);
+ kobject_put(lnd->lnd_kobj);
+
mutex_lock(&the_lnet.ln_lnd_mutex);
LASSERT(lnet_find_lnd_by_type(lnd->lnd_type) == lnd);
/* All LNDs apart from the LOLND are in separate modules. They
* register themselves when their module loads, and unregister
* themselves when their module is unloaded. */
- lnet_register_lnd(&the_lolnd);
- return 0;
+ rc = lnet_register_lnd(&the_lolnd, "lolnd");
+ return rc;
}
/**