Whamcloud - gitweb
LU-56 lnet: add lnet_*_free_locked for LNet
authorLiang Zhen <liang@whamcloud.com>
Sat, 26 May 2012 13:56:46 +0000 (21:56 +0800)
committerOleg Drokin <green@whamcloud.com>
Tue, 5 Jun 2012 19:31:32 +0000 (15:31 -0400)
LNet has a set of internal functions lnet_*_free to release LNet
message or LNet descriptors (EQ, MD, ME), they require caller to
hold LNET_LOCK on calling, this is somehow confusing because
lnet_*_alloc should be called w/o any lock.
This patch add another set of functions named as lnet_*_free_locked
to replace original lnet_*_free which require caller to hold lock,
and still provide lnet_*_free which can be called w/o any lock.

This patch is just the first step work for LNet SMP improvements.

Signed-off-by: Liang Zhen <liang@whamcloud.com>
Change-Id: I4686d83fc08695f117bf6b3b53d5ad56fb03bcd1
Reviewed-on: http://review.whamcloud.com/2919
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Doug Oucharek <doug@whamcloud.com>
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
lnet/include/lnet/lib-lnet.h
lnet/lnet/lib-eq.c
lnet/lnet/lib-md.c
lnet/lnet/lib-me.c
lnet/lnet/lib-move.c
lnet/lnet/lib-msg.c

index 8ab64d9..4b6c25f 100644 (file)
@@ -171,10 +171,18 @@ lnet_eq_alloc (void)
 }
 
 static inline void
-lnet_eq_free (lnet_eq_t *eq)
+lnet_eq_free_locked(lnet_eq_t *eq)
 {
-        /* ALWAYS called with liblock held */
-        lnet_freelist_free(&the_lnet.ln_free_eqs, eq);
+       /* ALWAYS called with resource lock held */
+       lnet_freelist_free(&the_lnet.ln_free_eqs, eq);
+}
+
+static inline void
+lnet_eq_free(lnet_eq_t *eq)
+{
+       LNET_LOCK();
+       lnet_eq_free_locked(eq);
+       LNET_UNLOCK();
 }
 
 static inline lnet_libmd_t *
@@ -194,10 +202,18 @@ lnet_md_alloc (lnet_md_t *umd)
 }
 
 static inline void
-lnet_md_free (lnet_libmd_t *md)
+lnet_md_free_locked(lnet_libmd_t *md)
 {
-        /* ALWAYS called with liblock held */
-        lnet_freelist_free (&the_lnet.ln_free_mds, md);
+       /* ALWAYS called with resource lock held */
+       lnet_freelist_free(&the_lnet.ln_free_mds, md);
+}
+
+static inline void
+lnet_md_free(lnet_libmd_t *md)
+{
+       LNET_LOCK();
+       lnet_md_free_locked(md);
+       LNET_UNLOCK();
 }
 
 static inline lnet_me_t *
@@ -214,10 +230,18 @@ lnet_me_alloc (void)
 }
 
 static inline void
-lnet_me_free (lnet_me_t *me)
+lnet_me_free_locked(lnet_me_t *me)
 {
-        /* ALWAYS called with liblock held */
-        lnet_freelist_free (&the_lnet.ln_free_mes, me);
+       /* ALWAYS called with resource lock held */
+       lnet_freelist_free(&the_lnet.ln_free_mes, me);
+}
+
+static inline void
+lnet_me_free(lnet_me_t *me)
+{
+       LNET_LOCK();
+       lnet_me_free_locked(me);
+       LNET_UNLOCK();
 }
 
 static inline lnet_msg_t *
@@ -241,14 +265,22 @@ lnet_msg_alloc (void)
 }
 
 static inline void
+lnet_msg_free_locked(lnet_msg_t *msg)
+{
+       /* ALWAYS called with network lock held */
+       LASSERT(!msg->msg_onactivelist);
+       lnet_freelist_free(&the_lnet.ln_free_msgs, msg);
+}
+
+static inline void
 lnet_msg_free (lnet_msg_t *msg)
 {
-        /* ALWAYS called with liblock held */
-        LASSERT (!msg->msg_onactivelist);
-        lnet_freelist_free(&the_lnet.ln_free_msgs, msg);
+       LNET_LOCK();
+       lnet_msg_free_locked(msg);
+       LNET_UNLOCK();
 }
 
-#else
+#else /* !LNET_USE_LIB_FREELIST */
 
 static inline lnet_eq_t *
 lnet_eq_alloc (void)
@@ -261,10 +293,10 @@ lnet_eq_alloc (void)
 }
 
 static inline void
-lnet_eq_free (lnet_eq_t *eq)
+lnet_eq_free(lnet_eq_t *eq)
 {
-        /* ALWAYS called with liblock held */
-        LIBCFS_FREE(eq, sizeof(*eq));
+       /* ALWAYS called with resource lock held */
+       LIBCFS_FREE(eq, sizeof(*eq));
 }
 
 static inline lnet_libmd_t *
@@ -297,17 +329,17 @@ lnet_md_alloc (lnet_md_t *umd)
 }
 
 static inline void
-lnet_md_free (lnet_libmd_t *md)
+lnet_md_free(lnet_libmd_t *md)
 {
-        /* ALWAYS called with liblock held */
-        unsigned int  size;
+       /* ALWAYS called with resource lock held */
+       unsigned int  size;
 
-        if ((md->md_options & LNET_MD_KIOV) != 0)
-                size = offsetof(lnet_libmd_t, md_iov.kiov[md->md_niov]);
-        else
-                size = offsetof(lnet_libmd_t, md_iov.iov[md->md_niov]);
+       if ((md->md_options & LNET_MD_KIOV) != 0)
+               size = offsetof(lnet_libmd_t, md_iov.kiov[md->md_niov]);
+       else
+               size = offsetof(lnet_libmd_t, md_iov.iov[md->md_niov]);
 
-        LIBCFS_FREE(md, size);
+       LIBCFS_FREE(md, size);
 }
 
 static inline lnet_me_t *
@@ -323,8 +355,8 @@ lnet_me_alloc (void)
 static inline void
 lnet_me_free(lnet_me_t *me)
 {
-        /* ALWAYS called with liblock held */
-        LIBCFS_FREE(me, sizeof(*me));
+       /* ALWAYS called with resource lock held */
+       LIBCFS_FREE(me, sizeof(*me));
 }
 
 static inline lnet_msg_t *
@@ -348,11 +380,17 @@ lnet_msg_alloc(void)
 static inline void
 lnet_msg_free(lnet_msg_t *msg)
 {
-        /* ALWAYS called with liblock held */
-        LASSERT (!msg->msg_onactivelist);
-        LIBCFS_FREE(msg, sizeof(*msg));
+       /* ALWAYS called with network lock held */
+       LASSERT(!msg->msg_onactivelist);
+       LIBCFS_FREE(msg, sizeof(*msg));
 }
-#endif
+
+#define lnet_eq_free_locked(eq)                lnet_eq_free(eq)
+#define lnet_md_free_locked(md)                lnet_md_free(md)
+#define lnet_me_free_locked(me)                lnet_me_free(me)
+#define lnet_msg_free_locked(msg)      lnet_msg_free(msg)
+
+#endif /* LNET_USE_LIB_FREELIST */
 
 extern lnet_libhandle_t *lnet_lookup_cookie (__u64 cookie, int type);
 extern void lnet_initialise_handle (lnet_libhandle_t *lh, int type);
index e4b544d..23f94be 100644 (file)
@@ -94,9 +94,7 @@ LNetEQAlloc(unsigned int count, lnet_eq_handler_t callback,
 
         LIBCFS_ALLOC(eq->eq_events, count * sizeof(lnet_event_t));
         if (eq->eq_events == NULL) {
-                LNET_LOCK();
-                lnet_eq_free (eq);
-                LNET_UNLOCK();
+               lnet_eq_free(eq);
 
                 return -ENOMEM;
         }
@@ -163,7 +161,7 @@ LNetEQFree(lnet_handle_eq_t eqh)
 
         lnet_invalidate_handle (&eq->eq_lh);
         cfs_list_del (&eq->eq_list);
-        lnet_eq_free (eq);
+       lnet_eq_free_locked(eq);
 
         LNET_UNLOCK();
 
index 71b84bc..464f9aa 100644 (file)
@@ -77,7 +77,7 @@ lnet_md_unlink(lnet_libmd_t *md)
 
         LASSERT (!cfs_list_empty(&md->md_list));
         cfs_list_del_init (&md->md_list);
-        lnet_md_free(md);
+       lnet_md_free_locked(md);
 }
 
 /* must be called with LNET_LOCK held */
@@ -302,7 +302,7 @@ LNetMDAttach(lnet_handle_me_t meh, lnet_md_t umd,
                 }
         }
 
-        lnet_md_free (md);
+       lnet_md_free_locked(md);
 
         LNET_UNLOCK();
         return (rc);
@@ -356,7 +356,7 @@ LNetMDBind(lnet_md_t umd, lnet_unlink_t unlink, lnet_handle_md_t *handle)
                 return (0);
         }
 
-        lnet_md_free (md);
+       lnet_md_free_locked(md);
 
         LNET_UNLOCK();
         return (rc);
index 819263a..c10828d 100644 (file)
@@ -215,7 +215,7 @@ LNetMEInsert(lnet_handle_me_t current_meh,
 
         current_me = lnet_handle2me(&current_meh);
         if (current_me == NULL) {
-                lnet_me_free (new_me);
+               lnet_me_free_locked(new_me);
 
                 LNET_UNLOCK();
                 return -ENOENT;
@@ -226,7 +226,7 @@ LNetMEInsert(lnet_handle_me_t current_meh,
         ptl = &the_lnet.ln_portals[current_me->me_portal];
         if (lnet_portal_is_unique(ptl)) {
                 /* nosense to insertion on unique portal */
-                lnet_me_free (new_me);
+               lnet_me_free_locked(new_me);
                 LNET_UNLOCK();
                 return -EPERM;
         }
@@ -310,7 +310,7 @@ lnet_me_unlink(lnet_me_t *me)
         }
 
         lnet_invalidate_handle (&me->me_lh);
-        lnet_me_free(me);
+       lnet_me_free_locked(me);
 }
 
 #if 0
index e7bb73e..8e949a4 100644 (file)
@@ -1574,7 +1574,7 @@ lnet_drop_delayed_put(lnet_msg_t *msg, char *reason)
         lnet_peer_decref_locked(msg->msg_rxpeer);
         msg->msg_rxpeer = NULL;
 
-        lnet_msg_free(msg);
+       lnet_msg_free_locked(msg);
 
         LNET_UNLOCK();
 }
@@ -2400,7 +2400,7 @@ lnet_parse(lnet_ni_t *ni, lnet_hdr_t *hdr, lnet_nid_t from_nid,
                 lnet_peer_decref_locked(msg->msg_rxpeer);
                 msg->msg_rxpeer = NULL;
         }
-        lnet_msg_free(msg);                     /* expects LNET_LOCK held */
+       lnet_msg_free_locked(msg);      /* expects LNET_LOCK held */
         LNET_UNLOCK();
 
  drop:
@@ -2485,7 +2485,7 @@ LNetPut(lnet_nid_t self, lnet_handle_md_t mdh, lnet_ack_req_t ack,
 
         md = lnet_handle2md(&mdh);
         if (md == NULL || md->md_threshold == 0 || md->md_me != NULL) {
-                lnet_msg_free(msg);
+               lnet_msg_free_locked(msg);
 
                 CERROR("Dropping PUT ("LPU64":%d:%s): MD (%d) invalid\n",
                        match_bits, portal, libcfs_id2str(target),
@@ -2613,7 +2613,7 @@ lnet_create_reply_msg (lnet_ni_t *ni, lnet_msg_t *getmsg)
         return msg;
 
  drop_msg:
-        lnet_msg_free(msg);
+       lnet_msg_free_locked(msg);
  drop:
         the_lnet.ln_counters.drop_count++;
         the_lnet.ln_counters.drop_length += getmd->md_length;
@@ -2690,7 +2690,7 @@ LNetGet(lnet_nid_t self, lnet_handle_md_t mdh,
 
         md = lnet_handle2md(&mdh);
         if (md == NULL || md->md_threshold == 0 || md->md_me != NULL) {
-                lnet_msg_free(msg);
+               lnet_msg_free_locked(msg);
 
                 CERROR("Dropping GET ("LPU64":%d:%s): MD (%d) invalid\n",
                        match_bits, portal, libcfs_id2str(target),
index 3907aa8..9f1ad48 100644 (file)
@@ -147,7 +147,7 @@ lnet_complete_msg_locked(lnet_msg_t *msg)
         msg->msg_onactivelist = 0;
         cfs_list_del (&msg->msg_activelist);
         the_lnet.ln_counters.msgs_alloc--;
-        lnet_msg_free(msg);
+       lnet_msg_free_locked(msg);
 }