#include <linux/ktime.h>
#include <linux/moduleparam.h>
#include <linux/uaccess.h>
+#ifdef HAVE_SCHED_HEADERS
+#include <linux/sched/signal.h>
+#endif
#include <lnet/lib-lnet.h>
"Set to 1 to drop asymmetrical route messages.");
#define LNET_TRANSACTION_TIMEOUT_NO_HEALTH_DEFAULT 50
-#define LNET_TRANSACTION_TIMEOUT_HEALTH_DEFAULT 10
+#define LNET_TRANSACTION_TIMEOUT_HEALTH_DEFAULT 50
unsigned lnet_transaction_timeout = LNET_TRANSACTION_TIMEOUT_HEALTH_DEFAULT;
static int transaction_to_set(const char *val, cfs_kernel_param_arg_t *kp);
MODULE_PARM_DESC(lnet_transaction_timeout,
"Maximum number of seconds to wait for a peer response.");
-#define LNET_RETRY_COUNT_HEALTH_DEFAULT 3
+#define LNET_RETRY_COUNT_HEALTH_DEFAULT 2
unsigned lnet_retry_count = LNET_RETRY_COUNT_HEALTH_DEFAULT;
static int retry_count_set(const char *val, cfs_kernel_param_arg_t *kp);
#ifdef HAVE_KERNEL_PARAM_OPS
mutex_init(&the_lnet.ln_lnd_mutex);
}
-static void
-lnet_fini_locks(void)
-{
-}
-
struct kmem_cache *lnet_mes_cachep; /* MEs kmem_cache */
struct kmem_cache *lnet_small_mds_cachep; /* <= LNET_SMALL_MD_SIZE bytes
* MDs kmem_cache */
+struct kmem_cache *lnet_rspt_cachep; /* response tracker cache */
+struct kmem_cache *lnet_msg_cachep;
static int
-lnet_descriptor_setup(void)
+lnet_slab_setup(void)
{
/* create specific kmem_cache for MEs and small MDs (i.e., originally
* allocated in <size-xxx> kmem_cache).
if (!lnet_small_mds_cachep)
return -ENOMEM;
+ lnet_rspt_cachep = kmem_cache_create("lnet_rspt", sizeof(struct lnet_rsp_tracker),
+ 0, 0, NULL);
+ if (!lnet_rspt_cachep)
+ return -ENOMEM;
+
+ lnet_msg_cachep = kmem_cache_create("lnet_msg", sizeof(struct lnet_msg),
+ 0, 0, NULL);
+ if (!lnet_msg_cachep)
+ return -ENOMEM;
+
return 0;
}
static void
-lnet_descriptor_cleanup(void)
+lnet_slab_cleanup(void)
{
+ if (lnet_msg_cachep) {
+ kmem_cache_destroy(lnet_msg_cachep);
+ lnet_msg_cachep = NULL;
+ }
+
+
+ if (lnet_rspt_cachep) {
+ kmem_cache_destroy(lnet_rspt_cachep);
+ lnet_rspt_cachep = NULL;
+ }
if (lnet_small_mds_cachep) {
kmem_cache_destroy(lnet_small_mds_cachep);
cfs_percpt_lock_free(the_lnet.ln_net_lock);
the_lnet.ln_net_lock = NULL;
}
-
- lnet_fini_locks();
}
static int
* with gcc version 3.3.3 20040412 (Red Hat Linux 3.3.3-7) */
/* Constants... */
- CLASSERT(LNET_PROTO_TCP_MAGIC == 0xeebc0ded);
- CLASSERT(LNET_PROTO_TCP_VERSION_MAJOR == 1);
- CLASSERT(LNET_PROTO_TCP_VERSION_MINOR == 0);
- CLASSERT(LNET_MSG_ACK == 0);
- CLASSERT(LNET_MSG_PUT == 1);
- CLASSERT(LNET_MSG_GET == 2);
- CLASSERT(LNET_MSG_REPLY == 3);
- CLASSERT(LNET_MSG_HELLO == 4);
+ BUILD_BUG_ON(LNET_PROTO_TCP_MAGIC != 0xeebc0ded);
+ BUILD_BUG_ON(LNET_PROTO_TCP_VERSION_MAJOR != 1);
+ BUILD_BUG_ON(LNET_PROTO_TCP_VERSION_MINOR != 0);
+ BUILD_BUG_ON(LNET_MSG_ACK != 0);
+ BUILD_BUG_ON(LNET_MSG_PUT != 1);
+ BUILD_BUG_ON(LNET_MSG_GET != 2);
+ BUILD_BUG_ON(LNET_MSG_REPLY != 3);
+ BUILD_BUG_ON(LNET_MSG_HELLO != 4);
/* Checks for struct lnet_handle_wire */
- CLASSERT((int)sizeof(struct lnet_handle_wire) == 16);
- CLASSERT((int)offsetof(struct lnet_handle_wire, wh_interface_cookie) == 0);
- CLASSERT((int)sizeof(((struct lnet_handle_wire *)0)->wh_interface_cookie) == 8);
- CLASSERT((int)offsetof(struct lnet_handle_wire, wh_object_cookie) == 8);
- CLASSERT((int)sizeof(((struct lnet_handle_wire *)0)->wh_object_cookie) == 8);
+ BUILD_BUG_ON((int)sizeof(struct lnet_handle_wire) != 16);
+ BUILD_BUG_ON((int)offsetof(struct lnet_handle_wire,
+ wh_interface_cookie) != 0);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_handle_wire *)0)->wh_interface_cookie) != 8);
+ BUILD_BUG_ON((int)offsetof(struct lnet_handle_wire,
+ wh_object_cookie) != 8);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_handle_wire *)0)->wh_object_cookie) != 8);
/* Checks for struct struct lnet_magicversion */
- CLASSERT((int)sizeof(struct lnet_magicversion) == 8);
- CLASSERT((int)offsetof(struct lnet_magicversion, magic) == 0);
- CLASSERT((int)sizeof(((struct lnet_magicversion *)0)->magic) == 4);
- CLASSERT((int)offsetof(struct lnet_magicversion, version_major) == 4);
- CLASSERT((int)sizeof(((struct lnet_magicversion *)0)->version_major) == 2);
- CLASSERT((int)offsetof(struct lnet_magicversion, version_minor) == 6);
- CLASSERT((int)sizeof(((struct lnet_magicversion *)0)->version_minor) == 2);
+ BUILD_BUG_ON((int)sizeof(struct lnet_magicversion) != 8);
+ BUILD_BUG_ON((int)offsetof(struct lnet_magicversion, magic) != 0);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_magicversion *)0)->magic) != 4);
+ BUILD_BUG_ON((int)offsetof(struct lnet_magicversion, version_major) != 4);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_magicversion *)0)->version_major) != 2);
+ BUILD_BUG_ON((int)offsetof(struct lnet_magicversion,
+ version_minor) != 6);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_magicversion *)0)->version_minor) != 2);
/* Checks for struct struct lnet_hdr */
- CLASSERT((int)sizeof(struct lnet_hdr) == 72);
- CLASSERT((int)offsetof(struct lnet_hdr, dest_nid) == 0);
- CLASSERT((int)sizeof(((struct lnet_hdr *)0)->dest_nid) == 8);
- CLASSERT((int)offsetof(struct lnet_hdr, src_nid) == 8);
- CLASSERT((int)sizeof(((struct lnet_hdr *)0)->src_nid) == 8);
- CLASSERT((int)offsetof(struct lnet_hdr, dest_pid) == 16);
- CLASSERT((int)sizeof(((struct lnet_hdr *)0)->dest_pid) == 4);
- CLASSERT((int)offsetof(struct lnet_hdr, src_pid) == 20);
- CLASSERT((int)sizeof(((struct lnet_hdr *)0)->src_pid) == 4);
- CLASSERT((int)offsetof(struct lnet_hdr, type) == 24);
- CLASSERT((int)sizeof(((struct lnet_hdr *)0)->type) == 4);
- CLASSERT((int)offsetof(struct lnet_hdr, payload_length) == 28);
- CLASSERT((int)sizeof(((struct lnet_hdr *)0)->payload_length) == 4);
- CLASSERT((int)offsetof(struct lnet_hdr, msg) == 32);
- CLASSERT((int)sizeof(((struct lnet_hdr *)0)->msg) == 40);
+ BUILD_BUG_ON((int)sizeof(struct lnet_hdr) != 72);
+ BUILD_BUG_ON((int)offsetof(struct lnet_hdr, dest_nid) != 0);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_hdr *)0)->dest_nid) != 8);
+ BUILD_BUG_ON((int)offsetof(struct lnet_hdr, src_nid) != 8);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_hdr *)0)->src_nid) != 8);
+ BUILD_BUG_ON((int)offsetof(struct lnet_hdr, dest_pid) != 16);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_hdr *)0)->dest_pid) != 4);
+ BUILD_BUG_ON((int)offsetof(struct lnet_hdr, src_pid) != 20);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_hdr *)0)->src_pid) != 4);
+ BUILD_BUG_ON((int)offsetof(struct lnet_hdr, type) != 24);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_hdr *)0)->type) != 4);
+ BUILD_BUG_ON((int)offsetof(struct lnet_hdr, payload_length) != 28);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_hdr *)0)->payload_length) != 4);
+ BUILD_BUG_ON((int)offsetof(struct lnet_hdr, msg) != 32);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_hdr *)0)->msg) != 40);
/* Ack */
- CLASSERT((int)offsetof(struct lnet_hdr, msg.ack.dst_wmd) == 32);
- CLASSERT((int)sizeof(((struct lnet_hdr *)0)->msg.ack.dst_wmd) == 16);
- CLASSERT((int)offsetof(struct lnet_hdr, msg.ack.match_bits) == 48);
- CLASSERT((int)sizeof(((struct lnet_hdr *)0)->msg.ack.match_bits) == 8);
- CLASSERT((int)offsetof(struct lnet_hdr, msg.ack.mlength) == 56);
- CLASSERT((int)sizeof(((struct lnet_hdr *)0)->msg.ack.mlength) == 4);
+ BUILD_BUG_ON((int)offsetof(struct lnet_hdr, msg.ack.dst_wmd) != 32);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_hdr *)0)->msg.ack.dst_wmd) != 16);
+ BUILD_BUG_ON((int)offsetof(struct lnet_hdr, msg.ack.match_bits) != 48);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_hdr *)0)->msg.ack.match_bits) != 8);
+ BUILD_BUG_ON((int)offsetof(struct lnet_hdr, msg.ack.mlength) != 56);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_hdr *)0)->msg.ack.mlength) != 4);
/* Put */
- CLASSERT((int)offsetof(struct lnet_hdr, msg.put.ack_wmd) == 32);
- CLASSERT((int)sizeof(((struct lnet_hdr *)0)->msg.put.ack_wmd) == 16);
- CLASSERT((int)offsetof(struct lnet_hdr, msg.put.match_bits) == 48);
- CLASSERT((int)sizeof(((struct lnet_hdr *)0)->msg.put.match_bits) == 8);
- CLASSERT((int)offsetof(struct lnet_hdr, msg.put.hdr_data) == 56);
- CLASSERT((int)sizeof(((struct lnet_hdr *)0)->msg.put.hdr_data) == 8);
- CLASSERT((int)offsetof(struct lnet_hdr, msg.put.ptl_index) == 64);
- CLASSERT((int)sizeof(((struct lnet_hdr *)0)->msg.put.ptl_index) == 4);
- CLASSERT((int)offsetof(struct lnet_hdr, msg.put.offset) == 68);
- CLASSERT((int)sizeof(((struct lnet_hdr *)0)->msg.put.offset) == 4);
+ BUILD_BUG_ON((int)offsetof(struct lnet_hdr, msg.put.ack_wmd) != 32);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_hdr *)0)->msg.put.ack_wmd) != 16);
+ BUILD_BUG_ON((int)offsetof(struct lnet_hdr, msg.put.match_bits) != 48);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_hdr *)0)->msg.put.match_bits) != 8);
+ BUILD_BUG_ON((int)offsetof(struct lnet_hdr, msg.put.hdr_data) != 56);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_hdr *)0)->msg.put.hdr_data) != 8);
+ BUILD_BUG_ON((int)offsetof(struct lnet_hdr, msg.put.ptl_index) != 64);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_hdr *)0)->msg.put.ptl_index) != 4);
+ BUILD_BUG_ON((int)offsetof(struct lnet_hdr, msg.put.offset) != 68);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_hdr *)0)->msg.put.offset) != 4);
/* Get */
- CLASSERT((int)offsetof(struct lnet_hdr, msg.get.return_wmd) == 32);
- CLASSERT((int)sizeof(((struct lnet_hdr *)0)->msg.get.return_wmd) == 16);
- CLASSERT((int)offsetof(struct lnet_hdr, msg.get.match_bits) == 48);
- CLASSERT((int)sizeof(((struct lnet_hdr *)0)->msg.get.match_bits) == 8);
- CLASSERT((int)offsetof(struct lnet_hdr, msg.get.ptl_index) == 56);
- CLASSERT((int)sizeof(((struct lnet_hdr *)0)->msg.get.ptl_index) == 4);
- CLASSERT((int)offsetof(struct lnet_hdr, msg.get.src_offset) == 60);
- CLASSERT((int)sizeof(((struct lnet_hdr *)0)->msg.get.src_offset) == 4);
- CLASSERT((int)offsetof(struct lnet_hdr, msg.get.sink_length) == 64);
- CLASSERT((int)sizeof(((struct lnet_hdr *)0)->msg.get.sink_length) == 4);
+ BUILD_BUG_ON((int)offsetof(struct lnet_hdr, msg.get.return_wmd) != 32);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_hdr *)0)->msg.get.return_wmd) != 16);
+ BUILD_BUG_ON((int)offsetof(struct lnet_hdr, msg.get.match_bits) != 48);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_hdr *)0)->msg.get.match_bits) != 8);
+ BUILD_BUG_ON((int)offsetof(struct lnet_hdr, msg.get.ptl_index) != 56);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_hdr *)0)->msg.get.ptl_index) != 4);
+ BUILD_BUG_ON((int)offsetof(struct lnet_hdr, msg.get.src_offset) != 60);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_hdr *)0)->msg.get.src_offset) != 4);
+ BUILD_BUG_ON((int)offsetof(struct lnet_hdr, msg.get.sink_length) != 64);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_hdr *)0)->msg.get.sink_length) != 4);
/* Reply */
- CLASSERT((int)offsetof(struct lnet_hdr, msg.reply.dst_wmd) == 32);
- CLASSERT((int)sizeof(((struct lnet_hdr *)0)->msg.reply.dst_wmd) == 16);
+ BUILD_BUG_ON((int)offsetof(struct lnet_hdr, msg.reply.dst_wmd) != 32);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_hdr *)0)->msg.reply.dst_wmd) != 16);
/* Hello */
- CLASSERT((int)offsetof(struct lnet_hdr, msg.hello.incarnation) == 32);
- CLASSERT((int)sizeof(((struct lnet_hdr *)0)->msg.hello.incarnation) == 8);
- CLASSERT((int)offsetof(struct lnet_hdr, msg.hello.type) == 40);
- CLASSERT((int)sizeof(((struct lnet_hdr *)0)->msg.hello.type) == 4);
+ BUILD_BUG_ON((int)offsetof(struct lnet_hdr, msg.hello.incarnation) != 32);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_hdr *)0)->msg.hello.incarnation) != 8);
+ BUILD_BUG_ON((int)offsetof(struct lnet_hdr, msg.hello.type) != 40);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_hdr *)0)->msg.hello.type) != 4);
/* Checks for struct lnet_ni_status and related constants */
- CLASSERT(LNET_NI_STATUS_INVALID == 0x00000000);
- CLASSERT(LNET_NI_STATUS_UP == 0x15aac0de);
- CLASSERT(LNET_NI_STATUS_DOWN == 0xdeadface);
+ BUILD_BUG_ON(LNET_NI_STATUS_INVALID != 0x00000000);
+ BUILD_BUG_ON(LNET_NI_STATUS_UP != 0x15aac0de);
+ BUILD_BUG_ON(LNET_NI_STATUS_DOWN != 0xdeadface);
/* Checks for struct lnet_ni_status */
- CLASSERT((int)sizeof(struct lnet_ni_status) == 16);
- CLASSERT((int)offsetof(struct lnet_ni_status, ns_nid) == 0);
- CLASSERT((int)sizeof(((struct lnet_ni_status *)0)->ns_nid) == 8);
- CLASSERT((int)offsetof(struct lnet_ni_status, ns_status) == 8);
- CLASSERT((int)sizeof(((struct lnet_ni_status *)0)->ns_status) == 4);
- CLASSERT((int)offsetof(struct lnet_ni_status, ns_unused) == 12);
- CLASSERT((int)sizeof(((struct lnet_ni_status *)0)->ns_unused) == 4);
+ BUILD_BUG_ON((int)sizeof(struct lnet_ni_status) != 16);
+ BUILD_BUG_ON((int)offsetof(struct lnet_ni_status, ns_nid) != 0);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_ni_status *)0)->ns_nid) != 8);
+ BUILD_BUG_ON((int)offsetof(struct lnet_ni_status, ns_status) != 8);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_ni_status *)0)->ns_status) != 4);
+ BUILD_BUG_ON((int)offsetof(struct lnet_ni_status, ns_unused) != 12);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_ni_status *)0)->ns_unused) != 4);
/* Checks for struct lnet_ping_info and related constants */
- CLASSERT(LNET_PROTO_PING_MAGIC == 0x70696E67);
- CLASSERT(LNET_PING_FEAT_INVAL == 0);
- CLASSERT(LNET_PING_FEAT_BASE == 1);
- CLASSERT(LNET_PING_FEAT_NI_STATUS == 2);
- CLASSERT(LNET_PING_FEAT_RTE_DISABLED == 4);
- CLASSERT(LNET_PING_FEAT_MULTI_RAIL == 8);
- CLASSERT(LNET_PING_FEAT_DISCOVERY == 16);
- CLASSERT(LNET_PING_FEAT_BITS == 31);
+ BUILD_BUG_ON(LNET_PROTO_PING_MAGIC != 0x70696E67);
+ BUILD_BUG_ON(LNET_PING_FEAT_INVAL != 0);
+ BUILD_BUG_ON(LNET_PING_FEAT_BASE != 1);
+ BUILD_BUG_ON(LNET_PING_FEAT_NI_STATUS != 2);
+ BUILD_BUG_ON(LNET_PING_FEAT_RTE_DISABLED != 4);
+ BUILD_BUG_ON(LNET_PING_FEAT_MULTI_RAIL != 8);
+ BUILD_BUG_ON(LNET_PING_FEAT_DISCOVERY != 16);
+ BUILD_BUG_ON(LNET_PING_FEAT_BITS != 31);
/* Checks for struct lnet_ping_info */
- CLASSERT((int)sizeof(struct lnet_ping_info) == 16);
- CLASSERT((int)offsetof(struct lnet_ping_info, pi_magic) == 0);
- CLASSERT((int)sizeof(((struct lnet_ping_info *)0)->pi_magic) == 4);
- CLASSERT((int)offsetof(struct lnet_ping_info, pi_features) == 4);
- CLASSERT((int)sizeof(((struct lnet_ping_info *)0)->pi_features) == 4);
- CLASSERT((int)offsetof(struct lnet_ping_info, pi_pid) == 8);
- CLASSERT((int)sizeof(((struct lnet_ping_info *)0)->pi_pid) == 4);
- CLASSERT((int)offsetof(struct lnet_ping_info, pi_nnis) == 12);
- CLASSERT((int)sizeof(((struct lnet_ping_info *)0)->pi_nnis) == 4);
- CLASSERT((int)offsetof(struct lnet_ping_info, pi_ni) == 16);
- CLASSERT((int)sizeof(((struct lnet_ping_info *)0)->pi_ni) == 0);
+ BUILD_BUG_ON((int)sizeof(struct lnet_ping_info) != 16);
+ BUILD_BUG_ON((int)offsetof(struct lnet_ping_info, pi_magic) != 0);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_ping_info *)0)->pi_magic) != 4);
+ BUILD_BUG_ON((int)offsetof(struct lnet_ping_info, pi_features) != 4);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_ping_info *)0)->pi_features) != 4);
+ BUILD_BUG_ON((int)offsetof(struct lnet_ping_info, pi_pid) != 8);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_ping_info *)0)->pi_pid) != 4);
+ BUILD_BUG_ON((int)offsetof(struct lnet_ping_info, pi_nnis) != 12);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_ping_info *)0)->pi_nnis) != 4);
+ BUILD_BUG_ON((int)offsetof(struct lnet_ping_info, pi_ni) != 16);
+ BUILD_BUG_ON((int)sizeof(((struct lnet_ping_info *)0)->pi_ni) != 0);
}
-static struct lnet_lnd *lnet_find_lnd_by_type(__u32 type)
+static const struct lnet_lnd *lnet_find_lnd_by_type(__u32 type)
{
- struct lnet_lnd *lnd;
- struct list_head *tmp;
+ const struct lnet_lnd *lnd;
/* holding lnd mutex */
- list_for_each(tmp, &the_lnet.ln_lnds) {
- lnd = list_entry(tmp, struct lnet_lnd, lnd_list);
+ if (type >= NUM_LNDS)
+ return NULL;
+ lnd = the_lnet.ln_lnds[type];
+ LASSERT(!lnd || lnd->lnd_type == type);
- if (lnd->lnd_type == type)
- return lnd;
- }
- return NULL;
+ return lnd;
}
unsigned int
EXPORT_SYMBOL(lnet_get_lnd_timeout);
void
-lnet_register_lnd(struct lnet_lnd *lnd)
+lnet_register_lnd(const struct lnet_lnd *lnd)
{
mutex_lock(&the_lnet.ln_lnd_mutex);
LASSERT(libcfs_isknown_lnd(lnd->lnd_type));
LASSERT(lnet_find_lnd_by_type(lnd->lnd_type) == NULL);
- list_add_tail(&lnd->lnd_list, &the_lnet.ln_lnds);
+ the_lnet.ln_lnds[lnd->lnd_type] = lnd;
CDEBUG(D_NET, "%s LND registered\n", libcfs_lnd2str(lnd->lnd_type));
EXPORT_SYMBOL(lnet_register_lnd);
void
-lnet_unregister_lnd(struct lnet_lnd *lnd)
+lnet_unregister_lnd(const struct lnet_lnd *lnd)
{
mutex_lock(&the_lnet.ln_lnd_mutex);
LASSERT(lnet_find_lnd_by_type(lnd->lnd_type) == lnd);
- list_del(&lnd->lnd_list);
+ the_lnet.ln_lnds[lnd->lnd_type] = NULL;
CDEBUG(D_NET, "%s LND unregistered\n", libcfs_lnd2str(lnd->lnd_type));
mutex_unlock(&the_lnet.ln_lnd_mutex);
LNetInvalidateEQHandle(&the_lnet.ln_mt_eqh);
init_completion(&the_lnet.ln_started);
- rc = lnet_descriptor_setup();
+ rc = lnet_slab_setup();
if (rc != 0)
goto failed;
if (rc != 0)
goto failed;
- recs = lnet_res_containers_create(LNET_COOKIE_TYPE_ME);
- if (recs == NULL) {
- rc = -ENOMEM;
- goto failed;
- }
-
- the_lnet.ln_me_containers = recs;
-
recs = lnet_res_containers_create(LNET_COOKIE_TYPE_MD);
if (recs == NULL) {
rc = -ENOMEM;
the_lnet.ln_md_containers = NULL;
}
- if (the_lnet.ln_me_containers != NULL) {
- lnet_res_containers_destroy(the_lnet.ln_me_containers);
- the_lnet.ln_me_containers = NULL;
- }
-
lnet_res_container_cleanup(&the_lnet.ln_eq_container);
lnet_msg_containers_destroy();
the_lnet.ln_counters = NULL;
}
lnet_destroy_remote_nets_table();
- lnet_descriptor_cleanup();
+ lnet_slab_cleanup();
return 0;
}
void
lnet_ping_buffer_free(struct lnet_ping_buffer *pbuf)
{
- LASSERT(lnet_ping_buffer_numref(pbuf) == 0);
+ LASSERT(atomic_read(&pbuf->pb_refcnt) == 0);
LIBCFS_FREE(pbuf, LNET_PING_BUFFER_SIZE(pbuf->pb_nnis));
}
.nid = LNET_NID_ANY,
.pid = LNET_PID_ANY
};
- struct lnet_handle_me me_handle;
+ struct lnet_me *me;
struct lnet_md md = { NULL };
int rc, rc2;
}
/* Ping target ME/MD */
- rc = LNetMEAttach(LNET_RESERVED_PORTAL, id,
+ me = LNetMEAttach(LNET_RESERVED_PORTAL, id,
LNET_PROTO_PING_MATCHBITS, 0,
- LNET_UNLINK, LNET_INS_AFTER,
- &me_handle);
- if (rc != 0) {
+ LNET_UNLINK, LNET_INS_AFTER);
+ if (IS_ERR(me)) {
+ rc = PTR_ERR(me);
CERROR("Can't create ping target ME: %d\n", rc);
goto fail_decref_ping_buffer;
}
md.eq_handle = the_lnet.ln_ping_target_eq;
md.user_ptr = *ppbuf;
- rc = LNetMDAttach(me_handle, md, LNET_RETAIN, ping_mdh);
+ rc = LNetMDAttach(me, md, LNET_RETAIN, ping_mdh);
if (rc != 0) {
CERROR("Can't attach ping target MD: %d\n", rc);
goto fail_unlink_ping_me;
return 0;
fail_unlink_ping_me:
- rc2 = LNetMEUnlink(me_handle);
- LASSERT(rc2 == 0);
+ LNetMEUnlink(me);
fail_decref_ping_buffer:
- LASSERT(lnet_ping_buffer_numref(*ppbuf) == 1);
+ LASSERT(atomic_read(&(*ppbuf)->pb_refcnt) == 1);
lnet_ping_buffer_decref(*ppbuf);
*ppbuf = NULL;
fail_free_eq:
lnet_ping_md_unlink(struct lnet_ping_buffer *pbuf,
struct lnet_handle_md *ping_mdh)
{
- sigset_t blocked = cfs_block_allsigs();
-
LNetMDUnlink(*ping_mdh);
LNetInvalidateMDHandle(ping_mdh);
/* NB the MD could be busy; this just starts the unlink */
- while (lnet_ping_buffer_numref(pbuf) > 1) {
+ while (atomic_read(&pbuf->pb_refcnt) > 1) {
CDEBUG(D_NET, "Still waiting for ping data MD to unlink\n");
- set_current_state(TASK_UNINTERRUPTIBLE);
- schedule_timeout(cfs_time_seconds(1));
+ schedule_timeout_uninterruptible(cfs_time_seconds(1));
}
-
- cfs_restore_sigs(blocked);
}
static void
{
struct lnet_process_id id = { LNET_NID_ANY, LNET_PID_ANY };
struct lnet_md md = { NULL };
- struct lnet_handle_me meh;
+ struct lnet_me *me;
struct lnet_handle_md mdh;
struct lnet_handle_md old_mdh;
struct lnet_ping_buffer *pbuf;
goto fail_return;
}
- rc = LNetMEAttach(LNET_RESERVED_PORTAL, id,
+ me = LNetMEAttach(LNET_RESERVED_PORTAL, id,
LNET_PROTO_PING_MATCHBITS, 0,
- LNET_UNLINK, LNET_INS_AFTER,
- &meh);
- if (rc) {
+ LNET_UNLINK, LNET_INS_AFTER);
+
+ if (IS_ERR(me)) {
+ rc = PTR_ERR(me);
CERROR("Can't create push target ME: %d\n", rc);
goto fail_decref_pbuf;
}
md.user_ptr = pbuf;
md.eq_handle = the_lnet.ln_push_target_eq;
- rc = LNetMDAttach(meh, md, LNET_RETAIN, &mdh);
+ rc = LNetMDAttach(me, md, LNET_RETAIN, &mdh);
if (rc) {
CERROR("Can't attach push MD: %d\n", rc);
- goto fail_unlink_meh;
+ goto fail_unlink_me;
}
lnet_ping_buffer_addref(pbuf);
return 0;
-fail_unlink_meh:
- LNetMEUnlink(meh);
+fail_unlink_me:
+ LNetMEUnlink(me);
fail_decref_pbuf:
lnet_ping_buffer_decref(pbuf);
fail_return:
LNetInvalidateMDHandle(&the_lnet.ln_push_target_md);
/* Wait for the unlink to complete. */
- while (lnet_ping_buffer_numref(the_lnet.ln_push_target) > 1) {
+ while (atomic_read(&the_lnet.ln_push_target->pb_refcnt) > 1) {
CDEBUG(D_NET, "Still waiting for ping data MD to unlink\n");
- set_current_state(TASK_UNINTERRUPTIBLE);
- schedule_timeout(cfs_time_seconds(1));
+ schedule_timeout_uninterruptible(cfs_time_seconds(1));
}
lnet_ping_buffer_decref(the_lnet.ln_push_target);
"Waiting for zombie LNI %s\n",
libcfs_nid2str(ni->ni_nid));
}
- set_current_state(TASK_UNINTERRUPTIBLE);
- schedule_timeout(cfs_time_seconds(1));
+ schedule_timeout_uninterruptible(cfs_time_seconds(1));
lnet_net_lock(LNET_LOCK_EX);
continue;
}
islo = ni->ni_net->net_lnd->lnd_type == LOLND;
LASSERT(!in_interrupt());
+ /* Holding the mutex makes it safe for lnd_shutdown
+ * to call module_put(). Module unload cannot finish
+ * until lnet_unregister_lnd() completes, and that
+ * requires the mutex.
+ */
+ mutex_lock(&the_lnet.ln_lnd_mutex);
(net->net_lnd->lnd_shutdown)(ni);
+ mutex_unlock(&the_lnet.ln_lnd_mutex);
if (!islo)
CDEBUG(D_LNI, "Removed LNI %s\n",
lnet_shutdown_lndnets(void)
{
struct lnet_net *net;
- struct list_head resend;
+ LIST_HEAD(resend);
struct lnet_msg *msg, *tmp;
- INIT_LIST_HEAD(&resend);
-
/* NB called holding the global mutex */
/* All quiet on the API front */
lnet_net_lock(LNET_LOCK_EX);
the_lnet.ln_state = LNET_STATE_STOPPING;
- while (!list_empty(&the_lnet.ln_nets)) {
- /*
- * move the nets to the zombie list to avoid them being
- * picked up for new work. LONET is also included in the
- * Nets that will be moved to the zombie list
- */
- net = list_entry(the_lnet.ln_nets.next,
- struct lnet_net, net_list);
- list_move(&net->net_list, &the_lnet.ln_net_zombie);
- }
+ /*
+ * move the nets to the zombie list to avoid them being
+ * picked up for new work. LONET is also included in the
+ * Nets that will be moved to the zombie list
+ */
+ list_splice_init(&the_lnet.ln_nets, &the_lnet.ln_net_zombie);
/* Drop the cached loopback Net. */
if (the_lnet.ln_loni != NULL) {
lnet_startup_lndnet(struct lnet_net *net, struct lnet_lnd_tunables *tun)
{
struct lnet_ni *ni;
- struct lnet_net *net_l = NULL;
- struct list_head local_ni_list;
- int rc;
- int ni_count = 0;
- __u32 lnd_type;
- struct lnet_lnd *lnd;
- int peer_timeout =
+ struct lnet_net *net_l = NULL;
+ LIST_HEAD(local_ni_list);
+ int rc;
+ int ni_count = 0;
+ __u32 lnd_type;
+ const struct lnet_lnd *lnd;
+ int peer_timeout =
net->net_tunables.lct_peer_timeout;
- int maxtxcredits =
+ int maxtxcredits =
net->net_tunables.lct_max_tx_credits;
- int peerrtrcredits =
+ int peerrtrcredits =
net->net_tunables.lct_peer_rtr_credits;
- INIT_LIST_HEAD(&local_ni_list);
-
/*
* make sure that this net is unique. If it isn't then
* we are adding interfaces to an already existing network, and
rc = lnet_startup_lndni(ni, tun);
- LASSERT(ni->ni_net->net_tunables.lct_peer_timeout <= 0 ||
- ni->ni_net->net_lnd->lnd_query != NULL);
-
if (rc < 0)
goto failed1;
lnet_assert_wire_constants();
/* refer to global cfs_cpt_table for now */
- the_lnet.ln_cpt_table = cfs_cpt_table;
- the_lnet.ln_cpt_number = cfs_cpt_number(cfs_cpt_table);
+ the_lnet.ln_cpt_table = cfs_cpt_tab;
+ the_lnet.ln_cpt_number = cfs_cpt_number(cfs_cpt_tab);
LASSERT(the_lnet.ln_cpt_number > 0);
if (the_lnet.ln_cpt_number > LNET_CPT_MAX) {
}
the_lnet.ln_refcount = 0;
- INIT_LIST_HEAD(&the_lnet.ln_lnds);
INIT_LIST_HEAD(&the_lnet.ln_net_zombie);
INIT_LIST_HEAD(&the_lnet.ln_msg_resend);
*
* \pre lnet_lib_init() called with success.
* \pre All LNet users called LNetNIFini() for matching LNetNIInit() calls.
+ *
+ * As this happens at module-unload, all lnds must already be unloaded,
+ * so they must already be unregistered.
*/
void lnet_lib_exit(void)
{
- LASSERT(the_lnet.ln_refcount == 0);
+ int i;
- while (!list_empty(&the_lnet.ln_lnds))
- lnet_unregister_lnd(list_entry(the_lnet.ln_lnds.next,
- struct lnet_lnd, lnd_list));
+ LASSERT(the_lnet.ln_refcount == 0);
+ lnet_unregister_lnd(&the_lolnd);
+ for (i = 0; i < NUM_LNDS; i++)
+ LASSERT(!the_lnet.ln_lnds[i]);
lnet_destroy_locks();
}
int ni_count;
struct lnet_ping_buffer *pbuf;
struct lnet_handle_md ping_mdh;
- struct list_head net_head;
+ LIST_HEAD(net_head);
struct lnet_net *net;
- INIT_LIST_HEAD(&net_head);
-
mutex_lock(&the_lnet.ln_api_mutex);
CDEBUG(D_OTHER, "refs %d\n", the_lnet.ln_refcount);
struct lnet_net *net;
char *nets;
int rc;
- struct list_head net_head;
-
- INIT_LIST_HEAD(&net_head);
+ LIST_HEAD(net_head);
rc = lnet_parse_ip2nets(&nets, ip2nets);
if (rc < 0)
int
lnet_dyn_add_net(struct lnet_ioctl_config_data *conf)
{
- struct lnet_net *net;
- struct list_head net_head;
- int rc;
+ struct lnet_net *net;
+ LIST_HEAD(net_head);
+ int rc;
struct lnet_ioctl_config_lnd_tunables tun;
char *nets = conf->cfg_config_u.cfg_net.net_intf;
- INIT_LIST_HEAD(&net_head);
-
/* Create a net/ni structures for the network string */
rc = lnet_parse_networks(&net_head, nets, use_tcp_bonding);
if (rc <= 0)
return 0;
case IOC_LIBCFS_TESTPROTOCOMPAT:
- lnet_net_lock(LNET_LOCK_EX);
the_lnet.ln_testprotocompat = data->ioc_flags;
- lnet_net_unlock(LNET_LOCK_EX);
return 0;
case IOC_LIBCFS_LNET_FAULT:
do {
/* MUST block for unlink to complete */
- if (unlinked)
- blocked = cfs_block_allsigs();
+ if (unlinked) {
+ sigset_t set;
+
+ sigfillset(&set);
+ sigprocmask(SIG_SETMASK, &set, &blocked);
+ }
rc2 = LNetEQPoll(&eqh, 1, timeout, &event, &which);