#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/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;
+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 gm_port
+#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)
#define NRXTHREADS 10 /* max number of receiver threads */
typedef struct _gmnal_data_t {
+ int refcnt;
+ spinlock_t cb_lock;
spinlock_t stxd_lock;
struct semaphore stxd_token;
gmnal_stxd_t *stxd;
#define GMNAL_GM_LOCK_INIT(a) spin_lock_init(&a->gm_lock);
#define GMNAL_GM_LOCK(a) spin_lock(&a->gm_lock);
#define GMNAL_GM_UNLOCK(a) spin_unlock(&a->gm_lock);
+#define GMNAL_CB_LOCK_INIT(a) spin_lock_init(&a->cb_lock);
/*
#define GMNAL_INIT_NAL(a) do { \
- a->startup = gmnal_api_startup; \
- a->forward = gmnal_api_forward; \
- a->shutdown = gmnal_api_shutdown; \
- a->yield = gmnal_api_yield; \
- a->lock = gmnal_api_lock; \
- a->unlock = gmnal_api_unlock; \
- a->timeout = NULL; \
- 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(lib_nal_t *, void *, lib_msg_t *, ptl_hdr_t *,
- int, ptl_nid_t, ptl_pid_t, unsigned int, struct iovec *, size_t);
+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);
-int 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);
+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);
-int gmnal_cb_recv(lib_nal_t *, void *, lib_msg_t *,
- unsigned int, struct iovec *, size_t, size_t);
+ptl_err_t gmnal_cb_recv(lib_nal_t *, void *, lib_msg_t *,
+ unsigned int, struct iovec *, size_t, size_t, size_t);
-int gmnal_cb_recv_pages(lib_nal_t *, void *, lib_msg_t *,
- unsigned int, ptl_kiov_t *, size_t, size_t);
+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(lib_nal_t *, ptl_nid_t, unsigned long *);
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);
/*
* Small messages
*/
-int gmnal_small_rx(lib_nal_t *, void *, lib_msg_t *, unsigned int,
- struct iovec *, size_t, size_t);
-int gmnal_small_tx(lib_nal_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(lib_nal_t *, void *, lib_msg_t *, unsigned int,
- struct iovec *, size_t, size_t);
+ struct iovec *, size_t, size_t, size_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);