Whamcloud - gitweb
LU-13569 lnet: Introduce lnet_recovery_limit parameter
[fs/lustre-release.git] / lnet / include / lnet / lib-lnet.h
index dbe8ba5..d245c11 100644 (file)
@@ -215,6 +215,62 @@ extern struct kmem_cache *lnet_small_mds_cachep; /* <= LNET_SMALL_MD_SIZE bytes
 extern struct kmem_cache *lnet_rspt_cachep;
 extern struct kmem_cache *lnet_msg_cachep;
 
+static inline bool
+lnet_ni_set_status_locked(struct lnet_ni *ni, __u32 status)
+__must_hold(&ni->ni_lock)
+{
+       bool update = false;
+
+       if (ni->ni_status && ni->ni_status->ns_status != status) {
+               CDEBUG(D_NET, "ni %s status changed from %#x to %#x\n",
+                      libcfs_nid2str(ni->ni_nid),
+                      ni->ni_status->ns_status, status);
+               ni->ni_status->ns_status = status;
+               update = true;
+       }
+
+       return update;
+}
+
+static inline bool
+lnet_ni_set_status(struct lnet_ni *ni, __u32 status)
+{
+       bool update;
+
+       lnet_ni_lock(ni);
+       update = lnet_ni_set_status_locked(ni, status);
+       lnet_ni_unlock(ni);
+
+       return update;
+}
+
+static inline void lnet_md_wait_handling(struct lnet_libmd *md, int cpt)
+{
+       wait_queue_head_t *wq = __var_waitqueue(md);
+#ifdef HAVE_WAIT_QUEUE_ENTRY
+       struct wait_bit_queue_entry entry;
+       wait_queue_entry_t *wqe = &entry.wq_entry;
+#else
+       struct wait_bit_queue entry;
+       wait_queue_entry_t *wqe = &entry.wait;
+#endif
+       init_wait_var_entry(&entry, md, 0);
+       prepare_to_wait_event(wq, wqe, TASK_IDLE);
+       if (md->md_flags & LNET_MD_FLAG_HANDLING) {
+               /* Race with unlocked call to ->md_handler.
+                * It is safe to drop the res_lock here as the
+                * caller has only just claimed it.
+                */
+               lnet_res_unlock(cpt);
+               schedule();
+               /* Cannot check md now, it might be freed.  Caller
+                * must reclaim reference and check.
+                */
+               lnet_res_lock(cpt);
+       }
+       finish_wait(wq, wqe);
+}
+
 static inline void
 lnet_md_free(struct lnet_libmd *md)
 {
@@ -464,6 +520,7 @@ extern unsigned int lnet_lnd_timeout;
 extern unsigned int lnet_numa_range;
 extern unsigned int lnet_health_sensitivity;
 extern unsigned int lnet_recovery_interval;
+extern unsigned int lnet_recovery_limit;
 extern unsigned int lnet_peer_discovery_disabled;
 extern unsigned int lnet_drop_asym_route;
 extern unsigned int router_sensitivity_percentage;
@@ -613,6 +670,7 @@ void lnet_set_reply_msg_len(struct lnet_ni *ni, struct lnet_msg *msg,
 void lnet_detach_rsp_tracker(struct lnet_libmd *md, int cpt);
 void lnet_clean_zombie_rstqs(void);
 
+bool lnet_md_discarded(struct lnet_libmd *md);
 void lnet_finalize(struct lnet_msg *msg, int rc);
 bool lnet_send_error_simulation(struct lnet_msg *msg,
                                enum lnet_msg_hstatus *hstatus);
@@ -652,7 +710,7 @@ bool lnet_delay_rule_match_locked(struct lnet_hdr *hdr, struct lnet_msg *msg);
 /** @} lnet_fault_simulation */
 
 void lnet_counters_get_common(struct lnet_counters_common *common);
-void lnet_counters_get(struct lnet_counters *counters);
+int lnet_counters_get(struct lnet_counters *counters);
 void lnet_counters_reset(void);
 
 unsigned int lnet_iov_nob(unsigned int niov, struct kvec *iov);