1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2 * vim:expandtab:shiftwidth=8:tabstop=8:
6 * Types used by the library side routines that do not need to be
7 * exposed to the user application
10 #ifndef __PORTALS_LIB_TYPES_H__
11 #define __PORTALS_LIB_TYPES_H__
13 #include "build_check.h"
15 #if defined(__linux__)
16 #include <portals/linux/lib-types.h>
17 #elif defined(__APPLE__)
18 #include <portals/darwin/lib-types.h>
20 #error Unsupported Operating System
23 #include <libcfs/libcfs.h>
24 #include <libcfs/list.h>
25 #include <portals/types.h>
26 #include <portals/nal.h>
28 typedef char *user_ptr;
29 typedef struct lib_msg_t lib_msg_t;
30 typedef struct lib_ptl_t lib_ptl_t;
31 typedef struct lib_ac_t lib_ac_t;
32 typedef struct lib_me_t lib_me_t;
33 typedef struct lib_md_t lib_md_t;
34 typedef struct lib_eq_t lib_eq_t;
36 #define WIRE_ATTR __attribute__((packed))
38 /* The wire handle's interface cookie only matches one network interface in
39 * one epoch (i.e. new cookie when the interface restarts or the node
40 * reboots). The object cookie only matches one object on that interface
41 * during that object's lifetime (i.e. no cookie re-use). */
43 __u64 wh_interface_cookie;
44 __u64 wh_object_cookie;
45 } WIRE_ATTR ptl_handle_wire_t;
47 /* byte-flip insensitive! */
48 #define PTL_WIRE_HANDLE_NONE \
49 ((const ptl_handle_wire_t) {.wh_interface_cookie = -1, .wh_object_cookie = -1})
59 /* The variant fields of the portals message header are aligned on an 8
60 * byte boundary in the message header. Note that all types used in these
61 * wire structs MUST be fixed size and the smaller types are placed at the
63 typedef struct ptl_ack {
64 ptl_handle_wire_t dst_wmd;
65 ptl_match_bits_t match_bits;
67 } WIRE_ATTR ptl_ack_t;
69 typedef struct ptl_put {
70 ptl_handle_wire_t ack_wmd;
71 ptl_match_bits_t match_bits;
72 ptl_hdr_data_t hdr_data;
73 ptl_pt_index_t ptl_index;
75 } WIRE_ATTR ptl_put_t;
77 typedef struct ptl_get {
78 ptl_handle_wire_t return_wmd;
79 ptl_match_bits_t match_bits;
80 ptl_pt_index_t ptl_index;
81 ptl_size_t src_offset;
82 ptl_size_t sink_length;
83 } WIRE_ATTR ptl_get_t;
85 typedef struct ptl_reply {
86 ptl_handle_wire_t dst_wmd;
87 } WIRE_ATTR ptl_reply_t;
89 typedef struct ptl_hello {
92 } WIRE_ATTR ptl_hello_t;
99 __u32 type; /* ptl_msg_type_t */
100 __u32 payload_length; /* payload data to follow */
101 /*<------__u64 aligned------->*/
109 } WIRE_ATTR ptl_hdr_t;
111 /* A HELLO message contains the portals magic number and protocol version
112 * code in the header's dest_nid, the peer's NID in the src_nid, and
113 * PTL_MSG_HELLO in the type field. All other common fields are zero
114 * (including payload_size; i.e. no payload).
115 * This is for use by byte-stream NALs (e.g. TCP/IP) to check the peer is
116 * running the same protocol and to find out its NID, so that hosts with
117 * multiple IP interfaces can have a single NID. These NALs should exchange
118 * HELLO messages when a connection is first established.
119 * Individual NALs can put whatever else they fancy in ptl_hdr_t::msg.
122 __u32 magic; /* PORTALS_PROTO_MAGIC */
123 __u16 version_major; /* increment on incompatible change */
124 __u16 version_minor; /* increment on compatible change */
125 } WIRE_ATTR ptl_magicversion_t;
127 #define PORTALS_PROTO_MAGIC 0xeebc0ded
129 #define PORTALS_PROTO_VERSION_MAJOR 1
130 #define PORTALS_PROTO_VERSION_MINOR 0
133 long recv_count, recv_length, send_count, send_length, drop_count,
134 drop_length, msgs_alloc, msgs_max;
137 /* temporary expedient: limit number of entries in discontiguous MDs */
138 #define PTL_MTU (1<<20)
139 #define PTL_MD_MAX_IOV 256
142 struct list_head msg_list;
144 ptl_handle_wire_t ack_wmd;
150 struct list_head *tbl;
158 struct list_head lh_hash_chain;
162 #define lh_entry(ptr, type, member) \
163 ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
166 struct list_head eq_list;
168 ptl_seq_t eq_enq_seq;
169 ptl_seq_t eq_deq_seq;
171 ptl_event_t *eq_events;
173 ptl_eq_handler_t eq_callback;
178 struct list_head me_list;
180 ptl_process_id_t match_id;
181 ptl_match_bits_t match_bits, ignore_bits;
187 struct list_head md_list;
196 unsigned int options;
197 unsigned int md_flags;
201 unsigned int md_niov; /* # frags */
203 struct iovec iov[PTL_MD_MAX_IOV];
204 ptl_kiov_t kiov[PTL_MD_MAX_IOV];
208 #define PTL_MD_FLAG_ZOMBIE (1 << 0)
209 #define PTL_MD_FLAG_AUTO_UNLINK (1 << 1)
211 static inline int lib_md_exhausted (lib_md_t *md)
213 return (md->threshold == 0 ||
214 ((md->options & PTL_MD_MAX_SIZE) != 0 &&
215 md->offset + md->max_size > md->length));
218 #ifdef PTL_USE_LIB_FREELIST
221 void *fl_objs; /* single contiguous array of objects */
222 int fl_nobjs; /* the number of them */
223 int fl_objsize; /* the size (including overhead) of each of them */
224 struct list_head fl_list; /* where they are enqueued */
229 struct list_head fo_list; /* enqueue on fl_list */
230 void *fo_contents; /* aligned contents */
235 /* info about peers we are trying to fail */
236 struct list_head tp_list; /* stash in ni.ni_test_peers */
237 ptl_nid_t tp_nid; /* matching nid */
238 unsigned int tp_threshold; /* # failures to simulate */
241 #define PTL_COOKIE_TYPE_MD 1
242 #define PTL_COOKIE_TYPE_ME 2
243 #define PTL_COOKIE_TYPE_EQ 3
244 #define PTL_COOKIE_TYPES 4
245 /* PTL_COOKIE_TYPES must be a power of 2, so the cookie type can be
246 * extracted by masking with (PTL_COOKIE_TYPES - 1) */
248 typedef struct lib_ni
251 ptl_process_id_t ni_pid;
252 lib_ptl_t ni_portals;
253 lib_counters_t ni_counters;
254 ptl_ni_limits_t ni_actual_limits;
256 int ni_lh_hash_size; /* size of lib handle hash table */
257 struct list_head *ni_lh_hash_table; /* all extant lib handles, this interface */
258 __u64 ni_next_object_cookie; /* cookie generator */
259 __u64 ni_interface_cookie; /* uniquely identifies this ni in this epoch */
261 struct list_head ni_test_peers;
262 int ni_loopback; /* loopback shortcircuits NAL */
264 #ifdef PTL_USE_LIB_FREELIST
265 lib_freelist_t ni_free_mes;
266 lib_freelist_t ni_free_msgs;
267 lib_freelist_t ni_free_mds;
268 lib_freelist_t ni_free_eqs;
271 struct list_head ni_active_msgs;
272 struct list_head ni_active_mds;
273 struct list_head ni_active_eqs;
277 cfs_waitq_t ni_waitq;
279 pthread_mutex_t ni_mutex;
280 pthread_cond_t ni_cond;
285 typedef struct lib_nal
287 /* lib-level interface state */
290 /* NAL-private data */
294 * send: Sends a preformatted header and payload data to a
295 * specified remote process. The payload is scattered over 'niov'
296 * fragments described by iov, starting at 'offset' for 'mlen'
298 * NB the NAL may NOT overwrite iov.
299 * PTL_OK on success => NAL has committed to send and will call
300 * lib_finalize on completion
302 ptl_err_t (*libnal_send)
303 (struct lib_nal *nal, void *private, lib_msg_t *cookie,
304 ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
305 unsigned int niov, struct iovec *iov,
306 size_t offset, size_t mlen);
308 /* as send, but with a set of page fragments (NULL if not supported) */
309 ptl_err_t (*libnal_send_pages)
310 (struct lib_nal *nal, void *private, lib_msg_t * cookie,
311 ptl_hdr_t * hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
312 unsigned int niov, ptl_kiov_t *iov,
313 size_t offset, size_t mlen);
315 * recv: Receives an incoming message from a remote process. The
316 * payload is to be received into the scattered buffer of 'niov'
317 * fragments described by iov, starting at 'offset' for 'mlen'
318 * bytes. Payload bytes after 'mlen' up to 'rlen' are to be
320 * NB the NAL may NOT overwrite iov.
321 * PTL_OK on success => NAL has committed to receive and will call
322 * lib_finalize on completion
324 ptl_err_t (*libnal_recv)
325 (struct lib_nal *nal, void *private, lib_msg_t * cookie,
326 unsigned int niov, struct iovec *iov,
327 size_t offset, size_t mlen, size_t rlen);
329 /* as recv, but with a set of page fragments (NULL if not supported) */
330 ptl_err_t (*libnal_recv_pages)
331 (struct lib_nal *nal, void *private, lib_msg_t * cookie,
332 unsigned int niov, ptl_kiov_t *iov,
333 size_t offset, size_t mlen, size_t rlen);
336 * (un)map: Tell the NAL about some memory it will access.
337 * *addrkey passed to libnal_unmap() is what libnal_map() set it to.
338 * type of *iov depends on options.
339 * Set to NULL if not required.
341 ptl_err_t (*libnal_map)
342 (struct lib_nal *nal, unsigned int niov, struct iovec *iov,
345 (struct lib_nal *nal, unsigned int niov, struct iovec *iov,
348 /* as (un)map, but with a set of page fragments */
349 ptl_err_t (*libnal_map_pages)
350 (struct lib_nal *nal, unsigned int niov, ptl_kiov_t *iov,
352 void (*libnal_unmap_pages)
353 (struct lib_nal *nal, unsigned int niov, ptl_kiov_t *iov,
356 void (*libnal_printf)(struct lib_nal *nal, const char *fmt, ...);
358 /* Calculate a network "distance" to given node */
359 int (*libnal_dist) (struct lib_nal *nal, ptl_nid_t nid, unsigned long *dist);
362 typedef struct /* loopback descriptor */
364 unsigned int lod_type;
365 unsigned int lod_niov;
374 #define LOD_IOV 0xeb105
375 #define LOD_KIOV 0xeb106