#ifndef _LIB_TYPES_H_
#define _LIB_TYPES_H_
+#include "build_check.h"
+
#include <portals/types.h>
#ifdef __KERNEL__
-# define PTL_USE_SLAB_CACHE
# include <linux/uio.h>
# include <linux/smp_lock.h>
# include <linux/types.h>
#else
+# define PTL_USE_LIB_FREELIST
# include <sys/types.h>
#endif
PTL_MSG_HELLO,
} ptl_msg_type_t;
-/* Each of these structs should start with an odd number of
- * __u32, or the compiler could add its own padding and confuse
- * everyone.
- *
- * Also, "length" needs to be at offset 28 of each struct.
- */
+/* The variant fields of the portals message header are aligned on an 8
+ * byte boundary in the message header. Note that all types used in these
+ * wire structs MUST be fixed size and the smaller types are placed at the
+ * end. */
typedef struct ptl_ack {
- ptl_size_t mlength;
- ptl_handle_wire_t dst_wmd;
- ptl_match_bits_t match_bits;
- ptl_size_t length; /* common length (0 for acks) moving out RSN */
+ ptl_handle_wire_t dst_wmd;
+ ptl_match_bits_t match_bits;
+ ptl_size_t mlength;
} WIRE_ATTR ptl_ack_t;
typedef struct ptl_put {
- ptl_pt_index_t ptl_index;
- ptl_handle_wire_t ack_wmd;
- ptl_match_bits_t match_bits;
- ptl_size_t length; /* common length moving out RSN */
- ptl_size_t offset;
- ptl_hdr_data_t hdr_data;
+ ptl_handle_wire_t ack_wmd;
+ ptl_match_bits_t match_bits;
+ ptl_hdr_data_t hdr_data;
+ ptl_pt_index_t ptl_index;
+ ptl_size_t offset;
} WIRE_ATTR ptl_put_t;
typedef struct ptl_get {
- ptl_pt_index_t ptl_index;
- ptl_handle_wire_t return_wmd;
- ptl_match_bits_t match_bits;
- ptl_size_t length; /* common length (0 for gets) moving out RSN */
- ptl_size_t src_offset;
- ptl_size_t return_offset; /* unused: going RSN */
- ptl_size_t sink_length;
+ ptl_handle_wire_t return_wmd;
+ ptl_match_bits_t match_bits;
+ ptl_pt_index_t ptl_index;
+ ptl_size_t src_offset;
+ ptl_size_t sink_length;
} WIRE_ATTR ptl_get_t;
typedef struct ptl_reply {
- __u32 unused1; /* unused fields going RSN */
- ptl_handle_wire_t dst_wmd;
- ptl_size_t dst_offset; /* unused: going RSN */
- __u32 unused2;
- ptl_size_t length; /* common length moving out RSN */
+ ptl_handle_wire_t dst_wmd;
} WIRE_ATTR ptl_reply_t;
+typedef struct ptl_hello {
+ __u64 incarnation;
+ __u32 type;
+} WIRE_ATTR ptl_hello_t;
+
typedef struct {
- ptl_nid_t dest_nid;
- ptl_nid_t src_nid;
- ptl_pid_t dest_pid;
- ptl_pid_t src_pid;
- __u32 type; /* ptl_msg_type_t */
+ ptl_nid_t dest_nid;
+ ptl_nid_t src_nid;
+ ptl_pid_t dest_pid;
+ ptl_pid_t src_pid;
+ __u32 type; /* ptl_msg_type_t */
+ __u32 payload_length; /* payload data to follow */
+ /*<------__u64 aligned------->*/
union {
- ptl_ack_t ack;
- ptl_put_t put;
- ptl_get_t get;
+ ptl_ack_t ack;
+ ptl_put_t put;
+ ptl_get_t get;
ptl_reply_t reply;
+ ptl_hello_t hello;
} msg;
} WIRE_ATTR ptl_hdr_t;
-/* All length fields in individual unions at same offset */
-/* LASSERT for same in lib-move.c */
-#define PTL_HDR_LENGTH(h) ((h)->msg.ack.length)
-
/* A HELLO message contains the portals magic number and protocol version
* code in the header's dest_nid, the peer's NID in the src_nid, and
- * PTL_MSG_HELLO in the type field. All other fields are zero (including
- * PTL_HDR_LENGTH; i.e. no payload).
+ * PTL_MSG_HELLO in the type field. All other common fields are zero
+ * (including payload_size; i.e. no payload).
* This is for use by byte-stream NALs (e.g. TCP/IP) to check the peer is
* running the same protocol and to find out its NID, so that hosts with
* multiple IP interfaces can have a single NID. These NALs should exchange
- * HELLO messages when a connection is first established. */
+ * HELLO messages when a connection is first established.
+ * Individual NALs can put whatever else they fancy in ptl_hdr_t::msg.
+ */
typedef struct {
__u32 magic; /* PORTALS_PROTO_MAGIC */
__u16 version_major; /* increment on incompatible change */
#define PORTALS_PROTO_MAGIC 0xeebc0ded
#define PORTALS_PROTO_VERSION_MAJOR 0
-#define PORTALS_PROTO_VERSION_MINOR 1
+#define PORTALS_PROTO_VERSION_MINOR 3
typedef struct {
long recv_count, recv_length, send_count, send_length, drop_count,
} lib_counters_t;
/* temporary expedient: limit number of entries in discontiguous MDs */
-#if PTL_LARGE_MTU
-# define PTL_MD_MAX_IOV 64
-#else
-# define PTL_MD_MAX_IOV 16
-#endif
+#define PTL_MTU (512<<10)
+#define PTL_MD_MAX_IOV 128
struct lib_msg_t {
struct list_head msg_list;
- int send_ack;
lib_md_t *md;
- ptl_nid_t nid;
- ptl_pid_t pid;
- ptl_event_t ev;
ptl_handle_wire_t ack_wmd;
- union {
- struct iovec iov[PTL_MD_MAX_IOV];
- ptl_kiov_t kiov[PTL_MD_MAX_IOV];
- } msg_iov;
+ ptl_event_t ev;
};
struct lib_ptl_t {
ptl_size_t size;
ptl_event_t *base;
int eq_refcount;
- int (*event_callback) (ptl_event_t * event);
+ ptl_eq_handler_t event_callback;
void *eq_addrkey;
};
ptl_size_t max_size;
int threshold;
int pending;
- ptl_unlink_t unlink;
unsigned int options;
unsigned int md_flags;
void *user_ptr;
} md_iov;
};
-#define PTL_MD_FLAG_UNLINK (1 << 0)
-#define PTL_MD_FLAG_AUTO_UNLINKED (1 << 1)
+#define PTL_MD_FLAG_ZOMBIE (1 << 0)
+#define PTL_MD_FLAG_AUTO_UNLINK (1 << 1)
+
+static inline int lib_md_exhausted (lib_md_t *md)
+{
+ return (md->threshold == 0 ||
+ ((md->options & PTL_MD_MAX_SIZE) != 0 &&
+ md->offset + md->max_size > md->length));
+}
-#ifndef PTL_USE_SLAB_CACHE
+#ifdef PTL_USE_LIB_FREELIST
typedef struct
{
void *fl_objs; /* single contiguous array of objects */
* extracted by masking with (PTL_COOKIE_TYPES - 1) */
typedef struct {
- int up;
- int refcnt;
ptl_nid_t nid;
ptl_pid_t pid;
- int num_nodes;
- unsigned int debug;
lib_ptl_t tbl;
- lib_ac_t ac;
lib_counters_t counters;
+ ptl_ni_limits_t actual_limits;
int ni_lh_hash_size; /* size of lib handle hash table */
struct list_head *ni_lh_hash_table; /* all extant lib handles, this interface */
struct list_head ni_test_peers;
-#ifndef PTL_USE_SLAB_CACHE
+#ifdef PTL_USE_LIB_FREELIST
lib_freelist_t ni_free_mes;
lib_freelist_t ni_free_msgs;
lib_freelist_t ni_free_mds;