From: Sonia Sharma Date: Thu, 7 Jun 2018 04:00:31 +0000 (-0700) Subject: LU-9667 lnet: Add new structs for sysfs LND APIs X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=b955816ff37c4b27644b0ead265cb8ceb0a53d45;p=fs%2Flustre-release.git LU-9667 lnet: Add new structs for sysfs LND APIs 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 Reviewed-on: https://review.whamcloud.com/32664 Reviewed-by: Amir Shehata Tested-by: Jenkins Reviewed-by: James Simmons Reviewed-by: Sonia Sharma --- diff --git a/lnet/include/lnet/lib-lnet.h b/lnet/include/lnet/lib-lnet.h index 307cbd7..95c4df1 100644 --- a/lnet/include/lnet/lib-lnet.h +++ b/lnet/include/lnet/lib-lnet.h @@ -828,7 +828,7 @@ struct page *lnet_kvaddr_to_page(unsigned long vaddr); 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, diff --git a/lnet/include/lnet/lib-types.h b/lnet/include/lnet/lib-types.h index 1bb1c9d..542f7610 100644 --- a/lnet/include/lnet/lib-types.h +++ b/lnet/include/lnet/lib-types.h @@ -249,11 +249,15 @@ struct socket; 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); diff --git a/lnet/include/lnet/lnet-sysfs.h b/lnet/include/lnet/lnet-sysfs.h index 6dac0f8..cc7f8de 100644 --- a/lnet/include/lnet/lnet-sysfs.h +++ b/lnet/include/lnet/lnet-sysfs.h @@ -52,6 +52,24 @@ 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, diff --git a/lnet/klnds/gnilnd/gnilnd.c b/lnet/klnds/gnilnd/gnilnd.c index 1fd80be..1f8fdc2 100644 --- a/lnet/klnds/gnilnd/gnilnd.c +++ b/lnet/klnds/gnilnd/gnilnd.c @@ -2898,9 +2898,9 @@ static int __init kgnilnd_init(void) 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. "); diff --git a/lnet/klnds/o2iblnd/o2iblnd.c b/lnet/klnds/o2iblnd/o2iblnd.c index 09ed638..cb5ebb5 100644 --- a/lnet/klnds/o2iblnd/o2iblnd.c +++ b/lnet/klnds/o2iblnd/o2iblnd.c @@ -3399,13 +3399,11 @@ static int __init ko2iblnd_init(void) 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. "); diff --git a/lnet/klnds/o2iblnd/o2iblnd.h b/lnet/klnds/o2iblnd/o2iblnd.h index 111133c..dd04ab0 100644 --- a/lnet/klnds/o2iblnd/o2iblnd.h +++ b/lnet/klnds/o2iblnd/o2iblnd.h @@ -707,6 +707,8 @@ struct kib_conn { /* 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 */ @@ -753,6 +755,8 @@ struct kib_peer_ni { __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 @@ -1153,7 +1157,7 @@ int kiblnd_fmr_pool_map(struct kib_fmr_poolset *fps, struct kib_tx *tx, 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); diff --git a/lnet/klnds/o2iblnd/o2iblnd_modparams.c b/lnet/klnds/o2iblnd/o2iblnd_modparams.c index 2a329e5..6e77261 100644 --- a/lnet/klnds/o2iblnd/o2iblnd_modparams.c +++ b/lnet/klnds/o2iblnd/o2iblnd_modparams.c @@ -317,7 +317,7 @@ kiblnd_tunables_setup(struct lnet_ni *ni) return 0; } -int +void kiblnd_tunables_init(void) { default_tunables.lnd_version = CURRENT_LND_VERSION; @@ -329,5 +329,4 @@ kiblnd_tunables_init(void) default_tunables.lnd_fmr_cache = fmr_cache; default_tunables.lnd_ntx = ntx; default_tunables.lnd_conns_per_peer = conns_per_peer; - return 0; } diff --git a/lnet/klnds/socklnd/socklnd.c b/lnet/klnds/socklnd/socklnd.c index 3409264..9cabeec 100644 --- a/lnet/klnds/socklnd/socklnd.c +++ b/lnet/klnds/socklnd/socklnd.c @@ -2886,13 +2886,11 @@ static int __init ksocklnd_init(void) 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. "); diff --git a/lnet/klnds/socklnd/socklnd.h b/lnet/klnds/socklnd/socklnd.h index 9f198dd..ce22149 100644 --- a/lnet/klnds/socklnd/socklnd.h +++ b/lnet/klnds/socklnd/socklnd.h @@ -369,6 +369,8 @@ struct ksock_conn { 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 { @@ -413,6 +415,7 @@ struct ksock_peer_ni { 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 { @@ -667,7 +670,7 @@ extern int ksocknal_lib_recv_kiov(struct ksock_conn *conn, struct page **pages, 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); diff --git a/lnet/klnds/socklnd/socklnd_modparams.c b/lnet/klnds/socklnd/socklnd_modparams.c index df9d96e..e2982ef 100644 --- a/lnet/klnds/socklnd/socklnd_modparams.c +++ b/lnet/klnds/socklnd/socklnd_modparams.c @@ -157,7 +157,7 @@ MODULE_PARM_DESC(protocol, "protocol version"); struct ksock_tunables ksocknal_tunables; -int ksocknal_tunables_init(void) +void ksocknal_tunables_init(void) { /* initialize ksocknal_tunables structure */ @@ -210,6 +210,4 @@ int ksocknal_tunables_init(void) if (*ksocknal_tunables.ksnd_zc_min_payload < (2 << 10)) *ksocknal_tunables.ksnd_zc_min_payload = (2 << 10); - - return 0; }; diff --git a/lnet/lnet/api-ni.c b/lnet/lnet/api-ni.c index d66c04b..a4c7877 100644 --- a/lnet/lnet/api-ni.c +++ b/lnet/lnet/api-ni.c @@ -816,8 +816,8 @@ lnet_get_lnd_timeout(void) } 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); @@ -830,12 +830,35 @@ lnet_register_lnd(struct lnet_lnd *lnd) 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); @@ -2475,8 +2498,8 @@ int lnet_lib_init(void) /* 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; } /**