xref: /freebsd/contrib/ofed/opensm/include/vendor/osm_vendor_mlx_txn.h (revision 87181516ef48be852d5e5fee53c6e0dbfc62f21e)
1 /*
2  * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved.
3  * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
4  * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
5  *
6  * This software is available to you under a choice of one of two
7  * licenses.  You may choose to be licensed under the terms of the GNU
8  * General Public License (GPL) Version 2, available from the file
9  * COPYING in the main directory of this source tree, or the
10  * OpenIB.org BSD license below:
11  *
12  *     Redistribution and use in source and binary forms, with or
13  *     without modification, are permitted provided that the following
14  *     conditions are met:
15  *
16  *      - Redistributions of source code must retain the above
17  *        copyright notice, this list of conditions and the following
18  *        disclaimer.
19  *
20  *      - Redistributions in binary form must reproduce the above
21  *        copyright notice, this list of conditions and the following
22  *        disclaimer in the documentation and/or other materials
23  *        provided with the distribution.
24  *
25  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32  * SOFTWARE.
33  *
34  */
35 
36 #ifndef _OSMV_TXN_H_
37 #define _OSMV_TXN_H_
38 
39 #include <sys/types.h>
40 #include <unistd.h>
41 
42 #include <complib/cl_qmap.h>
43 #include <opensm/osm_madw.h>
44 #include <complib/cl_event_wheel.h>
45 
46 #include <vendor/osm_vendor_mlx_rmpp_ctx.h>
47 
48 #ifdef __cplusplus
49 #  define BEGIN_C_DECLS extern "C" {
50 #  define END_C_DECLS   }
51 #else				/* !__cplusplus */
52 #  define BEGIN_C_DECLS
53 #  define END_C_DECLS
54 #endif				/* __cplusplus */
55 
56 BEGIN_C_DECLS
57 
58 typedef enum _osmv_txn_rmpp_state {
59 
60 	OSMV_TXN_RMPP_NONE = 0,	/* Not part of RMPP transaction */
61 
62 	OSMV_TXN_RMPP_SENDER,
63 	OSMV_TXN_RMPP_RECEIVER
64 } osmv_txn_rmpp_state_t;
65 
66 typedef struct _osmv_rmpp_txfr {
67 
68 	osmv_txn_rmpp_state_t rmpp_state;
69 	boolean_t is_rmpp_init_by_peer;
70 	osmv_rmpp_send_ctx_t *p_rmpp_send_ctx;
71 	osmv_rmpp_recv_ctx_t *p_rmpp_recv_ctx;
72 
73 } osmv_rmpp_txfr_t;
74 
75 typedef struct _osmv_txn_ctx {
76 
77 	/* The original Transaction ID */
78 	uint64_t tid;
79 	/* The key by which the Transaction is stored */
80 	uint64_t key;
81 
82 	/* RMPP Send/Receive contexts, if applicable */
83 	osmv_rmpp_txfr_t rmpp_txfr;
84 
85 	/* A MAD that was sent during the transaction (request or response) */
86 	osm_madw_t *p_madw;
87 
88 	/* Reference to a log to enable tracing */
89 	osm_log_t *p_log;
90 
91 } osmv_txn_ctx_t;
92 
93 typedef struct _osmv_txn_mgr {
94 
95 	/* Container of all the transactions */
96 	cl_qmap_t *p_txn_map;
97 
98 	/* The timeouts DB */
99 	cl_event_wheel_t *p_event_wheel;
100 
101 	/* Reference to a log to enable tracing */
102 	osm_log_t *p_log;
103 
104 } osmv_txn_mgr_t;
105 
106 /* *    *   *   *   *   *   osmv_txn_ctx_t functions  *    *   *   *   *   *   *   *   */
107 
108 /*
109  * NAME
110  *   osmv_txn_init
111  *
112  * DESCRIPTION
113  *   allocs & inits the osmv_txn_ctx obj and insert it into the db
114  * SEE ALSO
115  *
116  */
117 ib_api_status_t
118 osmv_txn_init(IN osm_bind_handle_t h_bind,
119 	      IN uint64_t tid, IN uint64_t key, OUT osmv_txn_ctx_t ** pp_txn);
120 
121 /*
122  * NAME
123  *   osmv_rmpp_txfr_init_sender
124  *
125  * DESCRIPTION
126  *   init the rmpp send ctx in the transaction
127  *
128  * SEE ALSO
129  *
130  */
131 ib_api_status_t
132 osmv_txn_init_rmpp_sender(IN osm_bind_handle_t h_bind,
133 			  IN osmv_txn_ctx_t * p_txn, IN osm_madw_t * p_madw);
134 
135 /*
136  * NAME
137  *   osmv_rmpp_txfr_init_receiver
138  *
139  * DESCRIPTION
140  *   init the rmpp recv ctx in the transaction
141  *
142  * SEE ALSO
143  *
144  */
145 ib_api_status_t
146 osmv_txn_init_rmpp_receiver(IN osm_bind_handle_t h_bind,
147 			    IN osmv_txn_ctx_t * p_txn,
148 			    IN boolean_t is_init_by_peer);
149 
150 /*
151  * NAME
152  *   osmv_txn_done
153  *
154  * DESCRIPTION
155  *   destroys txn object and removes it from the db
156  *
157  * SEE ALSO
158  *
159  */
160 void
161 osmv_txn_done(IN osm_bind_handle_t h_bind,
162 	      IN uint64_t key, IN boolean_t is_in_cb);
163 /*
164  * NAME
165  *   osmv_txn_get_tid
166  *
167  * DESCRIPTION
168  *   returns tid of the transaction
169  * SEE ALSO
170  *
171  */
osmv_txn_get_tid(IN osmv_txn_ctx_t * p_txn)172 static inline uint64_t osmv_txn_get_tid(IN osmv_txn_ctx_t * p_txn)
173 {
174 	CL_ASSERT(NULL != p_txn);
175 	return p_txn->tid;
176 }
177 
178 /*
179  * NAME
180  *   osmv_txn_get_key
181  *
182  * DESCRIPTION
183  *   returns key of the transaction
184  * SEE ALSO
185  *
186  */
187 
osmv_txn_get_key(IN osmv_txn_ctx_t * p_txn)188 static inline uint64_t osmv_txn_get_key(IN osmv_txn_ctx_t * p_txn)
189 {
190 	CL_ASSERT(NULL != p_txn);
191 	return p_txn->key;
192 }
193 
194 /*
195  * NAME
196  *   osmv_txn_is_rmpp_init_by_peer
197  *
198  * DESCRIPTION
199  *   returns whether the rmpp txfr was init by the peer
200  *
201  * SEE ALSO
202  *
203  */
osmv_txn_is_rmpp_init_by_peer(IN osmv_txn_ctx_t * p_txn)204 static inline boolean_t osmv_txn_is_rmpp_init_by_peer(IN osmv_txn_ctx_t * p_txn)
205 {
206 	CL_ASSERT(NULL != p_txn);
207 	return p_txn->rmpp_txfr.is_rmpp_init_by_peer;
208 }
209 
210 /*
211  * NAME
212  *   osmv_txn_get_rmpp_send_ctx
213  *
214  * DESCRIPTION
215  *   returns osmv_rmpp_send_ctx obj
216  * SEE ALSO
217  *
218  */
osmv_txn_get_rmpp_send_ctx(IN osmv_txn_ctx_t * p_txn)219 static inline osmv_rmpp_send_ctx_t *osmv_txn_get_rmpp_send_ctx(IN osmv_txn_ctx_t
220 							       * p_txn)
221 {
222 	CL_ASSERT(NULL != p_txn);
223 	return p_txn->rmpp_txfr.p_rmpp_send_ctx;
224 }
225 
226 /*
227  * NAME
228  *   osmv_txn_get_rmpp_recv_ctx
229  *
230  * DESCRIPTION
231  *   returns osmv_rmpp_recv_ctx obj
232  * SEE ALSO
233  *
234  */
osmv_txn_get_rmpp_recv_ctx(IN osmv_txn_ctx_t * p_txn)235 static inline osmv_rmpp_recv_ctx_t *osmv_txn_get_rmpp_recv_ctx(IN osmv_txn_ctx_t
236 							       * p_txn)
237 {
238 	CL_ASSERT(NULL != p_txn);
239 	return p_txn->rmpp_txfr.p_rmpp_recv_ctx;
240 }
241 
242 /*
243  * NAME
244  *   osmv_txn_get_rmpp_state
245  *
246  * DESCRIPTION
247  *   returns the rmpp role of the transactino ( send/ recv)
248  * SEE ALSO
249  *
250  */
251 static inline osmv_txn_rmpp_state_t
osmv_txn_get_rmpp_state(IN osmv_txn_ctx_t * p_txn)252 osmv_txn_get_rmpp_state(IN osmv_txn_ctx_t * p_txn)
253 {
254 	CL_ASSERT(NULL != p_txn);
255 	return p_txn->rmpp_txfr.rmpp_state;
256 }
257 
258 /*
259  * NAME
260  *   osmv_txn_set_rmpp_state
261  *
262  * DESCRIPTION
263  *   sets the rmpp role of the transaction (send/ recv)
264  * SEE ALSO
265  *
266  */
267 static inline void
osmv_txn_set_rmpp_state(IN osmv_txn_ctx_t * p_txn,IN osmv_txn_rmpp_state_t state)268 osmv_txn_set_rmpp_state(IN osmv_txn_ctx_t * p_txn,
269 			IN osmv_txn_rmpp_state_t state)
270 {
271 	CL_ASSERT(NULL != p_txn);
272 	p_txn->rmpp_txfr.rmpp_state = state;
273 }
274 
275 /*
276  * NAME
277  *   osmv_txn_get_madw
278  *
279  * DESCRIPTION
280  *   returns the requester madw
281  * SEE ALSO
282  *
283  */
osmv_txn_get_madw(IN osmv_txn_ctx_t * p_txn)284 static inline osm_madw_t *osmv_txn_get_madw(IN osmv_txn_ctx_t * p_txn)
285 {
286 	CL_ASSERT(NULL != p_txn);
287 	return p_txn->p_madw;
288 }
289 
290 /*
291  * NAME
292  *   osmv_txn_set_madw
293  *
294  * DESCRIPTION
295  *   sets the requester madw
296  * SEE ALSO
297  *
298  */
299 static inline void
osmv_txn_set_madw(IN osmv_txn_ctx_t * p_txn,IN osm_madw_t * p_madw)300 osmv_txn_set_madw(IN osmv_txn_ctx_t * p_txn, IN osm_madw_t * p_madw)
301 {
302 	CL_ASSERT(NULL != p_txn);
303 	p_txn->p_madw = p_madw;
304 }
305 
306 /*
307  * NAME
308  *  osmv_txn_set_timeout_ev
309  *
310  * DESCRIPTION
311  *
312  * SEE ALSO
313  *
314  */
315 ib_api_status_t
316 osmv_txn_set_timeout_ev(IN osm_bind_handle_t h_bind,
317 			IN uint64_t key, IN uint64_t msec);
318 /*
319  * NAME
320  *  osmv_txn_remove_timeout_ev
321  *
322  * DESCRIPTION
323 
324  * SEE ALSO
325  *
326  */
327 void osmv_txn_remove_timeout_ev(IN osm_bind_handle_t h_bind, IN uint64_t key);
328 /*
329  * NAME
330  *  osmv_txn_lookup
331  *
332  * DESCRIPTION
333  *   get a transaction by its key
334  *
335  * SEE ALSO
336  *
337  */
338 ib_api_status_t
339 osmv_txn_lookup(IN osm_bind_handle_t h_bind,
340 		IN uint64_t key, OUT osmv_txn_ctx_t ** pp_txn);
341 
342 void osmv_txn_abort_rmpp_txns(IN osm_bind_handle_t h_bind);
343 
344 /*      *       *       *       *       *       *       *       *       *       *       *       */
345 /*
346  * NAME
347  *  osmv_txnmgr_init
348  *
349  * DESCRIPTION
350  *  c'tor for txn mgr obj
351  * SEE ALSO
352  *
353  */
354 ib_api_status_t
355 osmv_txnmgr_init(IN osmv_txn_mgr_t * p_tx_mgr,
356 		 IN osm_log_t * p_log, IN cl_spinlock_t * p_lock);
357 
358 /*
359  * NAME
360  *  osmv_txnmgr_done
361  *
362  * DESCRIPTION
363  *  c'tor for txn mgr obj
364  * SEE ALSO
365  *
366  */
367 void osmv_txnmgr_done(IN osm_bind_handle_t h_bind);
368 
369 void osmv_txn_lock(IN osm_bind_handle_t h_bind);
370 void osmv_txn_unlock(IN osm_bind_handle_t h_bind);
371 
osmv_txn_uniq_key(IN uint64_t tid)372 inline static uint64_t osmv_txn_uniq_key(IN uint64_t tid)
373 {
374 	uint64_t pid = getpid();
375 
376 	return ((pid << 32) | (tid & 0xFFFFFFFF));
377 }
378 
379 END_C_DECLS
380 #endif				/* _OSMV_TXN_H_ */
381