X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=inline;f=lnet%2Flnet%2Flib-md.c;h=c13993466e04193110387d1e0e26ee6f7589831f;hb=faeb94fe81e4646b3121c263521d30e0e83fa71f;hp=6c10ccf87d7de556b7c6aba93d2bda9352b90ca0;hpb=dd62978b709aebf3dda536f2230f1b79c5361d9c;p=fs%2Flustre-release.git diff --git a/lnet/lnet/lib-md.c b/lnet/lnet/lib-md.c index 6c10ccf..c139934 100644 --- a/lnet/lnet/lib-md.c +++ b/lnet/lnet/lib-md.c @@ -26,6 +26,8 @@ /* * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. + * + * Copyright (c) 2012, 2013, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -77,9 +79,9 @@ lnet_md_unlink(lnet_libmd_t *md) (*md->md_eq->eq_refs[cpt])--; } - LASSERT(!cfs_list_empty(&md->md_list)); - cfs_list_del_init(&md->md_list); - lnet_md_free_locked(md); + LASSERT(!list_empty(&md->md_list)); + list_del_init(&md->md_list); + lnet_md_free(md); } static int @@ -125,9 +127,6 @@ lnet_md_build(lnet_libmd_t *lmd, lnet_md_t *umd, int unlink) return -EINVAL; } else if ((umd->options & LNET_MD_KIOV) != 0) { -#ifndef __KERNEL__ - return -EINVAL; -#else lmd->md_niov = niov = umd->length; memcpy(lmd->md_iov.kiov, umd->start, niov * sizeof (lmd->md_iov.kiov[0])); @@ -135,7 +134,7 @@ lnet_md_build(lnet_libmd_t *lmd, lnet_md_t *umd, int unlink) for (i = 0; i < (int)niov; i++) { /* We take the page pointer on trust */ if (lmd->md_iov.kiov[i].kiov_offset + - lmd->md_iov.kiov[i].kiov_len > CFS_PAGE_SIZE ) + lmd->md_iov.kiov[i].kiov_len > PAGE_CACHE_SIZE) return -EINVAL; /* invalid length */ total_length += lmd->md_iov.kiov[i].kiov_len; @@ -147,7 +146,6 @@ lnet_md_build(lnet_libmd_t *lmd, lnet_md_t *umd, int unlink) (umd->max_size < 0 || umd->max_size > total_length)) // illegal max_size return -EINVAL; -#endif } else { /* contiguous */ lmd->md_length = umd->length; lmd->md_niov = niov = 1; @@ -192,8 +190,8 @@ lnet_md_link(lnet_libmd_t *md, lnet_handle_eq_t eq_handle, int cpt) lnet_res_lh_initialize(container, &md->md_lh); - LASSERT(cfs_list_empty(&md->md_list)); - cfs_list_add(&md->md_list, &container->rec_active); + LASSERT(list_empty(&md->md_list)); + list_add(&md->md_list, &container->rec_active); return 0; } @@ -217,7 +215,7 @@ lnet_md_deconstruct(lnet_libmd_t *lmd, lnet_md_t *umd) lnet_eq2handle(&umd->eq_handle, lmd->md_eq); } -int +static int lnet_md_validate(lnet_md_t *umd) { if (umd->start == NULL && umd->length != 0) { @@ -265,14 +263,13 @@ int LNetMDAttach(lnet_handle_me_t meh, lnet_md_t umd, lnet_unlink_t unlink, lnet_handle_md_t *handle) { - CFS_LIST_HEAD (matches); - CFS_LIST_HEAD (drops); + struct list_head matches = LIST_HEAD_INIT(matches); + struct list_head drops = LIST_HEAD_INIT(drops); struct lnet_me *me; struct lnet_libmd *md; int cpt; int rc; - LASSERT (the_lnet.ln_init); LASSERT (the_lnet.ln_refcount > 0); if (lnet_md_validate(&umd) != 0) @@ -319,7 +316,7 @@ LNetMDAttach(lnet_handle_me_t meh, lnet_md_t umd, return 0; failed: - lnet_md_free_locked(md); + lnet_md_free(md); lnet_res_unlock(cpt); return rc; @@ -349,7 +346,6 @@ LNetMDBind(lnet_md_t umd, lnet_unlink_t unlink, lnet_handle_md_t *handle) int cpt; int rc; - LASSERT (the_lnet.ln_init); LASSERT (the_lnet.ln_refcount > 0); if (lnet_md_validate(&umd) != 0) @@ -380,7 +376,7 @@ LNetMDBind(lnet_md_t umd, lnet_unlink_t unlink, lnet_handle_md_t *handle) return 0; failed: - lnet_md_free_locked(md); + lnet_md_free(md); lnet_res_unlock(cpt); return rc; @@ -389,7 +385,8 @@ EXPORT_SYMBOL(LNetMDBind); /** * Unlink the memory descriptor from any ME it may be linked to and release - * the internal resources associated with it. + * the internal resources associated with it. As a result, active messages + * associated with the MD may get aborted. * * This function does not free the memory region associated with the MD; * i.e., the memory the user allocated for this MD. If the ME associated with @@ -423,7 +420,6 @@ LNetMDUnlink (lnet_handle_md_t mdh) lnet_libmd_t *md; int cpt; - LASSERT(the_lnet.ln_init); LASSERT(the_lnet.ln_refcount > 0); cpt = lnet_cpt_of_cookie(mdh.cookie); @@ -435,15 +431,14 @@ LNetMDUnlink (lnet_handle_md_t mdh) return -ENOENT; } - /* If the MD is busy, lnet_md_unlink just marks it for deletion, and - * when the NAL is done, the completion event flags that the MD was - * unlinked. Otherwise, we enqueue an event now... */ - - if (md->md_eq != NULL && - md->md_refcount == 0) { - lnet_build_unlink_event(md, &ev); + md->md_flags |= LNET_MD_FLAG_ABORTED; + /* If the MD is busy, lnet_md_unlink just marks it for deletion, and + * when the LND is done, the completion event flags that the MD was + * unlinked. Otherwise, we enqueue an event now... */ + if (md->md_eq != NULL && md->md_refcount == 0) { + lnet_build_unlink_event(md, &ev); lnet_eq_enqueue_event(md->md_eq, &ev); - } + } lnet_md_unlink(md);