From cc025e667464672edd25da819e106854c220e668 Mon Sep 17 00:00:00 2001 From: Quentin Bouget Date: Thu, 16 Jun 2016 17:46:42 -0400 Subject: [PATCH] LU-8249 lnet: potential deadlock in lnet Fixes potential deadlock in LNetMDAttach (vfree must not be called in interrupt context in linux kernel versions prior to 3.10). Signed-off-by: Quentin Bouget Change-Id: I1b421b470bab97d58f441040c39b9f1caf11b1fe Reviewed-on: http://review.whamcloud.com/20676 Reviewed-by: Doug Oucharek Tested-by: Jenkins Tested-by: Maloo Reviewed-by: James Simmons Reviewed-by: Henri Doreau Reviewed-by: Oleg Drokin --- lnet/lnet/lib-md.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/lnet/lnet/lib-md.c b/lnet/lnet/lib-md.c index c139934..4c6fb17 100644 --- a/lnet/lnet/lib-md.c +++ b/lnet/lnet/lib-md.c @@ -285,11 +285,12 @@ LNetMDAttach(lnet_handle_me_t meh, lnet_md_t umd, return -ENOMEM; rc = lnet_md_build(md, &umd, unlink); + if (rc != 0) + goto out_free; + cpt = lnet_cpt_of_cookie(meh.cookie); lnet_res_lock(cpt); - if (rc != 0) - goto failed; me = lnet_handle2me(&meh); if (me == NULL) @@ -300,7 +301,7 @@ LNetMDAttach(lnet_handle_me_t meh, lnet_md_t umd, rc = lnet_md_link(md, umd.eq_handle, cpt); if (rc != 0) - goto failed; + goto out_unlock; /* attach this MD to portal of ME and check if it matches any * blocked msgs on this portal */ @@ -315,10 +316,10 @@ LNetMDAttach(lnet_handle_me_t meh, lnet_md_t umd, return 0; - failed: - lnet_md_free(md); - +out_unlock: lnet_res_unlock(cpt); +out_free: + lnet_md_free(md); return rc; } EXPORT_SYMBOL(LNetMDAttach); @@ -361,24 +362,25 @@ LNetMDBind(lnet_md_t umd, lnet_unlink_t unlink, lnet_handle_md_t *handle) return -ENOMEM; rc = lnet_md_build(md, &umd, unlink); + if (rc != 0) + goto out_free; cpt = lnet_res_lock_current(); - if (rc != 0) - goto failed; rc = lnet_md_link(md, umd.eq_handle, cpt); if (rc != 0) - goto failed; + goto out_unlock; lnet_md2handle(handle, md); lnet_res_unlock(cpt); return 0; - failed: - lnet_md_free(md); - + out_unlock: lnet_res_unlock(cpt); + + out_free: + lnet_md_free(md); return rc; } EXPORT_SYMBOL(LNetMDBind); -- 1.8.3.1