From 04ad508ebed0d7ff38482ecb1248dfcf90b699e1 Mon Sep 17 00:00:00 2001 From: isaac Date: Sat, 10 May 2008 18:24:33 +0000 Subject: [PATCH] b=15272 i=liangzhen,i=maxim: - ensure UNLINK event when MD unlinked via LNetMEUnlink. - removed trailing spaces. --- lnet/ChangeLog | 5 +++++ lnet/include/lnet/lib-lnet.h | 1 + lnet/klnds/o2iblnd/o2iblnd.c | 16 ++++++++-------- lnet/lnet/lib-md.c | 11 ++--------- lnet/lnet/lib-me.c | 28 ++++++++++++++++++---------- lnet/lnet/lib-msg.c | 18 +++++++++++++++--- 6 files changed, 49 insertions(+), 30 deletions(-) diff --git a/lnet/ChangeLog b/lnet/ChangeLog index 48ac8c9..b09869e 100644 --- a/lnet/ChangeLog +++ b/lnet/ChangeLog @@ -17,6 +17,11 @@ Bugzilla : 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 + ------------------------------------------------------------------------------- diff --git a/lnet/include/lnet/lib-lnet.h b/lnet/include/lnet/lib-lnet.h index 37dc5d4..a93354b 100644 --- a/lnet/include/lnet/lib-lnet.h +++ b/lnet/include/lnet/lib-lnet.h @@ -548,6 +548,7 @@ lnet_remotenet_t *lnet_find_net_locked (__u32 net); 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); diff --git a/lnet/klnds/o2iblnd/o2iblnd.c b/lnet/klnds/o2iblnd/o2iblnd.c index b8a994a..f4bc290 100644 --- a/lnet/klnds/o2iblnd/o2iblnd.c +++ b/lnet/klnds/o2iblnd/o2iblnd.c @@ -1185,20 +1185,20 @@ kiblnd_alloc_tx_descs (lnet_ni_t *ni) 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; diff --git a/lnet/lnet/lib-md.c b/lnet/lnet/lib-md.c index ecd8f07..731db56 100644 --- a/lnet/lnet/lib-md.c +++ b/lnet/lnet/lib-md.c @@ -284,7 +284,7 @@ LNetMDUnlink (lnet_handle_md_t mdh) LASSERT (the_lnet.ln_init); LASSERT (the_lnet.ln_refcount > 0); - + LNET_LOCK(); md = lnet_handle2md(&mdh); @@ -299,14 +299,7 @@ LNetMDUnlink (lnet_handle_md_t 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); } diff --git a/lnet/lnet/lib-me.c b/lnet/lnet/lib-me.c index edfb8a83..c5b1286 100644 --- a/lnet/lnet/lib-me.c +++ b/lnet/lnet/lib-me.c @@ -119,25 +119,33 @@ LNetMEInsert(lnet_handle_me_t current_meh, 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 */ diff --git a/lnet/lnet/lib-msg.c b/lnet/lnet/lib-msg.c index c46ad1a..c5dfc2c 100644 --- a/lnet/lnet/lib-msg.c +++ b/lnet/lnet/lib-msg.c @@ -27,6 +27,18 @@ #include 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; @@ -167,12 +179,12 @@ lnet_finalize (lnet_ni_t *ni, lnet_msg_t *msg, int status) 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); -- 1.8.3.1