Whamcloud - gitweb
b=15272
authorisaac <isaac>
Sat, 10 May 2008 18:24:33 +0000 (18:24 +0000)
committerisaac <isaac>
Sat, 10 May 2008 18:24:33 +0000 (18:24 +0000)
i=liangzhen,i=maxim:
-   ensure UNLINK event when MD unlinked via LNetMEUnlink.
-   removed trailing spaces.

lnet/ChangeLog
lnet/include/lnet/lib-lnet.h
lnet/klnds/o2iblnd/o2iblnd.c
lnet/lnet/lib-md.c
lnet/lnet/lib-me.c
lnet/lnet/lib-msg.c

index 48ac8c9..b09869e 100644 (file)
@@ -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
+
 
 -------------------------------------------------------------------------------
 
index 37dc5d4..a93354b 100644 (file)
@@ -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);
index b8a994a..f4bc290 100644 (file)
@@ -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;
index ecd8f07..731db56 100644 (file)
@@ -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);
         }
 
index edfb8a8..c5b1286 100644 (file)
@@ -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 */
index c46ad1a..c5dfc2c 100644 (file)
 #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;
@@ -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);