From 4bd9bf53728260d38efc74cac981318fe31280cd Mon Sep 17 00:00:00 2001 From: Liang Zhen Date: Sat, 26 May 2012 21:56:46 +0800 Subject: [PATCH] LU-56 lnet: add lnet_*_free_locked for LNet 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 Change-Id: I4686d83fc08695f117bf6b3b53d5ad56fb03bcd1 Reviewed-on: http://review.whamcloud.com/2919 Reviewed-by: Andreas Dilger Reviewed-by: Doug Oucharek Tested-by: Hudson Tested-by: Maloo --- lnet/include/lnet/lib-lnet.h | 98 ++++++++++++++++++++++++++++++-------------- lnet/lnet/lib-eq.c | 6 +-- lnet/lnet/lib-md.c | 6 +-- lnet/lnet/lib-me.c | 6 +-- lnet/lnet/lib-move.c | 10 ++--- lnet/lnet/lib-msg.c | 2 +- 6 files changed, 82 insertions(+), 46 deletions(-) diff --git a/lnet/include/lnet/lib-lnet.h b/lnet/include/lnet/lib-lnet.h index 8ab64d9..4b6c25f 100644 --- a/lnet/include/lnet/lib-lnet.h +++ b/lnet/include/lnet/lib-lnet.h @@ -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); diff --git a/lnet/lnet/lib-eq.c b/lnet/lnet/lib-eq.c index e4b544d..23f94be 100644 --- a/lnet/lnet/lib-eq.c +++ b/lnet/lnet/lib-eq.c @@ -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(); diff --git a/lnet/lnet/lib-md.c b/lnet/lnet/lib-md.c index 71b84bc..464f9aa 100644 --- a/lnet/lnet/lib-md.c +++ b/lnet/lnet/lib-md.c @@ -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); diff --git a/lnet/lnet/lib-me.c b/lnet/lnet/lib-me.c index 819263a..c10828d 100644 --- a/lnet/lnet/lib-me.c +++ b/lnet/lnet/lib-me.c @@ -215,7 +215,7 @@ LNetMEInsert(lnet_handle_me_t current_meh, current_me = lnet_handle2me(¤t_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 diff --git a/lnet/lnet/lib-move.c b/lnet/lnet/lib-move.c index e7bb73e..8e949a4 100644 --- a/lnet/lnet/lib-move.c +++ b/lnet/lnet/lib-move.c @@ -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), diff --git a/lnet/lnet/lib-msg.c b/lnet/lnet/lib-msg.c index 3907aa8..9f1ad48 100644 --- a/lnet/lnet/lib-msg.c +++ b/lnet/lnet/lib-msg.c @@ -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); } -- 1.8.3.1