Whamcloud - gitweb
b=20973 Doxygen comments for LNet API
[fs/lustre-release.git] / lnet / include / lnet / types.h
1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=8:tabstop=8:
3  *
4  * GPL HEADER START
5  *
6  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 only,
10  * as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License version 2 for more details (a copy is included
16  * in the LICENSE file that accompanied this code).
17  *
18  * You should have received a copy of the GNU General Public License
19  * version 2 along with this program; If not, see
20  * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
21  *
22  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
23  * CA 95054 USA or visit www.sun.com if you need additional information or
24  * have any questions.
25  *
26  * GPL HEADER END
27  */
28 /*
29  * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
30  * Use is subject to license terms.
31  */
32 /*
33  * This file is part of Lustre, http://www.lustre.org/
34  * Lustre is a trademark of Sun Microsystems, Inc.
35  */
36
37 #ifndef __LNET_TYPES_H__
38 #define __LNET_TYPES_H__
39
40 /** \addtogroup lnet
41  * @{ */
42
43 #include <libcfs/libcfs.h>
44
45 /** \addtogroup lnet_addr
46  * @{ */
47
48 /** Portal reserved for LNet's own use.
49  * \see lustre/include/lustre/lustre_idl.h for Lustre portal assignments.
50  */
51 #define LNET_RESERVED_PORTAL      0
52
53 /**
54  * Address of an end-point in an LNet network.
55  *
56  * A node can have multiple end-points and hence multiple addresses.
57  * An LNet network can be a simple network (e.g. tcp0) or a network of
58  * LNet networks connected by LNet routers. Therefore an end-point address
59  * has two parts: network ID, and address within a network.
60  *
61  * \see LNET_NIDNET, LNET_NIDADDR, and LNET_MKNID.
62  */
63 typedef __u64 lnet_nid_t;
64 /**
65  * ID of a process in a node. Shortened as PID to distinguish from
66  * lnet_process_id_t, the global process ID.
67  */
68 typedef __u32 lnet_pid_t;
69
70 /** wildcard NID that matches any end-point address */
71 #define LNET_NID_ANY      ((lnet_nid_t) -1)
72 /** wildcard PID that matches any lnet_pid_t */
73 #define LNET_PID_ANY      ((lnet_pid_t) -1)
74
75 #ifdef CRAY_XT3
76 typedef __u32 lnet_uid_t;
77 #define LNET_UID_ANY      ((lnet_uid_t) -1)
78 #endif
79
80 #define LNET_PID_RESERVED 0xf0000000 /* reserved bits in PID */
81 #define LNET_PID_USERFLAG 0x80000000 /* set in userspace peers */
82
83 #define LNET_TIME_FOREVER    (-1)
84
85 /**
86  * Objects maintained by the LNet are accessed through handles. Handle types
87  * have names of the form lnet_handle_xx_t, where xx is one of the two letter
88  * object type codes ('eq' for event queue, 'md' for memory descriptor, and
89  * 'me' for match entry).
90  * Each type of object is given a unique handle type to enhance type checking.
91  * The type lnet_handle_any_t can be used when a generic handle is needed.
92  * Every handle value can be converted into a value of type lnet_handle_any_t
93  * without loss of information.
94  */
95 typedef struct {
96         __u64         cookie;
97 } lnet_handle_any_t;
98
99 typedef lnet_handle_any_t lnet_handle_eq_t;
100 typedef lnet_handle_any_t lnet_handle_md_t;
101 typedef lnet_handle_any_t lnet_handle_me_t;
102
103 #define LNET_WIRE_HANDLE_COOKIE_NONE   (-1)
104
105 /**
106  * Invalidate handle \a h.
107  */
108 static inline void LNetInvalidateHandle(lnet_handle_any_t *h)
109 {
110         h->cookie = LNET_WIRE_HANDLE_COOKIE_NONE;
111 }
112
113 /**
114  * Compare handles \a h1 and \a h2.
115  *
116  * \return 1 if handles are equal, 0 if otherwise.
117  */
118 static inline int LNetHandleIsEqual (lnet_handle_any_t h1, lnet_handle_any_t h2)
119 {
120         return (h1.cookie == h2.cookie);
121 }
122
123 /**
124  * Check whether handle \a h is invalid.
125  *
126  * \return 1 if handle is invalid, 0 if valid.
127  */
128 static inline int LNetHandleIsInvalid(lnet_handle_any_t h)
129 {
130         return (LNET_WIRE_HANDLE_COOKIE_NONE == h.cookie);
131 }
132
133 /**
134  * Global process ID.
135  */
136 typedef struct {
137         /** node id */
138         lnet_nid_t nid;
139         /** process id */
140         lnet_pid_t pid;
141 } lnet_process_id_t;
142 /** @} lnet_addr */
143
144 /** \addtogroup lnet_me
145  * @{ */
146
147 /**
148  * Specifies whether the match entry or memory descriptor should be unlinked
149  * automatically (LNET_UNLINK) or not (LNET_RETAIN).
150  */
151 typedef enum {
152         LNET_RETAIN = 0,
153         LNET_UNLINK
154 } lnet_unlink_t;
155
156 /**
157  * Values of the type lnet_ins_pos_t are used to control where a new match
158  * entry is inserted. The value LNET_INS_BEFORE is used to insert the new
159  * entry before the current entry or before the head of the list. The value
160  * LNET_INS_AFTER is used to insert the new entry after the current entry
161  * or after the last item in the list.
162  */
163 typedef enum {
164         LNET_INS_BEFORE,
165         LNET_INS_AFTER
166 } lnet_ins_pos_t;
167
168 /** @} lnet_me */
169
170 /** \addtogroup lnet_md
171  * @{ */
172
173 /**
174  * Defines the visible parts of a memory descriptor. Values of this type
175  * are used to initialize memory descriptors.
176  */
177 typedef struct {
178         /**
179          * Specify the memory region associated with the memory descriptor.
180          * If the options field has:
181          * - LNET_MD_KIOV bit set: The start field points to the starting
182          * address of an array of lnet_kiov_t and the length field specifies
183          * the number of entries in the array. The length can't be bigger
184          * than LNET_MAX_IOV. The lnet_kiov_t is used to describe page-based
185          * fragments that are not necessarily mapped in virtal memory.
186          * - LNET_MD_IOVEC bit set: The start field points to the starting
187          * address of an array of struct iovec and the length field specifies
188          * the number of entries in the array. The length can't be bigger
189          * than LNET_MAX_IOV. The struct iovec is used to describe fragments
190          * that have virtual addresses.
191          * - Otherwise: The memory region is contiguous. The start field
192          * specifies the starting address for the memory region and the
193          * length field specifies its length.
194          *
195          * When the memory region is fragmented, all fragments but the first
196          * one must start on page boundary, and all but the last must end on
197          * page boundary.
198          */
199         void            *start;
200         unsigned int     length;
201         /**
202          * Specifies the maximum number of operations that can be performed
203          * on the memory descriptor. An operation is any action that could
204          * possibly generate an event. In the usual case, the threshold value
205          * is decremented for each operation on the MD. When the threshold
206          * drops to zero, the MD becomes inactive and does not respond to
207          * operations. A threshold value of LNET_MD_THRESH_INF indicates that
208          * there is no bound on the number of operations that may be applied
209          * to a MD.
210          */
211         int              threshold;
212         /**
213          * Specifies the largest incoming request that the memory descriptor
214          * should respond to. When the unused portion of a MD (length -
215          * local offset) falls below this value, the MD becomes inactive and
216          * does not respond to further operations. This value is only used
217          * if the LNET_MD_MAX_SIZE option is set.
218          */
219         int              max_size;
220         /**
221          * Specifies the behavior of the memory descriptor. A bitwise OR
222          * of the following values can be used:
223          * - LNET_MD_OP_PUT: The LNet PUT operation is allowed on this MD.
224          * - LNET_MD_OP_GET: The LNet GET operation is allowed on this MD.
225          * - LNET_MD_MANAGE_REMOTE: The offset used in accessing the memory
226          *   region is provided by the incoming request. By default, the
227          *   offset is maintained locally. When maintained locally, the
228          *   offset is incremented by the length of the request so that
229          *   the next operation (PUT or GET) will access the next part of
230          *   the memory region. Note that only one offset variable exists
231          *   per memory descriptor. If both PUT and GET operations are
232          *   performed on a memory descriptor, the offset is updated each time.
233          * - LNET_MD_TRUNCATE: The length provided in the incoming request can
234          *   be reduced to match the memory available in the region (determined
235          *   by subtracting the offset from the length of the memory region).
236          *   By default, if the length in the incoming operation is greater
237          *   than the amount of memory available, the operation is rejected.
238          * - LNET_MD_ACK_DISABLE: An acknowledgment should not be sent for
239          *   incoming PUT operations, even if requested. By default,
240          *   acknowledgments are sent for PUT operations that request an
241          *   acknowledgment. Acknowledgments are never sent for GET operations.
242          *   The data sent in the REPLY serves as an implicit acknowledgment.
243          * - LNET_MD_KIOV: The start and length fields specify an array of
244          *   lnet_kiov_t.
245          * - LNET_MD_IOVEC: The start and length fields specify an array of
246          *   struct iovec.
247          * - LNET_MD_MAX_SIZE: The max_size field is valid.
248          *
249          * Note:
250          * - LNET_MD_KIOV or LNET_MD_IOVEC allows for a scatter/gather
251          *   capability for memory descriptors. They can't be both set.
252          * - When LNET_MD_MAX_SIZE is set, the total length of the memory
253          *   region (i.e. sum of all fragment lengths) must not be less than
254          *   \a max_size.
255          */
256         unsigned int     options;
257         /**
258          * A user-specified value that is associated with the memory
259          * descriptor. The value does not need to be a pointer, but must fit
260          * in the space used by a pointer. This value is recorded in events
261          * associated with operations on this MD.
262          */
263         void            *user_ptr;
264         /**
265          * A handle for the event queue used to log the operations performed on
266          * the memory region. If this argument is a NULL handle (i.e. nullified
267          * by LNetInvalidateHandle()), operations performed on this memory
268          * descriptor are not logged.
269          */
270         lnet_handle_eq_t eq_handle;
271 } lnet_md_t;
272
273 /* Max Transfer Unit (minimum supported everywhere) */
274 #define LNET_MTU_BITS   20
275 #define LNET_MTU        (1<<LNET_MTU_BITS)
276
277 /** limit on the number of fragments in discontiguous MDs */
278 #define LNET_MAX_IOV    256
279
280 /* Max payload size */
281 #ifndef LNET_MAX_PAYLOAD
282 # error "LNET_MAX_PAYLOAD must be defined in config.h"
283 #else
284 # if (LNET_MAX_PAYLOAD < LNET_MTU)
285 #  error "LNET_MAX_PAYLOAD too small - error in configure --with-max-payload-mb"
286 # elif defined(__KERNEL__)
287 #  if (LNET_MAX_PAYLOAD > (PAGE_SIZE * LNET_MAX_IOV))
288 /*  PAGE_SIZE is a constant: check with cpp! */
289 #   error "LNET_MAX_PAYLOAD too large - error in configure --with-max-payload-mb"
290 #  endif
291 # endif
292 #endif
293
294 /**
295  * Options for the MD structure. See lnet_md_t::options.
296  */
297 #define LNET_MD_OP_PUT               (1 << 0)
298 /** See lnet_md_t::options. */
299 #define LNET_MD_OP_GET               (1 << 1)
300 /** See lnet_md_t::options. */
301 #define LNET_MD_MANAGE_REMOTE        (1 << 2)
302 /* unused                            (1 << 3) */
303 /** See lnet_md_t::options. */
304 #define LNET_MD_TRUNCATE             (1 << 4)
305 /** See lnet_md_t::options. */
306 #define LNET_MD_ACK_DISABLE          (1 << 5)
307 /** See lnet_md_t::options. */
308 #define LNET_MD_IOVEC                (1 << 6)
309 /** See lnet_md_t::options. */
310 #define LNET_MD_MAX_SIZE             (1 << 7)
311 /** See lnet_md_t::options. */
312 #define LNET_MD_KIOV                 (1 << 8)
313
314 /* For compatibility with Cray Portals */
315 #define LNET_MD_PHYS                         0
316
317 /** Infinite threshold on MD operations. See lnet_md_t::threshold */
318 #define LNET_MD_THRESH_INF       (-1)
319
320 /* NB lustre portals uses struct iovec internally! */
321 typedef struct iovec lnet_md_iovec_t;
322
323 /**
324  * A page-based fragment of a MD.
325  */
326 typedef struct {
327         /** Pointer to the page where the fragment resides */
328         cfs_page_t      *kiov_page;
329         /** Length in bytes of the fragment */
330         unsigned int     kiov_len;
331         /**
332          * Starting offset of the fragment within the page. Note that the
333          * end of the fragment must not pass the end of the page; i.e.,
334          * kiov_len + kiov_offset <= CFS_PAGE_SIZE.
335          */
336         unsigned int     kiov_offset;
337 } lnet_kiov_t;
338 /** @} lnet_md */
339
340 /** \addtogroup lnet_eq
341  * @{ */
342
343 /**
344  * Six types of events can be logged in an event queue.
345  */
346 typedef enum {
347         /** An incoming GET operation has completed on the MD. */
348         LNET_EVENT_GET,
349         /**
350          * An incoming PUT operation has completed on the MD. The
351          * underlying layers will not alter the memory (on behalf of this
352          * operation) once this event has been logged.
353          */
354         LNET_EVENT_PUT,
355         /**
356          * A REPLY operation has completed. This event is logged after the
357          * data (if any) from the REPLY has been written into the MD.
358          */
359         LNET_EVENT_REPLY,
360         /** An acknowledgment has been received. */
361         LNET_EVENT_ACK,
362         /**
363          * An outgoing send (PUT or GET) operation has completed. This event
364          * is logged after the entire buffer has been sent and it is safe for
365          * the caller to reuse the buffer.
366          *
367          * Note:
368          * - The LNET_EVENT_SEND doesn't guarantee message delivery. It can
369          *   happen even when the message has not yet been put out on wire.
370          * - It's unsafe to assume that in an outgoing GET operation
371          *   the LNET_EVENT_SEND event would happen before the
372          *   LNET_EVENT_REPLY event. The same holds for LNET_EVENT_SEND and
373          *   LNET_EVENT_ACK events in an outgoing PUT operation.
374          */
375         LNET_EVENT_SEND,
376         /**
377          * A MD has been unlinked. Note that LNetMDUnlink() does not
378          * necessarily trigger an LNET_EVENT_UNLINK event.
379          * \see LNetMDUnlink
380          */
381         LNET_EVENT_UNLINK,
382 } lnet_event_kind_t;
383
384 #define LNET_SEQ_BASETYPE       long
385 typedef unsigned LNET_SEQ_BASETYPE lnet_seq_t;
386 #define LNET_SEQ_GT(a,b)        (((signed LNET_SEQ_BASETYPE)((a) - (b))) > 0)
387
388 /* XXX
389  * cygwin need the pragma line, not clear if it's needed in other places.
390  * checking!!!
391  */
392 #ifdef __CYGWIN__
393 #pragma pack(push, 4)
394 #endif
395
396 /**
397  * Information about an event on a MD.
398  */
399 typedef struct {
400         /** The identifier (nid, pid) of the target. */
401         lnet_process_id_t   target;
402         /** The identifier (nid, pid) of the initiator. */
403         lnet_process_id_t   initiator;
404         /**
405          * The NID of the immediate sender. If the request has been forwarded
406          * by routers, this is the NID of the last hop; otherwise it's the
407          * same as the initiator.
408          */
409         lnet_nid_t          sender;
410         /** Indicates the type of the event. */
411         lnet_event_kind_t   type;
412         /** The portal table index specified in the request */
413         unsigned int        pt_index;
414         /** A copy of the match bits specified in the request. */
415         __u64               match_bits;
416         /** The length (in bytes) specified in the request. */
417         unsigned int        rlength;
418         /**
419          * The length (in bytes) of the data that was manipulated by the
420          * operation. For truncated operations, the manipulated length will be
421          * the number of bytes specified by the MD (possibly with an offset,
422          * see lnet_md_t). For all other operations, the manipulated length
423          * will be the length of the requested operation, i.e. rlength.
424          */
425         unsigned int        mlength;
426         /**
427          * The handle to the MD associated with the event. The handle may be
428          * invalid if the MD has been unlinked.
429          */
430         lnet_handle_md_t    md_handle;
431         /**
432          * A snapshot of the state of the MD immediately after the event has
433          * been processed. In particular, the threshold field in md will
434          * reflect the value of the threshold after the operation occurred.
435          */
436         lnet_md_t           md;
437         /**
438          * 64 bits of out-of-band user data. Only valid for LNET_EVENT_PUT.
439          * \see LNetPut
440          */
441         __u64               hdr_data;
442         /**
443          * Indicates the completion status of the operation. It's 0 for
444          * successful operations, otherwise it's an error code.
445          */
446         int                 status;
447         /**
448          * Indicates whether the MD has been unlinked. Note that:
449          * - An event with unlinked set is the last event on the MD.
450          * - This field is also set for an explicit LNET_EVENT_UNLINK event.
451          * \see LNetMDUnlink
452          */
453         int                 unlinked;
454         /**
455          * The displacement (in bytes) into the memory region that the
456          * operation used. The offset can be determined by the operation for
457          * a remote managed MD or by the local MD.
458          * \see lnet_md_t::options
459          */
460         unsigned int        offset;
461 #ifdef CRAY_XT3
462         lnet_uid_t          uid;
463 #endif
464
465         /**
466          * The sequence number for this event. Sequence numbers are unique
467          * to each event.
468          */
469         volatile lnet_seq_t sequence;
470 } lnet_event_t;
471 #ifdef __CYGWIN__
472 #pragma pop
473 #endif
474
475 /**
476  * Event queue handler function type.
477  *
478  * The EQ handler runs for each event that is deposited into the EQ. The
479  * handler is supplied with a pointer to the event that triggered the
480  * handler invocation.
481  *
482  * The handler must not block, must be reentrant, and must not call any LNet
483  * API functions. It should return as quickly as possible.
484  */
485 typedef void (*lnet_eq_handler_t)(lnet_event_t *event);
486 #define LNET_EQ_HANDLER_NONE NULL
487 /** @} lnet_eq */
488
489 /** \addtogroup lnet_data
490  * @{ */
491
492 /**
493  * Specify whether an acknowledgment should be sent by target when the PUT
494  * operation completes (i.e., when the data has been written to a MD of the
495  * target process).
496  *
497  * \see lnet_md_t::options for the discussion on LNET_MD_ACK_DISABLE by which
498  * acknowledgments can be disabled for a MD.
499  */
500 typedef enum {
501         /** Request an acknowledgment */
502         LNET_ACK_REQ,
503         /** Request that no acknowledgment should be generated. */
504         LNET_NOACK_REQ
505 } lnet_ack_req_t;
506 /** @} lnet_data */
507
508 /** @} lnet */
509 #endif