/** exclusive lock */
#define LNET_LOCK_EX CFS_PERCPT_LOCK_EX
-/* default timeout */
+/* default timeout and credits */
#define DEFAULT_PEER_TIMEOUT 180
-#define LNET_LND_DEFAULT_TIMEOUT 5
+#define DEFAULT_PEER_CREDITS 8
+#define DEFAULT_CREDITS 256
#ifdef HAVE_KERN_SOCK_GETNAME_2ARGS
#define lnet_kernel_getpeername(sock, addr, addrlen) \
/*
* kernel 5.3: commit ef11db3310e272d3d8dbe8739e0770820dd20e52
+ * kernel 4.18.0-193.el8:
* added in_dev_for_each_ifa_rtnl and in_dev_for_each_ifa_rcu
* and removed for_ifa and endfor_ifa.
* Use the _rntl variant as the current locking is rtnl.
*/
-#ifdef in_dev_for_each_ifa_rtnl
+#ifdef HAVE_IN_DEV_FOR_EACH_IFA_RTNL
#define DECLARE_CONST_IN_IFADDR(ifa) const struct in_ifaddr *ifa
#define endfor_ifa(in_dev)
#else
#define MAX_PORTALS 64
-#define LNET_SMALL_MD_SIZE offsetof(struct lnet_libmd, md_iov.iov[1])
+#define LNET_SMALL_MD_SIZE offsetof(struct lnet_libmd, md_kiov[1])
extern struct kmem_cache *lnet_mes_cachep; /* MEs kmem_cache */
extern struct kmem_cache *lnet_small_mds_cachep; /* <= LNET_SMALL_MD_SIZE bytes
* MDs kmem_cache */
extern struct kmem_cache *lnet_rspt_cachep;
extern struct kmem_cache *lnet_msg_cachep;
-static inline struct lnet_libmd *
-lnet_md_alloc(struct lnet_md *umd)
+static inline bool
+lnet_ni_set_status_locked(struct lnet_ni *ni, __u32 status)
+__must_hold(&ni->ni_lock)
{
- struct lnet_libmd *md;
- unsigned int size;
- unsigned int niov;
-
- if ((umd->options & LNET_MD_KIOV) != 0) {
- niov = umd->length;
- size = offsetof(struct lnet_libmd, md_iov.kiov[niov]);
- } else {
- niov = 1;
- size = offsetof(struct lnet_libmd, md_iov.iov[niov]);
+ 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;
}
- if (size <= LNET_SMALL_MD_SIZE) {
- md = kmem_cache_alloc(lnet_small_mds_cachep,
- GFP_NOFS | __GFP_ZERO);
- if (md) {
- CDEBUG(D_MALLOC, "slab-alloced 'md' of size %u at "
- "%p.\n", size, md);
- } else {
- CDEBUG(D_MALLOC, "failed to allocate 'md' of size %u\n",
- size);
- return NULL;
- }
- } else {
- LIBCFS_ALLOC(md, size);
- }
+ return update;
+}
- if (md != NULL) {
- /* Set here in case of early free */
- md->md_options = umd->options;
- md->md_niov = niov;
- INIT_LIST_HEAD(&md->md_list);
- }
+static inline bool
+lnet_ni_set_status(struct lnet_ni *ni, __u32 status)
+{
+ bool update;
- return md;
+ 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
LASSERTF(md->md_rspt_ptr == NULL, "md %p rsp %p\n", md, md->md_rspt_ptr);
- if ((md->md_options & LNET_MD_KIOV) != 0)
- size = offsetof(struct lnet_libmd, md_iov.kiov[md->md_niov]);
- else
- size = offsetof(struct lnet_libmd, md_iov.iov[md->md_niov]);
+ size = offsetof(struct lnet_libmd, md_kiov[md->md_niov]);
if (size <= LNET_SMALL_MD_SIZE) {
CDEBUG(D_MALLOC, "slab-freed 'md' at %p.\n", md);
{
struct lnet_msg *msg;
- msg = kmem_cache_alloc(lnet_msg_cachep, GFP_NOFS | __GFP_ZERO);
+ msg = kmem_cache_zalloc(lnet_msg_cachep, GFP_NOFS);
return (msg);
}
{
struct lnet_rsp_tracker *rspt;
- rspt = kmem_cache_alloc(lnet_rspt_cachep, GFP_NOFS | __GFP_ZERO);
+ rspt = kmem_cache_zalloc(lnet_rspt_cachep, GFP_NOFS);
if (rspt) {
lnet_net_lock(cpt);
the_lnet.ln_counters[cpt]->lct_health.lch_rst_alloc++;
int lnet_lib_init(void);
void lnet_lib_exit(void);
+extern unsigned int lnet_response_tracking;
extern unsigned lnet_transaction_timeout;
extern unsigned lnet_retry_count;
+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;
unsigned int len);
int lnet_send(lnet_nid_t nid, struct lnet_msg *msg, lnet_nid_t rtr_nid);
int lnet_send_ping(lnet_nid_t dest_nid, struct lnet_handle_md *mdh, int nnis,
- void *user_ptr, lnet_eq_handler_t eq, bool recovery);
+ void *user_ptr, lnet_handler_t handler, bool recovery);
void lnet_return_tx_credits_locked(struct lnet_msg *msg);
void lnet_return_rx_credits_locked(struct lnet_msg *msg);
void lnet_schedule_blocked_locked(struct lnet_rtrbufpool *rbp);
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);
char *lnet_health_error2str(enum lnet_msg_hstatus hstatus);
char *lnet_msgtyp2str(int type);
-void lnet_print_hdr(struct lnet_hdr *hdr);
int lnet_fail_nid(lnet_nid_t nid, unsigned int threshold);
/** \addtogroup lnet_fault_simulation @{ */
/** @} 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);
-int lnet_extract_iov(int dst_niov, struct kvec *dst,
- int src_niov, struct kvec *src,
- unsigned int offset, unsigned int len);
-
unsigned int lnet_kiov_nob(unsigned int niov, struct bio_vec *iov);
int lnet_extract_kiov(int dst_niov, struct bio_vec *dst,
int src_niov, struct bio_vec *src,
unsigned int soffset, unsigned int nob);
static inline void
-lnet_copy_iov2flat(int dlen, void *dest, unsigned int doffset,
- unsigned int nsiov, struct kvec *siov, unsigned int soffset,
- unsigned int nob)
-{
- struct kvec diov = { .iov_base = dest, .iov_len = dlen };
-
- lnet_copy_iov2iov(1, &diov, doffset,
- nsiov, siov, soffset, nob);
-}
-
-static inline void
lnet_copy_kiov2flat(int dlen, void *dest, unsigned int doffset,
unsigned int nsiov, struct bio_vec *skiov,
unsigned int soffset, unsigned int nob)
}
static inline void
-lnet_copy_flat2iov(unsigned int ndiov, struct kvec *diov, unsigned int doffset,
- int slen, void *src, unsigned int soffset,
- unsigned int nob)
-{
- struct kvec siov = { .iov_base = src, .iov_len = slen };
- lnet_copy_iov2iov(ndiov, diov, doffset,
- 1, &siov, soffset, nob);
-}
-
-static inline void
lnet_copy_flat2kiov(unsigned int ndiov, struct bio_vec *dkiov,
unsigned int doffset, int slen, void *src,
unsigned int soffset, unsigned int nob)
void lnet_me_unlink(struct lnet_me *me);
void lnet_md_unlink(struct lnet_libmd *md);
-void lnet_md_deconstruct(struct lnet_libmd *lmd, struct lnet_md *umd);
+void lnet_md_deconstruct(struct lnet_libmd *lmd, struct lnet_event *ev);
struct page *lnet_kvaddr_to_page(unsigned long vaddr);
int lnet_cpt_of_md(struct lnet_libmd *md, unsigned int offset);
struct socket *lnet_sock_listen(int port, int backlog,
struct net *ns);
struct socket *lnet_sock_connect(int interface, int local_port,
- __u32 peer_ip, int peer_port, struct net *ns);
+ struct sockaddr *peeraddr,
+ struct net *ns);
int lnet_peers_start_down(void);
int lnet_peer_buffer_credits(struct lnet_net *net);
struct lnet_handle_md *mdh);
void lnet_peer_push_event(struct lnet_event *ev);
-int lnet_parse_ip2nets(char **networksp, char *ip2nets);
-int lnet_parse_routes(char *route_str, int *im_a_router);
-int lnet_parse_networks(struct list_head *nilist, char *networks,
+int lnet_parse_ip2nets(const char **networksp, const char *ip2nets);
+int lnet_parse_routes(const char *route_str, int *im_a_router);
+int lnet_parse_networks(struct list_head *nilist, const char *networks,
bool use_tcp_bonding);
bool lnet_net_unique(__u32 net_id, struct list_head *nilist,
struct lnet_net **net);
}
/*
- * A peer is alive if it satisfies the following two conditions:
- * 1. peer health >= LNET_MAX_HEALTH_VALUE * router_sensitivity_percentage
+ * A peer NI is alive if it satisfies the following two conditions:
+ * 1. peer NI health >= LNET_MAX_HEALTH_VALUE * router_sensitivity_percentage
* 2. the cached NI status received when we discover the peer is UP
*/
static inline bool