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
13 #include <portals/types.h>
15 # define PTL_USE_SLAB_CACHE
16 # include <linux/uio.h>
17 # include <linux/smp_lock.h>
18 # include <linux/types.h>
20 # include <sys/types.h>
23 /* struct nal_cb_t is defined in lib-nal.h */
24 typedef struct nal_cb_t nal_cb_t;
26 typedef char *user_ptr;
27 typedef struct lib_msg_t lib_msg_t;
28 typedef struct lib_ptl_t lib_ptl_t;
29 typedef struct lib_ac_t lib_ac_t;
30 typedef struct lib_me_t lib_me_t;
31 typedef struct lib_md_t lib_md_t;
32 typedef struct lib_eq_t lib_eq_t;
34 #define WIRE_ATTR __attribute__((packed))
36 /* The wire handle's interface cookie only matches one network interface in
37 * one epoch (i.e. new cookie when the interface restarts or the node
38 * reboots). The object cookie only matches one object on that interface
39 * during that object's lifetime (i.e. no cookie re-use). */
41 __u64 wh_interface_cookie;
42 __u64 wh_object_cookie;
43 } WIRE_ATTR ptl_handle_wire_t;
45 /* byte-flip insensitive! */
46 #define PTL_WIRE_HANDLE_NONE \
47 ((const ptl_handle_wire_t) {.wh_interface_cookie = -1, .wh_object_cookie = -1})
57 /* Each of these structs should start with an odd number of
58 * __u32, or the compiler could add its own padding and confuse
61 * Also, "length" needs to be at offset 28 of each struct.
63 typedef struct ptl_ack {
65 ptl_handle_wire_t dst_wmd;
66 ptl_match_bits_t match_bits;
67 ptl_size_t length; /* common length (0 for acks) moving out RSN */
68 } WIRE_ATTR ptl_ack_t;
70 typedef struct ptl_put {
71 ptl_pt_index_t ptl_index;
72 ptl_handle_wire_t ack_wmd;
73 ptl_match_bits_t match_bits;
74 ptl_size_t length; /* common length moving out RSN */
76 ptl_hdr_data_t hdr_data;
77 } WIRE_ATTR ptl_put_t;
79 typedef struct ptl_get {
80 ptl_pt_index_t ptl_index;
81 ptl_handle_wire_t return_wmd;
82 ptl_match_bits_t match_bits;
83 ptl_size_t length; /* common length (0 for gets) moving out RSN */
84 ptl_size_t src_offset;
85 ptl_size_t return_offset; /* unused: going RSN */
86 ptl_size_t sink_length;
87 } WIRE_ATTR ptl_get_t;
89 typedef struct ptl_reply {
90 __u32 unused1; /* unused fields going RSN */
91 ptl_handle_wire_t dst_wmd;
92 ptl_size_t dst_offset; /* unused: going RSN */
94 ptl_size_t length; /* common length moving out RSN */
95 } WIRE_ATTR ptl_reply_t;
102 __u32 type; /* ptl_msg_type_t */
109 } WIRE_ATTR ptl_hdr_t;
111 /* All length fields in individual unions at same offset */
112 /* LASSERT for same in lib-move.c */
113 #define PTL_HDR_LENGTH(h) ((h)->msg.ack.length)
115 /* A HELLO message contains the portals magic number and protocol version
116 * code in the header's dest_nid, the peer's NID in the src_nid, and
117 * PTL_MSG_HELLO in the type field. All other fields are zero (including
118 * PTL_HDR_LENGTH; i.e. no payload).
119 * This is for use by byte-stream NALs (e.g. TCP/IP) to check the peer is
120 * running the same protocol and to find out its NID, so that hosts with
121 * multiple IP interfaces can have a single NID. These NALs should exchange
122 * HELLO messages when a connection is first established. */
124 __u32 magic; /* PORTALS_PROTO_MAGIC */
125 __u16 version_major; /* increment on incompatible change */
126 __u16 version_minor; /* increment on compatible change */
127 } WIRE_ATTR ptl_magicversion_t;
129 #define PORTALS_PROTO_MAGIC 0xeebc0ded
131 #define PORTALS_PROTO_VERSION_MAJOR 0
132 #define PORTALS_PROTO_VERSION_MINOR 1
135 long recv_count, recv_length, send_count, send_length, drop_count,
136 drop_length, msgs_alloc, msgs_max;
139 /* temporary expedient: limit number of entries in discontiguous MDs */
141 # define PTL_MD_MAX_IOV 64
143 # define PTL_MD_MAX_IOV 16
147 struct list_head msg_list;
153 ptl_handle_wire_t ack_wmd;
155 struct iovec iov[PTL_MD_MAX_IOV];
156 ptl_kiov_t kiov[PTL_MD_MAX_IOV];
162 struct list_head *tbl;
170 struct list_head lh_hash_chain;
174 #define lh_entry(ptr, type, member) \
175 ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
178 struct list_head eq_list;
184 int (*event_callback) (ptl_event_t * event);
189 struct list_head me_list;
191 ptl_process_id_t match_id;
192 ptl_match_bits_t match_bits, ignore_bits;
198 struct list_head md_list;
208 unsigned int options;
209 unsigned int md_flags;
213 unsigned int md_niov; /* # frags */
215 struct iovec iov[PTL_MD_MAX_IOV];
216 ptl_kiov_t kiov[PTL_MD_MAX_IOV];
220 #define PTL_MD_FLAG_UNLINK (1 << 0)
221 #define PTL_MD_FLAG_AUTO_UNLINKED (1 << 1)
223 #ifndef PTL_USE_SLAB_CACHE
226 void *fl_objs; /* single contiguous array of objects */
227 int fl_nobjs; /* the number of them */
228 int fl_objsize; /* the size (including overhead) of each of them */
229 struct list_head fl_list; /* where they are enqueued */
234 struct list_head fo_list; /* enqueue on fl_list */
235 void *fo_contents; /* aligned contents */
240 /* info about peers we are trying to fail */
241 struct list_head tp_list; /* stash in ni.ni_test_peers */
242 ptl_nid_t tp_nid; /* matching nid */
243 unsigned int tp_threshold; /* # failures to simulate */
246 #define PTL_COOKIE_TYPE_MD 1
247 #define PTL_COOKIE_TYPE_ME 2
248 #define PTL_COOKIE_TYPE_EQ 3
249 #define PTL_COOKIE_TYPES 4
250 /* PTL_COOKIE_TYPES must be a power of 2, so the cookie type can be
251 * extracted by masking with (PTL_COOKIE_TYPES - 1) */
262 lib_counters_t counters;
264 int ni_lh_hash_size; /* size of lib handle hash table */
265 struct list_head *ni_lh_hash_table; /* all extant lib handles, this interface */
266 __u64 ni_next_object_cookie; /* cookie generator */
267 __u64 ni_interface_cookie; /* uniquely identifies this ni in this epoch */
269 struct list_head ni_test_peers;
271 #ifndef PTL_USE_SLAB_CACHE
272 lib_freelist_t ni_free_mes;
273 lib_freelist_t ni_free_msgs;
274 lib_freelist_t ni_free_mds;
275 lib_freelist_t ni_free_eqs;
277 struct list_head ni_active_msgs;
278 struct list_head ni_active_mds;
279 struct list_head ni_active_eqs;