Description:
Details :
+Severity : normal
+Bugzilla : 15272
+Description: ptl_send_rpc hits LASSERT when ptl_send_buf fails
+Details : only hits under out-of-memory situations
+
-------------------------------------------------------------------------------
int lnet_islocalnid(lnet_nid_t nid);
int lnet_islocalnet(__u32 net);
+void lnet_build_unlink_event(lnet_libmd_t *md, lnet_event_t *ev);
void lnet_enq_event_locked(lnet_eq_t *eq, lnet_event_t *ev);
void lnet_prep_send(lnet_msg_t *msg, int type, lnet_process_id_t target,
unsigned int offset, unsigned int len);
return -ENOMEM;
}
#else
- LIBCFS_ALLOC(tx->tx_wrq,
- (1 + IBLND_MAX_RDMA_FRAGS) *
+ LIBCFS_ALLOC(tx->tx_wrq,
+ (1 + IBLND_MAX_RDMA_FRAGS) *
sizeof(*tx->tx_wrq));
if (tx->tx_wrq == NULL)
return -ENOMEM;
-
- LIBCFS_ALLOC(tx->tx_sge,
- (1 + IBLND_MAX_RDMA_FRAGS) *
+
+ LIBCFS_ALLOC(tx->tx_sge,
+ (1 + IBLND_MAX_RDMA_FRAGS) *
sizeof(*tx->tx_sge));
if (tx->tx_sge == NULL)
return -ENOMEM;
-
- LIBCFS_ALLOC(tx->tx_rd,
- offsetof(kib_rdma_desc_t,
+
+ LIBCFS_ALLOC(tx->tx_rd,
+ offsetof(kib_rdma_desc_t,
rd_frags[IBLND_MAX_RDMA_FRAGS]));
if (tx->tx_rd == NULL)
return -ENOMEM;
LASSERT (the_lnet.ln_init);
LASSERT (the_lnet.ln_refcount > 0);
-
+
LNET_LOCK();
md = lnet_handle2md(&mdh);
if (md->md_eq != NULL &&
md->md_refcount == 0) {
- memset(&ev, 0, sizeof(ev));
-
- ev.type = LNET_EVENT_UNLINK;
- ev.status = 0;
- ev.unlinked = 1;
- lnet_md_deconstruct(md, &ev.md);
- lnet_md2handle(&ev.md_handle, md);
-
+ lnet_build_unlink_event(md, &ev);
lnet_enq_event_locked(md->md_eq, &ev);
}
int
LNetMEUnlink(lnet_handle_me_t meh)
{
- lnet_me_t *me;
- int rc;
+ lnet_me_t *me;
+ lnet_libmd_t *md;
+ lnet_event_t ev;
- LASSERT (the_lnet.ln_init);
+ LASSERT (the_lnet.ln_init);
LASSERT (the_lnet.ln_refcount > 0);
-
+
LNET_LOCK();
me = lnet_handle2me(&meh);
if (me == NULL) {
- rc = -ENOENT;
- } else {
- lnet_me_unlink(me);
- rc = 0;
+ LNET_UNLOCK();
+ return -ENOENT;
}
- LNET_UNLOCK();
+ md = me->me_md;
+ if (md != NULL &&
+ md->md_eq != NULL &&
+ md->md_refcount == 0) {
+ lnet_build_unlink_event(md, &ev);
+ lnet_enq_event_locked(md->md_eq, &ev);
+ }
- return (rc);
+ lnet_me_unlink(me);
+
+ LNET_UNLOCK();
+ return 0;
}
/* call with LNET_LOCK please */
#include <lnet/lib-lnet.h>
void
+lnet_build_unlink_event (lnet_libmd_t *md, lnet_event_t *ev)
+{
+ memset(ev, 0, sizeof(*ev));
+
+ ev->status = 0;
+ ev->unlinked = 1;
+ ev->type = LNET_EVENT_UNLINK;
+ lnet_md_deconstruct(md, &ev->md);
+ lnet_md2handle(&ev->md_handle, md);
+}
+
+void
lnet_enq_event_locked (lnet_eq_t *eq, lnet_event_t *ev)
{
lnet_event_t *eq_slot;
LASSERT (md->md_refcount >= 0);
unlink = lnet_md_unlinkable(md);
-
+
msg->msg_ev.unlinked = unlink;
-
+
if (md->md_eq != NULL)
lnet_enq_event_locked(md->md_eq, &msg->msg_ev);
-
+
if (unlink)
lnet_md_unlink(md);