Whamcloud - gitweb
LU-10003 lnet: use Netlink to support old and new NI APIs.
[fs/lustre-release.git] / lnet / include / uapi / linux / lnet / lnet-types.h
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, 2017, Intel Corporation.
27  */
28 /*
29  * This file is part of Lustre, http://www.lustre.org/
30  */
31
32 #ifndef __UAPI_LNET_TYPES_H__
33 #define __UAPI_LNET_TYPES_H__
34
35 #include <linux/types.h>
36 #include <linux/string.h>
37 #include <asm/byteorder.h>
38 #ifndef __KERNEL__
39 #include <stdbool.h>
40 #endif
41
42 /** \addtogroup lnet
43  * @{ */
44
45 #include <linux/lnet/lnet-idl.h>
46
47 /** \addtogroup lnet_addr
48  * @{ */
49
50 #define LNET_VERSION            "0.7.0"
51
52 /** Portal reserved for LNet's own use.
53  * \see lustre/include/lustre/lustre_idl.h for Lustre portal assignments.
54  */
55 #define LNET_RESERVED_PORTAL      0
56
57 /** wildcard NID that matches any end-point address */
58 #define LNET_NID_ANY      ((lnet_nid_t) -1)
59 /** wildcard PID that matches any lnet_pid_t */
60 #define LNET_PID_ANY      ((lnet_pid_t) -1)
61
62 static inline int LNET_NID_IS_ANY(const struct lnet_nid *nid)
63 {
64         /* A NULL pointer can be used to mean "ANY" */
65         return !nid || nid->nid_type == 0xFF;
66 }
67
68 #define LNET_ANY_NID ((struct lnet_nid)                 \
69                       {0xFF, 0xFF, ~0, {~0, ~0, ~0, ~0} })
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 /* how an LNET NID encodes net:address */
76 /** extract the address part of an lnet_nid_t */
77
78 static inline __u32 LNET_NIDADDR(lnet_nid_t nid)
79 {
80         return nid & 0xffffffff;
81 }
82
83 static inline __u32 LNET_NIDNET(lnet_nid_t nid)
84 {
85         return (nid >> 32) & 0xffffffff;
86 }
87
88 static inline lnet_nid_t LNET_MKNID(__u32 net, __u32 addr)
89 {
90         return (((__u64)net) << 32) | addr;
91 }
92
93 static inline __u32 LNET_NETNUM(__u32 net)
94 {
95         return net & 0xffff;
96 }
97
98 static inline __u32 LNET_NETTYP(__u32 net)
99 {
100         return (net >> 16) & 0xff;
101 }
102
103 static inline __u32 LNET_MKNET(__u32 type, __u32 num)
104 {
105         return (type << 16) | num;
106 }
107
108 /** The lolnd NID (i.e. myself) */
109 #define LNET_NID_LO_0 LNET_MKNID(LNET_MKNET(LOLND, 0), 0)
110
111 #define LNET_NET_ANY LNET_NIDNET(LNET_NID_ANY)
112
113 /* check for address set */
114 static inline bool nid_addr_is_set(const struct lnet_nid *nid)
115 {
116         int sum = 0, i;
117
118         for (i = 0; i < NID_ADDR_BYTES(nid); i++)
119                 sum |= nid->nid_addr[i];
120
121         return sum ? true : false;
122 }
123
124 static inline int nid_is_nid4(const struct lnet_nid *nid)
125 {
126         return NID_ADDR_BYTES(nid) == 4;
127 }
128
129 /* LOLND may not be defined yet, so we cannot use an inline */
130 #define nid_is_lo0(__nid)                                               \
131         ((__nid)->nid_type == LOLND &&                                  \
132          nid_is_nid4(__nid) &&                                          \
133          (__nid)->nid_num == 0 &&                                       \
134          (__nid)->nid_addr[0] == 0)
135
136 static inline __u32 LNET_NID_NET(const struct lnet_nid *nid)
137 {
138         if (LNET_NID_IS_ANY(nid))
139                 return LNET_NET_ANY;
140         else
141                 return LNET_MKNET(nid->nid_type, __be16_to_cpu(nid->nid_num));
142 }
143
144 static inline void lnet_nid4_to_nid(lnet_nid_t nid4, struct lnet_nid *nid)
145 {
146         if (nid4 == LNET_NID_ANY) {
147                 /* equal to setting to LNET_ANY_NID */
148                 memset(nid, 0xff, sizeof(*nid));
149                 return;
150         }
151
152         nid->nid_size = 0;
153         nid->nid_type = LNET_NETTYP(LNET_NIDNET(nid4));
154         nid->nid_num = __cpu_to_be16(LNET_NETNUM(LNET_NIDNET(nid4)));
155         nid->nid_addr[0] = __cpu_to_be32(LNET_NIDADDR(nid4));
156         nid->nid_addr[1] = nid->nid_addr[2] = nid->nid_addr[3] = 0;
157 }
158
159 static inline lnet_nid_t lnet_nid_to_nid4(const struct lnet_nid *nid)
160 {
161         if (LNET_NID_IS_ANY(nid))
162                 return LNET_NID_ANY;
163
164         return LNET_MKNID(LNET_NID_NET(nid), __be32_to_cpu(nid->nid_addr[0]));
165 }
166
167 static inline int nid_same(const struct lnet_nid *n1,
168                             const struct lnet_nid *n2)
169 {
170         return n1->nid_size == n2->nid_size &&
171                 n1->nid_type == n2->nid_type &&
172                 n1->nid_num == n2->nid_num &&
173                 n1->nid_addr[0] == n2->nid_addr[0] &&
174                 n1->nid_addr[1] == n2->nid_addr[1] &&
175                 n1->nid_addr[2] == n2->nid_addr[2] &&
176                 n1->nid_addr[3] == n2->nid_addr[3];
177 }
178
179 /* This can be used when we need to hash a nid */
180 static inline unsigned long nidhash(const struct lnet_nid *nid)
181 {
182         int i;
183         unsigned long hash = 0;
184
185         hash ^= LNET_NID_NET(nid);
186         for (i = 0; i < 4; i++)
187                 hash ^= nid->nid_addr[i];
188         return hash;
189 }
190
191 struct lnet_counters_health {
192         __u32   lch_rst_alloc;
193         __u32   lch_resend_count;
194         __u32   lch_response_timeout_count;
195         __u32   lch_local_interrupt_count;
196         __u32   lch_local_dropped_count;
197         __u32   lch_local_aborted_count;
198         __u32   lch_local_no_route_count;
199         __u32   lch_local_timeout_count;
200         __u32   lch_local_error_count;
201         __u32   lch_remote_dropped_count;
202         __u32   lch_remote_error_count;
203         __u32   lch_remote_timeout_count;
204         __u32   lch_network_timeout_count;
205 };
206
207 struct lnet_counters {
208         struct lnet_counters_common lct_common;
209         struct lnet_counters_health lct_health;
210 };
211
212 /*
213  * This is a hard-coded limit on the number of interfaces supported by
214  * the interface bonding implemented by the ksocknal LND. It must be
215  * defined here because it is used in LNet data structures that are
216  * common to all LNDs.
217  */
218 #define LNET_INTERFACES_NUM     16
219
220 /* The minimum number of interfaces per node supported by LNet. */
221 #define LNET_INTERFACES_MIN     16
222 /* The default - arbitrary - value of the lnet_max_interfaces tunable. */
223 #define LNET_INTERFACES_MAX_DEFAULT     200
224
225 /**
226  * Objects maintained by the LNet are accessed through handles. Handle types
227  * have names of the form lnet_handle_xx, where xx is one of the two letter
228  * object type codes ('md' for memory descriptor, and
229  * 'me' for match entry). Each type of object is given a unique handle type
230  * to enhance type checking.
231  */
232 #define LNET_WIRE_HANDLE_COOKIE_NONE   (~0ULL)
233
234 struct lnet_handle_md {
235         __u64   cookie;
236 };
237
238 /**
239  * Invalidate md handle \a h.
240  */
241 static inline void LNetInvalidateMDHandle(struct lnet_handle_md *h)
242 {
243         h->cookie = LNET_WIRE_HANDLE_COOKIE_NONE;
244 }
245
246 /**
247  * Check whether handler \a h is invalid.
248  *
249  * \return 1 if handle is invalid, 0 if valid.
250  */
251 static inline int LNetMDHandleIsInvalid(struct lnet_handle_md h)
252 {
253         return (LNET_WIRE_HANDLE_COOKIE_NONE == h.cookie);
254 }
255
256 /**
257  * Global process ID.
258  */
259 struct lnet_process_id {
260         /** node id */
261         lnet_nid_t nid;
262         /** process id */
263         lnet_pid_t pid;
264 };
265
266 /**
267  * Global process ID - with large addresses
268  */
269 struct lnet_processid {
270         /** node id */
271         struct lnet_nid nid;
272         /** process id */
273         lnet_pid_t pid;
274 };
275
276 static inline void
277 lnet_pid4_to_pid(struct lnet_process_id pid4, struct lnet_processid *pid)
278 {
279         pid->pid = pid4.pid;
280         lnet_nid4_to_nid(pid4.nid, &pid->nid);
281 }
282
283 static inline struct lnet_process_id
284 lnet_pid_to_pid4(struct lnet_processid *pid)
285 {
286         struct lnet_process_id ret;
287
288         ret.pid = pid->pid;
289         ret.nid = lnet_nid_to_nid4(&pid->nid);
290         return ret;
291 }
292
293 /** @} lnet_addr */
294
295 /** \addtogroup lnet_me
296  * @{ */
297
298 /**
299  * Specifies whether the match entry or memory descriptor should be unlinked
300  * automatically (LNET_UNLINK) or not (LNET_RETAIN).
301  */
302 enum lnet_unlink {
303         LNET_RETAIN = 0,
304         LNET_UNLINK
305 };
306
307 /**
308  * Values of the type enum lnet_ins_pos are used to control where a new match
309  * entry is inserted. The value LNET_INS_BEFORE is used to insert the new
310  * entry before the current entry or before the head of the list. The value
311  * LNET_INS_AFTER is used to insert the new entry after the current entry
312  * or after the last item in the list.
313  */
314 enum lnet_ins_pos {
315         /** insert ME before current position or head of the list */
316         LNET_INS_BEFORE,
317         /** insert ME after current position or tail of the list */
318         LNET_INS_AFTER,
319         /** attach ME at tail of local CPU partition ME list */
320         LNET_INS_LOCAL
321 };
322
323 /** @} lnet_me */
324
325 /** \addtogroup lnet_md
326  * @{ */
327
328 struct lnet_hdr_nid16 {
329         char    _bytes[sizeof(struct lnet_hdr)];
330 } __attribute__((packed));
331
332 /**
333  * Event queue handler function type.
334  *
335  * The EQ handler runs for each event that is deposited into the EQ. The
336  * handler is supplied with a pointer to the event that triggered the
337  * handler invocation.
338  *
339  * The handler must not block, must be reentrant, and must not call any LNet
340  * API functions. It should return as quickly as possible.
341  */
342 struct lnet_event;
343 typedef void (*lnet_handler_t)(struct lnet_event *event);
344
345 /**
346  * Defines the visible parts of a memory descriptor. Values of this type
347  * are used to initialize memory descriptors.
348  */
349 struct lnet_md {
350         /**
351          * Specify the memory region associated with the memory descriptor.
352          * If the options field has:
353          * - LNET_MD_KIOV bit set: The start field points to the starting
354          * address of an array of struct bio_vec and the length field specifies
355          * the number of entries in the array. The length can't be bigger
356          * than LNET_MAX_IOV. The struct bio_vec is used to describe page-based
357          * fragments that are not necessarily mapped in virtal memory.
358          * - Otherwise: The memory region is contiguous. The start field
359          * specifies the starting address for the memory region and the
360          * length field specifies its length.
361          *
362          * When the memory region is fragmented, all fragments but the first
363          * one must start on page boundary, and all but the last must end on
364          * page boundary.
365          */
366         void            *start;
367         unsigned int     length;
368         /**
369          * Specifies the maximum number of operations that can be performed
370          * on the memory descriptor. An operation is any action that could
371          * possibly generate an event. In the usual case, the threshold value
372          * is decremented for each operation on the MD. When the threshold
373          * drops to zero, the MD becomes inactive and does not respond to
374          * operations. A threshold value of LNET_MD_THRESH_INF indicates that
375          * there is no bound on the number of operations that may be applied
376          * to a MD.
377          */
378         int              threshold;
379         /**
380          * Specifies the largest incoming request that the memory descriptor
381          * should respond to. When the unused portion of a MD (length -
382          * local offset) falls below this value, the MD becomes inactive and
383          * does not respond to further operations. This value is only used
384          * if the LNET_MD_MAX_SIZE option is set.
385          */
386         int              max_size;
387         /**
388          * Specifies the behavior of the memory descriptor. A bitwise OR
389          * of the following values can be used:
390          * - LNET_MD_OP_PUT: The LNet PUT operation is allowed on this MD.
391          * - LNET_MD_OP_GET: The LNet GET operation is allowed on this MD.
392          * - LNET_MD_MANAGE_REMOTE: The offset used in accessing the memory
393          *   region is provided by the incoming request. By default, the
394          *   offset is maintained locally. When maintained locally, the
395          *   offset is incremented by the length of the request so that
396          *   the next operation (PUT or GET) will access the next part of
397          *   the memory region. Note that only one offset variable exists
398          *   per memory descriptor. If both PUT and GET operations are
399          *   performed on a memory descriptor, the offset is updated each time.
400          * - LNET_MD_TRUNCATE: The length provided in the incoming request can
401          *   be reduced to match the memory available in the region (determined
402          *   by subtracting the offset from the length of the memory region).
403          *   By default, if the length in the incoming operation is greater
404          *   than the amount of memory available, the operation is rejected.
405          * - LNET_MD_ACK_DISABLE: An acknowledgment should not be sent for
406          *   incoming PUT operations, even if requested. By default,
407          *   acknowledgments are sent for PUT operations that request an
408          *   acknowledgment. Acknowledgments are never sent for GET operations.
409          *   The data sent in the REPLY serves as an implicit acknowledgment.
410          * - LNET_MD_KIOV: The start and length fields specify an array of
411          *   struct bio_vec.
412          * - LNET_MD_MAX_SIZE: The max_size field is valid.
413          * - LNET_MD_BULK_HANDLE: The bulk_handle field is valid.
414          * - LNET_MD_TRACK_RESPONSE: Enable response tracking on this MD
415          *   regardless of the value of the lnet_response_tracking param.
416          * - LNET_MD_NO_TRACK_RESPONSE: Disable response tracking on this MD
417          *   regardless of the value of the lnet_response_tracking param.
418          * - LNET_MD_GNILND: Disable warning about exceeding LNET_MAX_IOV.
419          *
420          * Note:
421          * - LNET_MD_KIOV allows for a scatter/gather capability for memory
422          *   descriptors.
423          * - When LNET_MD_MAX_SIZE is set, the total length of the memory
424          *   region (i.e. sum of all fragment lengths) must not be less than
425          *   \a max_size.
426          */
427         unsigned int     options;
428         /**
429          * A user-specified value that is associated with the memory
430          * descriptor. The value does not need to be a pointer, but must fit
431          * in the space used by a pointer. This value is recorded in events
432          * associated with operations on this MD.
433          */
434         void            *user_ptr;
435         /**
436          * The event handler used to log the operations performed on
437          * the memory region. If this argument is NULL operations
438          * performed on this memory descriptor are not logged.
439          */
440         lnet_handler_t  handler;
441         /**
442          * The bulk MD handle which was registered to describe the buffers
443          * either to be used to transfer data to the peer or receive data
444          * from the peer. This allows LNet to properly determine the NUMA
445          * node on which the memory was allocated and use that to select the
446          * nearest local network interface. This value is only used
447          * if the LNET_MD_BULK_HANDLE option is set.
448          */
449         struct lnet_handle_md bulk_handle;
450 };
451
452 /* Max Transfer Unit (minimum supported everywhere).
453  * CAVEAT EMPTOR, with multinet (i.e. routers forwarding between networks)
454  * these limits are system wide and not interface-local. */
455 #define LNET_MTU_BITS   20
456 #define LNET_MTU        (1 << LNET_MTU_BITS)
457
458 /**
459  * Options for the MD structure. See struct lnet_md::options.
460  */
461 #define LNET_MD_OP_PUT               (1 << 0)
462 /** See struct lnet_md::options. */
463 #define LNET_MD_OP_GET               (1 << 1)
464 /** See struct lnet_md::options. */
465 #define LNET_MD_MANAGE_REMOTE        (1 << 2)
466 /* unused                            (1 << 3) */
467 /** See struct lnet_md::options. */
468 #define LNET_MD_TRUNCATE             (1 << 4)
469 /** See struct lnet_md::options. */
470 #define LNET_MD_ACK_DISABLE          (1 << 5)
471 /** See struct lnet_md::options. */
472 /* deprecated #define LNET_MD_IOVEC  (1 << 6) */
473 /** See struct lnet_md::options. */
474 #define LNET_MD_MAX_SIZE             (1 << 7)
475 /** See struct lnet_md::options. */
476 #define LNET_MD_KIOV                 (1 << 8)
477 /** See struct lnet_md::options. */
478 #define LNET_MD_BULK_HANDLE          (1 << 9)
479 /** See struct lnet_md::options. */
480 #define LNET_MD_TRACK_RESPONSE       (1 << 10)
481 /** See struct lnet_md::options. */
482 #define LNET_MD_NO_TRACK_RESPONSE    (1 << 11)
483 /** See struct lnet_md::options. */
484 #define LNET_MD_GNILND               (1 << 12)
485 /** Special page mapping handling */
486 #define LNET_MD_GPU_ADDR             (1 << 13)
487
488 /** Infinite threshold on MD operations. See struct lnet_md::threshold */
489 #define LNET_MD_THRESH_INF       (-1)
490
491 /** @} lnet_md */
492
493 /** \addtogroup lnet_eq
494  * @{ */
495
496 /**
497  * Six types of events can be logged in an event queue.
498  */
499 enum lnet_event_kind {
500         /** An incoming GET operation has completed on the MD. */
501         LNET_EVENT_GET          = 1,
502         /**
503          * An incoming PUT operation has completed on the MD. The
504          * underlying layers will not alter the memory (on behalf of this
505          * operation) once this event has been logged.
506          */
507         LNET_EVENT_PUT,
508         /**
509          * A REPLY operation has completed. This event is logged after the
510          * data (if any) from the REPLY has been written into the MD.
511          */
512         LNET_EVENT_REPLY,
513         /** An acknowledgment has been received. */
514         LNET_EVENT_ACK,
515         /**
516          * An outgoing send (PUT or GET) operation has completed. This event
517          * is logged after the entire buffer has been sent and it is safe for
518          * the caller to reuse the buffer.
519          *
520          * Note:
521          * - The LNET_EVENT_SEND doesn't guarantee message delivery. It can
522          *   happen even when the message has not yet been put out on wire.
523          * - It's unsafe to assume that in an outgoing GET operation
524          *   the LNET_EVENT_SEND event would happen before the
525          *   LNET_EVENT_REPLY event. The same holds for LNET_EVENT_SEND and
526          *   LNET_EVENT_ACK events in an outgoing PUT operation.
527          */
528         LNET_EVENT_SEND,
529         /**
530          * A MD has been unlinked. Note that LNetMDUnlink() does not
531          * necessarily trigger an LNET_EVENT_UNLINK event.
532          * \see LNetMDUnlink
533          */
534         LNET_EVENT_UNLINK,
535 };
536
537 #define LNET_SEQ_GT(a, b)       (((signed long)((a) - (b))) > 0)
538
539 /**
540  * Information about an event on a MD.
541  */
542 struct lnet_event {
543         /** The identifier (nid, pid) of the target. */
544         struct lnet_processid   target;
545         /** The identifier (nid, pid) of the initiator. */
546         struct lnet_processid   initiator;
547         /** The source NID on the initiator. */
548         struct lnet_processid   source;
549         /**
550          * The NID of the immediate sender. If the request has been forwarded
551          * by routers, this is the NID of the last hop; otherwise it's the
552          * same as the source.
553          */
554         struct lnet_nid sender;
555         /** Indicates the type of the event. */
556         enum lnet_event_kind    type;
557         /** The portal table index specified in the request */
558         unsigned int            pt_index;
559         /** A copy of the match bits specified in the request. */
560         __u64                   match_bits;
561         /** The length (in bytes) specified in the request. */
562         unsigned int            rlength;
563         /**
564          * The length (in bytes) of the data that was manipulated by the
565          * operation. For truncated operations, the manipulated length will be
566          * the number of bytes specified by the MD (possibly with an offset,
567          * see struct lnet_md). For all other operations, the manipulated length
568          * will be the length of the requested operation, i.e. rlength.
569          */
570         unsigned int            mlength;
571         /**
572          * The handle to the MD associated with the event. The handle may be
573          * invalid if the MD has been unlinked.
574          */
575         struct lnet_handle_md   md_handle;
576         /**
577          * A snapshot of relevant state of the MD immediately after the event
578          * has been processed.
579          */
580         void                    *md_start;
581         void                    *md_user_ptr;
582         unsigned int            md_options;
583         /**
584          * 64 bits of out-of-band user data. Only valid for LNET_EVENT_PUT.
585          * \see LNetPut
586          */
587         __u64                   hdr_data;
588         /**
589          * The message type, to ensure a handler for LNET_EVENT_SEND can
590          * distinguish between LNET_MSG_GET and LNET_MSG_PUT.
591          */
592         __u32                   msg_type;
593         /**
594          * Indicates the completion status of the operation. It's 0 for
595          * successful operations, otherwise it's an error code.
596          */
597         int                     status;
598         /**
599          * Indicates whether the MD has been unlinked. Note that:
600          * - An event with unlinked set is the last event on the MD.
601          * - This field is also set for an explicit LNET_EVENT_UNLINK event.
602          * \see LNetMDUnlink
603          */
604         int                     unlinked;
605         /**
606          * The displacement (in bytes) into the memory region that the
607          * operation used. The offset can be determined by the operation for
608          * a remote managed MD or by the local MD.
609          * \see struct lnet_md::options
610          */
611         unsigned int            offset;
612         /**
613          * The sequence number for this event. Sequence numbers are unique
614          * to each event.
615          */
616         volatile unsigned long  sequence;
617 };
618
619 /** \addtogroup lnet_data
620  * @{ */
621
622 /**
623  * Specify whether an acknowledgment should be sent by target when the PUT
624  * operation completes (i.e., when the data has been written to a MD of the
625  * target process).
626  *
627  * \see struct lnet_md::options for the discussion on LNET_MD_ACK_DISABLE
628  * by which acknowledgments can be disabled for a MD.
629  */
630 enum lnet_ack_req {
631         /** Request an acknowledgment */
632         LNET_ACK_REQ,
633         /** Request that no acknowledgment should be generated. */
634         LNET_NOACK_REQ
635 };
636
637 /**
638  * UDSP action types. There are two available actions:
639  *      1. PRIORITY - set priority of matching LNet constructs
640  *      2. PREFERRED LIST - set preferred list of matching LNet constructs
641  */
642 enum lnet_udsp_action_type {
643         EN_LNET_UDSP_ACTION_NONE = 0,
644         /** assign a priority to matching constructs */
645         EN_LNET_UDSP_ACTION_PRIORITY = 1,
646         /** assign a preferred list of NIDs to matching constructs */
647         EN_LNET_UDSP_ACTION_PREFERRED_LIST = 2,
648 };
649
650 /** @} lnet_data */
651
652 /** @} lnet */
653 #endif