[DAPL2] DAPL Counters & 2.0.3 extensions to support counter retrieval.
[mirror/winof/.git] / ulp / dapl2 / dapl / common / dapl_lmr_free.c
1 /*\r
2  * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.\r
3  *\r
4  * This Software is licensed under one of the following licenses:\r
5  *\r
6  * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
7  *    available from the Open Source Initiative, see\r
8  *    http://www.opensource.org/licenses/cpl.php.\r
9  *\r
10  * 2) under the terms of the "The BSD License" a copy of which is\r
11  *    available from the Open Source Initiative, see\r
12  *    http://www.opensource.org/licenses/bsd-license.php.\r
13  *\r
14  * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
15  *    copy of which is available from the Open Source Initiative, see\r
16  *    http://www.opensource.org/licenses/gpl-license.php.\r
17  *\r
18  * Licensee has the right to choose one of the above licenses.\r
19  *\r
20  * Redistributions of source code must retain the above copyright\r
21  * notice and one of the license notices.\r
22  *\r
23  * Redistributions in binary form must reproduce both the above copyright\r
24  * notice, one of the license notices in the documentation\r
25  * and/or other materials provided with the distribution.\r
26  */\r
27 \r
28 /**********************************************************************\r
29  * \r
30  * MODULE: dapl_lmr_free.c\r
31  *\r
32  * PURPOSE: Memory management\r
33  *\r
34  * $Id:$\r
35  **********************************************************************/\r
36 \r
37 #include "dapl_lmr_util.h"\r
38 #include "dapl_adapter_util.h"\r
39 #include "dapl_ia_util.h"\r
40 \r
41 /*\r
42  * dapl_lmr_free\r
43  *\r
44  * DAPL Requirements Version xxx, 6.6.3.2\r
45  *\r
46  * Destroy an instance of the Local Memory Region\r
47  *\r
48  * Input:\r
49  *      lmr_handle\r
50  *\r
51  * Output:\r
52  *\r
53  * Returns:\r
54  *      DAT_SUCCESS\r
55  *      DAT_INVALID_HANDLE\r
56  *      DAT_INVALID_PARAMETER\r
57  *      DAT_INVALID_STATE \r
58  */\r
59 \r
60 DAT_RETURN DAT_API\r
61 dapl_lmr_free (\r
62     IN  DAT_LMR_HANDLE  lmr_handle )\r
63 {\r
64     DAPL_LMR            *lmr;\r
65     DAPL_PZ             *pz;\r
66     DAT_RETURN          dat_status;\r
67 \r
68     dapl_dbg_log (DAPL_DBG_TYPE_API, "dapl_lmr_free (%p)\n", lmr_handle);\r
69 \r
70     if ( DAPL_BAD_HANDLE (lmr_handle, DAPL_MAGIC_LMR) )\r
71     {\r
72         dat_status = DAT_ERROR (DAT_INVALID_HANDLE,DAT_INVALID_HANDLE_LMR);\r
73         goto bail;\r
74     }\r
75 \r
76     lmr = (DAPL_LMR *)lmr_handle;\r
77     pz = (DAPL_PZ *)lmr->param.pz_handle;\r
78     \r
79     DAPL_CNTR(pz->header.owner_ia, DCNT_IA_LMR_FREE);\r
80 \r
81     switch (lmr->param.mem_type)\r
82     {\r
83 #if defined(__KDAPL__)\r
84         case DAT_MEM_TYPE_PHYSICAL:\r
85 #else\r
86         case DAT_MEM_TYPE_SHARED_VIRTUAL:\r
87 #endif  /* defined(__KDAPL__) */\r
88         /* fall through */\r
89         case DAT_MEM_TYPE_VIRTUAL:\r
90         case DAT_MEM_TYPE_LMR:\r
91         {\r
92             if ( 0 != dapl_os_atomic_read (&lmr->lmr_ref_count) )\r
93             {\r
94                 return DAT_INVALID_STATE;\r
95             }\r
96 \r
97             dat_status = dapls_hash_remove (lmr->header.owner_ia->hca_ptr->lmr_hash_table, \r
98                                             lmr->param.lmr_context, NULL);\r
99             if (dat_status != DAT_SUCCESS)\r
100             {\r
101                 goto bail;\r
102             }\r
103 \r
104             dat_status = dapls_ib_mr_deregister (lmr);\r
105 \r
106             if (dat_status == DAT_SUCCESS)\r
107             {\r
108                 dapl_os_atomic_dec (&pz->pz_ref_count);\r
109                 dapl_lmr_dealloc (lmr);\r
110             }\r
111             else\r
112             {\r
113                 /*\r
114                  * Deregister failed; put it back in the\r
115                  * hash table.\r
116                  */\r
117                 dapls_hash_insert (lmr->header.owner_ia->hca_ptr->lmr_hash_table, \r
118                                    lmr->param.lmr_context, lmr);\r
119             }\r
120 \r
121             break;\r
122         }\r
123 #if defined(__KDAPL__)\r
124         case DAT_MEM_TYPE_PLATFORM:\r
125         case DAT_MEM_TYPE_IA:\r
126         case DAT_MEM_TYPE_BYPASS:\r
127         {\r
128             return DAT_ERROR (DAT_NOT_IMPLEMENTED,0);\r
129         }\r
130 #endif  /* defined(__KDAPL__) */\r
131         default:\r
132         {\r
133             dat_status = DAT_ERROR (DAT_INVALID_PARAMETER,DAT_INVALID_ARG1);\r
134             break;\r
135         }\r
136     }\r
137  bail:\r
138     return dat_status;\r
139 }\r