• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * GPL HEADER START
3  *
4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 only,
8  * as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License version 2 for more details (a copy is included
14  * in the LICENSE file that accompanied this code).
15  *
16  * You should have received a copy of the GNU General Public License
17  * version 2 along with this program; If not, see
18  * http://www.gnu.org/licenses/gpl-2.0.html
19  *
20  * GPL HEADER END
21  */
22 /*
23  * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
24  * Use is subject to license terms.
25  *
26  * Copyright (c) 2012 - 2015, Intel Corporation.
27  */
28 /*
29  * This file is part of Lustre, http://www.lustre.org/
30  * Lustre is a trademark of Seagate, Inc.
31  */
32 
33 #ifndef __LNET_TYPES_H__
34 #define __LNET_TYPES_H__
35 
36 #include <linux/types.h>
37 
38 /** \addtogroup lnet
39  * @{ */
40 
41 /** \addtogroup lnet_addr
42  * @{ */
43 
44 /** Portal reserved for LNet's own use.
45  * \see lustre/include/lustre/lustre_idl.h for Lustre portal assignments.
46  */
47 #define LNET_RESERVED_PORTAL	0
48 
49 /**
50  * Address of an end-point in an LNet network.
51  *
52  * A node can have multiple end-points and hence multiple addresses.
53  * An LNet network can be a simple network (e.g. tcp0) or a network of
54  * LNet networks connected by LNet routers. Therefore an end-point address
55  * has two parts: network ID, and address within a network.
56  *
57  * \see LNET_NIDNET, LNET_NIDADDR, and LNET_MKNID.
58  */
59 typedef __u64 lnet_nid_t;
60 /**
61  * ID of a process in a node. Shortened as PID to distinguish from
62  * lnet_process_id_t, the global process ID.
63  */
64 typedef __u32 lnet_pid_t;
65 
66 /** wildcard NID that matches any end-point address */
67 #define LNET_NID_ANY	((lnet_nid_t) -1)
68 /** wildcard PID that matches any lnet_pid_t */
69 #define LNET_PID_ANY	((lnet_pid_t) -1)
70 
71 #define LNET_PID_RESERVED 0xf0000000 /* reserved bits in PID */
72 #define LNET_PID_USERFLAG 0x80000000 /* set in userspace peers */
73 #define LNET_PID_LUSTRE	  12345
74 
75 #define LNET_TIME_FOREVER (-1)
76 
77 /* how an LNET NID encodes net:address */
78 /** extract the address part of an lnet_nid_t */
79 
LNET_NIDADDR(lnet_nid_t nid)80 static inline __u32 LNET_NIDADDR(lnet_nid_t nid)
81 {
82 	return nid & 0xffffffff;
83 }
84 
LNET_NIDNET(lnet_nid_t nid)85 static inline __u32 LNET_NIDNET(lnet_nid_t nid)
86 {
87 	return (nid >> 32) & 0xffffffff;
88 }
89 
LNET_MKNID(__u32 net,__u32 addr)90 static inline lnet_nid_t LNET_MKNID(__u32 net, __u32 addr)
91 {
92 	return (((__u64)net) << 32) | addr;
93 }
94 
LNET_NETNUM(__u32 net)95 static inline __u32 LNET_NETNUM(__u32 net)
96 {
97 	return net & 0xffff;
98 }
99 
LNET_NETTYP(__u32 net)100 static inline __u32 LNET_NETTYP(__u32 net)
101 {
102 	return (net >> 16) & 0xffff;
103 }
104 
LNET_MKNET(__u32 type,__u32 num)105 static inline __u32 LNET_MKNET(__u32 type, __u32 num)
106 {
107 	return (type << 16) | num;
108 }
109 
110 #define WIRE_ATTR	__packed
111 
112 /* Packed version of lnet_process_id_t to transfer via network */
113 typedef struct {
114 	/* node id / process id */
115 	lnet_nid_t	nid;
116 	lnet_pid_t	pid;
117 } WIRE_ATTR lnet_process_id_packed_t;
118 
119 /* The wire handle's interface cookie only matches one network interface in
120  * one epoch (i.e. new cookie when the interface restarts or the node
121  * reboots).  The object cookie only matches one object on that interface
122  * during that object's lifetime (i.e. no cookie re-use). */
123 typedef struct {
124 	__u64	wh_interface_cookie;
125 	__u64	wh_object_cookie;
126 } WIRE_ATTR lnet_handle_wire_t;
127 
128 typedef enum {
129 	LNET_MSG_ACK = 0,
130 	LNET_MSG_PUT,
131 	LNET_MSG_GET,
132 	LNET_MSG_REPLY,
133 	LNET_MSG_HELLO,
134 } lnet_msg_type_t;
135 
136 /* The variant fields of the portals message header are aligned on an 8
137  * byte boundary in the message header.  Note that all types used in these
138  * wire structs MUST be fixed size and the smaller types are placed at the
139  * end. */
140 typedef struct lnet_ack {
141 	lnet_handle_wire_t	dst_wmd;
142 	__u64			match_bits;
143 	__u32			mlength;
144 } WIRE_ATTR lnet_ack_t;
145 
146 typedef struct lnet_put {
147 	lnet_handle_wire_t	ack_wmd;
148 	__u64			match_bits;
149 	__u64			hdr_data;
150 	__u32			ptl_index;
151 	__u32			offset;
152 } WIRE_ATTR lnet_put_t;
153 
154 typedef struct lnet_get {
155 	lnet_handle_wire_t	return_wmd;
156 	__u64			match_bits;
157 	__u32			ptl_index;
158 	__u32			src_offset;
159 	__u32			sink_length;
160 } WIRE_ATTR lnet_get_t;
161 
162 typedef struct lnet_reply {
163 	lnet_handle_wire_t	dst_wmd;
164 } WIRE_ATTR lnet_reply_t;
165 
166 typedef struct lnet_hello {
167 	__u64			incarnation;
168 	__u32			type;
169 } WIRE_ATTR lnet_hello_t;
170 
171 typedef struct {
172 	lnet_nid_t	dest_nid;
173 	lnet_nid_t	src_nid;
174 	lnet_pid_t	dest_pid;
175 	lnet_pid_t	src_pid;
176 	__u32		type;		/* lnet_msg_type_t */
177 	__u32		payload_length;	/* payload data to follow */
178 	/*<------__u64 aligned------->*/
179 	union {
180 		lnet_ack_t	ack;
181 		lnet_put_t	put;
182 		lnet_get_t	get;
183 		lnet_reply_t	reply;
184 		lnet_hello_t	hello;
185 	} msg;
186 } WIRE_ATTR lnet_hdr_t;
187 
188 /* A HELLO message contains a magic number and protocol version
189  * code in the header's dest_nid, the peer's NID in the src_nid, and
190  * LNET_MSG_HELLO in the type field.  All other common fields are zero
191  * (including payload_size; i.e. no payload).
192  * This is for use by byte-stream LNDs (e.g. TCP/IP) to check the peer is
193  * running the same protocol and to find out its NID. These LNDs should
194  * exchange HELLO messages when a connection is first established.  Individual
195  * LNDs can put whatever else they fancy in lnet_hdr_t::msg.
196  */
197 typedef struct {
198 	__u32	magic;		/* LNET_PROTO_TCP_MAGIC */
199 	__u16	version_major;	/* increment on incompatible change */
200 	__u16	version_minor;	/* increment on compatible change */
201 } WIRE_ATTR lnet_magicversion_t;
202 
203 /* PROTO MAGIC for LNDs */
204 #define LNET_PROTO_IB_MAGIC		0x0be91b91
205 #define LNET_PROTO_GNI_MAGIC		0xb00fbabe /* ask Kim */
206 #define LNET_PROTO_TCP_MAGIC		0xeebc0ded
207 #define LNET_PROTO_ACCEPTOR_MAGIC	0xacce7100
208 #define LNET_PROTO_PING_MAGIC		0x70696E67 /* 'ping' */
209 
210 /* Placeholder for a future "unified" protocol across all LNDs */
211 /* Current LNDs that receive a request with this magic will respond with a
212  * "stub" reply using their current protocol */
213 #define LNET_PROTO_MAGIC		0x45726963 /* ! */
214 
215 #define LNET_PROTO_TCP_VERSION_MAJOR	1
216 #define LNET_PROTO_TCP_VERSION_MINOR	0
217 
218 /* Acceptor connection request */
219 typedef struct {
220 	__u32	acr_magic;		/* PTL_ACCEPTOR_PROTO_MAGIC */
221 	__u32	acr_version;		/* protocol version */
222 	__u64	acr_nid;		/* target NID */
223 } WIRE_ATTR lnet_acceptor_connreq_t;
224 
225 #define LNET_PROTO_ACCEPTOR_VERSION	1
226 
227 typedef struct {
228 	lnet_nid_t	ns_nid;
229 	__u32		ns_status;
230 	__u32		ns_unused;
231 } WIRE_ATTR lnet_ni_status_t;
232 
233 typedef struct {
234 	__u32			pi_magic;
235 	__u32			pi_features;
236 	lnet_pid_t		pi_pid;
237 	__u32			pi_nnis;
238 	lnet_ni_status_t	pi_ni[0];
239 } WIRE_ATTR lnet_ping_info_t;
240 
241 typedef struct lnet_counters {
242 	__u32	msgs_alloc;
243 	__u32	msgs_max;
244 	__u32	errors;
245 	__u32	send_count;
246 	__u32	recv_count;
247 	__u32	route_count;
248 	__u32	drop_count;
249 	__u64	send_length;
250 	__u64	recv_length;
251 	__u64	route_length;
252 	__u64	drop_length;
253 } WIRE_ATTR lnet_counters_t;
254 
255 #define LNET_NI_STATUS_UP      0x15aac0de
256 #define LNET_NI_STATUS_DOWN    0xdeadface
257 #define LNET_NI_STATUS_INVALID 0x00000000
258 
259 #define LNET_MAX_INTERFACES    16
260 
261 /*
262  * Objects maintained by the LNet are accessed through handles. Handle types
263  * have names of the form lnet_handle_xx_t, where xx is one of the two letter
264  * object type codes ('eq' for event queue, 'md' for memory descriptor, and
265  * 'me' for match entry).
266  * Each type of object is given a unique handle type to enhance type checking.
267  * The type lnet_handle_any_t can be used when a generic handle is needed.
268  * Every handle value can be converted into a value of type lnet_handle_any_t
269  * without loss of information.
270  */
271 typedef struct {
272 	__u64	 cookie;
273 } lnet_handle_any_t;
274 
275 typedef lnet_handle_any_t lnet_handle_eq_t;
276 typedef lnet_handle_any_t lnet_handle_md_t;
277 typedef lnet_handle_any_t lnet_handle_me_t;
278 
279 #define LNET_WIRE_HANDLE_COOKIE_NONE   (-1)
280 
281 /**
282  * Invalidate handle \a h.
283  */
LNetInvalidateHandle(lnet_handle_any_t * h)284 static inline void LNetInvalidateHandle(lnet_handle_any_t *h)
285 {
286 	h->cookie = LNET_WIRE_HANDLE_COOKIE_NONE;
287 }
288 
289 /**
290  * Compare handles \a h1 and \a h2.
291  *
292  * \return 1 if handles are equal, 0 if otherwise.
293  */
LNetHandleIsEqual(lnet_handle_any_t h1,lnet_handle_any_t h2)294 static inline int LNetHandleIsEqual(lnet_handle_any_t h1, lnet_handle_any_t h2)
295 {
296 	return h1.cookie == h2.cookie;
297 }
298 
299 /**
300  * Check whether handle \a h is invalid.
301  *
302  * \return 1 if handle is invalid, 0 if valid.
303  */
LNetHandleIsInvalid(lnet_handle_any_t h)304 static inline int LNetHandleIsInvalid(lnet_handle_any_t h)
305 {
306 	return h.cookie == LNET_WIRE_HANDLE_COOKIE_NONE;
307 }
308 
309 /**
310  * Global process ID.
311  */
312 typedef struct {
313 	/** node id */
314 	lnet_nid_t nid;
315 	/** process id */
316 	lnet_pid_t pid;
317 } lnet_process_id_t;
318 /** @} lnet_addr */
319 
320 /** \addtogroup lnet_me
321  * @{ */
322 
323 /**
324  * Specifies whether the match entry or memory descriptor should be unlinked
325  * automatically (LNET_UNLINK) or not (LNET_RETAIN).
326  */
327 typedef enum {
328 	LNET_RETAIN = 0,
329 	LNET_UNLINK
330 } lnet_unlink_t;
331 
332 /**
333  * Values of the type lnet_ins_pos_t are used to control where a new match
334  * entry is inserted. The value LNET_INS_BEFORE is used to insert the new
335  * entry before the current entry or before the head of the list. The value
336  * LNET_INS_AFTER is used to insert the new entry after the current entry
337  * or after the last item in the list.
338  */
339 typedef enum {
340 	/** insert ME before current position or head of the list */
341 	LNET_INS_BEFORE,
342 	/** insert ME after current position or tail of the list */
343 	LNET_INS_AFTER,
344 	/** attach ME at tail of local CPU partition ME list */
345 	LNET_INS_LOCAL
346 } lnet_ins_pos_t;
347 
348 /** @} lnet_me */
349 
350 /** \addtogroup lnet_md
351  * @{ */
352 
353 /**
354  * Defines the visible parts of a memory descriptor. Values of this type
355  * are used to initialize memory descriptors.
356  */
357 typedef struct {
358 	/**
359 	 * Specify the memory region associated with the memory descriptor.
360 	 * If the options field has:
361 	 * - LNET_MD_KIOV bit set: The start field points to the starting
362 	 * address of an array of lnet_kiov_t and the length field specifies
363 	 * the number of entries in the array. The length can't be bigger
364 	 * than LNET_MAX_IOV. The lnet_kiov_t is used to describe page-based
365 	 * fragments that are not necessarily mapped in virtual memory.
366 	 * - LNET_MD_IOVEC bit set: The start field points to the starting
367 	 * address of an array of struct iovec and the length field specifies
368 	 * the number of entries in the array. The length can't be bigger
369 	 * than LNET_MAX_IOV. The struct iovec is used to describe fragments
370 	 * that have virtual addresses.
371 	 * - Otherwise: The memory region is contiguous. The start field
372 	 * specifies the starting address for the memory region and the
373 	 * length field specifies its length.
374 	 *
375 	 * When the memory region is fragmented, all fragments but the first
376 	 * one must start on page boundary, and all but the last must end on
377 	 * page boundary.
378 	 */
379 	void		*start;
380 	unsigned int	 length;
381 	/**
382 	 * Specifies the maximum number of operations that can be performed
383 	 * on the memory descriptor. An operation is any action that could
384 	 * possibly generate an event. In the usual case, the threshold value
385 	 * is decremented for each operation on the MD. When the threshold
386 	 * drops to zero, the MD becomes inactive and does not respond to
387 	 * operations. A threshold value of LNET_MD_THRESH_INF indicates that
388 	 * there is no bound on the number of operations that may be applied
389 	 * to a MD.
390 	 */
391 	int		 threshold;
392 	/**
393 	 * Specifies the largest incoming request that the memory descriptor
394 	 * should respond to. When the unused portion of a MD (length -
395 	 * local offset) falls below this value, the MD becomes inactive and
396 	 * does not respond to further operations. This value is only used
397 	 * if the LNET_MD_MAX_SIZE option is set.
398 	 */
399 	int		 max_size;
400 	/**
401 	 * Specifies the behavior of the memory descriptor. A bitwise OR
402 	 * of the following values can be used:
403 	 * - LNET_MD_OP_PUT: The LNet PUT operation is allowed on this MD.
404 	 * - LNET_MD_OP_GET: The LNet GET operation is allowed on this MD.
405 	 * - LNET_MD_MANAGE_REMOTE: The offset used in accessing the memory
406 	 *   region is provided by the incoming request. By default, the
407 	 *   offset is maintained locally. When maintained locally, the
408 	 *   offset is incremented by the length of the request so that
409 	 *   the next operation (PUT or GET) will access the next part of
410 	 *   the memory region. Note that only one offset variable exists
411 	 *   per memory descriptor. If both PUT and GET operations are
412 	 *   performed on a memory descriptor, the offset is updated each time.
413 	 * - LNET_MD_TRUNCATE: The length provided in the incoming request can
414 	 *   be reduced to match the memory available in the region (determined
415 	 *   by subtracting the offset from the length of the memory region).
416 	 *   By default, if the length in the incoming operation is greater
417 	 *   than the amount of memory available, the operation is rejected.
418 	 * - LNET_MD_ACK_DISABLE: An acknowledgment should not be sent for
419 	 *   incoming PUT operations, even if requested. By default,
420 	 *   acknowledgments are sent for PUT operations that request an
421 	 *   acknowledgment. Acknowledgments are never sent for GET operations.
422 	 *   The data sent in the REPLY serves as an implicit acknowledgment.
423 	 * - LNET_MD_KIOV: The start and length fields specify an array of
424 	 *   lnet_kiov_t.
425 	 * - LNET_MD_IOVEC: The start and length fields specify an array of
426 	 *   struct iovec.
427 	 * - LNET_MD_MAX_SIZE: The max_size field is valid.
428 	 *
429 	 * Note:
430 	 * - LNET_MD_KIOV or LNET_MD_IOVEC allows for a scatter/gather
431 	 *   capability for memory descriptors. They can't be both set.
432 	 * - When LNET_MD_MAX_SIZE is set, the total length of the memory
433 	 *   region (i.e. sum of all fragment lengths) must not be less than
434 	 *   \a max_size.
435 	 */
436 	unsigned int	 options;
437 	/**
438 	 * A user-specified value that is associated with the memory
439 	 * descriptor. The value does not need to be a pointer, but must fit
440 	 * in the space used by a pointer. This value is recorded in events
441 	 * associated with operations on this MD.
442 	 */
443 	void		*user_ptr;
444 	/**
445 	 * A handle for the event queue used to log the operations performed on
446 	 * the memory region. If this argument is a NULL handle (i.e. nullified
447 	 * by LNetInvalidateHandle()), operations performed on this memory
448 	 * descriptor are not logged.
449 	 */
450 	lnet_handle_eq_t eq_handle;
451 } lnet_md_t;
452 
453 /* Max Transfer Unit (minimum supported everywhere).
454  * CAVEAT EMPTOR, with multinet (i.e. routers forwarding between networks)
455  * these limits are system wide and not interface-local. */
456 #define LNET_MTU_BITS	20
457 #define LNET_MTU	(1 << LNET_MTU_BITS)
458 
459 /** limit on the number of fragments in discontiguous MDs */
460 #define LNET_MAX_IOV	256
461 
462 /**
463  * Options for the MD structure. See lnet_md_t::options.
464  */
465 #define LNET_MD_OP_PUT		(1 << 0)
466 /** See lnet_md_t::options. */
467 #define LNET_MD_OP_GET		(1 << 1)
468 /** See lnet_md_t::options. */
469 #define LNET_MD_MANAGE_REMOTE	(1 << 2)
470 /* unused			(1 << 3) */
471 /** See lnet_md_t::options. */
472 #define LNET_MD_TRUNCATE	(1 << 4)
473 /** See lnet_md_t::options. */
474 #define LNET_MD_ACK_DISABLE	(1 << 5)
475 /** See lnet_md_t::options. */
476 #define LNET_MD_IOVEC		(1 << 6)
477 /** See lnet_md_t::options. */
478 #define LNET_MD_MAX_SIZE	(1 << 7)
479 /** See lnet_md_t::options. */
480 #define LNET_MD_KIOV		(1 << 8)
481 
482 /* For compatibility with Cray Portals */
483 #define LNET_MD_PHYS		0
484 
485 /** Infinite threshold on MD operations. See lnet_md_t::threshold */
486 #define LNET_MD_THRESH_INF	(-1)
487 
488 /* NB lustre portals uses struct iovec internally! */
489 typedef struct iovec lnet_md_iovec_t;
490 
491 /**
492  * A page-based fragment of a MD.
493  */
494 typedef struct {
495 	/** Pointer to the page where the fragment resides */
496 	struct page	*kiov_page;
497 	/** Length in bytes of the fragment */
498 	unsigned int	 kiov_len;
499 	/**
500 	 * Starting offset of the fragment within the page. Note that the
501 	 * end of the fragment must not pass the end of the page; i.e.,
502 	 * kiov_len + kiov_offset <= PAGE_CACHE_SIZE.
503 	 */
504 	unsigned int	 kiov_offset;
505 } lnet_kiov_t;
506 /** @} lnet_md */
507 
508 /** \addtogroup lnet_eq
509  * @{ */
510 
511 /**
512  * Six types of events can be logged in an event queue.
513  */
514 typedef enum {
515 	/** An incoming GET operation has completed on the MD. */
516 	LNET_EVENT_GET		= 1,
517 	/**
518 	 * An incoming PUT operation has completed on the MD. The
519 	 * underlying layers will not alter the memory (on behalf of this
520 	 * operation) once this event has been logged.
521 	 */
522 	LNET_EVENT_PUT,
523 	/**
524 	 * A REPLY operation has completed. This event is logged after the
525 	 * data (if any) from the REPLY has been written into the MD.
526 	 */
527 	LNET_EVENT_REPLY,
528 	/** An acknowledgment has been received. */
529 	LNET_EVENT_ACK,
530 	/**
531 	 * An outgoing send (PUT or GET) operation has completed. This event
532 	 * is logged after the entire buffer has been sent and it is safe for
533 	 * the caller to reuse the buffer.
534 	 *
535 	 * Note:
536 	 * - The LNET_EVENT_SEND doesn't guarantee message delivery. It can
537 	 *   happen even when the message has not yet been put out on wire.
538 	 * - It's unsafe to assume that in an outgoing GET operation
539 	 *   the LNET_EVENT_SEND event would happen before the
540 	 *   LNET_EVENT_REPLY event. The same holds for LNET_EVENT_SEND and
541 	 *   LNET_EVENT_ACK events in an outgoing PUT operation.
542 	 */
543 	LNET_EVENT_SEND,
544 	/**
545 	 * A MD has been unlinked. Note that LNetMDUnlink() does not
546 	 * necessarily trigger an LNET_EVENT_UNLINK event.
547 	 * \see LNetMDUnlink
548 	 */
549 	LNET_EVENT_UNLINK,
550 } lnet_event_kind_t;
551 
552 #define LNET_SEQ_BASETYPE	long
553 typedef unsigned LNET_SEQ_BASETYPE lnet_seq_t;
554 #define LNET_SEQ_GT(a, b)	(((signed LNET_SEQ_BASETYPE)((a) - (b))) > 0)
555 
556 /**
557  * Information about an event on a MD.
558  */
559 typedef struct {
560 	/** The identifier (nid, pid) of the target. */
561 	lnet_process_id_t	target;
562 	/** The identifier (nid, pid) of the initiator. */
563 	lnet_process_id_t	initiator;
564 	/**
565 	 * The NID of the immediate sender. If the request has been forwarded
566 	 * by routers, this is the NID of the last hop; otherwise it's the
567 	 * same as the initiator.
568 	 */
569 	lnet_nid_t		sender;
570 	/** Indicates the type of the event. */
571 	lnet_event_kind_t	type;
572 	/** The portal table index specified in the request */
573 	unsigned int		pt_index;
574 	/** A copy of the match bits specified in the request. */
575 	__u64			match_bits;
576 	/** The length (in bytes) specified in the request. */
577 	unsigned int		rlength;
578 	/**
579 	 * The length (in bytes) of the data that was manipulated by the
580 	 * operation. For truncated operations, the manipulated length will be
581 	 * the number of bytes specified by the MD (possibly with an offset,
582 	 * see lnet_md_t). For all other operations, the manipulated length
583 	 * will be the length of the requested operation, i.e. rlength.
584 	 */
585 	unsigned int		mlength;
586 	/**
587 	 * The handle to the MD associated with the event. The handle may be
588 	 * invalid if the MD has been unlinked.
589 	 */
590 	lnet_handle_md_t	md_handle;
591 	/**
592 	 * A snapshot of the state of the MD immediately after the event has
593 	 * been processed. In particular, the threshold field in md will
594 	 * reflect the value of the threshold after the operation occurred.
595 	 */
596 	lnet_md_t		md;
597 	/**
598 	 * 64 bits of out-of-band user data. Only valid for LNET_EVENT_PUT.
599 	 * \see LNetPut
600 	 */
601 	__u64			hdr_data;
602 	/**
603 	 * Indicates the completion status of the operation. It's 0 for
604 	 * successful operations, otherwise it's an error code.
605 	 */
606 	int			status;
607 	/**
608 	 * Indicates whether the MD has been unlinked. Note that:
609 	 * - An event with unlinked set is the last event on the MD.
610 	 * - This field is also set for an explicit LNET_EVENT_UNLINK event.
611 	 * \see LNetMDUnlink
612 	 */
613 	int			unlinked;
614 	/**
615 	 * The displacement (in bytes) into the memory region that the
616 	 * operation used. The offset can be determined by the operation for
617 	 * a remote managed MD or by the local MD.
618 	 * \see lnet_md_t::options
619 	 */
620 	unsigned int		offset;
621 	/**
622 	 * The sequence number for this event. Sequence numbers are unique
623 	 * to each event.
624 	 */
625 	volatile lnet_seq_t	sequence;
626 } lnet_event_t;
627 
628 /**
629  * Event queue handler function type.
630  *
631  * The EQ handler runs for each event that is deposited into the EQ. The
632  * handler is supplied with a pointer to the event that triggered the
633  * handler invocation.
634  *
635  * The handler must not block, must be reentrant, and must not call any LNet
636  * API functions. It should return as quickly as possible.
637  */
638 typedef void (*lnet_eq_handler_t)(lnet_event_t *event);
639 #define LNET_EQ_HANDLER_NONE NULL
640 /** @} lnet_eq */
641 
642 /** \addtogroup lnet_data
643  * @{ */
644 
645 /**
646  * Specify whether an acknowledgment should be sent by target when the PUT
647  * operation completes (i.e., when the data has been written to a MD of the
648  * target process).
649  *
650  * \see lnet_md_t::options for the discussion on LNET_MD_ACK_DISABLE by which
651  * acknowledgments can be disabled for a MD.
652  */
653 typedef enum {
654 	/** Request an acknowledgment */
655 	LNET_ACK_REQ,
656 	/** Request that no acknowledgment should be generated. */
657 	LNET_NOACK_REQ
658 } lnet_ack_req_t;
659 /** @} lnet_data */
660 
661 /** @} lnet */
662 #endif
663