#ifndef __INCLUDE_GMNAL_H__
#define __INCLUDE_GMNAL_H__
+/* XXX Lustre as of V1.2.2 drop defines VERSION, which causes problems
+ * when including <GM>/include/gm_lanai.h which defines a structure field
+ * with the name VERSION XXX */
+#ifdef VERSION
+# undef VERSION
+#endif
+
#ifndef EXPORT_SYMTAB
# define EXPORT_SYMTAB
#endif
#include "linux/init.h"
#include "linux/sem.h"
#include "linux/vmalloc.h"
+#include "linux/sysctl.h"
-#define DEBUG_SUBSYSTEM S_GMNAL
+#define DEBUG_SUBSYSTEM S_NAL
#include "portals/nal.h"
#include "portals/api.h"
#include "portals/errno.h"
-#include "linux/kp30.h"
+#include "libcfs/kp30.h"
#include "portals/p30.h"
-#include "portals/lib-nal.h"
+#include "portals/nal.h"
#include "portals/lib-p30.h"
#define GM_STRONG_TYPES 1
+#ifdef VERSION
+#undef VERSION
+#endif
#include "gm.h"
#include "gm_internal.h"
extern int gmnal_small_msg_size;
extern int num_rx_threads;
extern int num_stxds;
+extern int gm_port_id;
#define GMNAL_SMALL_MSG_SIZE(a) a->small_msg_size
#define GMNAL_IS_SMALL_MESSAGE(n,a,b,c) gmnal_is_small_msg(n, a, b, c)
#define GMNAL_MAGIC 0x1234abcd
+/*
+ * The gm_port to use for gmnal
+ */
+#define GMNAL_GM_PORT_ID gm_port_id
/*
/*
* Header which lmgnal puts at the start of each message
+ * watch alignment for ia32/64 interaction
*/
typedef struct _gmnal_msghdr {
int magic;
int type;
unsigned int sender_node_id;
- gmnal_stxd_t *stxd;
int niov;
+ gm_remote_ptr_t stxd_remote_ptr; /* 64 bits */
} gmnal_msghdr_t;
#define GMNAL_MSGHDR_SIZE sizeof(gmnal_msghdr_t)
gmnal_srxd_t *srxd;
struct gm_hash *srxd_hash;
nal_t *nal;
- nal_cb_t *nal_cb;
+ lib_nal_t *libnal;
struct gm_port *gm_port;
unsigned int gm_local_nid;
unsigned int gm_global_nid;
gmnal_rxtwe_t *rxtwe_tail;
spinlock_t rxtwe_lock;
struct semaphore rxtwe_wait;
+ struct ctl_table_header *sysctl;
} gmnal_data_t;
/*
extern gmnal_data_t *global_nal_data;
/*
- * The gm_port to use for gmnal
- */
-#define GMNAL_GM_PORT 4
-
-/*
* for ioctl get pid
*/
#define GMNAL_IOC_GET_GNID 1
/*
* API NAL
*/
+int gmnal_api_startup(nal_t *, ptl_pid_t,
+ ptl_ni_limits_t *, ptl_ni_limits_t *);
+
int gmnal_api_forward(nal_t *, int, void *, size_t, void *, size_t);
-int gmnal_api_shutdown(nal_t *, int);
+void gmnal_api_shutdown(nal_t *);
int gmnal_api_validate(nal_t *, void *, size_t);
-void gmnal_api_yield(nal_t *);
+void gmnal_api_yield(nal_t *, unsigned long *, int);
void gmnal_api_lock(nal_t *, unsigned long *);
#define GMNAL_INIT_NAL(a) do { \
- a->forward = gmnal_api_forward; \
- a->shutdown = gmnal_api_shutdown; \
- a->validate = NULL; \
- a->yield = gmnal_api_yield; \
- a->lock = gmnal_api_lock; \
- a->unlock = gmnal_api_unlock; \
- a->timeout = NULL; \
- a->refct = 1; \
- a->nal_data = NULL; \
+ (a)->nal_ni_init = gmnal_api_startup; \
+ (a)->nal_ni_fini = gmnal_api_shutdown; \
+ (a)->nal_data = NULL; \
} while (0)
* CB NAL
*/
-int gmnal_cb_send(nal_cb_t *, void *, lib_msg_t *, ptl_hdr_t *,
- int, ptl_nid_t, ptl_pid_t, unsigned int, struct iovec *, size_t);
-
-int gmnal_cb_send_pages(nal_cb_t *, void *, lib_msg_t *, ptl_hdr_t *,
- int, ptl_nid_t, ptl_pid_t, unsigned int, ptl_kiov_t *, size_t);
-
-int gmnal_cb_recv(nal_cb_t *, void *, lib_msg_t *,
- unsigned int, struct iovec *, size_t, size_t);
-
-int gmnal_cb_recv_pages(nal_cb_t *, void *, lib_msg_t *,
- unsigned int, ptl_kiov_t *, size_t, size_t);
-
-int gmnal_cb_read(nal_cb_t *, void *private, void *, user_ptr, size_t);
-
-int gmnal_cb_write(nal_cb_t *, void *private, user_ptr, void *, size_t);
-
-void *gmnal_cb_malloc(nal_cb_t *, size_t);
-
-void gmnal_cb_free(nal_cb_t *, void *, size_t);
-
-void gmnal_cb_unmap(nal_cb_t *, unsigned int, struct iovec*, void **);
-
-int gmnal_cb_map(nal_cb_t *, unsigned int, struct iovec*, void **);
+ptl_err_t gmnal_cb_send(lib_nal_t *, void *, lib_msg_t *, ptl_hdr_t *,
+ int, ptl_nid_t, ptl_pid_t, unsigned int, struct iovec *, size_t, size_t);
-void gmnal_cb_printf(nal_cb_t *, const char *fmt, ...);
+ptl_err_t gmnal_cb_send_pages(lib_nal_t *, void *, lib_msg_t *, ptl_hdr_t *,
+ int, ptl_nid_t, ptl_pid_t, unsigned int, ptl_kiov_t *, size_t, size_t);
-void gmnal_cb_cli(nal_cb_t *, unsigned long *);
+ptl_err_t gmnal_cb_recv(lib_nal_t *, void *, lib_msg_t *,
+ unsigned int, struct iovec *, size_t, size_t, size_t);
-void gmnal_cb_sti(nal_cb_t *, unsigned long *);
+ptl_err_t gmnal_cb_recv_pages(lib_nal_t *, void *, lib_msg_t *,
+ unsigned int, ptl_kiov_t *, size_t, size_t, size_t);
-int gmnal_cb_dist(nal_cb_t *, ptl_nid_t, unsigned long *);
+int gmnal_cb_dist(lib_nal_t *, ptl_nid_t, unsigned long *);
-nal_t *gmnal_init(int, ptl_pt_index_t, ptl_ac_index_t, ptl_pid_t rpid);
+int gmnal_init(void);
void gmnal_fini(void);
#define GMNAL_INIT_NAL_CB(a) do { \
- a->cb_send = gmnal_cb_send; \
- a->cb_send_pages = gmnal_cb_send_pages; \
- a->cb_recv = gmnal_cb_recv; \
- a->cb_recv_pages = gmnal_cb_recv_pages; \
- a->cb_read = gmnal_cb_read; \
- a->cb_write = gmnal_cb_write; \
- a->cb_callback = NULL; \
- a->cb_malloc = gmnal_cb_malloc; \
- a->cb_free = gmnal_cb_free; \
- a->cb_map = NULL; \
- a->cb_unmap = NULL; \
- a->cb_printf = gmnal_cb_printf; \
- a->cb_cli = gmnal_cb_cli; \
- a->cb_sti = gmnal_cb_sti; \
- a->cb_dist = gmnal_cb_dist; \
- a->nal_data = NULL; \
+ a->libnal_send = gmnal_cb_send; \
+ a->libnal_send_pages = gmnal_cb_send_pages; \
+ a->libnal_recv = gmnal_cb_recv; \
+ a->libnal_recv_pages = gmnal_cb_recv_pages; \
+ a->libnal_map = NULL; \
+ a->libnal_unmap = NULL; \
+ a->libnal_dist = gmnal_cb_dist; \
+ a->libnal_data = NULL; \
} while (0)
gmnal_srxd_t *gmnal_rxbuffer_to_srxd(gmnal_data_t *, void*);
void gmnal_stop_rxthread(gmnal_data_t *);
void gmnal_stop_ctthread(gmnal_data_t *);
-void gmnal_small_tx_callback(gm_port_t *, void *, gm_status_t);
void gmnal_drop_sends_callback(gm_port_t *, void *, gm_status_t);
+void gmnal_resume_sending_callback(gm_port_t *, void *, gm_status_t);
char *gmnal_gm_error(gm_status_t);
char *gmnal_rxevent(gm_recv_event_t*);
int gmnal_is_small_msg(gmnal_data_t*, int, struct iovec*, int);
/*
* Small messages
*/
-int gmnal_small_rx(nal_cb_t *, void *, lib_msg_t *, unsigned int,
- struct iovec *, size_t, size_t);
-int gmnal_small_tx(nal_cb_t *, void *, lib_msg_t *, ptl_hdr_t *,
+ptl_err_t gmnal_small_rx(lib_nal_t *, void *, lib_msg_t *);
+ptl_err_t gmnal_small_tx(lib_nal_t *, void *, lib_msg_t *, ptl_hdr_t *,
int, ptl_nid_t, ptl_pid_t,
- unsigned int, struct iovec*, int);
+ gmnal_stxd_t*, int);
void gmnal_small_tx_callback(gm_port_t *, void *, gm_status_t);
/*
* Large messages
*/
-int gmnal_large_rx(nal_cb_t *, void *, lib_msg_t *, unsigned int,
- struct iovec *, size_t, size_t);
+int gmnal_large_rx(lib_nal_t *, void *, lib_msg_t *, unsigned int,
+ struct iovec *, size_t, size_t, size_t);
-int gmnal_large_tx(nal_cb_t *, void *, lib_msg_t *, ptl_hdr_t *,
+int gmnal_large_tx(lib_nal_t *, void *, lib_msg_t *, ptl_hdr_t *,
int, ptl_nid_t, ptl_pid_t, unsigned int,
- struct iovec*, int);
+ struct iovec*, size_t, int);
void gmnal_large_tx_callback(gm_port_t *, void *, gm_status_t);