@@ -566,6 +566,8 @@ struct lnet_peer_ni {
u32 lpni_gw_seq;
/* returned RC ping features. Protected with lpni_lock */
unsigned int lpni_ping_feats;
+ /* time last message was received from the peer */
+ time64_t lpni_last_alive;
/* preferred local nids: if only one, use lpni_pref.nid */
union lpni_pref {
lnet_nid_t nid;
@@ -608,6 +608,23 @@ void lnet_usr_translate_stats(struct lnet_ioctl_element_msg_stats *msg_stats,
return rc;
}
+static bool
+lnet_is_peer_deadline_passed(struct lnet_peer_ni *lpni, time64_t now)
+{
+ time64_t deadline;
+
+ deadline = lpni->lpni_last_alive +
+ lpni->lpni_net->net_tunables.lct_peer_timeout;
+
+ /* assume peer_ni is alive as long as we're within the configured
+ * peer timeout
+ */
+ if (deadline > now)
+ return false;
+
+ return true;
+}
+
/*
* NB: returns 1 when alive, 0 when dead, negative when error;
* may drop the lnet_net_lock
@@ -616,6 +633,8 @@ void lnet_usr_translate_stats(struct lnet_ioctl_element_msg_stats *msg_stats,
lnet_peer_alive_locked(struct lnet_ni *ni, struct lnet_peer_ni *lpni,
struct lnet_msg *msg)
{
+ time64_t now = ktime_get_seconds();
+
if (!lnet_peer_aliveness_enabled(lpni))
return -ENODEV;
@@ -635,6 +654,9 @@ void lnet_usr_translate_stats(struct lnet_ioctl_element_msg_stats *msg_stats,
msg->msg_type == LNET_MSG_REPLY)
return 1;
+ if (!lnet_is_peer_deadline_passed(lpni, now))
+ return true;
+
return lnet_is_peer_ni_alive(lpni);
}
@@ -4142,6 +4164,10 @@ void lnet_monitor_thr_stop(void)
return 0;
goto drop;
}
+
+ if (the_lnet.ln_routing)
+ lpni->lpni_last_alive = ktime_get_seconds();
+
msg->msg_rxpeer = lpni;
msg->msg_rxni = ni;
lnet_ni_addref_locked(ni, cpt);