From e520ee276800362caa652088b56325fac16aef7f Mon Sep 17 00:00:00 2001 From: "Mr. NeilBrown" Date: Thu, 11 Mar 2021 17:43:41 -0500 Subject: [PATCH] LU-12678 lnet: convert lpni_refcount to a kref This refcount is used exactly like a kref. So change it to one. kref uses refcount_t which will warn on increment-from-zero and similar problems (which enabled with CONFIG option), so we don't need the LASSERT calls. Change-Id: I857dff2c9838cb7d8f4b5f023f75f2d66119344f Signed-off-by: Mr. NeilBrown Reviewed-on: https://review.whamcloud.com/41941 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Chris Horn Reviewed-by: Oleg Drokin --- lnet/include/lnet/lib-lnet.h | 9 +++------ lnet/include/lnet/lib-types.h | 3 ++- lnet/lnet/peer.c | 14 ++++++++------ lnet/lnet/router_proc.c | 2 +- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/lnet/include/lnet/lib-lnet.h b/lnet/include/lnet/lib-lnet.h index 176c9a2..c531055 100644 --- a/lnet/include/lnet/lib-lnet.h +++ b/lnet/include/lnet/lib-lnet.h @@ -375,18 +375,15 @@ lnet_peer_decref_locked(struct lnet_peer *lp) static inline void lnet_peer_ni_addref_locked(struct lnet_peer_ni *lp) { - LASSERT(atomic_read(&lp->lpni_refcount) > 0); - atomic_inc(&lp->lpni_refcount); + kref_get(&lp->lpni_kref); } -extern void lnet_destroy_peer_ni_locked(struct lnet_peer_ni *lp); +extern void lnet_destroy_peer_ni_locked(struct kref *ref); static inline void lnet_peer_ni_decref_locked(struct lnet_peer_ni *lp) { - LASSERT(atomic_read(&lp->lpni_refcount) > 0); - if (atomic_dec_and_test(&lp->lpni_refcount)) - lnet_destroy_peer_ni_locked(lp); + kref_put(&lp->lpni_kref, lnet_destroy_peer_ni_locked); } static inline int diff --git a/lnet/include/lnet/lib-types.h b/lnet/include/lnet/lib-types.h index 4ffb27c..9f8a817 100644 --- a/lnet/include/lnet/lib-types.h +++ b/lnet/include/lnet/lib-types.h @@ -46,6 +46,7 @@ #include #include #include +#include #include #include @@ -580,7 +581,7 @@ struct lnet_peer_ni { /* peer's NID */ lnet_nid_t lpni_nid; /* # refs */ - atomic_t lpni_refcount; + struct kref lpni_kref; /* health value for the peer */ atomic_t lpni_healthv; /* recovery ping mdh */ diff --git a/lnet/lnet/peer.c b/lnet/lnet/peer.c index 04765cf..678b1f4 100644 --- a/lnet/lnet/peer.c +++ b/lnet/lnet/peer.c @@ -169,7 +169,7 @@ lnet_peer_ni_alloc(lnet_nid_t nid) INIT_LIST_HEAD(&lpni->lpni_on_remote_peer_ni_list); INIT_LIST_HEAD(&lpni->lpni_rtr_pref_nids); LNetInvalidateMDHandle(&lpni->lpni_recovery_ping_mdh); - atomic_set(&lpni->lpni_refcount, 1); + kref_init(&lpni->lpni_kref); lpni->lpni_sel_priority = LNET_MAX_SELECTION_PRIORITY; spin_lock_init(&lpni->lpni_lock); @@ -1873,14 +1873,16 @@ lnet_del_peer_ni(lnet_nid_t prim_nid, lnet_nid_t nid) } void -lnet_destroy_peer_ni_locked(struct lnet_peer_ni *lpni) +lnet_destroy_peer_ni_locked(struct kref *ref) { + struct lnet_peer_ni *lpni = container_of(ref, struct lnet_peer_ni, + lpni_kref); struct lnet_peer_table *ptable; struct lnet_peer_net *lpn; CDEBUG(D_NET, "%p nid %s\n", lpni, libcfs_nid2str(lpni->lpni_nid)); - LASSERT(atomic_read(&lpni->lpni_refcount) == 0); + LASSERT(kref_read(&lpni->lpni_kref) == 0); LASSERT(list_empty(&lpni->lpni_txq)); LASSERT(lpni->lpni_txqnob == 0); LASSERT(list_empty(&lpni->lpni_peer_nis)); @@ -3803,7 +3805,7 @@ lnet_debug_peer(lnet_nid_t nid) aliveness = (lnet_is_peer_ni_alive(lp)) ? "up" : "down"; CDEBUG(D_WARNING, "%-24s %4d %5s %5d %5d %5d %5d %5d %ld\n", - libcfs_nid2str(lp->lpni_nid), atomic_read(&lp->lpni_refcount), + libcfs_nid2str(lp->lpni_nid), kref_read(&lp->lpni_kref), aliveness, lp->lpni_net->net_tunables.lct_peer_tx_credits, lp->lpni_rtrcredits, lp->lpni_minrtrcredits, lp->lpni_txcredits, lp->lpni_mintxcredits, lp->lpni_txqnob); @@ -3859,7 +3861,7 @@ int lnet_get_peer_ni_info(__u32 peer_index, __u64 *nid, lnet_is_peer_ni_alive(lp) ? "up" : "down"); *nid = lp->lpni_nid; - *refcount = atomic_read(&lp->lpni_refcount); + *refcount = kref_read(&lp->lpni_kref); *ni_peer_tx_credits = lp->lpni_net->net_tunables.lct_peer_tx_credits; *peer_tx_credits = lp->lpni_txcredits; @@ -3945,7 +3947,7 @@ int lnet_get_peer_info(struct lnet_ioctl_peer_cfg *cfg, void __user *bulk) snprintf(lpni_info->cr_aliveness, LNET_MAX_STR_LEN, lnet_is_peer_ni_alive(lpni) ? "up" : "down"); - lpni_info->cr_refcount = atomic_read(&lpni->lpni_refcount); + lpni_info->cr_refcount = kref_read(&lpni->lpni_kref); lpni_info->cr_ni_peer_tx_credits = (lpni->lpni_net != NULL) ? lpni->lpni_net->net_tunables.lct_peer_tx_credits : 0; lpni_info->cr_peer_tx_credits = lpni->lpni_txcredits; diff --git a/lnet/lnet/router_proc.c b/lnet/lnet/router_proc.c index c99454c..8f839d4 100644 --- a/lnet/lnet/router_proc.c +++ b/lnet/lnet/router_proc.c @@ -484,7 +484,7 @@ proc_lnet_peers(struct ctl_table *table, int write, void __user *buffer, if (peer != NULL) { lnet_nid_t nid = peer->lpni_nid; - int nrefs = atomic_read(&peer->lpni_refcount); + int nrefs = kref_read(&peer->lpni_kref); time64_t lastalive = -1; char *aliveness = "NA"; int maxcr = (peer->lpni_net) ? -- 1.8.3.1