#define DEFAULT_PEER_TIMEOUT 180
#define LNET_LND_DEFAULT_TIMEOUT 5
-static inline int lnet_is_route_alive(struct lnet_route *route)
-{
- if (!route->lr_gateway->lpni_alive)
- return 0; /* gateway is down */
- if ((route->lr_gateway->lpni_ping_feats &
- LNET_PING_FEAT_NI_STATUS) == 0)
- return 1; /* no NI status, assume it's alive */
- /* has NI status, check # down NIs */
- return route->lr_downis == 0;
-}
+#ifdef HAVE_KERN_SOCK_GETNAME_2ARGS
+#define lnet_kernel_getpeername(sock, addr, addrlen) \
+ kernel_getpeername(sock, addr)
+#define lnet_kernel_getsockname(sock, addr, addrlen) \
+ kernel_getsockname(sock, addr)
+#else
+#define lnet_kernel_getpeername(sock, addr, addrlen) \
+ kernel_getpeername(sock, addr, addrlen)
+#define lnet_kernel_getsockname(sock, addr, addrlen) \
+ kernel_getsockname(sock, addr, addrlen)
+#endif
+
+bool lnet_is_route_alive(struct lnet_route *route);
+bool lnet_is_gateway_alive(struct lnet_peer *gw);
static inline int lnet_is_wire_handle_none(struct lnet_handle_wire *wh)
{
}
static inline int
-lnet_isrouter(struct lnet_peer_ni *lp)
+lnet_isrouter(struct lnet_peer_ni *lpni)
{
- return lp->lpni_rtr_refcount != 0;
+ return lpni->lpni_peer_net->lpn_peer->lp_rtr_refcount != 0;
}
static inline void
extern unsigned int lnet_health_sensitivity;
extern unsigned int lnet_recovery_interval;
extern unsigned int lnet_peer_discovery_disabled;
+extern unsigned int lnet_drop_asym_route;
+extern unsigned int router_sensitivity_percentage;
extern int portal_rotor;
+void lnet_mt_event_handler(struct lnet_event *event);
+
int lnet_notify(struct lnet_ni *ni, lnet_nid_t peer, int alive,
time64_t when);
void lnet_notify_locked(struct lnet_peer_ni *lp, int notifylnd, int alive,
time64_t when);
int lnet_add_route(__u32 net, __u32 hops, lnet_nid_t gateway_nid,
unsigned int priority);
-int lnet_check_routes(void);
int lnet_del_route(__u32 net, lnet_nid_t gw_nid);
void lnet_destroy_routes(void);
int lnet_get_route(int idx, __u32 *net, __u32 *hops,
bool lnet_router_checker_active(void);
void lnet_check_routers(void);
-int lnet_router_pre_mt_start(void);
void lnet_router_post_mt_start(void);
-void lnet_prune_rc_data(int wait_unlink);
-void lnet_router_cleanup(void);
-void lnet_router_ni_update_locked(struct lnet_peer_ni *gw, __u32 net);
void lnet_swap_pinginfo(struct lnet_ping_buffer *pbuf);
int lnet_ping_info_validate(struct lnet_ping_info *pinfo);
return NULL;
}
-static inline void
-lnet_peer_set_alive(struct lnet_peer_ni *lp)
-{
- lp->lpni_last_alive = ktime_get_seconds();
- lp->lpni_last_query = lp->lpni_last_alive;
- if (!lp->lpni_alive)
- lnet_notify_locked(lp, 0, 1, lp->lpni_last_alive);
-}
-
static inline bool
lnet_peer_is_multi_rail(struct lnet_peer *lp)
{
return false;
}
+/*
+ * A peer is alive if it satisfies the following two conditions:
+ * 1. peer health >= LNET_MAX_HEALTH_VALUE * router_sensitivity_percentage
+ * 2. the cached NI status received when we discover the peer is UP
+ */
+static inline bool
+lnet_is_peer_ni_alive(struct lnet_peer_ni *lpni)
+{
+ bool halive = false;
+
+ halive = (atomic_read(&lpni->lpni_healthv) >=
+ (LNET_MAX_HEALTH_VALUE * router_sensitivity_percentage / 100));
+
+ return halive && lpni->lpni_ns_status == LNET_NI_STATUS_UP;
+}
+
static inline void
lnet_inc_healthv(atomic_t *healthv)
{