#define copy_from_user(kaddr, uaddr, size) copyin((caddr_t)uaddr, (caddr_t)kaddr, size)
#define copy_to_user(uaddr, kaddr, size) copyout((caddr_t)kaddr, (caddr_t)uaddr, size)
+#error "need this define"
+#define strncpy_from_user(kaddr, uaddr, size) "something"
+
#if defined (__ppc__)
#define mb() __asm__ __volatile__ ("sync" : : : "memory")
#define rmb() __asm__ __volatile__ ("sync" : : : "memory")
#define CLASSERT(cond) ({ switch(42) { case (cond): case 0: break; } })
/* support decl needed both by kernel and liblustre */
-int libcfs_isknown_nettype(int type);
-char *libcfs_nettype2str(int type);
-char *libcfs_nid2str(ptl_nid_t nid);
-char *libcfs_id2str(ptl_process_id_t id);
+int libcfs_isknown_nal(int type);
+char *libcfs_nal2str(int type);
+int libcfs_str2nal(char *str);
+char *libcfs_net2str(__u32 net);
+char *libcfs_nid2str(ptl_nid_t nid);
+__u32 libcfs_str2net(char *str);
+ptl_nid_t libcfs_str2nid(char *str);
+int libcfs_str2anynid(ptl_nid_t *nid, char *str);
+char *libcfs_id2str(ptl_process_id_t id);
+
+#if !CRAY_PORTALS
+/* how a lustre portals NID encodes net:address */
+#define PTL_NIDADDR(nid) ((__u32)((nid) & 0xffffffff))
+#define PTL_NIDNET(nid) ((__u32)(((nid) >> 32)) & 0xffffffff)
+#define PTL_MKNID(net,addr) ((((__u64)(net))<<32)|((__u64)(addr)))
+/* how net encodes type:number */
+#define PTL_NETNUM(net) ((net) & 0xffff)
+#define PTL_NETNAL(net) (((net) >> 16) & 0xffff)
+#define PTL_MKNET(nal,num) ((((__u32)(nal))<<16)|((__u32)(num)))
+#endif
#ifndef CURRENT_TIME
# define CURRENT_TIME time(0)
* USER LEVEL STUFF BELOW
*/
-#define PORTAL_IOCTL_VERSION 0x00010008
-#define PING_SYNC 0
-#define PING_ASYNC 1
+#define PORTAL_IOCTL_VERSION 0x00010009
+
+struct portal_ioctl_data {
+ __u32 ioc_len;
+ __u32 ioc_version;
+
+ __u64 ioc_nid;
+ __u64 ioc_u64[1];
+
+ __u32 ioc_flags;
+ __u32 ioc_count;
+ __u32 ioc_net;
+ __u32 ioc_u32[6];
+
+ __u32 ioc_inllen1;
+ char *ioc_inlbuf1;
+ __u32 ioc_inllen2;
+ char *ioc_inlbuf2;
+
+ __u32 ioc_plen1; /* buffers in userspace */
+ char *ioc_pbuf1;
+ __u32 ioc_plen2; /* buffers in userspace */
+ char *ioc_pbuf2;
+
+ char ioc_bulk[0];
+};
+
struct portal_ioctl_hdr {
__u32 ioc_len;
/* ioctls for manipulating snapshots 30- */
#define IOC_PORTAL_TYPE 'e'
#define IOC_PORTAL_MIN_NR 30
+/* libcfs ioctls */
+#define IOC_PORTAL_PANIC _IOWR('e', 30, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_CLEAR_DEBUG _IOWR('e', 31, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_MARK_DEBUG _IOWR('e', 32, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_LWT_CONTROL _IOWR('e', 33, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_LWT_SNAPSHOT _IOWR('e', 34, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_LWT_LOOKUP_STRING _IOWR('e', 35, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_MEMHOG _IOWR('e', 36, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_PING _IOWR('e', 37, IOCTL_PORTAL_TYPE)
+/* portals ioctls */
+#define IOC_PORTAL_GET_NI _IOWR('e', 50, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_FAIL_NID _IOWR('e', 51, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_ADD_ROUTE _IOWR('e', 52, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_DEL_ROUTE _IOWR('e', 53, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_GET_ROUTE _IOWR('e', 54, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_NOTIFY_ROUTER _IOWR('e', 55, IOCTL_PORTAL_TYPE)
+/* nal ioctls */
+#define IOC_PORTAL_REGISTER_MYNID _IOWR('e', 70, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_CLOSE_CONNECTION _IOWR('e', 71, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_PUSH_CONNECTION _IOWR('e', 72, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_GET_CONN _IOWR('e', 73, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_DEL_PEER _IOWR('e', 74, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_ADD_PEER _IOWR('e', 75, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_GET_PEER _IOWR('e', 76, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_GET_TXDESC _IOWR('e', 77, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_ADD_INTERFACE _IOWR('e', 78, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_DEL_INTERFACE _IOWR('e', 79, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_GET_INTERFACE _IOWR('e', 80, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_GET_GMID _IOWR('e', 81, IOCTL_PORTAL_TYPE)
+
+#define IOC_PORTAL_MAX_NR 81
-#define IOC_PORTAL_PING _IOWR('e', 30, IOCTL_PORTAL_TYPE)
-
-#define IOC_PORTAL_CLEAR_DEBUG _IOWR('e', 32, IOCTL_PORTAL_TYPE)
-#define IOC_PORTAL_MARK_DEBUG _IOWR('e', 33, IOCTL_PORTAL_TYPE)
-#define IOC_PORTAL_PANIC _IOWR('e', 34, IOCTL_PORTAL_TYPE)
-#define IOC_PORTAL_NAL_CMD _IOWR('e', 35, IOCTL_PORTAL_TYPE)
-#define IOC_PORTAL_GET_NID _IOWR('e', 36, IOCTL_PORTAL_TYPE)
-#define IOC_PORTAL_FAIL_NID _IOWR('e', 37, IOCTL_PORTAL_TYPE)
-/* gap: use me! */
-#define IOC_PORTAL_LWT_CONTROL _IOWR('e', 39, IOCTL_PORTAL_TYPE)
-#define IOC_PORTAL_LWT_SNAPSHOT _IOWR('e', 40, IOCTL_PORTAL_TYPE)
-#define IOC_PORTAL_LWT_LOOKUP_STRING _IOWR('e', 41, IOCTL_PORTAL_TYPE)
-#define IOC_PORTAL_MEMHOG _IOWR('e', 42, IOCTL_PORTAL_TYPE)
-#define IOC_PORTAL_MAX_NR 42
enum {
- QSWNAL = 1,
+ LONAL = 1,
SOCKNAL = 2,
- GMNAL = 3,
- /* 4 unused */
- /* 5 unused */
- ROUTER = 6,
- OPENIBNAL = 7,
- IIBNAL = 8,
- LONAL = 9,
- RANAL = 10,
- VIBNAL = 11,
- NAL_ENUM_END_MARKER
+ QSWNAL = 3,
+ GMNAL = 4,
+ OPENIBNAL = 5,
+ IIBNAL = 6,
+ VIBNAL = 7,
+ RANAL = 8,
};
#define PTL_NALFMT_SIZE 32 /* %u:%u.%u.%u.%u,%u (10+4+4+4+3+5+1) */
-#define NAL_MAX_NR (NAL_ENUM_END_MARKER - 1)
-
-/* unused 100 */
-#define NAL_CMD_CLOSE_CONNECTION 101
-#define NAL_CMD_REGISTER_MYNID 102
-#define NAL_CMD_PUSH_CONNECTION 103
-#define NAL_CMD_GET_CONN 104
-#define NAL_CMD_DEL_PEER 105
-#define NAL_CMD_ADD_PEER 106
-#define NAL_CMD_GET_PEER 107
-#define NAL_CMD_GET_TXDESC 108
-#define NAL_CMD_ADD_ROUTE 109
-#define NAL_CMD_DEL_ROUTE 110
-#define NAL_CMD_GET_ROUTE 111
-#define NAL_CMD_NOTIFY_ROUTER 112
-#define NAL_CMD_ADD_INTERFACE 113
-#define NAL_CMD_DEL_INTERFACE 114
-#define NAL_CMD_GET_INTERFACE 115
-
-
enum {
DEBUG_DAEMON_START = 1,
DEBUG_DAEMON_STOP = 2,
#define LUSTRE_SRV_PTL_PID LUSTRE_PTL_PID
-/*
- * eeb cfg
- * ecf6
- * ecfG
- */
-#define PORTALS_CFG_VERSION 0xecf60001
-
-struct portals_cfg {
- __u32 pcfg_version;
- __u32 pcfg_command;
-
- __u32 pcfg_nal;
- __u32 pcfg_flags;
-
- __u32 pcfg_gw_nal;
- __u32 pcfg_padding1;
-
- __u64 pcfg_nid;
- __u64 pcfg_nid2;
- __u64 pcfg_nid3;
- __u32 pcfg_id;
- __u32 pcfg_misc;
- __u32 pcfg_fd;
- __u32 pcfg_count;
- __u32 pcfg_size;
- __u32 pcfg_wait;
-
- __u32 pcfg_plen1; /* buffers in userspace */
- __u32 pcfg_plen2; /* buffers in userspace */
- __u32 pcfg_alloc_size; /* size of this allocated portals_cfg */
- char pcfg_pbuf[0];
-};
-
-#define PCFG_INIT(pcfg, cmd) \
-do { \
- memset(&(pcfg), 0, sizeof((pcfg))); \
- (pcfg).pcfg_version = PORTALS_CFG_VERSION; \
- (pcfg).pcfg_command = (cmd); \
- \
-} while (0)
-
-#define PCFG_INIT_PBUF(pcfg, cmd, plen1, plen2) \
- do { \
- int bufsize = size_round(sizeof(*(pcfg))); \
- bufsize += size_round(plen1) + size_round(plen2); \
- PORTAL_ALLOC((pcfg), bufsize); \
- if ((pcfg)) { \
- memset((pcfg), 0, bufsize); \
- (pcfg)->pcfg_version = PORTALS_CFG_VERSION; \
- (pcfg)->pcfg_command = (cmd); \
- (pcfg)->pcfg_plen1 = (plen1); \
- (pcfg)->pcfg_plen2 = (plen2); \
- (pcfg)->pcfg_alloc_size = bufsize; \
- } \
- } while (0)
-
-#define PCFG_FREE_PBUF(pcfg) PORTAL_FREE((pcfg), (pcfg)->pcfg_alloc_size)
-
-#define PCFG_PBUF(pcfg, idx) \
- (0 == (idx) \
- ? ((char *)(pcfg) + size_round(sizeof(*(pcfg)))) \
- : (1 == (idx) \
- ? ((char *)(pcfg) + size_round(sizeof(*(pcfg))) + size_round(pcfg->pcfg_plen1)) \
- : (NULL)))
-
-typedef int (nal_cmd_handler_fn)(struct portals_cfg *, void *);
-int libcfs_nal_cmd_register(int nal, nal_cmd_handler_fn *handler, void *arg);
-int libcfs_nal_cmd(struct portals_cfg *pcfg);
-void libcfs_nal_cmd_unregister(int nal);
-
-struct portal_ioctl_data {
- __u32 ioc_len;
- __u32 ioc_version;
- __u64 ioc_nid;
- __u64 ioc_nid2;
- __u64 ioc_nid3;
- __u32 ioc_count;
- __u32 ioc_nal;
- __u32 ioc_nal_cmd;
- __u32 ioc_fd;
- __u32 ioc_id;
-
- __u32 ioc_flags;
- __u32 ioc_size;
-
- __u32 ioc_wait;
- __u32 ioc_timeout;
- __u32 ioc_misc;
-
- __u32 ioc_inllen1;
- char *ioc_inlbuf1;
- __u32 ioc_inllen2;
- char *ioc_inlbuf2;
-
- __u32 ioc_plen1; /* buffers in userspace */
- char *ioc_pbuf1;
- __u32 ioc_plen2; /* buffers in userspace */
- char *ioc_pbuf2;
-
- char ioc_bulk[0];
-};
-
-
#ifdef __KERNEL__
#include <libcfs/list.h>
+struct portal_ioctl_data; /* forward ref */
+
struct libcfs_ioctl_handler {
struct list_head item;
- int (*handle_ioctl)(struct portal_ioctl_data *data,
- unsigned int cmd, unsigned long args);
+ int (*handle_ioctl)(unsigned int cmd, struct portal_ioctl_data *data);
};
#define DECLARE_IOCTL_HANDLER(ident, func) \
ptl_err_t PtlNIHandle(ptl_handle_any_t handle_in,
ptl_handle_ni_t *interface_out);
-
/*
* PtlFailNid
*
- * Not an official Portals 3 API call. It provides a way of simulating
- * communications failures to all (nid == PTL_NID_ANY), or specific peers
- * (via multiple calls), either until further notice (threshold == -1), or
- * for a specific number of messages. Passing a threshold of zero, "heals"
- * the given peer.
+ * Not an official Portals 3 API call. It provides a way of calling
+ * network-specific functions
*/
-ptl_err_t PtlFailNid(ptl_handle_ni_t ni,
- ptl_nid_t nid,
- unsigned int threshold);
+int PtlNICtl(ptl_handle_ni_t interface, unsigned int cmd, void *arg);
/*
* PtlSnprintHandle:
ptl_ac_index_t cookie_in,
ptl_match_bits_t match_bits_in,
ptl_size_t offset_in);
+
+
#endif
# include <portals/lib-types.h> /* for ptl_hdr_t */
-/******************************************************************************/
-/* Kernel Portals Router interface */
-
-typedef void (*kpr_fwd_callback_t)(void *arg, int error); // completion callback
-
-/* space for routing targets to stash "stuff" in a forwarded packet */
-typedef union {
- long long _alignment;
- void *_space[16]; /* scale with CPU arch */
-} kprfd_scratch_t;
-
-/* Kernel Portals Routing Forwarded message Descriptor */
-typedef struct {
- struct list_head kprfd_list; /* stash in queues (routing target can use) */
- ptl_nid_t kprfd_target_nid; /* final destination NID */
- ptl_nid_t kprfd_gateway_nid; /* gateway NID */
- ptl_hdr_t *kprfd_hdr; /* header in wire byte order */
- int kprfd_nob; /* # payload bytes */
- int kprfd_niov; /* # payload frags */
- ptl_kiov_t *kprfd_kiov; /* payload fragments */
- void *kprfd_router_arg; /* originating NAL's router arg */
- kpr_fwd_callback_t kprfd_callback; /* completion callback */
- void *kprfd_callback_arg; /* completion callback arg */
- kprfd_scratch_t kprfd_scratch; /* scratchpad for routing targets */
-} kpr_fwd_desc_t;
-
-typedef void (*kpr_fwd_t)(void *arg, kpr_fwd_desc_t *fwd);
-typedef void (*kpr_notify_t)(void *arg, ptl_nid_t peer, int alive);
-
-/* NAL's routing interface (Kernel Portals Routing Nal Interface) */
-typedef const struct {
- int kprni_nalid; /* NAL's id */
- void *kprni_arg; /* Arg to pass when calling into NAL */
- kpr_fwd_t kprni_fwd; /* NAL's forwarding entrypoint */
- kpr_notify_t kprni_notify; /* NAL's notification entrypoint */
-} kpr_nal_interface_t;
-
-/* Router's routing interface (Kernel Portals Routing Router Interface) */
-typedef const struct {
- /* register the calling NAL with the router and get back the handle for
- * subsequent calls */
- int (*kprri_register) (kpr_nal_interface_t *nal_interface,
- void **router_arg);
-
- /* ask the router to find a gateway that forwards to 'nid' and is a
- * peer of the calling NAL; assume caller will send 'nob' bytes of
- * payload there */
- int (*kprri_lookup) (void *router_arg, ptl_nid_t nid, int nob,
- ptl_nid_t *gateway_nid);
-
- /* hand a packet over to the router for forwarding */
- kpr_fwd_t kprri_fwd_start;
-
- /* hand a packet back to the router for completion */
- void (*kprri_fwd_done) (void *router_arg, kpr_fwd_desc_t *fwd,
- int error);
-
- /* notify the router about peer state */
- void (*kprri_notify) (void *router_arg, ptl_nid_t peer,
- int alive, time_t when);
-
- /* the calling NAL is shutting down */
- void (*kprri_shutdown) (void *router_arg);
-
- /* deregister the calling NAL with the router */
- void (*kprri_deregister) (void *router_arg);
-
-} kpr_router_interface_t;
-
-/* Convenient struct for NAL to stash router interface/args */
-typedef struct {
- kpr_router_interface_t *kpr_interface;
- void *kpr_arg;
-} kpr_router_t;
-
-extern kpr_router_interface_t kpr_router_interface;
-
-static inline int
-kpr_register (kpr_router_t *router, kpr_nal_interface_t *nalif)
-{
- int rc;
-
- router->kpr_interface = PORTAL_SYMBOL_GET (kpr_router_interface);
- if (router->kpr_interface == NULL)
- return (-ENOENT);
-
- rc = (router->kpr_interface)->kprri_register (nalif, &router->kpr_arg);
- if (rc != 0)
- router->kpr_interface = NULL;
-
- PORTAL_SYMBOL_PUT (kpr_router_interface);
- return (rc);
-}
-
-static inline int
-kpr_routing (kpr_router_t *router)
-{
- return (router->kpr_interface != NULL);
-}
-
-static inline int
-kpr_lookup (kpr_router_t *router, ptl_nid_t nid, int nob, ptl_nid_t *gateway_nid)
-{
- if (!kpr_routing (router))
- return (-ENETUNREACH);
-
- return (router->kpr_interface->kprri_lookup(router->kpr_arg, nid, nob,
- gateway_nid));
-}
-
-static inline void
-kpr_fwd_init (kpr_fwd_desc_t *fwd, ptl_nid_t nid, ptl_hdr_t *hdr,
- int nob, int niov, ptl_kiov_t *kiov,
- kpr_fwd_callback_t callback, void *callback_arg)
-{
- fwd->kprfd_target_nid = nid;
- fwd->kprfd_gateway_nid = nid;
- fwd->kprfd_hdr = hdr;
- fwd->kprfd_nob = nob;
- fwd->kprfd_niov = niov;
- fwd->kprfd_kiov = kiov;
- fwd->kprfd_callback = callback;
- fwd->kprfd_callback_arg = callback_arg;
-}
-
-static inline void
-kpr_fwd_start (kpr_router_t *router, kpr_fwd_desc_t *fwd)
-{
- if (!kpr_routing (router))
- fwd->kprfd_callback (fwd->kprfd_callback_arg, -ENETUNREACH);
- else
- router->kpr_interface->kprri_fwd_start (router->kpr_arg, fwd);
-}
-
-static inline void
-kpr_fwd_done (kpr_router_t *router, kpr_fwd_desc_t *fwd, int error)
-{
- LASSERT (kpr_routing (router));
- router->kpr_interface->kprri_fwd_done (router->kpr_arg, fwd, error);
-}
-
-static inline void
-kpr_notify (kpr_router_t *router,
- ptl_nid_t peer, int alive, time_t when)
-{
- if (!kpr_routing (router))
- return;
-
- router->kpr_interface->kprri_notify(router->kpr_arg, peer, alive, when);
-}
-
-static inline void
-kpr_shutdown (kpr_router_t *router)
-{
- if (kpr_routing (router))
- router->kpr_interface->kprri_shutdown (router->kpr_arg);
-}
-
-static inline void
-kpr_deregister (kpr_router_t *router)
-{
- if (!kpr_routing (router))
- return;
- router->kpr_interface->kprri_deregister (router->kpr_arg);
- router->kpr_interface = NULL;
-}
#endif /* _KPR_H */
return (lh_entry (lh, ptl_me_t, me_lh));
}
-/*
- * When the NAL detects an incoming message header, it should call
- * ptl_parse() decode it. If the message header is garbage, ptl_parse()
- * returns immediately with failure, otherwise the NAL callbacks will be
- * called to receive the message body. They are handed the private cookie
- * as a way for the NAL to maintain state about which transaction is being
- * processed. An extra parameter, ptl_msg contains the lib-level message
- * state for passing to ptl_finalize() when the message body has been
- * received.
- */
+/******************************************************************************/
+/* Portals Router */
+
+/* NI APIs */
+int kpr_routing(void);
+ptl_nid_t kpr_lookup(ptl_ni_t **ni, ptl_nid_t nid, int nob);
+void kpr_fwd_start(ptl_ni_t *ni, kpr_fwd_desc_t *fwd);
+void kpr_fwd_done(ptl_ni_t *ni, kpr_fwd_desc_t *fwd, int error);
+int kpr_notify(ptl_ni_t *ni, ptl_nid_t peer, int alive, time_t when);
+
+/* internal APIs */
+int kpr_ctl(unsigned int cmd, void *arg);
+void kpr_initialise(void);
+void kpr_finalise(void);
+
+static inline void
+kpr_fwd_init (kpr_fwd_desc_t *fwd, ptl_nid_t nid, ptl_hdr_t *hdr,
+ int nob, int niov, ptl_kiov_t *kiov,
+ kpr_fwd_callback_t callback, void *callback_arg)
+{
+ fwd->kprfd_target_nid = nid;
+ fwd->kprfd_gateway_nid = nid;
+ fwd->kprfd_hdr = hdr;
+ fwd->kprfd_nob = nob;
+ fwd->kprfd_niov = niov;
+ fwd->kprfd_kiov = kiov;
+ fwd->kprfd_callback = callback;
+ fwd->kprfd_callback_arg = callback_arg;
+}
+
+/******************************************************************************/
+
+static inline void
+ptl_ni_addref(ptl_ni_t *ni)
+{
+ LASSERT (atomic_read(&ni->ni_refcount) > 0);
+ atomic_inc(&ni->ni_refcount);
+}
+
+extern void ptl_queue_zombie_ni (ptl_ni_t *ni);
+
+static inline void
+ptl_ni_decref(ptl_ni_t *ni)
+{
+ LASSERT (atomic_read(&ni->ni_refcount) > 0);
+ if (atomic_dec_and_test(&ni->ni_refcount))
+ ptl_queue_zombie_ni(ni);
+}
+
+extern ptl_ni_t *ptl_net2ni (__u32 net);
extern void ptl_enq_event_locked (void *private,
ptl_eq_t *eq, ptl_event_t *ev);
extern void ptl_finalize (ptl_ni_t *ni, void *private, ptl_msg_t *msg,
extern ptl_msg_t *ptl_create_reply_msg (ptl_ni_t *ni, ptl_nid_t peer_nid,
ptl_msg_t *get_msg);
extern void ptl_print_hdr (ptl_hdr_t * hdr);
-
+extern ptl_err_t ptl_fail_nid(ptl_nid_t nid, unsigned int threshold);
extern ptl_size_t ptl_iov_nob (int niov, struct iovec *iov);
extern void ptl_copy_iov2buf (char *dest, int niov, struct iovec *iov,
extern ptl_err_t ptl_recv (ptl_ni_t *ni, void *private, ptl_msg_t *msg, ptl_libmd_t *md,
ptl_size_t offset, ptl_size_t mlen, ptl_size_t rlen);
extern ptl_err_t ptl_send (ptl_ni_t *ni, void *private, ptl_msg_t *msg,
- ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
+ ptl_hdr_t *hdr, int type, ptl_process_id_t target,
ptl_libmd_t *md, ptl_size_t offset, ptl_size_t len);
extern void ptl_me_unlink(ptl_me_t *me);
return (lh_entry (lh, ptl_me_t, me_lh));
}
-/*
- * When the NAL detects an incoming message header, it should call
- * ptl_parse() decode it. If the message header is garbage, ptl_parse()
- * returns immediately with failure, otherwise the NAL callbacks will be
- * called to receive the message body. They are handed the private cookie
- * as a way for the NAL to maintain state about which transaction is being
- * processed. An extra parameter, ptl_msg contains the lib-level message
- * state for passing to ptl_finalize() when the message body has been
- * received.
- */
+/******************************************************************************/
+/* Portals Router */
+
+/* NI APIs */
+int kpr_routing(void);
+ptl_nid_t kpr_lookup(ptl_ni_t **ni, ptl_nid_t nid, int nob);
+void kpr_fwd_start(ptl_ni_t *ni, kpr_fwd_desc_t *fwd);
+void kpr_fwd_done(ptl_ni_t *ni, kpr_fwd_desc_t *fwd, int error);
+int kpr_notify(ptl_ni_t *ni, ptl_nid_t peer, int alive, time_t when);
+
+/* internal APIs */
+int kpr_ctl(unsigned int cmd, void *arg);
+void kpr_initialise(void);
+void kpr_finalise(void);
+
+static inline void
+kpr_fwd_init (kpr_fwd_desc_t *fwd, ptl_nid_t nid, ptl_hdr_t *hdr,
+ int nob, int niov, ptl_kiov_t *kiov,
+ kpr_fwd_callback_t callback, void *callback_arg)
+{
+ fwd->kprfd_target_nid = nid;
+ fwd->kprfd_gateway_nid = nid;
+ fwd->kprfd_hdr = hdr;
+ fwd->kprfd_nob = nob;
+ fwd->kprfd_niov = niov;
+ fwd->kprfd_kiov = kiov;
+ fwd->kprfd_callback = callback;
+ fwd->kprfd_callback_arg = callback_arg;
+}
+
+/******************************************************************************/
+
+static inline void
+ptl_ni_addref(ptl_ni_t *ni)
+{
+ LASSERT (atomic_read(&ni->ni_refcount) > 0);
+ atomic_inc(&ni->ni_refcount);
+}
+
+extern void ptl_queue_zombie_ni (ptl_ni_t *ni);
+
+static inline void
+ptl_ni_decref(ptl_ni_t *ni)
+{
+ LASSERT (atomic_read(&ni->ni_refcount) > 0);
+ if (atomic_dec_and_test(&ni->ni_refcount))
+ ptl_queue_zombie_ni(ni);
+}
+
+extern ptl_ni_t *ptl_net2ni (__u32 net);
extern void ptl_enq_event_locked (void *private,
ptl_eq_t *eq, ptl_event_t *ev);
extern void ptl_finalize (ptl_ni_t *ni, void *private, ptl_msg_t *msg,
extern ptl_msg_t *ptl_create_reply_msg (ptl_ni_t *ni, ptl_nid_t peer_nid,
ptl_msg_t *get_msg);
extern void ptl_print_hdr (ptl_hdr_t * hdr);
-
+extern ptl_err_t ptl_fail_nid(ptl_nid_t nid, unsigned int threshold);
extern ptl_size_t ptl_iov_nob (int niov, struct iovec *iov);
extern void ptl_copy_iov2buf (char *dest, int niov, struct iovec *iov,
extern ptl_err_t ptl_recv (ptl_ni_t *ni, void *private, ptl_msg_t *msg, ptl_libmd_t *md,
ptl_size_t offset, ptl_size_t mlen, ptl_size_t rlen);
extern ptl_err_t ptl_send (ptl_ni_t *ni, void *private, ptl_msg_t *msg,
- ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
+ ptl_hdr_t *hdr, int type, ptl_process_id_t target,
ptl_libmd_t *md, ptl_size_t offset, ptl_size_t len);
extern void ptl_me_unlink(ptl_me_t *me);
struct ptl_ni; /* forward ref */
+/******************************************************************************/
+/* Portals Router */
+
+typedef void (*kpr_fwd_callback_t)(struct ptl_ni *ni,
+ void *arg, int error);
+
+/* space for routing targets to stash "stuff" in a forwarded packet */
+typedef union {
+ long long _alignment;
+ void *_space[16]; /* scale with CPU arch */
+} kprfd_scratch_t;
+
+/* Kernel Portals Routing Forwarded message Descriptor */
+typedef struct {
+ struct list_head kprfd_list; /* stash in queues (routing target can use) */
+ ptl_nid_t kprfd_target_nid; /* final destination NID */
+ ptl_nid_t kprfd_gateway_nid; /* gateway NID */
+ ptl_hdr_t *kprfd_hdr; /* header in wire byte order */
+ int kprfd_nob; /* # payload bytes */
+ int kprfd_niov; /* # payload frags */
+ ptl_kiov_t *kprfd_kiov; /* payload fragments */
+ struct ptl_ni *kprfd_src_ni; /* originating NI */
+ kpr_fwd_callback_t kprfd_callback; /* completion callback */
+ void *kprfd_callback_arg; /* completion callback arg */
+ kprfd_scratch_t kprfd_scratch; /* scratchpad for routing targets */
+} kpr_fwd_desc_t;
+
+/******************************************************************************/
+
typedef struct ptl_nal
{
/* fields managed by portals */
struct list_head nal_list; /* stash in the NAL table */
- int nal_refcount; /* # active instances */
+ atomic_t nal_refcount; /* # active instances */
/* fields initialised by the NAL */
unsigned int nal_type;
ptl_err_t (*nal_startup) (struct ptl_ni *ni, char **interfaces);
void (*nal_shutdown) (struct ptl_ni *ni);
+
+ int (*nal_ctl)(struct ptl_ni *ni, unsigned int cmd, void *arg);
/*
* send: Sends a preformatted header and payload data to a
* ptl_finalize on completion
*/
ptl_err_t (*nal_send)
- (struct ptl_ni *ni, void *private, ptl_msg_t *cookie,
- ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
- unsigned int niov, struct iovec *iov,
+ (struct ptl_ni *ni, void *private, ptl_msg_t *msg,
+ ptl_hdr_t *hdr, int type, ptl_process_id_t target,
+ int routing, unsigned int niov, struct iovec *iov,
size_t offset, size_t mlen);
/* as send, but with a set of page fragments (NULL if not supported) */
ptl_err_t (*nal_send_pages)
(struct ptl_ni *ni, void *private, ptl_msg_t *cookie,
- ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
- unsigned int niov, ptl_kiov_t *iov,
+ ptl_hdr_t *hdr, int type, ptl_process_id_t target,
+ int routing, unsigned int niov, ptl_kiov_t *iov,
size_t offset, size_t mlen);
/*
* recv: Receives an incoming message from a remote process. The
unsigned int niov, ptl_kiov_t *iov,
size_t offset, size_t mlen, size_t rlen);
- /* Calculate a network "distance" to given node */
- int (*ptl_dist) (struct ptl_ni *ni, ptl_nid_t nid, unsigned long *dist);
+ /* forward a packet for the router */
+ void (*nal_fwd)(struct ptl_ni *ni, kpr_fwd_desc_t *fwd);
+
+ /* notification of peer health */
+ void (*nal_notify)(struct ptl_ni *ni, ptl_nid_t peer, int alive);
+
} ptl_nal_t;
typedef struct ptl_ni {
ptl_nid_t ni_nid; /* interface's NID */
void *ni_data; /* instance-specific data */
ptl_nal_t *ni_nal; /* procedural interface */
+ int ni_shutdown; /* shutting down? */
+ atomic_t ni_refcount; /* reference count */
} ptl_ni_t;
typedef struct /* loopback descriptor */
ptl_ni_limits_t apini_actual_limits;
struct list_head apini_nis; /* NAL instances */
+ struct list_head apini_zombie_nis; /* dying NAL instances */
+ int apini_nzombie_nis; /* # of NIS to wait for */
int apini_lh_hash_size; /* size of lib handle hash table */
struct list_head *apini_lh_hash_table; /* all extant lib handles, this interface */
#define SMFS_DEV_ID 2
#define SMFS_DEV_PATH "/dev/snapdev"
-int ptl_name2nal(char *str);
-int ptl_parse_ipaddr (__u32 *ipaddrp, char *str);
-int ptl_parse_anynid (ptl_nid_t *nidp, char *str);
-int ptl_parse_nid (ptl_nid_t *nidp, char *str);
-char * ptl_nid2str (char *buffer, ptl_nid_t nid);
-
int ptl_initialize(int argc, char **argv);
int jt_ptl_network(int argc, char **argv);
int jt_ptl_print_interfaces(int argc, char **argv);
int jt_ptl_push_connection(int argc, char **argv);
int jt_ptl_print_active_txs(int argc, char **argv);
int jt_ptl_ping(int argc, char **argv);
-int jt_ptl_shownid(int argc, char **argv);
int jt_ptl_mynid(int argc, char **argv);
int jt_ptl_add_uuid(int argc, char **argv);
int jt_ptl_add_uuid_old(int argc, char **argv); /* backwards compatibility */
int jt_dbg_modules(int argc, char **argv);
int jt_dbg_panic(int argc, char **argv);
-int ptl_set_cfg_record_cb(cfg_record_cb_t cb);
-
/* l_ioctl.c */
typedef int (ioc_handler_t)(int dev_id, unsigned int opc, void *buf);
void set_ioc_handler(ioc_handler_t *handler);
#define SMFS_DEV_ID 2
#define SMFS_DEV_PATH "/dev/snapdev"
-int ptl_name2nal(char *str);
-int ptl_parse_ipaddr (__u32 *ipaddrp, char *str);
-int ptl_parse_anynid (ptl_nid_t *nidp, char *str);
-int ptl_parse_nid (ptl_nid_t *nidp, char *str);
-char * ptl_nid2str (char *buffer, ptl_nid_t nid);
-
int ptl_initialize(int argc, char **argv);
int jt_ptl_network(int argc, char **argv);
int jt_ptl_print_interfaces(int argc, char **argv);
int jt_ptl_push_connection(int argc, char **argv);
int jt_ptl_print_active_txs(int argc, char **argv);
int jt_ptl_ping(int argc, char **argv);
-int jt_ptl_shownid(int argc, char **argv);
int jt_ptl_mynid(int argc, char **argv);
int jt_ptl_add_uuid(int argc, char **argv);
int jt_ptl_add_uuid_old(int argc, char **argv); /* backwards compatibility */
int jt_dbg_modules(int argc, char **argv);
int jt_dbg_panic(int argc, char **argv);
-int ptl_set_cfg_record_cb(cfg_record_cb_t cb);
-
/* l_ioctl.c */
typedef int (ioc_handler_t)(int dev_id, unsigned int opc, void *buf);
void set_ioc_handler(ioc_handler_t *handler);
extern gmnal_data_t *global_nal_data;
/*
- * for ioctl get pid
- */
-#define GMNAL_IOC_GET_GNID 1
-
-/*
* Return codes
*/
#define GMNAL_STATUS_OK 0
#define GLOBAL_NID_STR_LEN 16
char global_nid_str[GLOBAL_NID_STR_LEN] = {0};
-extern int gmnal_cmd(struct portals_cfg *pcfg, void *private);
+extern int gmnal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg);
/*
* Write the global nid /proc/sys/gmnal/globalnid
LASSERT(nal_data == global_nal_data);
CDEBUG(D_TRACE, "gmnal_shutdown: nal_data [%p]\n", nal_data);
- /* Stop portals calling our ioctl handler */
- libcfs_nal_cmd_unregister(GMNAL);
-
/* XXX for shutdown "under fire" we probably need to set a shutdown
* flag so when portals calls us we fail immediately and dont queue any
* more work but our threads can still call into portals OK. THEN
CDEBUG(D_INFO, "portals_pid is [%u]\n", ni->ni_pid);
CDEBUG(D_INFO, "portals_nid is ["LPU64"]\n", ni->ni_nid);
- if (libcfs_nal_cmd_register(GMNAL, &gmnal_cmd, nal_data) != 0) {
- CDEBUG(D_INFO, "libcfs_nal_cmd_register failed\n");
-
- /* XXX these cleanup cases should be restructured to
- * minimise duplication... */
- gmnal_stop_rxthread(nal_data);
- gmnal_stop_ctthread(nal_data);
- gmnal_free_txd(nal_data);
- gmnal_free_srxd(nal_data);
- GMNAL_GM_LOCK(nal_data);
- gm_close(nal_data->gm_port);
- gm_finalize();
- GMNAL_GM_UNLOCK(nal_data);
- PORTAL_FREE(nal_data, sizeof(gmnal_data_t));
- return(PTL_FAIL);
- }
-
/* might be better to initialise this at module load rather than in
* NAL startup */
nal_data->sysctl = NULL;
global_nal_data = nal_data;
+ PORTAL_MODULE_USE;
return(PTL_OK);
}
.nal_type = GMNAL,
.nal_startup = gmnal_startup,
.nal_shutdown = gmnal_shutdown,
+ .nal_cmd = gmnal_ctl,
.nal_send = gmnal_cb_send,
.nal_send_pages = gmnal_cb_send_pages,
.nal_recv = gmnal_cb_recv,
ptl_err_t gmnal_cb_send(ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
- ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
- unsigned int niov, struct iovec *iov, size_t offset,
- size_t len)
+ ptl_hdr_t *hdr, int type, ptl_process_id_t target,
+ int routing, unsigned int niov, struct iovec *iov,
+ size_t offset, size_t len)
{
gmnal_data_t *nal_data;
CDEBUG(D_TRACE, "gmnal_cb_send niov[%d] offset["LPSZ"] len["LPSZ
- "] nid["LPU64"]\n", niov, offset, len, nid);
+ "] target %s\n", niov, offset, len, libcfs_id2str(target));
nal_data = ni->ni_data;
CDEBUG(D_INFO, "nal_data [%p]\n", nal_data);
LASSERT (nal_data != NULL);
+ if (routing) {
+ CERROR ("Can't route\n");
+ return PTL_FAIL;
+ }
+
if (GMNAL_IS_SMALL_MESSAGE(nal_data, niov, iov, len)) {
CDEBUG(D_INFO, "This is a small message send\n");
/*
}
iov++;
}
- gmnal_small_tx(ni, private, cookie, hdr, type, nid, pid,
+ gmnal_small_tx(ni, private, cookie, hdr, type, target.nid, target.pid,
stxd, len);
} else {
CDEBUG(D_ERROR, "Large message send is not supported\n");
ptl_finalize(ni, private, cookie, PTL_FAIL);
return(PTL_FAIL);
- gmnal_large_tx(ni, private, cookie, hdr, type, nid, pid,
+ gmnal_large_tx(ni, private, cookie, hdr, type, target.nid, target.pid,
niov, iov, offset, len);
}
return(PTL_OK);
ptl_err_t gmnal_cb_send_pages(ptl_ni_t *ni, void *private,
ptl_msg_t *cookie, ptl_hdr_t *hdr, int type,
- ptl_nid_t nid, ptl_pid_t pid, unsigned int kniov,
- ptl_kiov_t *kiov, size_t offset, size_t len)
+ ptl_process_id_t target, int routing,
+ unsigned int kniov, ptl_kiov_t *kiov,
+ size_t offset, size_t len)
{
gmnal_data_t *nal_data;
gmnal_stxd_t *stxd = NULL;
ptl_err_t status = PTL_OK;
- CDEBUG(D_TRACE, "gmnal_cb_send_pages nid ["LPU64"] niov[%d] offset["
- LPSZ"] len["LPSZ"]\n", nid, kniov, offset, len);
+ CDEBUG(D_TRACE, "gmnal_cb_send_pages target %s niov[%d] offset["
+ LPSZ"] len["LPSZ"]\n", libcfs_id2str(target), kniov, offset, len);
nal_data = ni->ni_data;
CDEBUG(D_INFO, "nal_data [%p]\n", nal_data);
LASSERT (nal_data != NULL);
+ if (routing) {
+ CERROR ("Can't route\n");
+ return PTL_FAIL;
+ }
+
/* HP SFS 1380: Need to do the gm_bcopy after the kmap so we can kunmap
* more aggressively. This is the fix for a livelock situation under
* load on ia32 that occurs when there are no more available entries in
}
kiov++;
}
- status = gmnal_small_tx(ni, private, cookie, hdr, type, nid,
- pid, stxd, len);
+ status = gmnal_small_tx(ni, private, cookie, hdr, type, target.nid,
+ target.pid, stxd, len);
} else {
int i = 0;
struct iovec *iovec = NULL, *iovec_dup = NULL;
iovec++;
kiov++;
}
- gmnal_large_tx(ni, private, cookie, hdr, type, nid,
- pid, kniov, iovec, offset, len);
+ gmnal_large_tx(ni, private, cookie, hdr, type, target.nid,
+ target.pid, kniov, iovec, offset, len);
for (i=0; i<kniov; i++) {
kunmap(kiov_dup->kiov_page);
kiov_dup++;
int gm_port_id = 4;
int
-gmnal_cmd(struct portals_cfg *pcfg, void *private)
+gmnal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg)
{
+ struct portal_ioctl_data *data = arg;
gmnal_data_t *nal_data = NULL;
char *name = NULL;
int nid = -2;
gm_status_t gm_status;
- CDEBUG(D_TRACE, "gmnal_cmd [%d] private [%p]\n",
- pcfg->pcfg_command, private);
- nal_data = (gmnal_data_t*)private;
- switch(pcfg->pcfg_command) {
- /*
- * just reuse already defined GET_NID. Should define GMNAL version
- */
- case(GMNAL_IOC_GET_GNID):
-
- PORTAL_ALLOC(name, pcfg->pcfg_plen1);
- copy_from_user(name, PCFG_PBUF(pcfg, 1), pcfg->pcfg_plen1);
-
+ CDEBUG(D_TRACE, "gmnal_cmd [%d] ni_data [%p]\n", cmd, ni->ni_data);
+ nal_data = (gmnal_data_t*)ni->ni_data;
+ switch(cmd) {
+ case IOC_PORTAL_GET_GMID:
+
+ PORTAL_ALLOC(name, data->ioc_plen1);
+ if (name == NULL)
+ return -ENOMEM;
+
+ if (copy_from_user(name, data->ioc_pbuf1, data->ioc_plen1)) {
+ PORTAL_FREE(name, data->ioc_plen1);
+ return -EFAULT;
+ }
+
GMNAL_GM_LOCK(nal_data);
//nid = gm_host_name_to_node_id(nal_data->gm_port, name);
gm_status = gm_host_name_to_node_id_ex (nal_data->gm_port, 0, name, &nid);
if (gm_status != GM_SUCCESS) {
CDEBUG(D_INFO, "gm_host_name_to_node_id_ex(...host %s) failed[%d]\n",
name, gm_status);
- return (-1);
- } else
- CDEBUG(D_INFO, "Local node %s id is [%d]\n", name, nid);
+ PORTAL_FREE(name, data->ioc_plen1);
+ return -ENOENT;
+ }
+
+ CDEBUG(D_INFO, "Local node %s id is [%d]\n", name, nid);
+ PORTAL_FREE(name, data->ioc_plen1);
+
GMNAL_GM_LOCK(nal_data);
gm_status = gm_node_id_to_global_id(nal_data->gm_port,
nid, &gnid);
if (gm_status != GM_SUCCESS) {
CDEBUG(D_INFO, "gm_node_id_to_global_id failed[%d]\n",
gm_status);
- return(-1);
+ return -ENOENT;
}
CDEBUG(D_INFO, "Global node is is [%u][%x]\n", gnid, gnid);
- copy_to_user(PCFG_PBUF(pcfg, 2), &gnid, pcfg->pcfg_plen2);
- break;
+
+ /* gnid returned to userspace in ioc_nid!!! */
+ data->ioc_nid = gnid;
+ return 0;
+
default:
- CDEBUG(D_INFO, "gmnal_cmd UNKNOWN[%d]\n", pcfg->pcfg_command);
- pcfg->pcfg_nid2 = -1;
+ CDEBUG(D_INFO, "gmnal_cmd UNKNOWN[%d]\n", cmd);
+ return -EINVAL;
}
-
-
- return(0);
}
.nal_type = IIBNAL,
.nal_startup = kibnal_startup,
.nal_shutdown = kibnal_shutdown,
+ .nal_ctl = kibnal_ctl,
.nal_send = kibnal_send,
.nal_send_pages = kibnal_send_pages,
.nal_recv = kibnal_recv,
/* Delete all existing peers and their connections after new
* NID/incarnation set to ensure no old connections in our brave
* new world. */
- kibnal_del_peer (PTL_NID_ANY, 0);
+ kibnal_del_peer(PTL_NID_ANY);
if (kibnal_data.kib_ni->ni_nid == PTL_NID_ANY) {
/* No new NID to install */
iibt_cm_destroy_cep (kibnal_data.kib_cep);
/* remove any peers that sprung up while I failed to
* advertise myself */
- kibnal_del_peer (PTL_NID_ANY, 0);
+ kibnal_del_peer(PTL_NID_ANY);
}
kibnal_data.kib_ni->ni_nid = PTL_NID_ANY;
}
static void
-kibnal_del_peer_locked (kib_peer_t *peer, int single_share)
+kibnal_del_peer_locked (kib_peer_t *peer)
{
struct list_head *ctmp;
struct list_head *cnxt;
kib_conn_t *conn;
- if (!single_share)
- peer->ibp_persistence = 0;
- else if (peer->ibp_persistence > 0)
- peer->ibp_persistence--;
-
- if (peer->ibp_persistence != 0)
- return;
+ peer->ibp_persistence = 0;
if (list_empty(&peer->ibp_conns)) {
kibnal_unlink_peer_locked(peer);
}
int
-kibnal_del_peer (ptl_nid_t nid, int single_share)
+kibnal_del_peer (ptl_nid_t)
{
unsigned long flags;
struct list_head *ptmp;
if (!(nid == PTL_NID_ANY || peer->ibp_nid == nid))
continue;
- kibnal_del_peer_locked (peer, single_share);
+ kibnal_del_peer_locked (peer);
rc = 0; /* matched something */
-
- if (single_share)
- goto out;
}
}
out:
return (count == 0 ? -ENOENT : 0);
}
-static int
-kibnal_cmd(struct portals_cfg *pcfg, void * private)
+int
+kibnal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg)
{
- int rc = -EINVAL;
+ struct portal_ioctl_data *data = arg;
+ int rc = -EINVAL;
ENTRY;
- LASSERT (pcfg != NULL);
+ LASSERT (ni == kibnal_data.kib_ni);
- switch(pcfg->pcfg_command) {
- case NAL_CMD_GET_PEER: {
+ switch(data->ioc_command) {
+ case IOC_PORTAL_GET_PEER: {
ptl_nid_t nid = 0;
int share_count = 0;
- rc = kibnal_get_peer_info(pcfg->pcfg_count,
+ rc = kibnal_get_peer_info(data->ioc_count,
&nid, &share_count);
- pcfg->pcfg_nid = nid;
- pcfg->pcfg_size = 0;
- pcfg->pcfg_id = 0;
- pcfg->pcfg_misc = 0;
- pcfg->pcfg_count = 0;
- pcfg->pcfg_wait = share_count;
+ data->ioc_nid = nid;
+ data->ioc_count = share_count;
break;
}
- case NAL_CMD_ADD_PEER: {
- rc = kibnal_add_persistent_peer (pcfg->pcfg_nid);
+ case IOC_PORTAL_ADD_PEER: {
+ rc = kibnal_add_persistent_peer (data->ioc_nid);
break;
}
- case NAL_CMD_DEL_PEER: {
- rc = kibnal_del_peer (pcfg->pcfg_nid,
- /* flags == single_share */
- pcfg->pcfg_flags != 0);
+ case IOC_PORTAL_DEL_PEER: {
+ rc = kibnal_del_peer (data->ioc_nid);
break;
}
- case NAL_CMD_GET_CONN: {
- kib_conn_t *conn = kibnal_get_conn_by_idx (pcfg->pcfg_count);
+ case IOC_PORTAL_GET_CONN: {
+ kib_conn_t *conn = kibnal_get_conn_by_idx (data->ioc_count);
if (conn == NULL)
rc = -ENOENT;
else {
rc = 0;
- pcfg->pcfg_nid = conn->ibc_peer->ibp_nid;
- pcfg->pcfg_id = 0;
- pcfg->pcfg_misc = 0;
- pcfg->pcfg_flags = 0;
+ data->ioc_nid = conn->ibc_peer->ibp_nid;
kibnal_put_conn (conn);
}
break;
}
- case NAL_CMD_CLOSE_CONNECTION: {
- rc = kibnal_close_matching_conns (pcfg->pcfg_nid);
+ case IOC_PORTAL_CLOSE_CONNECTION: {
+ rc = kibnal_close_matching_conns (data->ioc_nid);
break;
}
- case NAL_CMD_REGISTER_MYNID: {
- if (pcfg->pcfg_nid == PTL_NID_ANY)
+ case IOC_PORTAL_REGISTER_MYNID: {
+ if (data->ioc_nid == PTL_NID_ANY)
rc = -EINVAL;
else
- rc = kibnal_set_mynid (pcfg->pcfg_nid);
+ rc = kibnal_set_mynid (data->ioc_nid);
break;
}
}
LBUG();
case IBNAL_INIT_ALL:
- /* stop calls to nal_cmd */
- libcfs_nal_cmd_unregister(IIBNAL);
- /* No new peers */
-
/* resetting my NID to unadvertises me, removes my
* listener and nukes all current peers */
kibnal_set_mynid (PTL_NID_ANY);
atomic_read(&portal_kmemory));
kibnal_data.kib_init = IBNAL_INIT_NOTHING;
+ PORTAL_MODULE_UNUSE;
}
#define roundup_power(val, power) \
return -ENOSYS;
}
+ PORTAL_MODULE_USE;
+
init_MUTEX (&kibnal_data.kib_nid_mutex);
init_MUTEX_LOCKED (&kibnal_data.kib_nid_signal);
kibnal_data.kib_ni->ni_nid = PTL_NID_ANY;
}
}
- /*****************************************************/
-
- rc = libcfs_nal_cmd_register(IIBNAL, &kibnal_cmd, NULL);
- if (rc != 0) {
- CERROR ("Can't initialise command interface (rc = %d)\n", rc);
- goto failed;
- }
-
/* flag everything initialised */
kibnal_data.kib_init = IBNAL_INIT_ALL;
/*****************************************************/
extern ptl_err_t kibnal_startup (ptl_ni_t *ni, char **interfaces);
extern void kibnal_shutdown (ptl_ni_t *ni);
-extern ptl_err_t kibnal_send (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
- ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
- unsigned int payload_niov, struct iovec *payload_iov,
- size_t payload_offset, size_t payload_len);
-extern ptl_err_t kibnal_send_pages (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
- ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
- unsigned int payload_niov, ptl_kiov_t *payload_kiov,
- size_t payload_offset, size_t payload_len);
+extern int kibnal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg);
+ptl_err_t kibnal_send (ptl_ni_t *ni, void *private,
+ ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
+ int type, ptl_process_id_t tgt, int routing,
+ unsigned int payload_niov, struct iovec *payload_iov,
+ size_t payload_offset, size_t payload_nob);
+ptl_err_t kibnal_send_pages (ptl_ni_t *ni, void *private,
+ ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
+ int type, ptl_process_id_t tgt, int routing,
+ unsigned int payload_niov, ptl_kiov_t *payload_kiov,
+ size_t payload_offset, size_t payload_nob);
extern ptl_err_t kibnal_recv (ptl_ni_t *ni, void *private, ptl_msg_t *msg,
unsigned int niov, struct iovec *iov,
size_t offset, size_t mlen, size_t rlen);
extern kib_peer_t *kibnal_create_peer (ptl_nid_t nid);
extern void kibnal_destroy_peer (kib_peer_t *peer);
-extern int kibnal_del_peer (ptl_nid_t nid, int single_share);
+extern int kibnal_del_peer (ptl_nid_t nid);
extern kib_peer_t *kibnal_find_peer_locked (ptl_nid_t nid);
extern void kibnal_unlink_peer_locked (kib_peer_t *peer);
extern int kibnal_close_stale_conns_locked (kib_peer_t *peer,
}
static ptl_err_t
-kibnal_sendmsg(ptl_ni_t *ni,
- void *private,
- ptl_msg_t *ptlmsg,
- ptl_hdr_t *hdr,
- int type,
- ptl_nid_t nid,
- ptl_pid_t pid,
- unsigned int payload_niov,
- struct iovec *payload_iov,
- ptl_kiov_t *payload_kiov,
- size_t payload_offset,
- size_t payload_nob)
+kibnal_sendmsg(ptl_ni_t *ni,
+ void *private,
+ ptl_msg_t *ptlmsg,
+ ptl_hdr_t *hdr,
+ int type,
+ ptl_process_id_t target,
+ int routing,
+ unsigned int payload_niov,
+ struct iovec *payload_iov,
+ ptl_kiov_t *payload_kiov,
+ size_t payload_offset,
+ size_t payload_nob)
{
kib_msg_t *ibmsg;
kib_tx_t *tx;
/* NB 'private' is different depending on what we're sending.... */
- CDEBUG(D_NET, "sending "LPSZ" bytes in %d frags to nid:"LPX64
- " pid %d\n", payload_nob, payload_niov, nid , pid);
+ CDEBUG(D_NET, "sending "LPSZ" bytes in %d frags to %s\n",
+ payload_nob, payload_niov, libcfs_id2str(target));
LASSERT (payload_nob == 0 || payload_niov > 0);
LASSERT (payload_niov <= PTL_MD_MAX_IOV);
/* payload is either all vaddrs or all pages */
LASSERT (!(payload_kiov != NULL && payload_iov != NULL));
+ if (routing) {
+ CERROR ("Can't route\n");
+ return PTL_FAIL;
+ }
+
switch (type) {
default:
LBUG();
/* Incoming message consistent with immediate reply? */
if (rx->rx_msg->ibm_type != IBNAL_MSG_IMMEDIATE) {
CERROR ("REPLY to "LPX64" bad opbm type %d!!!\n",
- nid, rx->rx_msg->ibm_type);
+ target.nid, rx->rx_msg->ibm_type);
return (PTL_FAIL);
}
nob = offsetof(kib_msg_t, ibm_u.immediate.ibim_payload[payload_nob]);
if (nob >= IBNAL_MSG_SIZE) {
CERROR("REPLY for "LPX64" too big (RDMA not requested): %d\n",
- nid, payload_nob);
+ target.nid, payload_nob);
return (PTL_FAIL);
}
break;
nob = offsetof(kib_msg_t, ibm_u.immediate.ibim_payload[ptlmsg->msg_md->md_length]);
if (nob > IBNAL_MSG_SIZE)
return (kibnal_start_passive_rdma(IBNAL_MSG_GET_RDMA,
- nid, ptlmsg, hdr));
+ target.nid, ptlmsg, hdr));
break;
case PTL_MSG_ACK:
nob = offsetof(kib_msg_t, ibm_u.immediate.ibim_payload[payload_nob]);
if (nob > IBNAL_MSG_SIZE)
return (kibnal_start_passive_rdma(IBNAL_MSG_PUT_RDMA,
- nid, ptlmsg, hdr));
+ target.nid, ptlmsg, hdr));
break;
}
in_interrupt()));
if (tx == NULL) {
CERROR ("Can't send %d to "LPX64": tx descs exhausted%s\n",
- type, nid, in_interrupt() ? " (intr)" : "");
+ type, target.nid, in_interrupt() ? " (intr)" : "");
return (PTL_NO_SPACE);
}
/* ptlmsg gets finalized when tx completes */
tx->tx_ptlmsg[0] = ptlmsg;
- kibnal_launch_tx(tx, nid);
+ kibnal_launch_tx(tx, target.nid);
return (PTL_OK);
}
ptl_err_t
kibnal_send (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
- ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
+ ptl_hdr_t *hdr, int type, ptl_process_id_t tgt, int routing,
unsigned int payload_niov, struct iovec *payload_iov,
size_t payload_offset, size_t payload_len)
{
return (kibnal_sendmsg(ni, private, cookie,
- hdr, type, nid, pid,
+ hdr, type, tgt, routing,
payload_niov, payload_iov, NULL,
payload_offset, payload_len));
}
ptl_err_t
kibnal_send_pages (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
- ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
+ ptl_hdr_t *hdr, int type, ptl_process_id_t tgt, int routing,
unsigned int payload_niov, ptl_kiov_t *payload_kiov,
size_t payload_offset, size_t payload_len)
{
return (kibnal_sendmsg(ni, private, cookie,
- hdr, type, nid, pid,
+ hdr, type, tgt, routing,
payload_niov, NULL, payload_kiov,
payload_offset, payload_len));
}
CDEBUG (D_NET, "start\n");
-#warning fixme
- ni->ni_nid = 0;
klonal_instanced = 1;
PORTAL_MODULE_USE;
.nal_type = OPENIBNAL,
.nal_startup = kibnal_startup,
.nal_shutdown = kibnal_shutdown,
+ .nal_ctl = kibnal_ctl,
.nal_send = kibnal_send,
.nal_send_pages = kibnal_send_pages,
.nal_recv = kibnal_recv,
}
void
-kibnal_del_peer_locked (kib_peer_t *peer, int single_share)
+kibnal_del_peer_locked (kib_peer_t *peer)
{
struct list_head *ctmp;
struct list_head *cnxt;
kib_conn_t *conn;
- if (!single_share)
- peer->ibp_persistence = 0;
- else if (peer->ibp_persistence > 0)
- peer->ibp_persistence--;
-
- if (peer->ibp_persistence != 0)
- return;
+ peer->ibp_persistence = 0;
if (list_empty(&peer->ibp_conns)) {
kibnal_unlink_peer_locked(peer);
}
int
-kibnal_del_peer (ptl_nid_t nid, int single_share)
+kibnal_del_peer (ptl_nid_t nid)
{
unsigned long flags;
struct list_head *ptmp;
if (!(nid == PTL_NID_ANY || peer->ibp_nid == nid))
continue;
- kibnal_del_peer_locked (peer, single_share);
+ kibnal_del_peer_locked (peer);
rc = 0; /* matched something */
-
- if (single_share)
- goto out;
}
}
out:
}
int
-kibnal_cmd(struct portals_cfg *pcfg, void * private)
+kibnal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg)
{
- int rc = -EINVAL;
+ struct portal_ioctl_data *data = arg;
+ int rc = -EINVAL;
- LASSERT (pcfg != NULL);
+ LASSERT (ni == kibnal_data.kib_ni);
- switch(pcfg->pcfg_command) {
- case NAL_CMD_GET_PEER: {
+ switch(cmd) {
+ case IOC_PORTAL_GET_PEER: {
ptl_nid_t nid = 0;
__u32 ip = 0;
int port = 0;
int share_count = 0;
- rc = kibnal_get_peer_info(pcfg->pcfg_count,
+ rc = kibnal_get_peer_info(data->ioc_count,
&nid, &ip, &port, &share_count);
- pcfg->pcfg_nid = nid;
- pcfg->pcfg_size = 0;
- pcfg->pcfg_id = ip;
- pcfg->pcfg_misc = port;
- pcfg->pcfg_count = 0;
- pcfg->pcfg_wait = share_count;
+ data->ioc_nid = nid;
+ data->ioc_count = share_count;
+ data->ioc_u32[0] = ip;
+ data->ioc_u32[1] = port;
break;
}
- case NAL_CMD_ADD_PEER: {
- rc = kibnal_add_persistent_peer (pcfg->pcfg_nid,
- pcfg->pcfg_id, /* IP */
- pcfg->pcfg_misc); /* port */
+ case IOC_PORTAL_ADD_PEER: {
+ rc = kibnal_add_persistent_peer (data->ioc_nid,
+ data->ioc_u32[0], /* IP */
+ data->ioc_u32[1]); /* port */
break;
}
- case NAL_CMD_DEL_PEER: {
- rc = kibnal_del_peer (pcfg->pcfg_nid,
- /* flags == single_share */
- pcfg->pcfg_flags != 0);
+ case IOC_PORTAL_DEL_PEER: {
+ rc = kibnal_del_peer (data->ioc_nid);
break;
}
- case NAL_CMD_GET_CONN: {
- kib_conn_t *conn = kibnal_get_conn_by_idx (pcfg->pcfg_count);
+ case IOC_PORTAL_GET_CONN: {
+ kib_conn_t *conn = kibnal_get_conn_by_idx (data->ioc_count);
if (conn == NULL)
rc = -ENOENT;
else {
rc = 0;
- pcfg->pcfg_nid = conn->ibc_peer->ibp_nid;
- pcfg->pcfg_id = 0;
- pcfg->pcfg_misc = 0;
- pcfg->pcfg_flags = 0;
+ data->ioc_nid = conn->ibc_peer->ibp_nid;
kibnal_put_conn (conn);
}
break;
}
- case NAL_CMD_CLOSE_CONNECTION: {
- rc = kibnal_close_matching_conns (pcfg->pcfg_nid);
+ case IOC_PORTAL_CLOSE_CONNECTION: {
+ rc = kibnal_close_matching_conns (data->ioc_nid);
break;
}
- case NAL_CMD_REGISTER_MYNID: {
- if (pcfg->pcfg_nid == PTL_NID_ANY)
+ case IOC_PORTAL_REGISTER_MYNID: {
+ if (data->ioc_nid == PTL_NID_ANY)
rc = -EINVAL;
else
- rc = kibnal_set_mynid (pcfg->pcfg_nid);
+ rc = kibnal_set_mynid (data->ioc_nid);
break;
}
}
LBUG();
case IBNAL_INIT_ALL:
- /* stop calls to nal_cmd */
- libcfs_nal_cmd_unregister(OPENIBNAL);
- /* No new peers */
-
/* resetting my NID unadvertises me, removes my
* listener and nukes all current peers */
kibnal_set_mynid (PTL_NID_ANY);
set_current_state (TASK_INTERRUPTIBLE);
schedule_timeout (HZ);
}
- /* fall through */
- case IBNAL_INIT_CQ:
rc = ib_cq_destroy (kibnal_data.kib_cq);
if (rc != 0)
CERROR ("Destroy CQ error: %d\n", rc);
atomic_read(&portal_kmemory));
kibnal_data.kib_init = IBNAL_INIT_NOTHING;
+ PORTAL_MODULE_UNUSE;
}
ptl_err_t
return PTL_FAIL;
}
+ PORTAL_MODULE_USE;
memset (&kibnal_data, 0, sizeof (kibnal_data)); /* zero pointers, flags etc */
kibnal_data.kib_ni = ni;
LASSERT (rc == 0);
}
- /* flag CQ initialised */
- kibnal_data.kib_init = IBNAL_INIT_CQ;
- /*****************************************************/
-
- rc = libcfs_nal_cmd_register(OPENIBNAL, &kibnal_cmd, NULL);
- if (rc != 0) {
- CERROR ("Can't initialise command interface (rc = %d)\n", rc);
- goto failed;
- }
-
/* flag everything initialised */
kibnal_data.kib_init = IBNAL_INIT_ALL;
/*****************************************************/
#define IBNAL_INIT_PD 3
#define IBNAL_INIT_FMR 4
#define IBNAL_INIT_TXD 5
-#define IBNAL_INIT_CQ 6
-#define IBNAL_INIT_ALL 7
+#define IBNAL_INIT_ALL 6
typedef struct kib_acceptsock /* accepted socket queued for connd */
{
ptl_err_t kibnal_startup (ptl_ni_t *ni, char **interfaces);
void kibnal_shutdown (ptl_ni_t *ni);
+int kibnal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg);
ptl_err_t kibnal_send (ptl_ni_t *ni, void *private,
ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
- int type, ptl_nid_t nid, ptl_pid_t pid,
- unsigned int payload_niov,
- struct iovec *payload_iov,
+ int type, ptl_process_id_t tgt, int routing,
+ unsigned int payload_niov, struct iovec *payload_iov,
size_t payload_offset, size_t payload_nob);
ptl_err_t kibnal_send_pages (ptl_ni_t *ni, void *private,
ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
- int type, ptl_nid_t nid, ptl_pid_t pid,
- unsigned int payload_niov,
- ptl_kiov_t *payload_kiov,
+ int type, ptl_process_id_t tgt, int routing,
+ unsigned int payload_niov, ptl_kiov_t *payload_kiov,
size_t payload_offset, size_t payload_nob);
ptl_err_t kibnal_recv(ptl_ni_t *ni, void *private,
ptl_msg_t *ptlmsg, unsigned int niov,
size_t *lenp);
extern kib_peer_t *kibnal_create_peer (ptl_nid_t nid);
extern void kibnal_put_peer (kib_peer_t *peer);
-extern int kibnal_del_peer (ptl_nid_t nid, int single_share);
+extern int kibnal_del_peer (ptl_nid_t nid);
extern kib_peer_t *kibnal_find_peer_locked (ptl_nid_t nid);
extern void kibnal_unlink_peer_locked (kib_peer_t *peer);
extern int kibnal_close_stale_conns_locked (kib_peer_t *peer,
unsigned int niov,
struct iovec *iov, ptl_kiov_t *kiov,
int offset, int nob);
-
-
-
-
-
}
ptl_err_t
-kibnal_sendmsg(ptl_ni_t *ni,
- void *private,
- ptl_msg_t *ptlmsg,
- ptl_hdr_t *hdr,
- int type,
- ptl_nid_t nid,
- ptl_pid_t pid,
- unsigned int payload_niov,
- struct iovec *payload_iov,
- ptl_kiov_t *payload_kiov,
- int payload_offset,
- int payload_nob)
+kibnal_sendmsg(ptl_ni_t *ni,
+ void *private,
+ ptl_msg_t *ptlmsg,
+ ptl_hdr_t *hdr,
+ int type,
+ ptl_process_id_t target,
+ int routing,
+ unsigned int payload_niov,
+ struct iovec *payload_iov,
+ ptl_kiov_t *payload_kiov,
+ int payload_offset,
+ int payload_nob)
{
kib_msg_t *ibmsg;
kib_tx_t *tx;
/* NB 'private' is different depending on what we're sending.... */
- CDEBUG(D_NET, "sending %d bytes in %d frags to nid:"LPX64" pid %d\n",
- payload_nob, payload_niov, nid , pid);
+ CDEBUG(D_NET, "sending %d bytes in %d frags to %s\n",
+ payload_nob, payload_niov, libcfs_id2str(target));
LASSERT (payload_nob == 0 || payload_niov > 0);
LASSERT (payload_niov <= PTL_MD_MAX_IOV);
/* payload is either all vaddrs or all pages */
LASSERT (!(payload_kiov != NULL && payload_iov != NULL));
+ if (routing) {
+ CERROR ("Can't route\n");
+ return PTL_FAIL;
+ }
+
switch (type) {
default:
LBUG();
/* Incoming message consistent with immediate reply? */
if (rx->rx_msg->ibm_type != IBNAL_MSG_IMMEDIATE) {
CERROR ("REPLY to "LPX64" bad opbm type %d!!!\n",
- nid, rx->rx_msg->ibm_type);
+ target.nid, rx->rx_msg->ibm_type);
return (PTL_FAIL);
}
nob = offsetof(kib_msg_t, ibm_u.immediate.ibim_payload[payload_nob]);
if (nob > IBNAL_MSG_SIZE) {
CERROR("REPLY for "LPX64" too big (RDMA not requested): %d\n",
- nid, payload_nob);
+ target.nid, payload_nob);
return (PTL_FAIL);
}
break;
nob = offsetof(kib_msg_t, ibm_u.immediate.ibim_payload[ptlmsg->msg_md->md_length]);
if (nob > IBNAL_MSG_SIZE)
return (kibnal_start_passive_rdma(IBNAL_MSG_GET_RDMA,
- nid, ptlmsg, hdr));
+ target.nid, ptlmsg, hdr));
break;
case PTL_MSG_ACK:
nob = offsetof(kib_msg_t, ibm_u.immediate.ibim_payload[payload_nob]);
if (nob > IBNAL_MSG_SIZE)
return (kibnal_start_passive_rdma(IBNAL_MSG_PUT_RDMA,
- nid, ptlmsg, hdr));
+ target.nid, ptlmsg, hdr));
break;
}
in_interrupt()));
if (tx == NULL) {
CERROR ("Can't send %d to "LPX64": tx descs exhausted%s\n",
- type, nid, in_interrupt() ? " (intr)" : "");
+ type, target.nid, in_interrupt() ? " (intr)" : "");
return (PTL_NO_SPACE);
}
/* ptlmsg gets finalized when tx completes */
tx->tx_ptlmsg[0] = ptlmsg;
- kibnal_launch_tx(tx, nid);
+ kibnal_launch_tx(tx, target.nid);
return (PTL_OK);
}
ptl_err_t
kibnal_send (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
- ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
+ ptl_hdr_t *hdr, int type, ptl_process_id_t tgt, int routing,
unsigned int payload_niov, struct iovec *payload_iov,
size_t payload_offset, size_t payload_len)
{
return (kibnal_sendmsg(ni, private, cookie,
- hdr, type, nid, pid,
+ hdr, type, tgt, routing,
payload_niov, payload_iov, NULL,
payload_offset, payload_len));
}
ptl_err_t
kibnal_send_pages (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
- ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
+ ptl_hdr_t *hdr, int type, ptl_process_id_t tgt, int routing,
unsigned int payload_niov, ptl_kiov_t *payload_kiov,
size_t payload_offset, size_t payload_len)
{
return (kibnal_sendmsg(ni, private, cookie,
- hdr, type, nid, pid,
+ hdr, type, tgt, routing,
payload_niov, NULL, payload_kiov,
payload_offset, payload_len));
}
.nal_type = QSWNAL,
.nal_startup = kqswnal_startup,
.nal_shutdown = kqswnal_shutdown,
+ .nal_ctl = kqswnal_ctl,
.nal_send = kqswnal_send,
.nal_send_pages = kqswnal_send_pages,
.nal_recv = kqswnal_recv,
.nal_recv_pages = kqswnal_recv_pages,
+ .nal_fwd = kqswnal_fwd_packet,
};
kqswnal_data_t kqswnal_data;
-kpr_nal_interface_t kqswnal_router_interface = {
- kprni_nalid: QSWNAL,
- kprni_arg: NULL,
- kprni_fwd: kqswnal_fwd_packet,
- kprni_notify: NULL, /* we're connectionless */
-};
-
int
-kqswnal_get_tx_desc (struct portals_cfg *pcfg)
+kqswnal_get_tx_desc (struct portal_ioctl_data *data)
{
unsigned long flags;
struct list_head *tmp;
kqswnal_tx_t *ktx;
ptl_hdr_t *hdr;
- int index = pcfg->pcfg_count;
+ int index = data->ioc_count;
int rc = -ENOENT;
spin_lock_irqsave (&kqswnal_data.kqn_idletxd_lock, flags);
ktx = list_entry (tmp, kqswnal_tx_t, ktx_list);
hdr = (ptl_hdr_t *)ktx->ktx_buffer;
- memcpy(pcfg->pcfg_pbuf, ktx,
- MIN(sizeof(*ktx), pcfg->pcfg_plen1));
- pcfg->pcfg_count = le32_to_cpu(hdr->type);
- pcfg->pcfg_size = le32_to_cpu(hdr->payload_length);
- pcfg->pcfg_nid = le64_to_cpu(hdr->dest_nid);
- pcfg->pcfg_nid2 = ktx->ktx_nid;
- pcfg->pcfg_misc = ktx->ktx_launcher;
- pcfg->pcfg_flags = (list_empty (&ktx->ktx_delayed_list) ? 0 : 1) |
- (!ktx->ktx_isnblk ? 0 : 2) |
- (ktx->ktx_state << 2);
+ data->ioc_count = le32_to_cpu(hdr->payload_length);
+ data->ioc_nid = le64_to_cpu(hdr->dest_nid);
+ data->ioc_u64[0] = ktx->ktx_nid;
+ data->ioc_u32[0] = le32_to_cpu(hdr->type);
+ data->ioc_u32[1] = ktx->ktx_launcher;
+ data->ioc_flags = (list_empty (&ktx->ktx_delayed_list) ? 0 : 1) |
+ (!ktx->ktx_isnblk ? 0 : 2) |
+ (ktx->ktx_state << 2);
rc = 0;
break;
}
}
int
-kqswnal_cmd (struct portals_cfg *pcfg, void *private)
+kqswnal_ctl (ptl_ni_t *ni, unsigned int cmd, void *arg)
{
- LASSERT (pcfg != NULL);
-
- switch (pcfg->pcfg_command) {
- case NAL_CMD_GET_TXDESC:
- return (kqswnal_get_tx_desc (pcfg));
-
- case NAL_CMD_REGISTER_MYNID:
- CDEBUG (D_IOCTL, "setting NID offset to "LPX64" (was "LPX64")\n",
- pcfg->pcfg_nid - kqswnal_data.kqn_elanid,
- kqswnal_data.kqn_nid_offset);
- kqswnal_data.kqn_nid_offset =
- pcfg->pcfg_nid - kqswnal_data.kqn_elanid;
- kqswnal_data.kqn_ni->ni_nid = pcfg->pcfg_nid;
- return (0);
+ struct portal_ioctl_data *data = arg;
+
+ LASSERT (ni == kqswnal_data.kqn_ni);
+
+ switch (cmd) {
+ case IOC_PORTAL_GET_TXDESC:
+ return (kqswnal_get_tx_desc (data));
+
+ case IOC_PORTAL_REGISTER_MYNID:
+ if (data->ioc_nid == ni->ni_nid)
+ return 0;
+
+ LASSERT (PTL_NIDNET(data->ioc_nid) == PTL_NIDNET(ni->ni_nid));
+
+ CERROR("obsolete IOC_PORTAL_REGISTER_MYNID for %s(%s)\n",
+ libcfs_nid2str(data->ioc_nid),
+ libcfs_nid2str(ni->ni_nid));
+ return 0;
default:
return (-EINVAL);
LASSERT (0);
case KQN_INIT_ALL:
- libcfs_nal_cmd_unregister(QSWNAL);
- /* fall through */
-
case KQN_INIT_DATA:
break;
-
- case KQN_INIT_NOTHING:
- return;
}
/**********************************************************************/
- /* Tell router we're shutting down. Any router calls my threads
- * make will now fail immediately and the router will stop calling
- * into me. */
- kpr_shutdown (&kqswnal_data.kqn_router);
-
- /**********************************************************************/
/* Signal the start of shutdown... */
spin_lock_irqsave(&kqswnal_data.kqn_idletxd_lock, flags);
kqswnal_data.kqn_shuttingdown = 1;
kpr_fwd_desc_t *fwd = list_entry (kqswnal_data.kqn_idletxd_fwdq.next,
kpr_fwd_desc_t, kprfd_list);
list_del (&fwd->kprfd_list);
- kpr_fwd_done (&kqswnal_data.kqn_router, fwd, -ESHUTDOWN);
+ kpr_fwd_done (ni, fwd, -ESHUTDOWN);
}
/**********************************************************************/
- /* finalise router */
-
- kpr_deregister (&kqswnal_data.kqn_router);
-
- /**********************************************************************/
/* Unmap message buffers and free all descriptors and buffers
*/
printk (KERN_INFO "Lustre: Routing QSW NAL unloaded (final mem %d)\n",
atomic_read(&portal_kmemory));
+ PORTAL_MODULE_UNUSE;
}
ptl_err_t
}
CDEBUG (D_MALLOC, "start kmem %d\n", atomic_read(&portal_kmemory));
-
+
/* ensure all pointers NULL etc */
memset (&kqswnal_data, 0, sizeof (kqswnal_data));
/* pointers/lists/locks initialised */
kqswnal_data.kqn_init = KQN_INIT_DATA;
+ PORTAL_MODULE_USE;
#if MULTIRAIL_EKC
kqswnal_data.kqn_ep = ep_system();
}
#endif
- kqswnal_data.kqn_nid_offset = 0;
- kqswnal_data.kqn_nnodes = ep_numnodes (kqswnal_data.kqn_ep);
- kqswnal_data.kqn_elanid = ep_nodeid (kqswnal_data.kqn_ep);
+ kqswnal_data.kqn_nnodes = ep_numnodes (kqswnal_data.kqn_ep);
+ kqswnal_data.kqn_elanid = ep_nodeid (kqswnal_data.kqn_ep);
+
+ ni->ni_nid = PTL_MKNID(PTL_NIDNET(ni->ni_nid), kqswnal_data.kqn_elanid);
/**********************************************************************/
/* Get the transmitter */
}
}
- /**********************************************************************/
- /* Connect to the router */
- rc = kpr_register (&kqswnal_data.kqn_router, &kqswnal_router_interface);
- CDEBUG(D_NET, "Can't initialise routing interface (rc = %d): not routing\n",rc);
-
- rc = libcfs_nal_cmd_register (QSWNAL, &kqswnal_cmd, NULL);
- if (rc != 0) {
- CERROR ("Can't initialise command interface (rc = %d)\n", rc);
- kqswnal_shutdown (ni);
- return (PTL_FAIL);
- }
-
kqswnal_data.kqn_init = KQN_INIT_ALL;
printk(KERN_INFO "Lustre: Routing QSW NAL loaded on node %d of %d "
- "(Routing %s, initial mem %d)\n",
- kqswnal_data.kqn_elanid, kqswnal_data.kqn_nnodes,
- kpr_routing (&kqswnal_data.kqn_router) ? "enabled" : "disabled",
- pkmem);
+ "(initial mem %d)\n",
+ kqswnal_data.kqn_elanid, kqswnal_data.kqn_nnodes, pkmem);
return (PTL_OK);
}
EP_XMTR *kqn_eptx; /* elan transmitter */
EP_RCVR *kqn_eprx_small; /* elan receiver (small messages) */
EP_RCVR *kqn_eprx_large; /* elan receiver (large messages) */
- kpr_router_t kqn_router; /* connection to Kernel Portals Router module */
- ptl_nid_t kqn_nid_offset; /* this cluster's NID offset */
int kqn_nnodes; /* this cluster's size */
int kqn_elanid; /* this nodes's elan ID */
extern int kqswnal_thread_start (int (*fn)(void *arg), void *arg);
extern void kqswnal_rxhandler(EP_RXD *rxd);
extern int kqswnal_scheduler (void *);
-extern void kqswnal_fwd_packet (void *arg, kpr_fwd_desc_t *fwd);
+extern void kqswnal_fwd_packet (ptl_ni_t *ni, kpr_fwd_desc_t *fwd);
extern void kqswnal_rx_done (kqswnal_rx_t *krx);
static inline ptl_nid_t
kqswnal_elanid2nid (int elanid)
{
- return (kqswnal_data.kqn_nid_offset + elanid);
+ return PTL_MKNID(PTL_NIDNET(kqswnal_data.kqn_ni->ni_nid), elanid);
}
static inline int
kqswnal_nid2elanid (ptl_nid_t nid)
{
- /* not in this cluster? */
- if (nid < kqswnal_data.kqn_nid_offset ||
- nid >= kqswnal_data.kqn_nid_offset + kqswnal_data.kqn_nnodes)
- return (-1);
+ int elanid = PTL_NIDADDR(nid);
- return (nid - kqswnal_data.kqn_nid_offset);
+ /* not in this cluster? */
+ return (elanid >= kqswnal_data.kqn_nnodes) ? -1 : elanid;
}
static inline ptl_nid_t
ptl_err_t kqswnal_startup (ptl_ni_t *ni, char **interfaces);
void kqswnal_shutdown (ptl_ni_t *ni);
+int kqswnal_ctl (ptl_ni_t *ni, unsigned int cmd, void *arg);
ptl_err_t kqswnal_send (ptl_ni_t *ni, void *private,
ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
- int type, ptl_nid_t nid, ptl_pid_t pid,
+ int type, ptl_process_id_t tgt, int routing,
unsigned int payload_niov,
struct iovec *payload_iov,
size_t payload_offset, size_t payload_nob);
ptl_err_t kqswnal_send_pages (ptl_ni_t *ni, void *private,
ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
- int type, ptl_nid_t nid, ptl_pid_t pid,
+ int type, ptl_process_id_t tgt, int routing,
unsigned int payload_niov,
ptl_kiov_t *payload_kiov,
size_t payload_offset, size_t payload_nob);
do_gettimeofday (&now);
then = now.tv_sec - (jiffies - ktx->ktx_launchtime)/HZ;
- kpr_notify(&kqswnal_data.kqn_router, ktx->ktx_nid, 0, then);
+ kpr_notify(kqswnal_data.kqn_ni, ktx->ktx_nid, 0, then);
}
void
{
switch (ktx->ktx_state) {
case KTX_FORWARDING: /* router asked me to forward this packet */
- kpr_fwd_done (&kqswnal_data.kqn_router,
+ kpr_fwd_done (kqswnal_data.kqn_ni,
(kpr_fwd_desc_t *)ktx->ktx_args[0], error);
break;
}
static ptl_err_t
-kqswnal_sendmsg (ptl_ni_t *ni,
- void *private,
- ptl_msg_t *ptlmsg,
- ptl_hdr_t *hdr,
- int type,
- ptl_nid_t nid,
- ptl_pid_t pid,
- unsigned int payload_niov,
- struct iovec *payload_iov,
- ptl_kiov_t *payload_kiov,
- size_t payload_offset,
- size_t payload_nob)
+kqswnal_sendmsg (ptl_ni_t *ni,
+ void *private,
+ ptl_msg_t *ptlmsg,
+ ptl_hdr_t *hdr,
+ int type,
+ ptl_process_id_t target,
+ int routing,
+ unsigned int payload_niov,
+ struct iovec *payload_iov,
+ ptl_kiov_t *payload_kiov,
+ size_t payload_offset,
+ size_t payload_nob)
{
kqswnal_tx_t *ktx;
int rc;
- ptl_nid_t targetnid;
#if KQSW_CHECKSUM
int i;
kqsw_csum_t csum;
/* NB 1. hdr is in network byte order */
/* 2. 'private' depends on the message type */
- CDEBUG(D_NET, "sending "LPSZ" bytes in %d frags to nid: "LPX64
- " pid %u\n", payload_nob, payload_niov, nid, pid);
+ CDEBUG(D_NET, "sending "LPSZ" bytes in %d frags to %s\n",
+ payload_nob, payload_niov, libcfs_id2str(target));
LASSERT (payload_nob == 0 || payload_niov > 0);
LASSERT (payload_niov <= PTL_MD_MAX_IOV);
return ((rc == 0) ? PTL_OK : PTL_FAIL);
}
- targetnid = nid;
- if (kqswnal_nid2elanid (nid) < 0) { /* Can't send direct: find gateway? */
- rc = kpr_lookup (&kqswnal_data.kqn_router, nid,
- sizeof (ptl_hdr_t) + payload_nob, &targetnid);
- if (rc != 0) {
- CERROR("Can't route to "LPX64": router error %d\n",
- nid, rc);
- return (PTL_FAIL);
- }
- if (kqswnal_nid2elanid (targetnid) < 0) {
- CERROR("Bad gateway "LPX64" for "LPX64"\n",
- targetnid, nid);
- return (PTL_FAIL);
- }
+
+ if (kqswnal_nid2elanid (target.nid) < 0) {
+ CERROR("%s not in my cluster\n", libcfs_nid2str(target.nid));
+ return PTL_FAIL;
}
/* I may not block for a transmit descriptor if I might block the
type == PTL_MSG_REPLY ||
in_interrupt()));
if (ktx == NULL) {
- CERROR ("Can't get txd for msg type %d for "LPX64"\n",
- type, ptlmsg->msg_ev.initiator.nid);
+ CERROR ("Can't get txd for msg type %d for %s\n",
+ type, libcfs_nid2str(target.nid));
return (PTL_NO_SPACE);
}
ktx->ktx_state = KTX_SENDING;
- ktx->ktx_nid = targetnid;
+ ktx->ktx_nid = target.nid;
ktx->ktx_args[0] = private;
ktx->ktx_args[1] = ptlmsg;
ktx->ktx_args[2] = NULL; /* set when a GET commits to REPLY */
* portals header. */
ktx->ktx_nfrag = ktx->ktx_firsttmpfrag = 1;
- if (nid == targetnid && /* not forwarding */
+ if (!routing && /* target.nid is final dest */
((type == PTL_MSG_GET && /* optimize GET? */
kqswnal_tunables.kqn_optimized_gets != 0 &&
le32_to_cpu(hdr->msg.get.sink_length) >=
if (type == PTL_MSG_GET) {
/* Allocate reply message now while I'm in thread context */
ktx->ktx_args[2] = ptl_create_reply_msg (
- kqswnal_data.kqn_ni, nid, ptlmsg);
+ kqswnal_data.kqn_ni, target.nid, ptlmsg);
if (ktx->ktx_args[2] == NULL)
goto out;
rc = kqswnal_launch (ktx);
out:
- CDEBUG(rc == 0 ? D_NET : D_ERROR,
- "%s "LPSZ" bytes to "LPX64" via "LPX64": rc %d\n",
+ CDEBUG(rc == 0 ? D_NET : D_ERROR, "%s "LPSZ" bytes to %s%s: rc %d\n",
rc == 0 ? "Sent" : "Failed to send",
- payload_nob, nid, targetnid, rc);
+ payload_nob, libcfs_nid2str(target.nid),
+ routing ? "(routing)" : "", rc);
if (rc != 0) {
if (ktx->ktx_state == KTX_GETTING &&
}
ptl_err_t
-kqswnal_send (ptl_ni_t *ni,
- void *private,
- ptl_msg_t *ptlmsg,
- ptl_hdr_t *hdr,
- int type,
- ptl_nid_t nid,
- ptl_pid_t pid,
- unsigned int payload_niov,
- struct iovec *payload_iov,
- size_t payload_offset,
- size_t payload_nob)
+kqswnal_send (ptl_ni_t *ni,
+ void *private,
+ ptl_msg_t *ptlmsg,
+ ptl_hdr_t *hdr,
+ int type,
+ ptl_process_id_t tgt,
+ int routing,
+ unsigned int payload_niov,
+ struct iovec *payload_iov,
+ size_t payload_offset,
+ size_t payload_nob)
{
- return (kqswnal_sendmsg (ni, private, ptlmsg, hdr, type, nid, pid,
+ return (kqswnal_sendmsg (ni, private, ptlmsg, hdr, type, tgt, routing,
payload_niov, payload_iov, NULL,
payload_offset, payload_nob));
}
ptl_err_t
-kqswnal_send_pages (ptl_ni_t *ni,
- void *private,
- ptl_msg_t *ptlmsg,
- ptl_hdr_t *hdr,
- int type,
- ptl_nid_t nid,
- ptl_pid_t pid,
- unsigned int payload_niov,
- ptl_kiov_t *payload_kiov,
- size_t payload_offset,
- size_t payload_nob)
+kqswnal_send_pages (ptl_ni_t *ni,
+ void *private,
+ ptl_msg_t *ptlmsg,
+ ptl_hdr_t *hdr,
+ int type,
+ ptl_process_id_t tgt,
+ int routing,
+ unsigned int payload_niov,
+ ptl_kiov_t *payload_kiov,
+ size_t payload_offset,
+ size_t payload_nob)
{
- return (kqswnal_sendmsg (ni, private, ptlmsg, hdr, type, nid, pid,
+ return (kqswnal_sendmsg (ni, private, ptlmsg, hdr, type, tgt, routing,
payload_niov, NULL, payload_kiov,
payload_offset, payload_nob));
}
void
-kqswnal_fwd_packet (void *arg, kpr_fwd_desc_t *fwd)
+kqswnal_fwd_packet (ptl_ni_t *ni, kpr_fwd_desc_t *fwd)
{
int rc;
kqswnal_tx_t *ktx;
if (ktx == NULL) /* can't get txd right now */
return; /* fwd will be scheduled when tx desc freed */
- if (nid == kqswnal_data.kqn_ni->ni_nid) /* gateway is me */
+ if (nid == ni->ni_nid) /* gateway is me */
nid = fwd->kprfd_target_nid; /* target is final dest */
- if (kqswnal_nid2elanid (nid) < 0) {
- CERROR("Can't forward [%p] to "LPX64": not a peer\n", fwd, nid);
- rc = -EHOSTUNREACH;
- goto out;
- }
-
/* copy hdr into pre-mapped buffer */
memcpy(ktx->ktx_buffer, fwd->kprfd_hdr, sizeof(ptl_hdr_t));
ktx->ktx_args[0] = fwd;
ktx->ktx_nfrag = ktx->ktx_firsttmpfrag = 1;
+ if (kqswnal_nid2elanid (nid) < 0) {
+ CERROR("Can't forward [%p] to "LPX64": not a peer\n", fwd, nid);
+ rc = -EHOSTUNREACH;
+ goto out;
+ }
+
if (nob <= *kqswnal_tunables.kqn_tx_maxcontig)
{
/* send payload from ktx's pre-mapped contiguous buffer */
}
void
-kqswnal_fwd_callback (void *arg, int error)
+kqswnal_fwd_callback (ptl_ni_t *ni, void *arg, int error)
{
kqswnal_rx_t *krx = (kqswnal_rx_t *)arg;
hdr, payload_nob, niov, krx->krx_kiov,
kqswnal_fwd_callback, krx);
- kpr_fwd_start (&kqswnal_data.kqn_router, &krx->krx_fwd);
+ kpr_fwd_start (kqswnal_data.kqn_ni, &krx->krx_fwd);
}
/* Receive Interrupt Handler: posts to schedulers */
.nal_type = RANAL,
.nal_startup = kranal_startup,
.nal_shutdown = kranal_shutdown,
+ .nal_ctl = kranal_ctl,
.nal_send = kranal_send,
.nal_send_pages = kranal_send_pages,
.nal_recv = kranal_recv,
/* Delete all existing peers and their connections after new
* NID/connstamp set to ensure no old connections in our brave
* new world. */
- kranal_del_peer(PTL_NID_ANY, 0);
+ kranal_del_peer(PTL_NID_ANY);
if (nid != PTL_NID_ANY)
rc = kranal_start_listener();
}
void
-kranal_del_peer_locked (kra_peer_t *peer, int single_share)
+kranal_del_peer_locked (kra_peer_t *peer)
{
struct list_head *ctmp;
struct list_head *cnxt;
kra_conn_t *conn;
- if (!single_share)
- peer->rap_persistence = 0;
- else if (peer->rap_persistence > 0)
- peer->rap_persistence--;
-
- if (peer->rap_persistence != 0)
- return;
+ peer->rap_persistence = 0;
if (list_empty(&peer->rap_conns)) {
kranal_unlink_peer_locked(peer);
}
int
-kranal_del_peer (ptl_nid_t nid, int single_share)
+kranal_del_peer (ptl_nid_t nid)
{
unsigned long flags;
struct list_head *ptmp;
if (!(nid == PTL_NID_ANY || peer->rap_nid == nid))
continue;
- kranal_del_peer_locked(peer, single_share);
+ kranal_del_peer_locked(peer);
rc = 0; /* matched something */
-
- if (single_share)
- goto out;
}
}
out:
}
int
-kranal_cmd(struct portals_cfg *pcfg, void * private)
+kranal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg)
{
- int rc = -EINVAL;
+ struct portal_ioctl_data *data = arg;
+ int rc = -EINVAL;
- LASSERT (pcfg != NULL);
+ LASSERT (ni == kranal_data.kra_ni);
- switch(pcfg->pcfg_command) {
- case NAL_CMD_GET_PEER: {
+ switch(cmd) {
+ case IOC_PORTAL_GET_PEER: {
ptl_nid_t nid = 0;
__u32 ip = 0;
int port = 0;
int share_count = 0;
- rc = kranal_get_peer_info(pcfg->pcfg_count,
+ rc = kranal_get_peer_info(data->ioc_count,
&nid, &ip, &port, &share_count);
- pcfg->pcfg_nid = nid;
- pcfg->pcfg_size = 0;
- pcfg->pcfg_id = ip;
- pcfg->pcfg_misc = port;
- pcfg->pcfg_count = 0;
- pcfg->pcfg_wait = share_count;
+ data->ioc_nid = nid;
+ data->ioc_count = share_count;
+ data->ioc_u32[0] = ip;
+ data->ioc_u32[1] = port;
break;
}
- case NAL_CMD_ADD_PEER: {
- rc = kranal_add_persistent_peer(pcfg->pcfg_nid,
- pcfg->pcfg_id, /* IP */
- pcfg->pcfg_misc); /* port */
+ case IOC_PORTAL_ADD_PEER: {
+ rc = kranal_add_persistent_peer(data->ioc_nid,
+ data->ioc_u32[0], /* IP */
+ data->ioc_u32[1]); /* port */
break;
}
- case NAL_CMD_DEL_PEER: {
- rc = kranal_del_peer(pcfg->pcfg_nid,
- /* flags == single_share */
- pcfg->pcfg_flags != 0);
+ case IOC_PORTAL_DEL_PEER: {
+ rc = kranal_del_peer(data->ioc_nid);
break;
}
- case NAL_CMD_GET_CONN: {
- kra_conn_t *conn = kranal_get_conn_by_idx(pcfg->pcfg_count);
+ case IOC_PORTAL_GET_CONN: {
+ kra_conn_t *conn = kranal_get_conn_by_idx(data->ioc_count);
if (conn == NULL)
rc = -ENOENT;
else {
rc = 0;
- pcfg->pcfg_nid = conn->rac_peer->rap_nid;
- pcfg->pcfg_id = conn->rac_device->rad_id;
- pcfg->pcfg_misc = 0;
- pcfg->pcfg_flags = 0;
+ data->ioc_nid = conn->rac_peer->rap_nid;
+ data->ioc_u32[0] = conn->rac_device->rad_id;
kranal_conn_decref(conn);
}
break;
}
- case NAL_CMD_CLOSE_CONNECTION: {
- rc = kranal_close_matching_conns(pcfg->pcfg_nid);
+ case IOC_PORTAL_CLOSE_CONNECTION: {
+ rc = kranal_close_matching_conns(data->ioc_nid);
break;
}
- case NAL_CMD_REGISTER_MYNID: {
- if (pcfg->pcfg_nid == PTL_NID_ANY)
+ case IOC_PORTAL_REGISTER_MYNID: {
+ if (data->ioc_nid == PTL_NID_ANY)
rc = -EINVAL;
else
- rc = kranal_set_mynid(pcfg->pcfg_nid);
+ rc = kranal_set_mynid(data->ioc_nid);
break;
}
}
LBUG();
case RANAL_INIT_ALL:
- /* stop calls to nal_cmd */
- libcfs_nal_cmd_unregister(RANAL);
- /* No new persistent peers */
-
/* resetting my NID to unadvertises me, removes my
* listener and nukes all current peers */
kranal_set_mynid(PTL_NID_ANY);
atomic_read(&portal_kmemory));
kranal_data.kra_init = RANAL_INIT_NOTHING;
+ PORTAL_MODULE_UNUSE;
}
ptl_err_t
/* OK to call kranal_api_shutdown() to cleanup now */
kranal_data.kra_init = RANAL_INIT_DATA;
+ PORTAL_MODULE_USE;
kranal_data.kra_peer_hash_size = RANAL_PEER_HASH_SIZE;
PORTAL_ALLOC(kranal_data.kra_peers,
}
}
- rc = libcfs_nal_cmd_register(RANAL, &kranal_cmd, NULL);
- if (rc != 0) {
- CERROR("Can't initialise command interface (rc = %d)\n", rc);
- goto failed;
- }
-
/* flag everything initialised */
kranal_data.kra_init = RANAL_INIT_ALL;
/*****************************************************/
-
+
CDEBUG(D_MALLOC, "initial kmem %d\n", atomic_read(&portal_kmemory));
printk(KERN_INFO "Lustre: RapidArray NAL loaded "
"(initial mem %d)\n", pkmem);
ptl_err_t kranal_startup (ptl_ni_t *ni, char **interfaces);
void kranal_shutdown (ptl_ni_t *ni);
+int kranal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg);
ptl_err_t kranal_send (ptl_ni_t *ni, void *private,
ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
- int type, ptl_nid_t nid, ptl_pid_t pid,
- unsigned int payload_niov,
- struct iovec *payload_iov,
+ int type, ptl_process_id_t tgt, int routing,
+ unsigned int payload_niov, struct iovec *payload_iov,
size_t payload_offset, size_t payload_nob);
ptl_err_t kranal_send_pages (ptl_ni_t *ni, void *private,
ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
- int type, ptl_nid_t nid, ptl_pid_t pid,
- unsigned int payload_niov,
- ptl_kiov_t *payload_kiov,
+ int type, ptl_process_id_t tgt, int routing,
+ unsigned int payload_niov, ptl_kiov_t *payload_kiov,
size_t payload_offset, size_t payload_nob);
ptl_err_t kranal_recv(ptl_ni_t *ni, void *private,
ptl_msg_t *ptlmsg, unsigned int niov,
extern kra_peer_t *kranal_create_peer (ptl_nid_t nid);
extern kra_peer_t *kranal_find_peer_locked (ptl_nid_t nid);
extern void kranal_post_fma (kra_conn_t *conn, kra_tx_t *tx);
-extern int kranal_del_peer (ptl_nid_t nid, int single_share);
+extern int kranal_del_peer (ptl_nid_t nid);
extern void kranal_device_callback (RAP_INT32 devid, RAP_PVOID arg);
extern int kranal_thread_start (int(*fn)(void *arg), void *arg);
extern int kranal_connd (void *arg);
}
ptl_err_t
-kranal_do_send (ptl_ni_t *ni,
- void *private,
- ptl_msg_t *ptlmsg,
- ptl_hdr_t *hdr,
- int type,
- ptl_nid_t nid,
- ptl_pid_t pid,
- unsigned int niov,
- struct iovec *iov,
- ptl_kiov_t *kiov,
- int offset,
- int nob)
+kranal_do_send (ptl_ni_t *ni,
+ void *private,
+ ptl_msg_t *ptlmsg,
+ ptl_hdr_t *hdr,
+ int type,
+ ptl_process_id_t target,
+ int routing,
+ unsigned int niov,
+ struct iovec *iov,
+ ptl_kiov_t *kiov,
+ int offset,
+ int nob)
{
kra_conn_t *conn;
kra_tx_t *tx;
/* NB 'private' is different depending on what we're sending.... */
- CDEBUG(D_NET, "sending %d bytes in %d frags to nid:"LPX64" pid %d\n",
- nob, niov, nid, pid);
+ CDEBUG(D_NET, "sending %d bytes in %d frags to %s\n",
+ nob, niov, libcfs_id2str(target));
LASSERT (nob == 0 || niov > 0);
LASSERT (niov <= PTL_MD_MAX_IOV);
/* payload is either all vaddrs or all pages */
LASSERT (!(kiov != NULL && iov != NULL));
+ if (routing) {
+ CERROR ("Can't route\n");
+ return PTL_FAIL;
+ }
+
switch(type) {
default:
LBUG();
if (conn->rac_rxmsg->ram_type == RANAL_MSG_IMMEDIATE) {
if (nob > RANAL_FMA_MAX_DATA) {
CERROR("Can't REPLY IMMEDIATE %d to "LPX64"\n",
- nob, nid);
+ nob, target.nid);
return PTL_FAIL;
}
break; /* RDMA not expected */
/* Incoming message consistent with RDMA? */
if (conn->rac_rxmsg->ram_type != RANAL_MSG_GET_REQ) {
CERROR("REPLY to "LPX64" bad msg type %x!!!\n",
- nid, conn->rac_rxmsg->ram_type);
+ target.nid, conn->rac_rxmsg->ram_type);
return PTL_FAIL;
}
return PTL_FAIL;
}
- tx->tx_ptlmsg[1] = ptl_create_reply_msg(kranal_data.kra_ni,
- nid, ptlmsg);
+ tx->tx_ptlmsg[1] = ptl_create_reply_msg(ni, target.nid, ptlmsg);
if (tx->tx_ptlmsg[1] == NULL) {
- CERROR("Can't create reply for GET to "LPX64"\n", nid);
+ CERROR("Can't create reply for GET to "LPX64"\n", target.nid);
kranal_tx_done(tx, rc);
return PTL_FAIL;
}
tx->tx_ptlmsg[0] = ptlmsg;
tx->tx_msg.ram_u.get.ragm_hdr = *hdr;
/* rest of tx_msg is setup just before it is sent */
- kranal_launch_tx(tx, nid);
+ kranal_launch_tx(tx, target.nid);
return PTL_OK;
case PTL_MSG_ACK:
tx->tx_ptlmsg[0] = ptlmsg;
tx->tx_msg.ram_u.putreq.raprm_hdr = *hdr;
/* rest of tx_msg is setup just before it is sent */
- kranal_launch_tx(tx, nid);
+ kranal_launch_tx(tx, target.nid);
return PTL_OK;
}
tx->tx_msg.ram_u.immediate.raim_hdr = *hdr;
tx->tx_ptlmsg[0] = ptlmsg;
- kranal_launch_tx(tx, nid);
+ kranal_launch_tx(tx, target.nid);
return PTL_OK;
}
ptl_err_t
kranal_send (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
- ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
+ ptl_hdr_t *hdr, int type, ptl_process_id_t tgt, int routing,
unsigned int niov, struct iovec *iov,
size_t offset, size_t len)
{
return kranal_do_send(ni, private, cookie,
- hdr, type, nid, pid,
- niov, iov, NULL,
- offset, len);
+ hdr, type, tgt, routing,
+ niov, iov, NULL, offset, len);
}
ptl_err_t
kranal_send_pages (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
- ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
+ ptl_hdr_t *hdr, int type, ptl_process_id_t tgt, int routing,
unsigned int niov, ptl_kiov_t *kiov,
size_t offset, size_t len)
{
return kranal_do_send(ni, private, cookie,
- hdr, type, nid, pid,
- niov, NULL, kiov,
- offset, len);
+ hdr, type, tgt, routing,
+ niov, NULL, kiov, offset, len);
}
ptl_err_t
.nal_type = SOCKNAL,
.nal_startup = ksocknal_startup,
.nal_shutdown = ksocknal_shutdown,
+ .nal_ctl = ksocknal_ctl,
.nal_send = ksocknal_send,
.nal_send_pages = ksocknal_send_pages,
.nal_recv = ksocknal_recv,
.nal_recv_pages = ksocknal_recv_pages,
+ .nal_fwd = ksocknal_fwd_packet,
+ .nal_notify = ksocknal_notify,
};
-ksock_nal_data_t ksocknal_data;
-kpr_nal_interface_t ksocknal_router_interface = {
- kprni_nalid: SOCKNAL,
- kprni_arg: &ksocknal_data,
- kprni_fwd: ksocknal_fwd_packet,
- kprni_notify: ksocknal_notify,
-};
+ksock_nal_data_t ksocknal_data;
int
ksocknal_set_mynid(ptl_nid_t nid)
CDEBUG(D_IOCTL, "setting mynid to "LPX64" (old nid="LPX64")\n",
nid, ni->ni_nid);
+ LASSERT (PTL_NIDNET(nid) == PTL_NIDNET(ni->ni_nid));
ni->ni_nid = nid;
return (0);
}
}
ksock_peer_t *
-ksocknal_get_peer (ptl_nid_t nid)
+ksocknal_find_peer (ptl_nid_t nid)
{
ksock_peer_t *peer;
}
void
-ksocknal_del_peer_locked (ksock_peer_t *peer, __u32 ip, int single_share)
+ksocknal_del_peer_locked (ksock_peer_t *peer, __u32 ip)
{
ksock_conn_t *conn;
ksock_route_t *route;
list_for_each_safe (tmp, nxt, &peer->ksnp_routes) {
route = list_entry(tmp, ksock_route_t, ksnr_list);
- if (single_share && route->ksnr_share_count == 0)
- continue;
-
/* no match */
if (!(ip == 0 || route->ksnr_ipaddr == ip))
continue;
- if (!single_share)
- route->ksnr_share_count = 0;
- else if (route->ksnr_share_count > 0)
- route->ksnr_share_count--;
-
- if (route->ksnr_share_count == 0) {
- /* This deletes associated conns too */
- ksocknal_del_route_locked (route);
- }
-
- if (single_share)
- break;
+ route->ksnr_share_count = 0;
+ /* This deletes associated conns too */
+ ksocknal_del_route_locked (route);
}
nshared = 0;
}
int
-ksocknal_del_peer (ptl_nid_t nid, __u32 ip, int single_share)
+ksocknal_del_peer (ptl_nid_t nid, __u32 ip)
{
unsigned long flags;
struct list_head *ptmp;
if (!(nid == PTL_NID_ANY || peer->ksnp_nid == nid))
continue;
- ksocknal_del_peer_locked (peer, ip, single_share);
+ ksocknal_del_peer_locked (peer, ip);
rc = 0; /* matched! */
-
- if (single_share)
- break;
}
}
ksocknal_connsock_decref(conn);
if (notify)
- kpr_notify (&ksocknal_data.ksnd_router, peer->ksnp_nid,
+ kpr_notify (ksocknal_data.ksnd_ni, peer->ksnp_nid,
0, then);
}
conn->ksnc_cookie, PTL_FAIL);
break;
case SOCKNAL_RX_BODY_FWD:
- ksocknal_fmb_callback (conn->ksnc_cookie, -ECONNABORTED);
+ ksocknal_fmb_callback (ksocknal_data.ksnd_ni,
+ conn->ksnc_cookie, -ECONNABORTED);
break;
case SOCKNAL_RX_HEADER:
case SOCKNAL_RX_SLOP:
}
void
-ksocknal_notify (void *arg, ptl_nid_t gw_nid, int alive)
+ksocknal_notify (ptl_ni_t *ni, ptl_nid_t gw_nid, int alive)
{
/* The router is telling me she's been notified of a change in
* gateway state.... */
int rc = -ENOENT;
if (nid != PTL_NID_ANY) {
- peer = ksocknal_get_peer (nid);
+ peer = ksocknal_find_peer (nid);
if (peer != NULL) {
rc = 0;
}
int
-ksocknal_cmd(struct portals_cfg *pcfg, void * private)
+ksocknal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg)
{
+ struct portal_ioctl_data *data = arg;
int rc;
- switch(pcfg->pcfg_command) {
- case NAL_CMD_GET_INTERFACE: {
+ LASSERT(ni == ksocknal_data.ksnd_ni);
+
+ switch(cmd) {
+ case IOC_PORTAL_GET_INTERFACE: {
ksock_interface_t *iface;
read_lock (&ksocknal_data.ksnd_global_lock);
- if (pcfg->pcfg_count < 0 ||
- pcfg->pcfg_count >= ksocknal_data.ksnd_ninterfaces) {
+ if (data->ioc_count < 0 ||
+ data->ioc_count >= ksocknal_data.ksnd_ninterfaces) {
rc = -ENOENT;
} else {
rc = 0;
- iface = &ksocknal_data.ksnd_interfaces[pcfg->pcfg_count];
+ iface = &ksocknal_data.ksnd_interfaces[data->ioc_count];
- pcfg->pcfg_id = iface->ksni_ipaddr;
- pcfg->pcfg_misc = iface->ksni_netmask;
- pcfg->pcfg_fd = iface->ksni_npeers;
- pcfg->pcfg_count = iface->ksni_nroutes;
+ data->ioc_u32[0] = iface->ksni_ipaddr;
+ data->ioc_u32[1] = iface->ksni_netmask;
+ data->ioc_u32[2] = iface->ksni_npeers;
+ data->ioc_u32[3] = iface->ksni_nroutes;
}
read_unlock (&ksocknal_data.ksnd_global_lock);
break;
}
- case NAL_CMD_ADD_INTERFACE: {
- rc = ksocknal_add_interface(pcfg->pcfg_id, /* IP address */
- pcfg->pcfg_misc); /* net mask */
+ case IOC_PORTAL_ADD_INTERFACE: {
+ rc = ksocknal_add_interface(data->ioc_u32[0], /* IP address */
+ data->ioc_u32[1]); /* net mask */
break;
}
- case NAL_CMD_DEL_INTERFACE: {
- rc = ksocknal_del_interface(pcfg->pcfg_id); /* IP address */
+ case IOC_PORTAL_DEL_INTERFACE: {
+ rc = ksocknal_del_interface(data->ioc_u32[0]); /* IP address */
break;
}
- case NAL_CMD_GET_PEER: {
+ case IOC_PORTAL_GET_PEER: {
ptl_nid_t nid = 0;
__u32 myip = 0;
__u32 ip = 0;
int conn_count = 0;
int share_count = 0;
- rc = ksocknal_get_peer_info(pcfg->pcfg_count, &nid,
+ rc = ksocknal_get_peer_info(data->ioc_count, &nid,
&myip, &ip, &port,
&conn_count, &share_count);
- pcfg->pcfg_nid = nid;
- pcfg->pcfg_size = myip;
- pcfg->pcfg_id = ip;
- pcfg->pcfg_misc = port;
- pcfg->pcfg_count = conn_count;
- pcfg->pcfg_wait = share_count;
+ data->ioc_nid = nid;
+ data->ioc_count = share_count;
+ data->ioc_u32[0] = ip;
+ data->ioc_u32[1] = port;
+ data->ioc_u32[2] = myip;
+ data->ioc_u32[3] = conn_count;
break;
}
- case NAL_CMD_ADD_PEER: {
-#if 1
- CDEBUG(D_WARNING, "ADD_PEER: ignoring "
- LPX64"@%u.%u.%u.%u:%d\n",
- pcfg->pcfg_nid,
- HIPQUAD(pcfg->pcfg_id), /* IP */
- pcfg->pcfg_misc); /* port */
- rc = 0;
-#else
- rc = ksocknal_add_peer (pcfg->pcfg_nid,
- pcfg->pcfg_id, /* IP */
- pcfg->pcfg_misc); /* port */
-#endif
+ case IOC_PORTAL_ADD_PEER: {
+ rc = ksocknal_add_peer (data->ioc_nid,
+ data->ioc_u32[0], /* IP */
+ data->ioc_u32[1]); /* port */
break;
}
- case NAL_CMD_DEL_PEER: {
- if (pcfg->pcfg_flags) { /* single_share */
- CDEBUG(D_WARNING, "DEL_PEER: ignoring "
- LPX64"@%u.%u.%u.%u\n",
- pcfg->pcfg_nid,
- HIPQUAD(pcfg->pcfg_id)); /* IP */
- rc = 0;
- break;
- }
- rc = ksocknal_del_peer (pcfg->pcfg_nid,
- pcfg->pcfg_id, /* IP */
- pcfg->pcfg_flags); /* single_share? */
+ case IOC_PORTAL_DEL_PEER: {
+ rc = ksocknal_del_peer (data->ioc_nid,
+ data->ioc_u32[0]); /* IP */
break;
}
- case NAL_CMD_GET_CONN: {
- ksock_conn_t *conn = ksocknal_get_conn_by_idx (pcfg->pcfg_count);
+ case IOC_PORTAL_GET_CONN: {
+ ksock_conn_t *conn = ksocknal_get_conn_by_idx (data->ioc_count);
if (conn == NULL)
rc = -ENOENT;
ksocknal_lib_get_conn_tunables(conn, &txmem, &rxmem, &nagle);
rc = 0;
- pcfg->pcfg_nid = conn->ksnc_peer->ksnp_nid;
- pcfg->pcfg_id = conn->ksnc_ipaddr;
- pcfg->pcfg_misc = conn->ksnc_port;
- pcfg->pcfg_fd = conn->ksnc_myipaddr;
- pcfg->pcfg_flags = conn->ksnc_type;
- pcfg->pcfg_gw_nal = conn->ksnc_scheduler -
+ data->ioc_count = txmem;
+ data->ioc_nid = conn->ksnc_peer->ksnp_nid;
+ data->ioc_flags = nagle;
+ data->ioc_u32[0] = conn->ksnc_ipaddr;
+ data->ioc_u32[1] = conn->ksnc_port;
+ data->ioc_u32[2] = conn->ksnc_myipaddr;
+ data->ioc_u32[3] = conn->ksnc_type;
+ data->ioc_u32[4] = conn->ksnc_scheduler -
ksocknal_data.ksnd_schedulers;
- pcfg->pcfg_count = txmem;
- pcfg->pcfg_size = rxmem;
- pcfg->pcfg_wait = nagle;
+ data->ioc_u32[5] = rxmem;
ksocknal_conn_decref(conn);
}
break;
}
- case NAL_CMD_CLOSE_CONNECTION: {
- rc = ksocknal_close_matching_conns (pcfg->pcfg_nid,
- pcfg->pcfg_id);
+ case IOC_PORTAL_CLOSE_CONNECTION: {
+ rc = ksocknal_close_matching_conns (data->ioc_nid,
+ data->ioc_u32[0]);
break;
}
- case NAL_CMD_REGISTER_MYNID: {
- rc = ksocknal_set_mynid (pcfg->pcfg_nid);
+ case IOC_PORTAL_REGISTER_MYNID: {
+ rc = ksocknal_set_mynid (data->ioc_nid);
break;
}
- case NAL_CMD_PUSH_CONNECTION: {
- rc = ksocknal_push (pcfg->pcfg_nid);
+ case IOC_PORTAL_PUSH_CONNECTION: {
+ rc = ksocknal_push (data->ioc_nid);
break;
}
default:
CDEBUG(D_MALLOC, "before NAL cleanup: kmem %d\n",
atomic_read (&portal_kmemory));
- LASSERT(ni->ni_nal == &ksocknal_nal);
+ LASSERT(ni == ksocknal_data.ksnd_ni);
switch (ksocknal_data.ksnd_init) {
default:
LASSERT (0);
case SOCKNAL_INIT_ALL:
- libcfs_nal_cmd_unregister(SOCKNAL);
- /* fall through */
-
- case SOCKNAL_INIT_LISTENER:
ksocknal_stop_listener();
/* Wait for queued connreqs to clean up */
i = 2;
/* fall through */
case SOCKNAL_INIT_DATA:
- /* No more calls to ksocknal_cmd() to create new
- * peers/connections since we're being unloaded. */
-
/* Delete all peers */
- ksocknal_del_peer(PTL_NID_ANY, 0, 0);
+ ksocknal_del_peer(PTL_NID_ANY, 0);
/* Wait for all peer state to clean up */
i = 2;
LASSERT (kss->kss_nconns == 0);
}
- /* stop router calling me */
- kpr_shutdown (&ksocknal_data.ksnd_router);
-
/* flag threads to terminate; wake and wait for them to die */
ksocknal_data.ksnd_shuttingdown = 1;
cfs_waitq_broadcast (&ksocknal_data.ksnd_connd_waitq);
}
read_unlock(&ksocknal_data.ksnd_global_lock);
- kpr_deregister (&ksocknal_data.ksnd_router);
-
ksocknal_free_buffers();
ksocknal_data.ksnd_init = SOCKNAL_INIT_NOTHING;
- /* fall through */
-
- case SOCKNAL_INIT_NOTHING:
break;
}
printk(KERN_INFO "Lustre: Routing socket NAL unloaded (final mem %d)\n",
atomic_read(&portal_kmemory));
-
PORTAL_MODULE_UNUSE;
}
return (rc);
}
- rc = kpr_register(&ksocknal_data.ksnd_router,
- &ksocknal_router_interface);
- if (rc != 0) {
- CDEBUG(D_NET, "Can't initialise routing interface "
- "(rc = %d): not routing\n", rc);
- } else {
+ if (kpr_routing()) {
/* Only allocate forwarding buffers if there's a router */
for (i = 0; i < (SOCKNAL_SMALL_FWD_NMSGS +
return rc;
}
- ksocknal_data.ksnd_init = SOCKNAL_INIT_LISTENER;
-
- rc = libcfs_nal_cmd_register(SOCKNAL, &ksocknal_cmd, NULL);
- if (rc != 0) {
- CERROR ("Can't initialise command interface (rc = %d)\n", rc);
- ksocknal_shutdown (ni);
- return (rc);
- }
-
/* flag everything initialised */
ksocknal_data.ksnd_init = SOCKNAL_INIT_ALL;
printk(KERN_INFO "Lustre: Routing socket NAL loaded "
- "(Routing %s, initial mem %d, incarnation "LPX64")\n",
- kpr_routing (&ksocknal_data.ksnd_router) ?
- "enabled" : "disabled", pkmem, ksocknal_data.ksnd_incarnation);
+ "(initial mem %d, incarnation "LPX64")\n",
+ pkmem, ksocknal_data.ksnd_incarnation);
return (0);
}
atomic_t ksnd_npeers; /* total # peers extant */
atomic_t ksnd_nclosing_conns; /* # closed conns extant */
- kpr_router_t ksnd_router; /* THE router */
+ void *ksnd_router; /* router callback arg */
ksock_fmb_pool_t ksnd_small_fmp; /* small message forwarding buffers */
ksock_fmb_pool_t ksnd_large_fmp; /* large message forwarding buffers */
#define SOCKNAL_INIT_NOTHING 0
#define SOCKNAL_INIT_DATA 1
-#define SOCKNAL_INIT_LISTENER 2
-#define SOCKNAL_INIT_ALL 3
+#define SOCKNAL_INIT_ALL 2
/* A packet just assembled for transmission is represented by 1 or more
* struct iovec fragments (the first frag contains the portals header),
ptl_err_t ksocknal_startup (ptl_ni_t *ni, char **interfaces);
void ksocknal_shutdown (ptl_ni_t *ni);
+int ksocknal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg);
ptl_err_t ksocknal_send (ptl_ni_t *ni, void *private,
ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
- int type, ptl_nid_t nid, ptl_pid_t pid,
- unsigned int payload_niov,
- struct iovec *payload_iov,
+ int type, ptl_process_id_t tgt, int routing,
+ unsigned int payload_niov, struct iovec *payload_iov,
size_t payload_offset, size_t payload_nob);
ptl_err_t ksocknal_send_pages (ptl_ni_t *ni, void *private,
ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
- int type, ptl_nid_t nid, ptl_pid_t pid,
- unsigned int payload_niov,
- ptl_kiov_t *payload_kiov,
+ int type, ptl_process_id_t tgt, int routing,
+ unsigned int payload_niov, ptl_kiov_t *payload_kiov,
size_t payload_offset, size_t payload_nob);
ptl_err_t ksocknal_recv(ptl_ni_t *ni, void *private,
ptl_msg_t *ptlmsg, unsigned int niov,
extern int ksocknal_add_peer(ptl_nid_t nid, __u32 ip, int port);
extern ksock_peer_t *ksocknal_find_peer_locked (ptl_nid_t nid);
-extern ksock_peer_t *ksocknal_get_peer (ptl_nid_t nid);
+extern ksock_peer_t *ksocknal_find_peer (ptl_nid_t nid);
extern int ksocknal_create_conn (ksock_route_t *route,
struct socket *sock, int type);
extern void ksocknal_close_conn_locked (ksock_conn_t *conn, int why);
extern void ksocknal_queue_tx_locked (ksock_tx_t *tx, ksock_conn_t *conn);
extern void ksocknal_tx_done (ksock_tx_t *tx, int asynch);
-extern void ksocknal_fwd_packet (void *arg, kpr_fwd_desc_t *fwd);
-extern void ksocknal_fmb_callback (void *arg, int error);
-extern void ksocknal_notify (void *arg, ptl_nid_t gw_nid, int alive);
+extern void ksocknal_fwd_packet (ptl_ni_t *ni, kpr_fwd_desc_t *fwd);
+extern void ksocknal_fmb_callback (ptl_ni_t *ni, void *arg, int error);
+extern void ksocknal_notify (ptl_ni_t *ni, ptl_nid_t gw_nid, int alive);
extern int ksocknal_thread_start (int (*fn)(void *arg), void *arg);
extern void ksocknal_thread_fini (void);
extern int ksocknal_new_packet (ksock_conn_t *conn, int skip);
}
if (tx->tx_isfwd) { /* was a forwarded packet? */
- kpr_fwd_done (&ksocknal_data.ksnd_router,
+ kpr_fwd_done (ksocknal_data.ksnd_ni,
KSOCK_TX_2_KPR_FWD_DESC (tx),
(tx->tx_resid == 0) ? 0 : -ECONNABORTED);
EXIT;
spin_unlock_irqrestore (&ksocknal_data.ksnd_connd_lock, flags);
}
-#if 0
-ksock_peer_t *
-ksocknal_find_target_peer_locked (ksock_tx_t *tx, ptl_nid_t nid)
-{
- ptl_nid_t target_nid;
- int rc;
- ksock_peer_t *peer = ksocknal_find_peer_locked (nid);
-
- if (peer != NULL)
- return (peer);
-
- if (tx->tx_isfwd) {
- CERROR ("Can't send packet to "LPX64
- " %s: routed target is not a peer\n",
- nid, libcfs_nid2str(nid));
- return (NULL);
- }
-
- rc = kpr_lookup (&ksocknal_data.ksnd_router, nid, tx->tx_nob,
- &target_nid);
- if (rc != 0) {
- CERROR ("Can't route to "LPX64" %s: router error %d\n",
- nid, libcfs_nid2str(nid), rc);
- return (NULL);
- }
-
- peer = ksocknal_find_peer_locked (target_nid);
- if (peer != NULL)
- return (peer);
-
- CERROR ("Can't send packet to "LPX64" %s: no peer entry\n",
- target_nid, libcfs_nid2str(target_nid));
- return (NULL);
-}
-#endif
-
ksock_conn_t *
ksocknal_find_conn_locked (ksock_tx_t *tx, ksock_peer_t *peer)
{
}
int
-ksocknal_launch_packet (ksock_tx_t *tx, ptl_nid_t nid)
+ksocknal_launch_packet (ksock_tx_t *tx, ptl_nid_t nid, int routing)
{
unsigned long flags;
ksock_peer_t *peer;
#if !SOCKNAL_ROUND_ROBIN
read_lock (g_lock);
-#warning "router issues"
peer = ksocknal_find_peer_locked(nid);
if (peer != NULL) {
if (ksocknal_find_connectable_route_locked(peer) == NULL) {
#endif
write_lock_irqsave(g_lock, flags);
-#warning "router issues"
peer = ksocknal_find_peer_locked(nid);
if (peer == NULL) {
write_unlock_irqrestore(g_lock, flags);
}
ptl_err_t
-ksocknal_sendmsg(ptl_ni_t *ni,
- void *private,
- ptl_msg_t *cookie,
- ptl_hdr_t *hdr,
- int type,
- ptl_nid_t nid,
- ptl_pid_t pid,
- unsigned int payload_niov,
- struct iovec *payload_iov,
- ptl_kiov_t *payload_kiov,
- size_t payload_offset,
- size_t payload_nob)
+ksocknal_sendmsg(ptl_ni_t *ni,
+ void *private,
+ ptl_msg_t *cookie,
+ ptl_hdr_t *hdr,
+ int type,
+ ptl_process_id_t target,
+ int routing,
+ unsigned int payload_niov,
+ struct iovec *payload_iov,
+ ptl_kiov_t *payload_kiov,
+ size_t payload_offset,
+ size_t payload_nob)
{
ksock_ltx_t *ltx;
int desc_size;
/* NB 'private' is different depending on what we're sending.
* Just ignore it... */
- CDEBUG(D_NET, "sending "LPSZ" bytes in %d frags to nid:"LPX64
- " pid %d\n", payload_nob, payload_niov, nid , pid);
+ CDEBUG(D_NET, "sending "LPSZ" bytes in %d frags to %s\n",
+ payload_nob, payload_niov, libcfs_id2str(target));
LASSERT (payload_nob == 0 || payload_niov > 0);
LASSERT (payload_niov <= PTL_MD_MAX_IOV);
payload_offset, payload_nob);
}
- rc = ksocknal_launch_packet(<x->ltx_tx, nid);
+ rc = ksocknal_launch_packet(<x->ltx_tx, target.nid, routing);
if (rc == 0)
return (PTL_OK);
ptl_err_t
ksocknal_send (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
- ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
+ ptl_hdr_t *hdr, int type, ptl_process_id_t tgt, int routing,
unsigned int payload_niov, struct iovec *payload_iov,
size_t payload_offset, size_t payload_len)
{
return (ksocknal_sendmsg(ni, private, cookie,
- hdr, type, nid, pid,
+ hdr, type, tgt, routing,
payload_niov, payload_iov, NULL,
payload_offset, payload_len));
}
ptl_err_t
ksocknal_send_pages (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
- ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
+ ptl_hdr_t *hdr, int type, ptl_process_id_t tgt, int routing,
unsigned int payload_niov, ptl_kiov_t *payload_kiov,
size_t payload_offset, size_t payload_len)
{
return (ksocknal_sendmsg(ni, private, cookie,
- hdr, type, nid, pid,
+ hdr, type, tgt, routing,
payload_niov, NULL, payload_kiov,
payload_offset, payload_len));
}
void
-ksocknal_fwd_packet (void *arg, kpr_fwd_desc_t *fwd)
+ksocknal_fwd_packet (ptl_ni_t *ni, kpr_fwd_desc_t *fwd)
{
ptl_nid_t nid = fwd->kprfd_gateway_nid;
ksock_ftx_t *ftx = (ksock_ftx_t *)&fwd->kprfd_scratch;
+ int routing;
int rc;
CDEBUG (D_NET, "Forwarding [%p] -> "LPX64" ("LPX64"))\n", fwd,
fwd->kprfd_gateway_nid, fwd->kprfd_target_nid);
- /* I'm the gateway; must be the last hop */
- if (nid == ksocknal_data.ksnd_ni->ni_nid)
+ routing = (nid != ksocknal_data.ksnd_ni->ni_nid);
+ if (!routing)
nid = fwd->kprfd_target_nid;
/* setup iov for hdr */
ftx->ftx_tx.tx_nkiov = fwd->kprfd_niov;
ftx->ftx_tx.tx_kiov = fwd->kprfd_kiov;
- rc = ksocknal_launch_packet (&ftx->ftx_tx, nid);
+ rc = ksocknal_launch_packet (&ftx->ftx_tx, nid, routing);
if (rc != 0)
- kpr_fwd_done (&ksocknal_data.ksnd_router, fwd, rc);
+ kpr_fwd_done (ni, fwd, rc);
}
int
}
void
-ksocknal_fmb_callback (void *arg, int error)
+ksocknal_fmb_callback (ptl_ni_t *ni, void *arg, int error)
{
ksock_fmb_t *fmb = (ksock_fmb_t *)arg;
ksock_fmb_pool_t *fmp = fmb->fmb_pool;
ksock_fmb_t *fmb;
LASSERT (conn->ksnc_rx_state == SOCKNAL_RX_GET_FMB);
- LASSERT (kpr_routing(&ksocknal_data.ksnd_router));
if (payload_nob <= SOCKNAL_SMALL_FWD_PAGES * CFS_PAGE_SIZE)
pool = &ksocknal_data.ksnd_small_fmp;
CDEBUG (D_NET, "%p "LPX64"->"LPX64" fwd_start (immediate)\n",
conn, le64_to_cpu(conn->ksnc_hdr.src_nid), dest_nid);
- kpr_fwd_start (&ksocknal_data.ksnd_router, &fmb->fmb_fwd);
+ kpr_fwd_start (ksocknal_data.ksnd_ni, &fmb->fmb_fwd);
ksocknal_new_packet (conn, 0); /* on to next packet */
return (1);
return;
}
- if (!kpr_routing(&ksocknal_data.ksnd_router)) { /* not forwarding */
- CERROR("dropping packet from "LPX64" (%s) for "LPX64
- " (%s): not forwarding\n",
- src_nid, libcfs_nid2str(src_nid),
- dest_nid, libcfs_nid2str(dest_nid));
- /* on to new packet (skip this one's body) */
- ksocknal_new_packet (conn, body_len);
- return;
- }
-
if (body_len > PTL_MTU) { /* too big to forward */
CERROR ("dropping packet from "LPX64" (%s) for "LPX64
"(%s): packet size %d too big\n",
}
/* should have gone direct */
- peer = ksocknal_get_peer (conn->ksnc_hdr.dest_nid);
+ peer = ksocknal_find_peer (conn->ksnc_hdr.dest_nid);
if (peer != NULL) {
CERROR ("dropping packet from "LPX64" (%s) for "LPX64
"(%s): target is a peer\n",
/* forward the packet. NB ksocknal_init_fmb() put fmb into
* conn->ksnc_cookie */
fmb = (ksock_fmb_t *)conn->ksnc_cookie;
- kpr_fwd_start (&ksocknal_data.ksnd_router, &fmb->fmb_fwd);
+ kpr_fwd_start (ksocknal_data.ksnd_ni, &fmb->fmb_fwd);
/* no slop in forwarded packets */
LASSERT (conn->ksnc_rx_nob_left == 0);
.nal_type = VIBNAL,
.nal_startup = kibnal_startup,
.nal_shutdown = kibnal_shutdown,
+ .nal_ctl = kibnal_ctl,
.nal_send = kibnal_send,
.nal_send_pages = kibnal_send_pages,
.nal_recv = kibnal_recv,
}
void
-kibnal_del_peer_locked (kib_peer_t *peer, int single_share)
+kibnal_del_peer_locked (kib_peer_t *peer)
{
struct list_head *ctmp;
struct list_head *cnxt;
kib_conn_t *conn;
- if (!single_share)
- peer->ibp_persistence = 0;
- else if (peer->ibp_persistence > 0)
- peer->ibp_persistence--;
-
- if (peer->ibp_persistence != 0)
- return;
+ peer->ibp_persistence = 0;
if (list_empty(&peer->ibp_conns)) {
kibnal_unlink_peer_locked(peer);
}
int
-kibnal_del_peer (ptl_nid_t nid, int single_share)
+kibnal_del_peer (ptl_nid_t nid)
{
struct list_head *ptmp;
struct list_head *pnxt;
if (!(nid == PTL_NID_ANY || peer->ibp_nid == nid))
continue;
- kibnal_del_peer_locked (peer, single_share);
+ kibnal_del_peer_locked (peer);
rc = 0; /* matched something */
-
- if (single_share)
- goto out;
}
}
out:
}
int
-kibnal_cmd(struct portals_cfg *pcfg, void * private)
+kibnal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg)
{
- int rc = -EINVAL;
+ struct portal_ioctl_data *data = arg;
+ int rc = -EINVAL;
- LASSERT (pcfg != NULL);
+ LASSERT (ni == kibnal_data.kib_ni);
- switch(pcfg->pcfg_command) {
- case NAL_CMD_GET_PEER: {
+ switch(data->ioc_command) {
+ case IOC_PORTAL_GET_PEER: {
ptl_nid_t nid = 0;
__u32 ip = 0;
int share_count = 0;
- rc = kibnal_get_peer_info(pcfg->pcfg_count,
+ rc = kibnal_get_peer_info(data->ioc_count,
&nid, &ip, &share_count);
- pcfg->pcfg_nid = nid;
- pcfg->pcfg_size = 0;
- pcfg->pcfg_id = ip;
- pcfg->pcfg_misc = IBNAL_SERVICE_NUMBER; /* port */
- pcfg->pcfg_count = 0;
- pcfg->pcfg_wait = share_count;
+ data->ioc_nid = nid;
+ data->ioc_count = share_count;
+ data->ioc_u32[0] = ip;
+ data->ioc_u32[1] = IBNAL_SERVICE_NUMBER; /* port */
break;
}
- case NAL_CMD_ADD_PEER: {
- rc = kibnal_add_persistent_peer (pcfg->pcfg_nid,
- pcfg->pcfg_id); /* IP */
+ case IOC_PORTAL_ADD_PEER: {
+ rc = kibnal_add_persistent_peer (data->ioc_nid,
+ data->ioc_u32[0]); /* IP */
break;
}
- case NAL_CMD_DEL_PEER: {
- rc = kibnal_del_peer (pcfg->pcfg_nid,
- /* flags == single_share */
- pcfg->pcfg_flags != 0);
+ case IOC_PORTAL_DEL_PEER: {
+ rc = kibnal_del_peer (data->ioc_nid);
break;
}
- case NAL_CMD_GET_CONN: {
- kib_conn_t *conn = kibnal_get_conn_by_idx (pcfg->pcfg_count);
+ case IOC_PORTAL_GET_CONN: {
+ kib_conn_t *conn = kibnal_get_conn_by_idx (data->ioc_count);
if (conn == NULL)
rc = -ENOENT;
else {
rc = 0;
- pcfg->pcfg_nid = conn->ibc_peer->ibp_nid;
- pcfg->pcfg_id = 0;
- pcfg->pcfg_misc = 0;
- pcfg->pcfg_flags = 0;
+ data->ioc_nid = conn->ibc_peer->ibp_nid;
kibnal_conn_decref(conn);
}
break;
}
- case NAL_CMD_CLOSE_CONNECTION: {
- rc = kibnal_close_matching_conns (pcfg->pcfg_nid);
+ case IOC_PORTAL_CLOSE_CONNECTION: {
+ rc = kibnal_close_matching_conns (data->ioc_nid);
break;
}
- case NAL_CMD_REGISTER_MYNID: {
- if (pcfg->pcfg_nid == PTL_NID_ANY)
+ case IOC_PORTAL_REGISTER_MYNID: {
+ if (data->ioc_nid == PTL_NID_ANY)
rc = -EINVAL;
else
- rc = kibnal_set_mynid (pcfg->pcfg_nid);
+ rc = kibnal_set_mynid (data->ioc_nid);
break;
}
}
switch (kibnal_data.kib_init) {
case IBNAL_INIT_ALL:
- /* stop calls to nal_cmd */
- libcfs_nal_cmd_unregister(VIBNAL);
- /* No new peers */
-
/* resetting my NID removes my listener and nukes all current
* peers and their connections */
kibnal_set_mynid (PTL_NID_ANY);
atomic_read(&portal_kmemory));
kibnal_data.kib_init = IBNAL_INIT_NOTHING;
+ PORTAL_MODULE_UNUSE;
}
ptl_err_t
return PTL_FAIL;
}
+ PORTAL_MODULE_USE;
memset (&kibnal_data, 0, sizeof (kibnal_data)); /* zero pointers, flags etc */
kibnal_data.kib_ni = ni;
}
}
- /*****************************************************/
-
- rc = libcfs_nal_cmd_register(VIBNAL, &kibnal_cmd, NULL);
- if (rc != 0) {
- CERROR ("Can't initialise command interface (rc = %d)\n", rc);
- goto failed;
- }
-
/* flag everything initialised */
kibnal_data.kib_init = IBNAL_INIT_ALL;
/*****************************************************/
ptl_err_t kibnal_startup (ptl_ni_t *ni, char **interfaces);
void kibnal_shutdown (ptl_ni_t *ni);
+int kibnal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg);
ptl_err_t kibnal_send (ptl_ni_t *ni, void *private,
ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
- int type, ptl_nid_t nid, ptl_pid_t pid,
- unsigned int payload_niov,
- struct iovec *payload_iov,
+ int type, ptl_process_id_t tgt, int routing,
+ unsigned int payload_niov, struct iovec *payload_iov,
size_t payload_offset, size_t payload_nob);
ptl_err_t kibnal_send_pages (ptl_ni_t *ni, void *private,
ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
- int type, ptl_nid_t nid, ptl_pid_t pid,
- unsigned int payload_niov,
- ptl_kiov_t *payload_kiov,
+ int type, ptl_process_id_t tgt, int routing,
+ unsigned int payload_niov, ptl_kiov_t *payload_kiov,
size_t payload_offset, size_t payload_nob);
ptl_err_t kibnal_recv(ptl_ni_t *ni, void *private,
ptl_msg_t *ptlmsg, unsigned int niov,
extern int kibnal_unpack_msg(kib_msg_t *msg, int nob);
extern kib_peer_t *kibnal_create_peer(ptl_nid_t nid);
extern void kibnal_destroy_peer(kib_peer_t *peer);
-extern int kibnal_del_peer(ptl_nid_t nid, int single_share);
+extern int kibnal_del_peer(ptl_nid_t nid);
extern kib_peer_t *kibnal_find_peer_locked(ptl_nid_t nid);
extern void kibnal_unlink_peer_locked(kib_peer_t *peer);
extern int kibnal_close_stale_conns_locked(kib_peer_t *peer,
}
ptl_err_t
-kibnal_sendmsg(ptl_ni_t *ni,
- void *private,
- ptl_msg_t *ptlmsg,
- ptl_hdr_t *hdr,
- int type,
- ptl_nid_t nid,
- ptl_pid_t pid,
- unsigned int payload_niov,
- struct iovec *payload_iov,
- ptl_kiov_t *payload_kiov,
- int payload_offset,
- int payload_nob)
+kibnal_sendmsg(ptl_ni_t *ni,
+ void *private,
+ ptl_msg_t *ptlmsg,
+ ptl_hdr_t *hdr,
+ int type,
+ ptl_process_id_t target,
+ int routing,
+ unsigned int payload_niov,
+ struct iovec *payload_iov,
+ ptl_kiov_t *payload_kiov,
+ int payload_offset,
+ int payload_nob)
{
kib_msg_t *ibmsg;
kib_tx_t *tx;
/* NB 'private' is different depending on what we're sending.... */
- CDEBUG(D_NET, "sending %d bytes in %d frags to nid:"LPX64
- " pid %d\n", payload_nob, payload_niov, nid , pid);
+ CDEBUG(D_NET, "sending %d bytes in %d frags to %s\n",
+ payload_nob, payload_niov, libcfs_id2str(target));
LASSERT (payload_nob == 0 || payload_niov > 0);
LASSERT (payload_niov <= PTL_MD_MAX_IOV);
/* payload is either all vaddrs or all pages */
LASSERT (!(payload_kiov != NULL && payload_iov != NULL));
+ if (routing) {
+ CERROR ("Can't route\n");
+ return PTL_FAIL;
+ }
+
switch (type) {
default:
LBUG();
if (nob > IBNAL_MSG_SIZE) {
CERROR("REPLY for "LPX64" too big (RDMA not requested):"
"%d (max for message is %d)\n",
- nid, payload_nob, IBNAL_MSG_SIZE);
+ target.nid, payload_nob, IBNAL_MSG_SIZE);
CERROR("Can't REPLY IMMEDIATE %d to "LPX64"\n",
- nob, nid);
+ nob, target.nid);
return PTL_FAIL;
}
break;
/* Incoming message consistent with RDMA? */
if (rx->rx_msg->ibm_type != IBNAL_MSG_GET_REQ) {
CERROR("REPLY to "LPX64" bad msg type %x!!!\n",
- nid, rx->rx_msg->ibm_type);
+ target.nid, rx->rx_msg->ibm_type);
return PTL_FAIL;
}
tx = kibnal_get_idle_tx(0);
if (tx == NULL) {
- CERROR("Can't get tx for REPLY to "LPX64"\n", nid);
+ CERROR("Can't get tx for REPLY to "LPX64"\n", target.nid);
return PTL_FAIL;
}
payload_niov, payload_kiov,
payload_offset, payload_nob);
if (rc != 0) {
- CERROR("Can't setup GET src for "LPX64": %d\n", nid, rc);
+ CERROR("Can't setup GET src for "LPX64": %d\n", target.nid, rc);
kibnal_tx_done(tx);
return PTL_FAIL;
}
rx->rx_msg->ibm_u.get.ibgm_cookie);
if (rc < 0) {
CERROR("Can't setup rdma for GET from "LPX64": %d\n",
- nid, rc);
+ target.nid, rc);
} else if (rc == 0) {
/* No RDMA: local completion may happen now! */
ptl_finalize (kibnal_data.kib_ni, NULL, ptlmsg, PTL_OK);
ptlmsg->msg_md->md_iov.kiov,
0, ptlmsg->msg_md->md_length);
if (rc != 0) {
- CERROR("Can't setup GET sink for "LPX64": %d\n", nid, rc);
+ CERROR("Can't setup GET sink for "LPX64": %d\n", target.nid, rc);
kibnal_tx_done(tx);
return PTL_FAIL;
}
nob = offsetof(kib_get_msg_t, ibgm_rd.rd_frags[n]);
kibnal_init_tx_msg(tx, IBNAL_MSG_GET_REQ, nob);
- tx->tx_ptlmsg[1] = ptl_create_reply_msg(kibnal_data.kib_ni, nid, ptlmsg);
+ tx->tx_ptlmsg[1] = ptl_create_reply_msg(kibnal_data.kib_ni, target.nid, ptlmsg);
if (tx->tx_ptlmsg[1] == NULL) {
- CERROR("Can't create reply for GET -> "LPX64"\n", nid);
+ CERROR("Can't create reply for GET -> "LPX64"\n", target.nid);
kibnal_tx_done(tx);
return PTL_FAIL;
}
tx->tx_ptlmsg[0] = ptlmsg; /* finalise ptlmsg[0,1] on completion */
tx->tx_waiting = 1; /* waiting for GET_DONE */
- kibnal_launch_tx(tx, nid);
+ kibnal_launch_tx(tx, target.nid);
return PTL_OK;
case PTL_MSG_ACK:
payload_niov, payload_kiov,
payload_offset, payload_nob);
if (rc != 0) {
- CERROR("Can't setup PUT src for "LPX64": %d\n", nid, rc);
+ CERROR("Can't setup PUT src for "LPX64": %d\n", target.nid, rc);
kibnal_tx_done(tx);
return PTL_FAIL;
}
tx->tx_ptlmsg[0] = ptlmsg; /* finalise ptlmsg on completion */
tx->tx_waiting = 1; /* waiting for PUT_{ACK,NAK} */
- kibnal_launch_tx(tx, nid);
+ kibnal_launch_tx(tx, target.nid);
return PTL_OK;
}
tx = kibnal_get_idle_tx(!(type == PTL_MSG_ACK ||
type == PTL_MSG_REPLY));
if (tx == NULL) {
- CERROR ("Can't send %d to "LPX64": tx descs exhausted\n", type, nid);
+ CERROR ("Can't send %d to "LPX64": tx descs exhausted\n", type, target.nid);
return PTL_NO_SPACE;
}
kibnal_init_tx_msg (tx, IBNAL_MSG_IMMEDIATE, nob);
tx->tx_ptlmsg[0] = ptlmsg; /* finalise ptlmsg on completion */
- kibnal_launch_tx(tx, nid);
+ kibnal_launch_tx(tx, target.nid);
return PTL_OK;
}
ptl_err_t
kibnal_send (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
- ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
+ ptl_hdr_t *hdr, int type, ptl_process_id_t tgt, int routing,
unsigned int payload_niov, struct iovec *payload_iov,
size_t payload_offset, size_t payload_len)
{
- CDEBUG(D_NET, " pid = %d, nid="LPU64"\n",
- pid, nid);
return (kibnal_sendmsg(ni, private, cookie,
- hdr, type, nid, pid,
+ hdr, type, tgt, routing,
payload_niov, payload_iov, NULL,
payload_offset, payload_len));
}
ptl_err_t
kibnal_send_pages (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
- ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
+ ptl_hdr_t *hdr, int type, ptl_process_id_t tgt, int routing,
unsigned int payload_niov, ptl_kiov_t *payload_kiov,
size_t payload_offset, size_t payload_len)
{
return (kibnal_sendmsg(ni, private, cookie,
- hdr, type, nid, pid,
+ hdr, type, tgt, routing,
payload_niov, NULL, payload_kiov,
payload_offset, payload_len));
}
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
+
#include <portals/api-support.h>
+
+/* This ghastly hack to allows me to include lib-types.h It doesn't affect any
+ * assertions generated here (but fails-safe if it ever does) */
+typedef struct {
+ int counter;
+} atomic_t;
+
#include <portals/lib-types.h>
#include "vibnal_wire.h"
RETURN(0);
}
-
+
extern struct cfs_psdev_ops libcfs_psdev_ops;
static int
#include <portals/p30.h>
#include <libcfs/kp30.h>
-struct nal_cmd_handler {
- int nch_number;
- nal_cmd_handler_fn *nch_handler;
- void *nch_private;
-};
-
-static struct nal_cmd_handler nal_cmd[16];
-struct semaphore nal_cmd_mutex;
-
void
kportal_memhog_free (struct portals_device_userstate *pdu)
{
RETURN(0);
}
-static inline void freedata(void *data, int len)
-{
- PORTAL_FREE(data, len);
-}
-
-struct nal_cmd_handler *
-libcfs_find_nal_cmd_handler(int nal)
-{
- int i;
-
- for (i = 0; i < sizeof(nal_cmd)/sizeof(nal_cmd[0]); i++)
- if (nal_cmd[i].nch_handler != NULL &&
- nal_cmd[i].nch_number == nal)
- return (&nal_cmd[i]);
-
- return (NULL);
-}
-
-int
-libcfs_nal_cmd_register(int nal, nal_cmd_handler_fn *handler, void *private)
-{
- struct nal_cmd_handler *cmd;
- int i;
- int rc;
-
- CDEBUG(D_IOCTL, "Register NAL %x, handler: %p\n", nal, handler);
-
- mutex_down(&nal_cmd_mutex);
-
- if (libcfs_find_nal_cmd_handler(nal) != NULL) {
- mutex_up (&nal_cmd_mutex);
- return (-EBUSY);
- }
-
- cmd = NULL;
- for (i = 0; i < sizeof(nal_cmd)/sizeof(nal_cmd[0]); i++)
- if (nal_cmd[i].nch_handler == NULL) {
- cmd = &nal_cmd[i];
- break;
- }
-
- if (cmd == NULL) {
- rc = -EBUSY;
- } else {
- rc = 0;
- cmd->nch_number = nal;
- cmd->nch_handler = handler;
- cmd->nch_private = private;
- }
-
- mutex_up(&nal_cmd_mutex);
-
- return rc;
-}
-EXPORT_SYMBOL(libcfs_nal_cmd_register);
-
-void
-libcfs_nal_cmd_unregister(int nal)
-{
- struct nal_cmd_handler *cmd;
-
- CDEBUG(D_IOCTL, "Unregister NAL %x\n", nal);
-
- mutex_down(&nal_cmd_mutex);
- cmd = libcfs_find_nal_cmd_handler(nal);
- LASSERT (cmd != NULL);
- cmd->nch_handler = NULL;
- cmd->nch_private = NULL;
- mutex_up(&nal_cmd_mutex);
-}
-EXPORT_SYMBOL(libcfs_nal_cmd_unregister);
-
-int
-libcfs_nal_cmd(struct portals_cfg *pcfg)
-{
-#if CRAY_PORTALS
- /* pretend success */
- RETURN(0);
-#else
- struct nal_cmd_handler *cmd;
- __u32 nal = pcfg->pcfg_nal;
- int rc = -EINVAL;
- ENTRY;
-
- if (pcfg->pcfg_version != PORTALS_CFG_VERSION) {
- RETURN(-EINVAL);
- }
-
- mutex_down(&nal_cmd_mutex);
- cmd = libcfs_find_nal_cmd_handler(nal);
- if (cmd != NULL) {
- CDEBUG(D_IOCTL, "calling handler nal: %x, cmd: %d\n", nal,
- pcfg->pcfg_command);
- rc = cmd->nch_handler(pcfg, cmd->nch_private);
- } else {
- CERROR("invalid nal: %x, cmd: %d\n", nal, pcfg->pcfg_command);
- }
- mutex_up(&nal_cmd_mutex);
-
- RETURN(rc);
-#endif
-}
-EXPORT_SYMBOL(libcfs_nal_cmd);
-
static struct rw_semaphore ioctl_list_sem;
static struct list_head ioctl_list;
int libcfs_register_ioctl(struct libcfs_ioctl_handler *hand)
{
int rc = 0;
- down_read(&ioctl_list_sem);
+
+ down_write(&ioctl_list_sem);
if (!list_empty(&hand->item))
rc = -EBUSY;
- up_read(&ioctl_list_sem);
-
- if (rc == 0) {
- down_write(&ioctl_list_sem);
+ else
list_add_tail(&hand->item, &ioctl_list);
- up_write(&ioctl_list_sem);
- }
- RETURN(0);
+ up_write(&ioctl_list_sem);
+
+ return rc;
}
EXPORT_SYMBOL(libcfs_register_ioctl);
int libcfs_deregister_ioctl(struct libcfs_ioctl_handler *hand)
{
int rc = 0;
- down_read(&ioctl_list_sem);
+
+ down_write(&ioctl_list_sem);
if (list_empty(&hand->item))
rc = -ENOENT;
- up_read(&ioctl_list_sem);
-
- if (rc == 0) {
- down_write(&ioctl_list_sem);
+ else
list_del_init(&hand->item);
- up_write(&ioctl_list_sem);
- }
- RETURN(0);
+ up_write(&ioctl_list_sem);
+
+ return rc;
}
EXPORT_SYMBOL(libcfs_deregister_ioctl);
RETURN(0);
#if LWT_SUPPORT
case IOC_PORTAL_LWT_CONTROL:
- err = lwt_control (data->ioc_flags, data->ioc_misc);
+ err = lwt_control ((data->ioc_flags & 1) != 0,
+ (data->ioc_flags & 2) != 0);
break;
case IOC_PORTAL_LWT_SNAPSHOT: {
err = lwt_snapshot (&now, &ncpu, &total_size,
data->ioc_pbuf1, data->ioc_plen1);
- data->ioc_nid = now;
- data->ioc_count = ncpu;
- data->ioc_misc = total_size;
+ data->ioc_u64[0] = now;
+ data->ioc_u32[0] = ncpu;
+ data->ioc_u32[1] = total_size;
/* Hedge against broken user/kernel typedefs (e.g. cycles_t) */
- data->ioc_nid2 = sizeof(lwt_event_t);
- data->ioc_nid3 = offsetof(lwt_event_t, lwte_where);
+ data->ioc_u32[2] = sizeof(lwt_event_t);
+ data->ioc_u32[3] = offsetof(lwt_event_t, lwte_where);
if (err == 0 &&
copy_to_user((char *)arg, data, sizeof (*data)))
err = -EFAULT;
break;
#endif
- case IOC_PORTAL_NAL_CMD: {
- struct portals_cfg pcfg;
-
- if (data->ioc_plen1 != sizeof(pcfg)) {
- CERROR("Bad ioc_plen1 %d (wanted "LPSZ")\n",
- data->ioc_plen1, sizeof(pcfg));
- err = -EINVAL;
- break;
- }
-
- if (copy_from_user(&pcfg, (void *)data->ioc_pbuf1,
- sizeof(pcfg))) {
- err = -EFAULT;
- break;
- }
-
- CDEBUG (D_IOCTL, "nal command nal %x cmd %d\n", pcfg.pcfg_nal,
- pcfg.pcfg_command);
- if (pcfg.pcfg_version != PORTALS_CFG_VERSION) {
- /* set this so userspace can tell when they
- * have an incompatible version and print a
- * decent message to the user
- */
- pcfg.pcfg_version = PORTALS_CFG_VERSION;
- if (copy_to_user((char *)data->ioc_pbuf1, &pcfg,
- sizeof (pcfg)))
- err = -EFAULT;
- else
- err = -EINVAL;
- } else {
- err = libcfs_nal_cmd(&pcfg);
-
- if (err == 0 &&
- copy_to_user((char *)data->ioc_pbuf1, &pcfg,
- sizeof (pcfg)))
- err = -EFAULT;
- }
- break;
- }
-
case IOC_PORTAL_MEMHOG:
if (pfile->private_data == NULL) {
err = -EINVAL;
}
break;
+ case IOC_PORTAL_PING: {
+ extern void (kping_client)(struct portal_ioctl_data *);
+ void (*ping)(struct portal_ioctl_data *);
+
+ CDEBUG(D_IOCTL, "doing %d pings to nid "LPX64" (%s)\n",
+ data->ioc_count, data->ioc_nid,
+ libcfs_nid2str(data->ioc_nid));
+ ping = PORTAL_SYMBOL_GET(kping_client);
+ if (!ping)
+ CERROR("PORTAL_SYMBOL_GET failed\n");
+ else {
+ ping(data);
+ PORTAL_SYMBOL_PUT(kping_client);
+ }
+ RETURN(0);
+ }
+
default: {
struct libcfs_ioctl_handler *hand;
err = -EINVAL;
down_read(&ioctl_list_sem);
list_for_each_entry(hand, &ioctl_list, item) {
- err = hand->handle_ioctl(data, cmd, (unsigned long)arg);
- if (err != -EINVAL)
+ err = hand->handle_ioctl(cmd, data);
+ if (err != -EINVAL) {
+ if (copy_to_user((char *)arg,
+ data, sizeof (*data)))
+ err = -EFAULT;
break;
+ }
}
up_read(&ioctl_list_sem);
- } break;
+ break;
+ }
}
RETURN(err);
libcfs_init_nidstrings();
init_rwsem(&tracefile_sem);
init_mutex(&trace_thread_sem);
- init_mutex(&nal_cmd_mutex);
init_rwsem(&ioctl_list_sem);
CFS_INIT_LIST_HEAD(&ioctl_list);
# define EXPORT_SYMTAB
#endif
-# define DEBUG_SUBSYSTEM S_PORTALS
+#define DEBUG_SUBSYSTEM S_PORTALS
+#include <portals/p30.h>
#include <libcfs/kp30.h>
-#include <libcfs/libcfs.h>
+#ifndef __KERNEL__
+#include <netdb.h>
+#endif
+
+/* CAVEAT VENDITOR! Keep the canonical string representation of nets/nids
+ * consistent in all conversion functions. Some code fragments are copied
+ * around for the sake of clarity...
+ */
/* CAVEAT EMPTOR! Racey temporary buffer allocation!
* Choose the number of nidstrings to support the MAXIMUM expected number of
* between getting its string and using it.
*/
-static char libcfs_nidstrings[128][PTL_NALFMT_SIZE];
-static int libcfs_nidstring_idx;
-static spinlock_t libcfs_nidstring_lock;
+static char libcfs_nidstrings[128][PTL_NALFMT_SIZE];
+static int libcfs_nidstring_idx = 0;
-void
-libcfs_init_nidstrings (void)
+#ifdef __KERNEL__
+static spinlock_t libcfs_nidstring_lock;
+
+void libcfs_init_nidstrings (void)
{
spin_lock_init(&libcfs_nidstring_lock);
}
+# define NIDSTR_LOCK(f) spin_lock_irqsave(&libcfs_nidstring_lock, f)
+# define NIDSTR_UNLOCK(f) spin_unlock_irqrestore(&libcfs_nidstring_lock, f)
+#else
+# define NIDSTR_LOCK(f) (f) /* avoid unused var warnings */
+# define NIDSTR_UNLOCK(f) (f)
+#endif
+
static char *
libcfs_next_nidstring (void)
{
- unsigned long flags;
char *str;
-
- spin_lock_irqsave(&libcfs_nidstring_lock, flags);
-
+ unsigned long flags;
+
+ NIDSTR_LOCK(flags);
+
str = libcfs_nidstrings[libcfs_nidstring_idx++];
if (libcfs_nidstring_idx ==
sizeof(libcfs_nidstrings)/sizeof(libcfs_nidstrings[0]))
libcfs_nidstring_idx = 0;
- spin_unlock_irqrestore(&libcfs_nidstring_lock, flags);
-
+ NIDSTR_UNLOCK(flags);
return str;
}
static void libcfs_num_addr2str(__u32 addr, char *str);
static int libcfs_num_str2addr(char *str, int nob, __u32 *addr);
-struct nettype {
- int type;
- char *name;
- void (*addr2str)(__u32 addr, char *str);
- int (*str2addr)(char *str, int nob, __u32 *addr);
+struct nalstrfns {
+ int nf_nal;
+ char *nf_name;
+ void (*nf_addr2str)(__u32 addr, char *str);
+ int (*nf_str2addr)(char *str, int nob, __u32 *addr);
};
-static struct nettype libcfs_nettypes[] = {
+static struct nalstrfns libcfs_nalstrfns[] = {
{LONAL, "lo", libcfs_lo_addr2str, libcfs_lo_str2addr},
{SOCKNAL, "tcp", libcfs_ip_addr2str, libcfs_ip_str2addr},
{OPENIBNAL, "openib", libcfs_ip_addr2str, libcfs_ip_str2addr},
{GMNAL, "gm", libcfs_num_addr2str, libcfs_num_str2addr},
};
-const int libcfs_nnettypes = sizeof(libcfs_nettypes)/sizeof(libcfs_nettypes[0]);
+const int libcfs_nnalstrfns = sizeof(libcfs_nalstrfns)/sizeof(libcfs_nalstrfns[0]);
void
libcfs_lo_addr2str(__u32 addr, char *str)
void
libcfs_ip_addr2str(__u32 addr, char *str)
{
- snprintf(str, PTL_NALFMT_SIZE, "%u.%u.%u.%u", HIPQUAD(addr));
+#if !defined(__KERNEL__) && defined HAVE_GETHOSTBYNAME
+ __u32 netip = htonl(addr);
+ struct hostent *he = gethostbyaddr(&netip, sizeof(netip), AF_INET);
+
+ if (he != NULL &&
+ strlen(he->h_name) < PTL_NALFMT_SIZE) {
+ strcpy(str, he->h_name);
+ return;
+ }
+#endif
+ snprintf(str, PTL_NALFMT_SIZE, "%u.%u.%u.%u",
+ (addr >> 24) & 0xff, (addr >> 16) & 0xff,
+ (addr >> 8) & 0xff, addr & 0xff);
}
int
int c;
int d;
int n;
-
- if (sscanf(str, "%u.%u.%u.%u%n", &a, &b, &c, &d, &n) < 4 ||
- n != nob)
- return 0;
- if ((a & ~0xff) != 0 || (b & ~0xff) != 0 ||
- (c & ~0xff) != 0 || (d & ~0xff) != 0)
- return 0;
-
- *addr = ((a<<24)|(b<<16)|(c<<8)|d);
- return 1;
+ /* numeric IP? */
+ if (sscanf(str, "%u.%u.%u.%u%n", &a, &b, &c, &d, &n) >= 4 &&
+ n == nob &&
+ (a & ~0xff) == 0 && (b & ~0xff) == 0 &&
+ (c & ~0xff) == 0 && (d & ~0xff) == 0) {
+ *addr = ((a<<24)|(b<<16)|(c<<8)|d);
+ return 1;
+ }
+
+#if !defined(__KERNEL__) && defined HAVE_GETHOSTBYNAME
+ /* known hostname? */
+ if (('a' <= str[0] && str[0] <= 'z') ||
+ ('A' <= str[0] && str[0] <= 'Z')) {
+ struct hostent *he = gethostbyname(str);
+
+ if (he != NULL) {
+ __u32 ip = *(__u32 *)he->h_addr;
+
+ *addr = ntohl(ip);
+ return 1;
+ }
+ }
+#endif
+ return 0;
}
void
return 1;
}
-struct nettype *
-libcfs_get_nettype(int type)
+struct nalstrfns *
+libcfs_nal2nalstrfns(int nal)
+{
+ int i;
+
+ for (i = 0; i < libcfs_nnalstrfns; i++)
+ if (nal == libcfs_nalstrfns[i].nf_nal)
+ return &libcfs_nalstrfns[i];
+
+ return NULL;
+}
+
+struct nalstrfns *
+libcfs_name2nalstrfns(char *name)
{
int i;
- for (i = 0; i < libcfs_nnettypes; i++)
- if (type == libcfs_nettypes[i].type)
- return &libcfs_nettypes[i];
+ for (i = 0; i < libcfs_nnalstrfns; i++)
+ if (!strcmp(libcfs_nalstrfns[i].nf_name, name))
+ return &libcfs_nalstrfns[i];
return NULL;
}
int
-libcfs_isknown_nettype(int type)
+libcfs_isknown_nal(int nal)
{
- return libcfs_get_nettype(type) != NULL;
+ return libcfs_nal2nalstrfns(nal) != NULL;
}
char *
-libcfs_nettype2str(int type)
+libcfs_nal2str(int nal)
{
char *str;
- struct nettype *nt = libcfs_get_nettype(type);
+ struct nalstrfns *nf = libcfs_nal2nalstrfns(nal);
- if (nt != NULL)
- return nt->name;
+ if (nf != NULL)
+ return nf->nf_name;
str = libcfs_next_nidstring();
- snprintf(str, PTL_NALFMT_SIZE, "?%u?", type);
+ snprintf(str, PTL_NALFMT_SIZE, "?%u?", nal);
+ return str;
+}
+
+int
+libcfs_str2nal(char *str)
+{
+ struct nalstrfns *nf = libcfs_name2nalstrfns(str);
+
+ if (nf != NULL)
+ return nf->nf_nal;
+
+ return -1;
+}
+
+char *
+libcfs_net2str(__u32 net)
+{
+ int nal = PTL_NETNAL(net);
+ int num = PTL_NETNUM(net);
+ struct nalstrfns *nf = libcfs_nal2nalstrfns(nal);
+ char *str = libcfs_next_nidstring();
+
+ if (nf == NULL)
+ snprintf(str, PTL_NALFMT_SIZE, "t<%u>%u", nal, num);
+ else if (num == 0)
+ snprintf(str, PTL_NALFMT_SIZE, "%s", nf->nf_name);
+ else
+ snprintf(str, PTL_NALFMT_SIZE, "%s%u", nf->nf_name, num);
+
return str;
}
char *
libcfs_nid2str(ptl_nid_t nid)
{
- char *str = libcfs_next_nidstring();
- __u32 lo = (__u32)nid;
- __u32 hi = (__u32)(nid>>32);
- int nnum = hi & 0xffff;
- int ntype = (hi >> 16) & 0xffff;
- struct nettype *nettype = libcfs_get_nettype(ntype);
+ __u32 addr = PTL_NIDADDR(nid);
+ __u32 net = PTL_NIDNET(nid);
+ int nal = PTL_NETNAL(net);
+ int nnum = PTL_NETNUM(net);
+ struct nalstrfns *nf;
+ char *str;
int nob;
- if (nid == PTL_NID_ANY) {
- snprintf(str, PTL_NALFMT_SIZE, "%s", "PTL_NID_ANY");
- } else if (nettype == NULL) {
- snprintf(str, PTL_NALFMT_SIZE, "%x@%u.%u", lo, nnum, ntype);
- } else {
- nettype->addr2str(lo, str);
- nob = strlen(str);
- if (nnum == 0)
- snprintf(str + nob, PTL_NALFMT_SIZE - nob,
- "@%s", nettype->name);
- else
- snprintf(str + nob, PTL_NALFMT_SIZE - nob,
- "@%s%u", nettype->name, nnum);
+ if (nid == PTL_NID_ANY)
+ return "PTL_NID_ANY";
+
+ nf = libcfs_nal2nalstrfns(PTL_NETNAL(net));
+ str = libcfs_next_nidstring();
+
+ if (nf == NULL)
+ snprintf(str, PTL_NALFMT_SIZE, "%x@t<%u>%u", addr, nal, nnum);
+ else {
+ nf->nf_addr2str(addr, str);
+ nob = strlen(str);
+ if (nnum == 0)
+ snprintf(str + nob, PTL_NALFMT_SIZE - nob, "@%s",
+ nf->nf_name);
+ else
+ snprintf(str + nob, PTL_NALFMT_SIZE - nob, "@%s%u",
+ nf->nf_name, nnum);
}
return str;
}
-ptl_nid_t
-libcfs_str2nid(char *str)
+static struct nalstrfns *
+libcfs_str2net_internal(char *str, __u32 *net)
{
- char *sep = strchr(str, '@');
- struct nettype *nettype;
+ struct nalstrfns *nf;
int nob;
- int net;
- __u32 addr;
+ int netnum;
int i;
- if (sep == NULL) {
- sep = str + strlen(str);
- net = 0;
- nettype = libcfs_get_nettype(SOCKNAL);
- LASSERT (nettype != NULL);
- } else {
- for (i = 0; i < libcfs_nnettypes; i++) {
- nettype = &libcfs_nettypes[i];
+ for (i = 0; i < libcfs_nnalstrfns; i++) {
+ nf = &libcfs_nalstrfns[i];
- if (!strncmp(sep + 1, nettype->name,
- strlen(nettype->name)))
- break;
- }
- if (i == libcfs_nnettypes)
- return PTL_NID_ANY;
+ if (!strncmp(str, nf->nf_name, strlen(nf->nf_name)))
+ break;
+ }
+ if (i == libcfs_nnalstrfns)
+ return NULL;
+
+ nob = strlen(nf->nf_name);
+
+ if (strlen(str) == nob)
+ netnum = 0;
+ else if (nf->nf_nal == LONAL || /* net number not allowed */
+ sscanf(str + nob, "%u%n", &netnum, &i) < 1 ||
+ i != strlen(str + nob) ||
+ (netnum & ~0xffff) != 0)
+ return NULL;
- nob = strlen(nettype->name);
+ *net = PTL_MKNET(nf->nf_nal, netnum);
+ return nf;
+}
+
+__u32
+libcfs_str2net(char *str)
+{
+ __u32 net;
+
+ if (libcfs_str2net_internal(str, &net) != NULL)
+ return net;
+
+ return PTL_NIDNET(PTL_NID_ANY);
+}
+
+ptl_nid_t
+libcfs_str2nid(char *str)
+{
+ char *sep = strchr(str, '@');
+ struct nalstrfns *nf;
+ int nob;
+ __u32 net;
+ __u32 addr;
- if (strlen(sep + 1) == nob)
- net = 0;
- else if (nettype->type == LONAL || /* net number not allowed */
- sscanf(sep + 1 + nob, "%u%n", &net, &i) < 1 ||
- i != strlen(sep + 1 + nob) ||
- (net & ~0xffff) != 0)
+ if (sep != NULL) {
+ nf = libcfs_str2net_internal(sep + 1, &net);
+ if (nf == NULL)
return PTL_NID_ANY;
+ } else {
+ sep = str + strlen(str);
+ net = PTL_MKNET(SOCKNAL, 0);
+ nf = libcfs_nal2nalstrfns(SOCKNAL);
+ LASSERT (nf != NULL);
}
-
- if (!nettype->str2addr(str, sep - str, &addr))
+
+ if (!nf->nf_str2addr(str, sep - str, &addr))
return PTL_NID_ANY;
- return (((__u64)((nettype->type<<16)|net))<<32)|addr;
+ return PTL_MKNID(net, addr);
}
#else /* CRAY_PORTALS */
int
-libcfs_isknown_nettype(int type)
+libcfs_isknown_nal(int nal)
{
return 1;
}
char *
-libcfs_nettype2str(int type)
+libcfs_nal2str(int nal)
+{
+ return "cray";
+}
+
+int
+libcfs_str2nal(char *str)
+{
+ return 0;
+}
+
+char *
+libcfs_net2str(__u32 net)
{
return "cray";
}
snprintf(str, PTL_NALFMT_SIZE, "%llx", (unsigned long long)nid);
}
+__u32
+libcfs_str2net(char *str)
+{
+ return 0;
+}
+
ptl_nid_t
libcfs_str2nid(char *str)
{
return str;
}
-EXPORT_SYMBOL(libcfs_isknown_nettype);
-EXPORT_SYMBOL(libcfs_nettype2str);
+int
+libcfs_str2anynid(ptl_nid_t *nidp, char *str)
+{
+ if (!strcmp(str, "*")) {
+ *nidp = PTL_NID_ANY;
+ return 1;
+ }
+
+ *nidp = libcfs_str2nid(str);
+ return *nidp != PTL_NID_ANY;
+}
+
+#ifdef __KERNEL__
+EXPORT_SYMBOL(libcfs_isknown_nal);
+EXPORT_SYMBOL(libcfs_nal2str);
+EXPORT_SYMBOL(libcfs_str2nal);
+EXPORT_SYMBOL(libcfs_net2str);
EXPORT_SYMBOL(libcfs_nid2str);
+EXPORT_SYMBOL(libcfs_str2net);
+EXPORT_SYMBOL(libcfs_str2nid);
EXPORT_SYMBOL(libcfs_id2str);
+EXPORT_SYMBOL(libcfs_str2anynid);
+#endif
MODULES := portals
+
+router_objs := $(ROUTER)r_router.o
+router_objs += $(ROUTER)r_proc.o
+
portals-objs := api-errno.o api-ni.o
portals-objs += lib-me.o lib-msg.o lib-eq.o lib-md.o
portals-objs += lib-move.o module.o
+portals-objs += $(router_objs)
+
+default: all
+
+r_%.c: ../router/%.c
+ ln -sf $< $@
+
+EXTRA_PRE_CFLAGS := -I../router
@INCLUDE_RULES@
ptl_mutex_enter();
LASSERT (ptl_init);
- LASSERT (libcfs_isknown_nettype(nal->nal_type));
+ LASSERT (libcfs_isknown_nal(nal->nal_type));
LASSERT (ptl_find_nal_by_type(nal->nal_type) == NULL);
list_add (&nal->nal_list, &ptl_nal_table);
- nal->nal_refcount = 0;
+ atomic_set(&nal->nal_refcount, 0);
ptl_mutex_exit();
}
LASSERT (ptl_init);
LASSERT (ptl_find_nal_by_type(nal->nal_type) == nal);
- LASSERT (nal->nal_refcount == 0);
+ LASSERT (atomic_read(&nal->nal_refcount) == 0);
list_del (&nal->nal_list);
}
int
-ptl_startup_apini(ptl_pid_t requested_pid,
- ptl_ni_limits_t *requested_limits,
- ptl_ni_limits_t *actual_limits)
+ptl_apini_init(ptl_pid_t requested_pid,
+ ptl_ni_limits_t *requested_limits,
+ ptl_ni_limits_t *actual_limits)
{
int rc = PTL_OK;
int ptl_size;
CFS_INIT_LIST_HEAD (&ptl_apini.apini_active_eqs);
CFS_INIT_LIST_HEAD (&ptl_apini.apini_test_peers);
CFS_INIT_LIST_HEAD (&ptl_apini.apini_nis);
+ CFS_INIT_LIST_HEAD (&ptl_apini.apini_zombie_nis);
#ifdef __KERNEL__
spin_lock_init (&ptl_apini.apini_lock);
}
int
-ptl_shutdown_apini (void)
+ptl_apini_fini (void)
{
int idx;
* descriptors, even those that appear committed to a network op (eg MD
* with non-zero pending count) */
+ ptl_fail_nid(PTL_NID_ANY, 0);
+
+ LASSERT (list_empty(&ptl_apini.apini_test_peers));
LASSERT (ptl_apini.apini_refcount == 0);
LASSERT (list_empty(&ptl_apini.apini_nis));
-
+ LASSERT (list_empty(&ptl_apini.apini_zombie_nis));
+ LASSERT (ptl_apini.apini_nzombie_nis == 0);
+
for (idx = 0; idx < ptl_apini.apini_nportals; idx++)
while (!list_empty (&ptl_apini.apini_portals[idx])) {
ptl_me_t *me = list_entry (ptl_apini.apini_portals[idx].next,
return (PTL_OK);
}
+ptl_ni_t *
+ptl_net2ni (__u32 net)
+{
+ struct list_head *tmp;
+ ptl_ni_t *ni;
+ unsigned long flags;
+
+ PTL_LOCK(flags);
+ list_for_each (tmp, &ptl_apini.apini_nis) {
+ ni = list_entry(tmp, ptl_ni_t, ni_list);
+
+ if (PTL_NIDNET(ni->ni_nid) == net) {
+ ptl_ni_addref(ni);
+ PTL_UNLOCK(flags);
+ return ni;
+ }
+ }
+
+ PTL_UNLOCK(flags);
+ return NULL;
+}
+
+void
+ptl_queue_zombie_ni (ptl_ni_t *ni)
+{
+ unsigned long flags;
+
+ LASSERT (atomic_read(&ni->ni_refcount) == 0);
+ LASSERT (ptl_init);
+
+ PTL_LOCK(flags);
+ list_add_tail(&ni->ni_list, &ptl_apini.apini_zombie_nis);
+ PTL_UNLOCK(flags);
+}
+
void
ptl_shutdown_nalnis (void)
{
+ int i;
ptl_ni_t *ni;
+ ptl_nal_t *nal;
struct list_head *tmp;
struct list_head *nxt;
+ unsigned long flags;
+
+ /* NB called holding the global mutex */
/* All quiet on the API front */
LASSERT (ptl_apini.apini_refcount == 0);
-
- list_for_each_safe (tmp, nxt, &ptl_apini.apini_nis) {
- ni = list_entry(tmp, ptl_ni_t, ni_list);
+ LASSERT (list_empty(&ptl_apini.apini_zombie_nis));
+ LASSERT (ptl_apini.apini_nzombie_nis == 0);
- (ni->ni_nal->nal_shutdown)(ni);
- ni->ni_nal->nal_refcount--;
+ /* First unlink the NIs from the global list and drop its ref. When
+ * the last ref goes, the NI is queued on apini_zombie_nis....*/
+
+ PTL_LOCK(flags);
+ while (!list_empty(&ptl_apini.apini_nis)) {
+ ni = list_entry(ptl_apini.apini_nis.next,
+ ptl_ni_t, ni_list);
list_del (&ni->ni_list);
+ ni->ni_shutdown = 1;
+ ptl_ni_decref(ni); /* drop apini's ref (shutdown on last ref) */
+ ptl_apini.apini_nzombie_nis++;
+ }
+ PTL_UNLOCK(flags);
+
+ PTL_LOCK(flags);
+
+ /* Now wait for the NI's I just nuked to show up on apini_zombie_nis
+ * and shut them down in guaranteed thread context */
+ i = 2;
+ while (ptl_apini.apini_nzombie_nis != 0) {
+
+ while (list_empty(&ptl_apini.apini_zombie_nis)) {
+ PTL_UNLOCK(flags);
+ ++i;
+ if ((i & (-i)) == i)
+ CDEBUG(D_WARNING,"Waiting for %d zombie NIs\n",
+ ptl_apini.apini_nzombie_nis);
+ set_current_state(TASK_UNINTERRUPTIBLE);
+ schedule_timeout(cfs_time_seconds(1));
+ PTL_LOCK(flags);
+ }
+
+ ni = list_entry(ptl_apini.apini_zombie_nis.next,
+ ptl_ni_t, ni_list);
+
+ PTL_UNLOCK(flags);
+
+ LASSERT (!in_interrupt());
+ atomic_dec(&ni->ni_nal->nal_refcount);
+ (ni->ni_nal->nal_shutdown)(ni);
PORTAL_FREE(ni, sizeof(*ni));
+
+ PTL_LOCK(flags);
+ ptl_apini.apini_nzombie_nis--;
}
}
{
ptl_nal_t *nal;
ptl_ni_t *ni;
+ ptl_ni_t *ni2;
struct list_head *tmp;
+ struct list_head *tmp2;
ptl_err_t rc = PTL_OK;
char *interface = NULL;
+ unsigned long flags;
list_for_each (tmp, &ptl_nal_table) {
nal = list_entry(tmp, ptl_nal_t, nal_list);
PORTAL_ALLOC(ni, sizeof(*ni));
if (ni == NULL) {
CERROR("Can't allocate NI for %s NAL\n",
- libcfs_nettype2str(nal->nal_type));
+ libcfs_nal2str(nal->nal_type));
rc = PTL_FAIL;
break;
}
ni->ni_nal = nal;
- // ni->ni_nid = (nal->nal_type << 16)
- nal->nal_refcount++;
+ ni->ni_nid = PTL_MKNID(PTL_MKNET(nal->nal_type, 0), 0);
+ /* for now */
+
+ atomic_inc(&nal->nal_refcount);
rc = (nal->nal_startup)(ni, &interface);
if (rc != PTL_OK) {
CERROR("Error %d staring up NI %s\n",
- rc, libcfs_nettype2str(nal->nal_type));
+ rc, libcfs_nal2str(nal->nal_type));
PORTAL_FREE(ni, sizeof(*ni));
- nal->nal_refcount--;
+ atomic_dec(&nal->nal_refcount);
break;
}
- list_add(&ni->ni_list, &ptl_apini.apini_nis);
+ PTL_LOCK(flags);
+ list_add_tail(&ni->ni_list, &ptl_apini.apini_nis);
+ PTL_UNLOCK(flags);
}
if (rc != PTL_OK)
goto out;
}
- rc = ptl_startup_apini(requested_pid,
- requested_limits, actual_limits);
+ rc = ptl_apini_init(requested_pid, requested_limits, actual_limits);
if (rc != PTL_OK)
goto out;
+ kpr_initialise();
+
rc = ptl_startup_nalnis();
if (rc != PTL_OK) {
- ptl_shutdown_apini();
+ ptl_apini_fini();
goto out;
}
ptl_apini.apini_refcount--;
if (ptl_apini.apini_refcount == 0) {
ptl_shutdown_nalnis();
- ptl_shutdown_apini();
+ kpr_finalise();
+ ptl_apini_fini();
}
ptl_mutex_exit ();
return PTL_OK;
}
+int
+PtlNICtl(ptl_handle_ni_t nih, unsigned int cmd, void *arg)
+{
+ struct portal_ioctl_data *data = arg;
+ struct list_head *tmp;
+ ptl_ni_t *ni;
+ int rc;
+ unsigned long flags;
+ int count;
+
+ ptl_mutex_enter ();
+
+ LASSERT (ptl_init);
+ LASSERT (ptl_apini.apini_refcount > 0);
+
+ switch (cmd) {
+ case IOC_PORTAL_GET_NI:
+ count = data->ioc_count;
+ data->ioc_nid = PTL_NID_ANY;
+ rc = -ENOENT;
+
+ PTL_LOCK(flags);
+ list_for_each (tmp, &ptl_apini.apini_nis) {
+ if (count-- != 0)
+ continue;
+
+ ni = list_entry(tmp, ptl_ni_t, ni_list);
+ data->ioc_nid = ni->ni_nid;
+ rc = 0;
+ break;
+ }
+ PTL_UNLOCK(flags);
+ break;
+
+ case IOC_PORTAL_FAIL_NID:
+ rc = ptl_fail_nid(data->ioc_nid, data->ioc_count);
+ break;
+
+ case IOC_PORTAL_ADD_ROUTE:
+ case IOC_PORTAL_DEL_ROUTE:
+ case IOC_PORTAL_GET_ROUTE:
+ case IOC_PORTAL_NOTIFY_ROUTER:
+ rc = kpr_ctl(cmd, arg);
+ break;
+
+ default:
+ ni = ptl_net2ni(data->ioc_net);
+ if (ni == NULL) {
+ rc = -EINVAL;
+ } else {
+ if (ni->ni_nal->nal_ctl == NULL)
+ rc = -EINVAL;
+ else
+ rc = ni->ni_nal->nal_ctl(ni, cmd, arg);
+
+ ptl_ni_decref(ni);
+ }
+ break;
+ }
+
+ ptl_mutex_exit();
+ return rc;
+}
+
ptl_err_t
PtlGetId(ptl_handle_ni_t ni_handle, ptl_process_id_t *id)
{
my_sources = api-errno.c api-ni.c \
lib-me.c lib-msg.c lib-eq.c \
- lib-md.c lib-move.c
+ lib-md.c lib-move. \
+ $(top_srcdir)/portals/router/router.c
if !CRAY_PORTALS
void *private, int loopback);
static ptl_libmd_t *
-ptl_match_md(int index, int op_mask,
- ptl_nid_t src_nid, ptl_pid_t src_pid,
+ptl_match_md(int index, int op_mask, ptl_process_id_t src,
ptl_size_t rlength, ptl_size_t roffset,
ptl_match_bits_t match_bits, ptl_msg_t *msg,
ptl_size_t *mlength_out, ptl_size_t *offset_out)
ptl_size_t offset;
ENTRY;
- CDEBUG (D_NET, "Request from "LPX64".%d of length %d into portal %d "
- "MB="LPX64"\n", src_nid, src_pid, rlength, index, match_bits);
+ CDEBUG (D_NET, "Request from %s of length %d into portal %d "
+ "MB="LPX64"\n", libcfs_id2str(src), rlength, index, match_bits);
if (index < 0 || index >= ptl_apini.apini_nportals) {
CERROR("Invalid portal %d not in [0-%d]\n",
/* mismatched ME nid/pid? */
if (me->me_match_id.nid != PTL_NID_ANY &&
- me->me_match_id.nid != src_nid)
+ me->me_match_id.nid != src.nid)
continue;
- CDEBUG(D_NET, "match_id.pid [%x], src_pid [%x]\n",
- me->me_match_id.pid, src_pid);
-
if (me->me_match_id.pid != PTL_PID_ANY &&
- me->me_match_id.pid != src_pid)
+ me->me_match_id.pid != src.pid)
continue;
/* mismatched ME matchbits? */
}
/* Commit to this ME/MD */
- CDEBUG(D_NET, "Incoming %s index %x from "LPX64"/%u of "
+ CDEBUG(D_NET, "Incoming %s index %x from %s of "
"length %d/%d into md "LPX64" [%d] + %d\n",
(op_mask == PTL_MD_OP_PUT) ? "put" : "get",
- index, src_nid, src_pid, mlength, rlength,
+ index, libcfs_id2str(src), mlength, rlength,
md->md_lh.lh_cookie, md->md_niov, offset);
ptl_commit_md(md, msg);
md->md_offset = offset + mlength;
/* NB Caller sets ev.type and ev.hdr_data */
- msg->msg_ev.initiator.nid = src_nid;
- msg->msg_ev.initiator.pid = src_pid;
+ msg->msg_ev.initiator = src;
msg->msg_ev.pt_index = index;
msg->msg_ev.match_bits = match_bits;
msg->msg_ev.rlength = rlength;
}
failed:
- CERROR ("Dropping %s from "LPX64".%d portal %d match "LPX64
+ CERROR ("Dropping %s from %s portal %d match "LPX64
" offset %d length %d: no match\n",
(op_mask == PTL_MD_OP_GET) ? "GET" : "PUT",
- src_nid, src_pid, index, match_bits, roffset, rlength);
+ libcfs_id2str(src), index, match_bits, roffset, rlength);
RETURN(NULL);
}
ptl_err_t
-PtlFailNid (ptl_handle_ni_t interface,
- ptl_nid_t nid, unsigned int threshold)
+ptl_fail_nid (ptl_nid_t nid, unsigned int threshold)
{
ptl_test_peer_t *tp;
unsigned long flags;
void *private,
ptl_msg_t *libmsg,
ptl_hdr_t *hdr,
- int type,
- ptl_nid_t nid,
- ptl_pid_t pid,
unsigned int payload_niov,
ptl_kiov_t *payload_kiov,
size_t payload_offset,
void *private,
ptl_msg_t *libmsg,
ptl_hdr_t *hdr,
- int type,
- ptl_nid_t nid,
- ptl_pid_t pid,
unsigned int payload_niov,
struct iovec *payload_iov,
size_t payload_offset,
ptl_err_t
ptl_send (ptl_ni_t *ni, void *private, ptl_msg_t *msg,
- ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
+ ptl_hdr_t *hdr, int type, ptl_process_id_t target,
ptl_libmd_t *md, ptl_size_t offset, ptl_size_t len)
{
- int loopback = (nid == ni->ni_nid);
+ ptl_nid_t gw_nid;
+ int routing;
+ int loopback;
+ ptl_err_t rc;
+
+ /* CAVEAT EMPTOR! ni != NULL == interface pre-determined (ACK) */
+
+ gw_nid = kpr_lookup (&ni, target.nid, sizeof(*hdr) + len);
+ if (gw_nid == PTL_NID_ANY) {
+ CERROR("No route to %s\n", libcfs_id2str(target));
+ return PTL_FAIL;
+ }
+
+ routing = (gw_nid != ni->ni_nid); /* gateway will forward */
+ loopback = (target.nid == ni->ni_nid); /* it's for me! */
+
+ if (routing && loopback) { /* very strange */
+ CERROR("Inconsistent route table: target %s gw %s ni %s\n",
+ libcfs_id2str(target), libcfs_nid2str(gw_nid),
+ libcfs_nid2str(ni->ni_nid));
+ rc = PTL_FAIL;
+ goto out;
+ }
+
+ hdr->type = cpu_to_le32(type);
+ hdr->dest_nid = cpu_to_le64(target.nid);
+ hdr->dest_pid = cpu_to_le32(target.pid);
+ hdr->src_nid = cpu_to_le64(ni->ni_nid);
+ hdr->src_pid = cpu_to_le64(ptl_apini.apini_pid);
+ hdr->payload_length = cpu_to_le32(len);
+ /* set the completion event's initiator.nid now we know it */
+ if (type == PTL_MSG_PUT || type == PTL_MSG_GET)
+ msg->msg_ev.initiator.nid = ni->ni_nid;
+
+ if (routing)
+ target.nid = gw_nid;
+
if (len == 0) {
if (loopback)
- return ptl_lo_txiov(ni, private, msg,
- hdr, type, nid, pid,
- 0, NULL,
- offset, len);
+ rc = ptl_lo_txiov(ni, private, msg, hdr,
+ 0, NULL, offset, len);
else
- return (ni->ni_nal->nal_send)(ni, private, msg,
- hdr, type, nid, pid,
- 0, NULL,
- offset, len);
- }
-
- if ((md->md_options & PTL_MD_KIOV) == 0) {
+ rc = (ni->ni_nal->nal_send)(ni, private, msg, hdr,
+ type, target, routing,
+ 0, NULL, offset, len);
+ } else if ((md->md_options & PTL_MD_KIOV) == 0) {
if (loopback)
- return ptl_lo_txiov(ni, private, msg,
- hdr, type, nid, pid,
- md->md_niov, md->md_iov.iov,
+ rc = ptl_lo_txiov(ni, private, msg, hdr,
+ md->md_niov, md->md_iov.iov,
+ offset, len);
+ else
+ rc = (ni->ni_nal->nal_send)
+ (ni, private, msg, hdr,
+ type, target, routing,
+ md->md_niov, md->md_iov.iov,
+ offset, len);
+ } else {
+ if (loopback)
+ rc = ptl_lo_txkiov(ni, private, msg, hdr,
+ md->md_niov, md->md_iov.kiov,
offset, len);
else
- return (ni->ni_nal->nal_send)(ni, private, msg,
- hdr, type, nid, pid,
- md->md_niov,
- md->md_iov.iov,
- offset, len);
+ rc = (ni->ni_nal->nal_send_pages)
+ (ni, private, msg, hdr,
+ type, target, routing,
+ md->md_niov, md->md_iov.kiov,
+ offset, len);
}
- if (loopback)
- return ptl_lo_txkiov(ni, private, msg,
- hdr, type, nid, pid,
- md->md_niov, md->md_iov.kiov,
- offset, len);
- else
- return (ni->ni_nal->nal_send_pages)(ni, private, msg,
- hdr, type, nid, pid,
- md->md_niov,
- md->md_iov.kiov,
- offset, len);
+ out:
+ ptl_ni_decref(ni); /* lose ref from kpr_lookup */
+ return rc;
}
static void
{
ptl_size_t mlength = 0;
ptl_size_t offset = 0;
+ ptl_process_id_t src = {.nid = hdr->src_nid,
+ .pid = hdr->src_pid};
ptl_err_t rc;
ptl_libmd_t *md;
unsigned long flags;
PTL_LOCK(flags);
- md = ptl_match_md(hdr->msg.put.ptl_index, PTL_MD_OP_PUT,
- hdr->src_nid, hdr->src_pid,
+ md = ptl_match_md(hdr->msg.put.ptl_index, PTL_MD_OP_PUT, src,
hdr->payload_length, hdr->msg.put.offset,
hdr->msg.put.match_bits, msg,
&mlength, &offset);
hdr->payload_length);
if (rc != PTL_OK)
- CERROR(LPX64": error on receiving PUT from "LPX64": %d\n",
- ni->ni_nid, hdr->src_nid, rc);
+ CERROR("%s: error on receiving PUT from %s: %d\n",
+ libcfs_nid2str(ni->ni_nid), libcfs_id2str(src), rc);
return (rc);
}
{
ptl_size_t mlength = 0;
ptl_size_t offset = 0;
+ ptl_process_id_t src = {.nid = hdr->src_nid,
+ .pid = hdr->src_pid};
ptl_libmd_t *md;
ptl_hdr_t reply;
unsigned long flags;
PTL_LOCK(flags);
- md = ptl_match_md(hdr->msg.get.ptl_index, PTL_MD_OP_GET,
- hdr->src_nid, hdr->src_pid,
+ md = ptl_match_md(hdr->msg.get.ptl_index, PTL_MD_OP_GET, src,
hdr->msg.get.sink_length, hdr->msg.get.src_offset,
hdr->msg.get.match_bits, msg,
&mlength, &offset);
PTL_UNLOCK(flags);
memset (&reply, 0, sizeof (reply));
- reply.type = cpu_to_le32(PTL_MSG_REPLY);
- reply.dest_nid = cpu_to_le64(hdr->src_nid);
- reply.dest_pid = cpu_to_le32(hdr->src_pid);
- reply.src_nid = cpu_to_le64(ni->ni_nid);
- reply.src_pid = cpu_to_le32(ptl_apini.apini_pid);
- reply.payload_length = cpu_to_le32(mlength);
-
reply.msg.reply.dst_wmd = hdr->msg.get.return_wmd;
/* NB call ptl_send() _BEFORE_ ptl_recv() completes the incoming
* message. Some NALs _require_ this to implement optimized GET */
- rc = ptl_send (ni, private, msg, &reply, PTL_MSG_REPLY,
- hdr->src_nid, hdr->src_pid, md, offset, mlength);
+ rc = ptl_send (ni, private, msg, &reply, PTL_MSG_REPLY, src,
+ md, offset, mlength);
if (rc != PTL_OK)
- CERROR(LPX64": Unable to send REPLY for GET from "LPX64": %d\n",
- ni->ni_nid, hdr->src_nid, rc);
+ CERROR("%s: Unable to send REPLY for GET from %s: %d\n",
+ libcfs_nid2str(ni->ni_nid), libcfs_id2str(src), rc);
/* Discard any junk after the hdr */
if (!loopback)
ptl_parse_reply(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private,
ptl_msg_t *msg, int loopback)
{
+ ptl_process_id_t src = {.nid = hdr->src_nid,
+ .pid = hdr->src_pid};
ptl_libmd_t *md;
int rlength;
int length;
/* NB handles only looked up by creator (no flips) */
md = ptl_wire_handle2md(&hdr->msg.reply.dst_wmd);
if (md == NULL || md->md_threshold == 0) {
- CERROR (LPX64": Dropping REPLY from "LPX64" for %s MD "
- LPX64"."LPX64"\n", ni->ni_nid, hdr->src_nid,
+ CERROR ("%s: Dropping REPLY from %s for %s "
+ "MD "LPX64"."LPX64"\n",
+ libcfs_nid2str(ni->ni_nid), libcfs_id2str(src),
(md == NULL) ? "invalid" : "inactive",
hdr->msg.reply.dst_wmd.wh_interface_cookie,
hdr->msg.reply.dst_wmd.wh_object_cookie);
if (length > md->md_length) {
if ((md->md_options & PTL_MD_TRUNCATE) == 0) {
- CERROR (LPX64": Dropping REPLY from "LPX64
- " length %d for MD "LPX64" would overflow (%d)\n",
- ni->ni_nid, hdr->src_nid, length,
- hdr->msg.reply.dst_wmd.wh_object_cookie,
+ CERROR ("%s: Dropping REPLY from %s length %d "
+ "for MD "LPX64" would overflow (%d)\n",
+ libcfs_nid2str(ni->ni_nid), libcfs_id2str(src),
+ length, hdr->msg.reply.dst_wmd.wh_object_cookie,
md->md_length);
PTL_UNLOCK(flags);
return (PTL_FAIL);
length = md->md_length;
}
- CDEBUG(D_NET, LPX64": Reply from "LPX64
- " of length %d/%d into md "LPX64"\n",
- ni->ni_nid, hdr->src_nid, length, rlength,
- hdr->msg.reply.dst_wmd.wh_object_cookie);
+ CDEBUG(D_NET, "%s: Reply from %s of length %d/%d into md "LPX64"\n",
+ libcfs_nid2str(ni->ni_nid), libcfs_id2str(src),
+ length, rlength, hdr->msg.reply.dst_wmd.wh_object_cookie);
ptl_commit_md(md, msg);
msg->msg_ev.type = PTL_EVENT_REPLY_END;
- msg->msg_ev.initiator.nid = hdr->src_nid;
- msg->msg_ev.initiator.pid = hdr->src_pid;
+ msg->msg_ev.initiator = src;
msg->msg_ev.rlength = rlength;
msg->msg_ev.mlength = length;
msg->msg_ev.offset = 0;
rc = ptl_recv(ni, private, msg, md, 0, length, rlength);
if (rc != PTL_OK)
- CERROR(LPX64": error on receiving REPLY from "LPX64": %d\n",
- ni->ni_nid, hdr->src_nid, rc);
+ CERROR("%s: error on receiving REPLY from %s: %d\n",
+ libcfs_nid2str(ni->ni_nid), libcfs_id2str(src), rc);
return (rc);
}
ptl_parse_ack(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private,
ptl_msg_t *msg, int loopback)
{
- ptl_libmd_t *md;
- unsigned long flags;
+ ptl_process_id_t src = {.nid = hdr->src_nid,
+ .pid = hdr->src_pid};
+ ptl_libmd_t *md;
+ unsigned long flags;
/* Convert ack fields to host byte order */
hdr->msg.ack.match_bits = le64_to_cpu(hdr->msg.ack.match_bits);
/* NB handles only looked up by creator (no flips) */
md = ptl_wire_handle2md(&hdr->msg.ack.dst_wmd);
if (md == NULL || md->md_threshold == 0) {
- CERROR (LPX64": Dropping ACK from "LPX64" to %s MD "
- LPX64"."LPX64"\n", ni->ni_nid, hdr->src_nid,
- (md == NULL) ? "invalid" : "inactive",
- hdr->msg.ack.dst_wmd.wh_interface_cookie,
- hdr->msg.ack.dst_wmd.wh_object_cookie);
+ CERROR ("%s: Dropping ACK from %s to %s MD "LPX64"."LPX64"\n",
+ libcfs_nid2str(ni->ni_nid), libcfs_id2str(src),
+ (md == NULL) ? "invalid" : "inactive",
+ hdr->msg.ack.dst_wmd.wh_interface_cookie,
+ hdr->msg.ack.dst_wmd.wh_object_cookie);
PTL_UNLOCK(flags);
return (PTL_FAIL);
}
- CDEBUG(D_NET, LPX64": ACK from "LPX64" into md "LPX64"\n",
- ni->ni_nid, hdr->src_nid,
+ CDEBUG(D_NET, "%s: ACK from %s into md "LPX64"\n",
+ libcfs_nid2str(ni->ni_nid), libcfs_id2str(src),
hdr->msg.ack.dst_wmd.wh_object_cookie);
ptl_commit_md(md, msg);
msg->msg_ev.type = PTL_EVENT_ACK;
- msg->msg_ev.initiator.nid = hdr->src_nid;
- msg->msg_ev.initiator.pid = hdr->src_pid;
+ msg->msg_ev.initiator = src;
msg->msg_ev.mlength = hdr->msg.ack.mlength;
msg->msg_ev.match_bits = hdr->msg.ack.match_bits;
void
ptl_print_hdr(ptl_hdr_t * hdr)
{
+ ptl_process_id_t src = {.nid = hdr->src_nid,
+ .pid = hdr->src_pid};
+ ptl_process_id_t dst = {.nid = hdr->dest_nid,
+ .pid = hdr->dest_pid};
char *type_str = hdr_type_string (hdr);
CWARN("P3 Header at %p of type %s\n", hdr, type_str);
- CWARN(" From nid/pid "LPX64"/%u", hdr->src_nid, hdr->src_pid);
- CWARN(" To nid/pid "LPX64"/%u\n", hdr->dest_nid, hdr->dest_pid);
+ CWARN(" From %s\n", libcfs_id2str(src));
+ CWARN(" To %s\n", libcfs_id2str(dst));
switch (hdr->type) {
default:
if (mv->magic == PORTALS_PROTO_MAGIC &&
mv->version_major == PORTALS_PROTO_VERSION_MAJOR &&
mv->version_minor == PORTALS_PROTO_VERSION_MINOR) {
- CWARN (LPX64": Dropping unexpected HELLO message: "
- "magic %d, version %d.%d from "LPD64"\n",
- ni->ni_nid, mv->magic,
+ CWARN ("%s: Dropping unexpected HELLO message: "
+ "magic %d, version %d.%d from %s\n",
+ libcfs_nid2str(ni->ni_nid), mv->magic,
mv->version_major, mv->version_minor,
- hdr->src_nid);
+ libcfs_nid2str(hdr->src_nid));
/* it's good but we don't want it */
ptl_drop_message(ni, private, hdr, loopback);
}
/* we got garbage */
- CERROR (LPX64": Bad HELLO message: "
- "magic %d, version %d.%d from "LPD64"\n",
- ni->ni_nid, mv->magic,
+ CERROR ("%s: Bad HELLO message: "
+ "magic %d, version %d.%d from %s\n",
+ libcfs_nid2str(ni->ni_nid), mv->magic,
mv->version_major, mv->version_minor,
- hdr->src_nid);
+ libcfs_nid2str(hdr->src_nid));
return PTL_FAIL;
}
case PTL_MSG_REPLY:
hdr->dest_nid = le64_to_cpu(hdr->dest_nid);
if (hdr->dest_nid != ni->ni_nid) {
- CERROR(LPX64": BAD dest NID in %s message from"
- LPX64" to "LPX64" (not me)\n",
- ni->ni_nid, hdr_type_string(hdr),
- hdr->src_nid, hdr->dest_nid);
+ CERROR("%s: BAD dest NID in %s message from %s to %s"
+ "(not me)\n", libcfs_nid2str(ni->ni_nid),
+ hdr_type_string(hdr),
+ libcfs_nid2str(hdr->src_nid),
+ libcfs_nid2str(hdr->dest_nid));
return PTL_FAIL;
}
break;
default:
- CERROR(LPX64": Bad message type 0x%x from "LPX64"\n",
- ni->ni_nid, hdr->type, hdr->src_nid);
+ CERROR("%s: Bad message type 0x%x from %s\n",
+ libcfs_nid2str(ni->ni_nid), hdr->type,
+ libcfs_nid2str(hdr->src_nid));
return PTL_FAIL;
}
if (!list_empty (&ptl_apini.apini_test_peers) && /* normally we don't */
fail_peer (hdr->src_nid, 0)) /* shall we now? */
{
- CERROR(LPX64": Dropping incoming %s from "LPX64
- ": simulated failure\n",
- ni->ni_nid, hdr_type_string (hdr),
- hdr->src_nid);
+ CERROR("%s: Dropping incoming %s from %s: simulated failure\n",
+ libcfs_nid2str(ni->ni_nid), hdr_type_string (hdr),
+ libcfs_nid2str(hdr->src_nid));
ptl_drop_message(ni, private, hdr, loopback);
return PTL_OK;
}
msg = ptl_msg_alloc();
if (msg == NULL) {
- CERROR(LPX64": Dropping incoming %s from "LPX64
- ": can't allocate a ptl_msg_t\n",
- ni->ni_nid, hdr_type_string (hdr),
- hdr->src_nid);
+ CERROR("%s: Dropping incoming %s from %s: "
+ "can't allocate a ptl_msg_t\n",
+ libcfs_nid2str(ni->ni_nid), hdr_type_string (hdr),
+ libcfs_nid2str(hdr->src_nid));
ptl_drop_message(ni, private, hdr, loopback);
return PTL_OK;
}
ptl_ac_index_t ac, ptl_match_bits_t match_bits,
ptl_size_t offset, ptl_hdr_data_t hdr_data)
{
- ptl_ni_t *ni;
ptl_msg_t *msg;
ptl_hdr_t hdr;
ptl_libmd_t *md;
if (!list_empty (&ptl_apini.apini_test_peers) && /* normally we don't */
fail_peer (target.nid, 1)) /* shall we now? */
{
- CERROR("Dropping PUT to "LPX64": simulated failure\n",
- target.nid);
+ CERROR("Dropping PUT to %s: simulated failure\n",
+ libcfs_id2str(target));
return PTL_PROCESS_INVALID;
}
msg = ptl_msg_alloc();
if (msg == NULL) {
- CERROR("Dropping PUT to "LPX64": ENOMEM on ptl_msg_t\n",
- target.nid);
+ CERROR("Dropping PUT to %s: ENOMEM on ptl_msg_t\n",
+ libcfs_id2str(target));
return PTL_NO_SPACE;
}
PTL_LOCK(flags);
- ni = ptl_nid2ni(target.nid);
- if (ni == NULL) {
- ptl_msg_free(msg);
- PTL_UNLOCK(flags);
-
- CERROR("Dropping PUT to "LPX64": not reachable\n", target.nid);
- return PTL_PROCESS_INVALID;
- }
-
md = ptl_handle2md(&mdh);
if (md == NULL || md->md_threshold == 0) {
ptl_msg_free(msg);
PTL_UNLOCK(flags);
- CERROR("Dropping PUT to "LPX64": MD invalid\n", target.nid);
+ CERROR("Dropping PUT to %s: MD invalid\n",
+ libcfs_id2str(target));
return PTL_MD_INVALID;
}
- CDEBUG(D_NET, LPX64": PtlPut -> "LPX64":%lu\n",
- ni->ni_nid, target.nid, (unsigned long)target.pid);
+ CDEBUG(D_NET, "PtlPut -> %s\n", libcfs_id2str(target));
memset (&hdr, 0, sizeof (hdr));
- hdr.type = cpu_to_le32(PTL_MSG_PUT);
- hdr.dest_nid = cpu_to_le64(target.nid);
- hdr.dest_pid = cpu_to_le32(target.pid);
- hdr.src_nid = cpu_to_le64(ni->ni_nid);
- hdr.src_pid = cpu_to_le32(ptl_apini.apini_pid);
- hdr.payload_length = cpu_to_le32(md->md_length);
/* NB handles only looked up by creator (no flips) */
if (ack == PTL_ACK_REQ) {
ptl_commit_md(md, msg);
msg->msg_ev.type = PTL_EVENT_SEND_END;
- msg->msg_ev.initiator.nid = ni->ni_nid;
+ msg->msg_ev.initiator.nid = PTL_NID_ANY;
msg->msg_ev.initiator.pid = ptl_apini.apini_pid;
msg->msg_ev.pt_index = portal;
msg->msg_ev.match_bits = match_bits;
PTL_UNLOCK(flags);
- rc = ptl_send (ni, NULL, msg, &hdr, PTL_MSG_PUT,
- target.nid, target.pid, md, 0, md->md_length);
+ rc = ptl_send (NULL, NULL, msg, &hdr, PTL_MSG_PUT, target,
+ md, 0, md->md_length);
if (rc != PTL_OK) {
- CERROR(LPX64": Error sending PUT to "LPX64": %d\n",
- ni->ni_nid, target.nid, rc);
- ptl_finalize (ni, NULL, msg, rc);
+ CERROR("Error sending PUT to %s: %d\n",
+ libcfs_id2str(target), rc);
+ ptl_finalize (NULL, NULL, msg, rc);
}
/* completion will be signalled by an event */
LASSERT (getmd->md_pending > 0);
if (msg == NULL) {
- CERROR (LPX64": Dropping REPLY from "LPX64": can't allocate msg\n",
- ni->ni_nid, peer_nid);
+ CERROR ("%s: Dropping REPLY from %s: can't allocate msg\n",
+ libcfs_nid2str(ni->ni_nid), libcfs_nid2str(peer_nid));
goto drop;
}
if (getmd->md_threshold == 0) {
- CERROR (LPX64": Dropping REPLY from "LPX64" for inactive MD %p\n",
- ni->ni_nid, peer_nid, getmd);
+ CERROR ("%s: Dropping REPLY from %s for inactive MD %p\n",
+ libcfs_nid2str(ni->ni_nid), libcfs_nid2str(peer_nid),
+ getmd);
goto drop_msg;
}
LASSERT (getmd->md_offset == 0);
- CDEBUG(D_NET, LPX64": Reply from "LPX64" md %p\n",
- ni->ni_nid, peer_nid, getmd);
+ CDEBUG(D_NET, "%s: Reply from %s md %p\n",
+ libcfs_nid2str(ni->ni_nid), libcfs_nid2str(peer_nid), getmd);
ptl_commit_md (getmd, msg);
ptl_pt_index_t portal, ptl_ac_index_t ac,
ptl_match_bits_t match_bits, ptl_size_t offset)
{
- ptl_ni_t *ni;
ptl_msg_t *msg;
ptl_hdr_t hdr;
ptl_libmd_t *md;
if (!list_empty (&ptl_apini.apini_test_peers) && /* normally we don't */
fail_peer (target.nid, 1)) /* shall we now? */
{
- CERROR("Dropping GET to "LPX64": simulated failure\n",
- target.nid);
+ CERROR("Dropping GET to %s: simulated failure\n",
+ libcfs_id2str(target));
return PTL_PROCESS_INVALID;
}
msg = ptl_msg_alloc();
if (msg == NULL) {
- CERROR("Dropping GET to "LPX64": ENOMEM on ptl_msg_t\n",
- target.nid);
+ CERROR("Dropping GET to %s: ENOMEM on ptl_msg_t\n",
+ libcfs_id2str(target));
return PTL_NO_SPACE;
}
PTL_LOCK(flags);
- ni = ptl_nid2ni(target.nid);
- if (ni == NULL) {
- ptl_msg_free(msg);
- PTL_UNLOCK(flags);
-
- CERROR("Dropping GET to "LPX64": not reachable\n", target.nid);
- return PTL_PROCESS_INVALID;
- }
-
md = ptl_handle2md(&mdh);
if (md == NULL || md->md_threshold == 0) {
ptl_msg_free(msg);
PTL_UNLOCK(flags);
- CERROR("Dropping GET to "LPX64": MD invalid\n", target.nid);
+ CERROR("Dropping GET to %s: MD invalid\n",
+ libcfs_id2str(target));
return PTL_MD_INVALID;
}
- CDEBUG(D_NET, LPX64": PtlGet -> "LPX64":%lu\n",
- ni->ni_nid, target.nid, (unsigned long)target.pid);
+ CDEBUG(D_NET, "PtlGet -> %s\n", libcfs_id2str(target));
memset (&hdr, 0, sizeof (hdr));
- hdr.type = cpu_to_le32(PTL_MSG_GET);
- hdr.dest_nid = cpu_to_le64(target.nid);
- hdr.dest_pid = cpu_to_le32(target.pid);
- hdr.src_nid = cpu_to_le64(ni->ni_nid);
- hdr.src_pid = cpu_to_le32(ptl_apini.apini_pid);
- hdr.payload_length = 0;
/* NB handles only looked up by creator (no flips) */
hdr.msg.get.return_wmd.wh_interface_cookie =
ptl_commit_md(md, msg);
msg->msg_ev.type = PTL_EVENT_SEND_END;
- msg->msg_ev.initiator.nid = ni->ni_nid;
+ msg->msg_ev.initiator.nid = PTL_NID_ANY;
msg->msg_ev.initiator.pid = ptl_apini.apini_pid;
msg->msg_ev.pt_index = portal;
msg->msg_ev.match_bits = match_bits;
PTL_UNLOCK(flags);
- rc = ptl_send (ni, NULL, msg, &hdr, PTL_MSG_GET,
- target.nid, target.pid, NULL, 0, 0);
+ rc = ptl_send (NULL, NULL, msg, &hdr, PTL_MSG_GET, target,
+ NULL, 0, 0);
if (rc != PTL_OK) {
- CERROR(LPX64": error sending GET to "LPX64": %d\n",
- ni->ni_nid, target.nid, rc);
- ptl_finalize (ni, NULL, msg, rc);
+ CERROR("error sending GET to %s: %d\n",
+ libcfs_id2str(target), rc);
+ ptl_finalize (NULL, NULL, msg, rc);
}
/* completion will be signalled by an event */
LASSERT(msg->msg_ev.type == PTL_EVENT_PUT_END);
memset (&ack, 0, sizeof (ack));
- ack.type = cpu_to_le32(PTL_MSG_ACK);
- ack.dest_nid = cpu_to_le64(msg->msg_ev.initiator.nid);
- ack.dest_pid = cpu_to_le32(msg->msg_ev.initiator.pid);
- ack.src_nid = cpu_to_le64(ni->ni_nid);
- ack.src_pid = cpu_to_le32(ptl_apini.apini_pid);
- ack.payload_length = 0;
-
ack.msg.ack.dst_wmd = msg->msg_ack_wmd;
ack.msg.ack.match_bits = msg->msg_ev.match_bits;
ack.msg.ack.mlength = cpu_to_le32(msg->msg_ev.mlength);
rc = ptl_send (ni, private, NULL, &ack, PTL_MSG_ACK,
- msg->msg_ev.initiator.nid,
- msg->msg_ev.initiator.pid,
- NULL, 0, 0);
+ msg->msg_ev.initiator, NULL, 0, 0);
if (rc != PTL_OK) {
/* send failed: there's nothing else to clean up. */
CERROR("Error %d sending ACK to "LPX64"\n",
#define DEBUG_SUBSYSTEM S_PORTALS
#include <portals/lib-p30.h>
-extern void (kping_client)(struct portal_ioctl_data *);
-
-static int kportal_ioctl(struct portal_ioctl_data *data,
- unsigned int cmd, unsigned long arg)
+static int kportal_ioctl(unsigned int cmd, struct portal_ioctl_data *data)
{
- int err;
- ENTRY;
-
- switch (cmd) {
- case IOC_PORTAL_PING: {
- void (*ping)(struct portal_ioctl_data *);
-
- CDEBUG(D_IOCTL, "doing %d pings to nid "LPX64" (%s)\n",
- data->ioc_count, data->ioc_nid,
- libcfs_nid2str(data->ioc_nid));
- ping = PORTAL_SYMBOL_GET(kping_client);
- if (!ping)
- CERROR("PORTAL_SYMBOL_GET failed\n");
- else {
- ping(data);
- PORTAL_SYMBOL_PUT(kping_client);
- }
- RETURN(0);
- }
-
- case IOC_PORTAL_GET_NID: {
- ptl_handle_ni_t nih;
- ptl_process_id_t pid;
-
- CDEBUG (D_IOCTL, "Getting nid for nal [%x]\n", data->ioc_nal);
+ int rc;
+ ptl_handle_ni_t nih;
- err = PtlNIInit(data->ioc_nal, LUSTRE_SRV_PTL_PID, NULL,
- NULL, &nih);
- if (!(err == PTL_OK || err == PTL_IFACE_DUP))
- RETURN (-EINVAL);
+ rc = PtlNIInit(PTL_IFACE_DEFAULT, LUSTRE_SRV_PTL_PID,
+ NULL, NULL, &nih);
+ if (!(rc == PTL_OK || rc == PTL_IFACE_DUP))
+ RETURN (-EINVAL);
- err = PtlGetId (nih, &pid);
- LASSERT (err == PTL_OK);
+ rc = PtlNICtl(nih, cmd, data);
- PtlNIFini(nih);
-
- data->ioc_nid = pid.nid;
- if (copy_to_user ((char *)arg, data, sizeof (*data)))
- RETURN (-EFAULT);
- RETURN(0);
- }
-
- case IOC_PORTAL_FAIL_NID: {
- ptl_handle_ni_t nih;
-
- CDEBUG (D_IOCTL, "fail nid: [%d] "LPU64" count %d\n",
- data->ioc_nal, data->ioc_nid, data->ioc_count);
-
- err = PtlNIInit(PTL_IFACE_DEFAULT, LUSTRE_SRV_PTL_PID, NULL,
- NULL, &nih);
- if (!(err == PTL_OK || err == PTL_IFACE_DUP))
- return (-EINVAL);
-
- if (err == PTL_OK) {
- /* There's no point in failing an interface that
- * came into existance just for this */
- err = -EINVAL;
- } else {
- err = PtlFailNid (nih, data->ioc_nid, data->ioc_count);
- if (err != PTL_OK)
- err = -EINVAL;
- }
-
- PtlNIFini(nih);
- RETURN (err);
- }
-
- default:
- RETURN(-EINVAL);
- }
- /* Not Reached */
+ PtlNIFini(nih);
+ return rc;
}
DECLARE_IOCTL_HANDLER(kportal_ioctl_handler, kportal_ioctl);
-MODULES := kptlrouter
-kptlrouter-objs := router.o proc.o
@INCLUDE_RULES@
# This code is issued under the GNU General Public License.
# See the file COPYING in this distribution
-if MODULES
-if !CRAY_PORTALS
-
-if LINUX
-modulenet_DATA = kptlrouter$(KMODEXT)
-endif
-
-endif
-endif
-
MOSTLYCLEANFILES = *.o *.ko *.mod.c
DIST_SOURCES = $(kptlrouter-objs:%.o=%.c) router.h
re = list_entry(prd->curr, kpr_route_entry_t, kpre_list);
ge = re->kpre_gateway;
- line_len = sprintf(page + chunk_len,
- "%12s "LPX64" : "LPX64" - "LPX64", %s\n",
- nal2name(ge->kpge_nalid), ge->kpge_nid,
- re->kpre_lo_nid, re->kpre_hi_nid,
- ge->kpge_alive ? "up" : "down");
+ line_len = sprintf(page + chunk_len,
+ "net %12s: gateway %s %s\n",
+ libcfs_net2str(re->kpre_net),
+ libcfs_nid2str(ge->kpge_nid),
+ ge->kpge_alive ? "up" : "down");
chunk_len += line_len;
user_len += line_len;
LIST_HEAD(kpr_routes);
LIST_HEAD(kpr_gateways);
-LIST_HEAD(kpr_nals);
unsigned int kpr_routes_generation;
unsigned long long kpr_fwd_bytes;
* entries (thread context only)... */
rwlock_t kpr_rwlock = RW_LOCK_UNLOCKED;
-kpr_router_interface_t kpr_router_interface = {
- kprri_register: kpr_register_nal,
- kprri_lookup: kpr_lookup_target,
- kprri_fwd_start: kpr_forward_packet,
- kprri_fwd_done: kpr_complete_packet,
- kprri_notify: kpr_nal_notify,
- kprri_shutdown: kpr_shutdown_nal,
- kprri_deregister: kpr_deregister_nal,
-};
-
int
-kpr_register_nal (kpr_nal_interface_t *nalif, void **argp)
+kpr_routing ()
{
- unsigned long flags;
- struct list_head *e;
- kpr_nal_entry_t *ne;
-
- CDEBUG (D_NET, "Registering NAL %x\n", nalif->kprni_nalid);
-
- PORTAL_ALLOC (ne, sizeof (*ne));
- if (ne == NULL)
- return (-ENOMEM);
-
- memset (ne, 0, sizeof (*ne));
- memcpy ((void *)&ne->kpne_interface, (void *)nalif, sizeof (*nalif));
-
- LASSERT (!in_interrupt());
- write_lock_irqsave (&kpr_rwlock, flags);
-
- for (e = kpr_nals.next; e != &kpr_nals; e = e->next)
- {
- kpr_nal_entry_t *ne2 = list_entry (e, kpr_nal_entry_t, kpne_list);
-
- if (ne2->kpne_interface.kprni_nalid == ne->kpne_interface.kprni_nalid)
- {
- write_unlock_irqrestore (&kpr_rwlock, flags);
-
- CERROR ("Attempt to register same NAL %x twice\n", ne->kpne_interface.kprni_nalid);
-
- PORTAL_FREE (ne, sizeof (*ne));
- return (-EEXIST);
- }
- }
-
- list_add (&ne->kpne_list, &kpr_nals);
-
- write_unlock_irqrestore (&kpr_rwlock, flags);
-
- *argp = ne;
- PORTAL_MODULE_USE;
- return (0);
+ return 1;
}
void
kpr_do_upcall (void *arg)
{
kpr_upcall_t *u = (kpr_upcall_t *)arg;
- char nalstr[10];
- char nidstr[36];
+ char nidstr[PTL_NALFMT_SIZE];
char whenstr[36];
char *argv[] = {
NULL,
"ROUTER_NOTIFY",
- nalstr,
nidstr,
u->kpru_alive ? "up" : "down",
whenstr,
NULL};
-
- snprintf (nalstr, sizeof(nalstr), "%d", u->kpru_nal_id);
- snprintf (nidstr, sizeof(nidstr), LPX64, u->kpru_nid);
+
+ strcpy(nidstr, libcfs_nid2str(u->kpru_nid));
snprintf (whenstr, sizeof(whenstr), "%ld", u->kpru_when);
portals_run_upcall (argv);
- kfree (u);
+ PORTAL_FREE(u, sizeof(*u));
}
void
-kpr_upcall (int gw_nalid, ptl_nid_t gw_nid, int alive, time_t when)
+kpr_upcall (ptl_nid_t gw_nid, int alive, time_t when)
{
/* May be in arbitrary context */
- kpr_upcall_t *u = kmalloc (sizeof (kpr_upcall_t), GFP_ATOMIC);
+ kpr_upcall_t *u;
+ PORTAL_ALLOC_ATOMIC(u, sizeof(*u));
if (u == NULL) {
- CERROR ("Upcall out of memory: nal %x nid "LPX64" (%s) %s\n",
- gw_nalid, gw_nid,
- libcfs_nid2str(gw_nid),
- alive ? "up" : "down");
+ CERROR ("Upcall out of memory: nid %s %s\n",
+ libcfs_nid2str(gw_nid), alive ? "up" : "down");
return;
}
- u->kpru_nal_id = gw_nalid;
u->kpru_nid = gw_nid;
u->kpru_alive = alive;
u->kpru_when = when;
}
int
-kpr_do_notify (int byNal, int gateway_nalid, ptl_nid_t gateway_nid,
- int alive, time_t when)
+kpr_notify (ptl_ni_t *ni, ptl_nid_t gateway_nid, int alive, time_t when)
{
unsigned long flags;
int found;
- kpr_nal_entry_t *ne = NULL;
kpr_gateway_entry_t *ge = NULL;
struct timeval now;
struct list_head *e;
struct list_head *n;
- CDEBUG (D_NET, "%s notifying [%x] "LPX64": %s\n",
- byNal ? "NAL" : "userspace",
- gateway_nalid, gateway_nid, alive ? "up" : "down");
-
+ CDEBUG (D_NET, "%s notifying %s: %s\n",
+ (ni == NULL) ? "userspace" : libcfs_nid2str(ni->ni_nid),
+ libcfs_nid2str(gateway_nid),
+ alive ? "up" : "down");
+
+ if (ni != NULL &&
+ PTL_NIDNET(ni->ni_nid) != PTL_NIDNET(gateway_nid)) {
+ CWARN ("Ignoring notification of %s %s by %s (different net)\n",
+ libcfs_nid2str(gateway_nid), alive ? "birth" : "death",
+ libcfs_nid2str(ni->ni_nid));
+ return -EINVAL;
+ }
+
/* can't do predictions... */
do_gettimeofday (&now);
if (when > now.tv_sec) {
- CWARN ("Ignoring prediction from %s of [%x] "LPX64" %s "
+ CWARN ("Ignoring prediction from %s of %s %s "
"%ld seconds in the future\n",
- byNal ? "NAL" : "userspace",
- gateway_nalid, gateway_nid,
- alive ? "up" : "down",
+ (ni == NULL) ? "userspace" : libcfs_nid2str(ni->ni_nid),
+ libcfs_nid2str(gateway_nid), alive ? "up" : "down",
when - now.tv_sec);
- return (EINVAL);
+ return -EINVAL;
}
- LASSERT (when <= now.tv_sec);
-
/* Serialise with lookups (i.e. write lock) */
write_lock_irqsave(&kpr_rwlock, flags);
list_for_each_safe (e, n, &kpr_gateways) {
ge = list_entry(e, kpr_gateway_entry_t, kpge_list);
- if ((gateway_nalid != 0 &&
- ge->kpge_nalid != gateway_nalid) ||
- ge->kpge_nid != gateway_nid)
+ if (ge->kpge_nid != gateway_nid)
continue;
found = 1;
}
ge->kpge_alive = alive;
- CDEBUG(D_NET, "set "LPX64" [%p] %d\n", gateway_nid, ge, alive);
+ CDEBUG(D_NET, "set %s [%p] %d\n",
+ libcfs_nid2str(gateway_nid), ge, alive);
if (alive) {
/* Reset all gateway weights so the newly-enabled gateway
}
}
- found = 0;
- if (!byNal) {
- /* userland notified me: notify NAL? */
- ne = kpr_find_nal_entry_locked (ge->kpge_nalid);
- if (ne != NULL) {
- if (!ne->kpne_shutdown &&
- ne->kpne_interface.kprni_notify != NULL) {
- /* take a ref on this NAL until notifying
- * it has completed... */
- atomic_inc (&ne->kpne_refcount);
- found = 1;
- }
- }
- }
-
write_unlock_irqrestore(&kpr_rwlock, flags);
- if (found) {
- ne->kpne_interface.kprni_notify (ne->kpne_interface.kprni_arg,
- gateway_nid, alive);
- /* 'ne' can disappear now... */
- atomic_dec (&ne->kpne_refcount);
- }
-
- if (byNal) {
+ if (ni == NULL) {
+ /* userland notified me: notify NAL? */
+ ni = ptl_net2ni(PTL_NIDNET(gateway_nid));
+ if (ni != NULL) {
+ ni->ni_nal->nal_notify(ni, gateway_nid, alive);
+ ptl_ni_decref(ni);
+ }
+ } else {
/* It wasn't userland that notified me... */
- CWARN ("Upcall: NAL %x NID "LPX64" (%s) is %s\n",
- gateway_nalid, gateway_nid,
+ CWARN ("Upcall: NID %s is %s\n",
libcfs_nid2str(gateway_nid),
alive ? "alive" : "dead");
- kpr_upcall (gateway_nalid, gateway_nid, alive, when);
- } else {
- CDEBUG (D_NET, " NOT Doing upcall\n");
+ kpr_upcall (gateway_nid, alive, when);
}
-
- return (0);
-}
-
-void
-kpr_nal_notify (void *arg, ptl_nid_t peer, int alive, time_t when)
-{
- kpr_nal_entry_t *ne = (kpr_nal_entry_t *)arg;
-
- kpr_do_notify (1, ne->kpne_interface.kprni_nalid, peer, alive, when);
-}
-
-void
-kpr_shutdown_nal (void *arg)
-{
- unsigned long flags;
- kpr_nal_entry_t *ne = (kpr_nal_entry_t *)arg;
-
- CDEBUG (D_NET, "Shutting down NAL %x\n", ne->kpne_interface.kprni_nalid);
-
- LASSERT (!ne->kpne_shutdown);
- LASSERT (!in_interrupt());
-
- write_lock_irqsave (&kpr_rwlock, flags);
- ne->kpne_shutdown = 1;
- write_unlock_irqrestore (&kpr_rwlock, flags);
-}
-
-void
-kpr_deregister_nal (void *arg)
-{
- unsigned long flags;
- kpr_nal_entry_t *ne = (kpr_nal_entry_t *)arg;
-
- CDEBUG (D_NET, "Deregister NAL %x\n", ne->kpne_interface.kprni_nalid);
-
- LASSERT (ne->kpne_shutdown); /* caller must have issued shutdown already */
- LASSERT (!in_interrupt());
-
- write_lock_irqsave (&kpr_rwlock, flags);
- list_del (&ne->kpne_list);
- write_unlock_irqrestore (&kpr_rwlock, flags);
- /* Wait until all outstanding messages/notifications have completed */
- while (atomic_read (&ne->kpne_refcount) != 0)
- {
- CDEBUG (D_NET, "Waiting for refcount on NAL %x to reach zero (%d)\n",
- ne->kpne_interface.kprni_nalid, atomic_read (&ne->kpne_refcount));
-
- set_current_state (TASK_UNINTERRUPTIBLE);
- schedule_timeout (HZ);
- }
-
- PORTAL_FREE (ne, sizeof (*ne));
- PORTAL_MODULE_UNUSE;
+ return (0);
}
int
atomic_add (weight, &ge->kpge_weight);
}
-int
-kpr_lookup_target (void *arg, ptl_nid_t target_nid, int nob,
- ptl_nid_t *gateway_nidp)
+ptl_nid_t
+kpr_lookup (ptl_ni_t **nip, ptl_nid_t target_nid, int nob)
{
- kpr_nal_entry_t *ne = (kpr_nal_entry_t *)arg;
+ ptl_ni_t *ni = *nip;
+ ptl_nid_t gwnid;
struct list_head *e;
kpr_route_entry_t *re;
+ ptl_ni_t *gwni = NULL;
+ ptl_ni_t *tmpni = NULL;
kpr_gateway_entry_t *ge = NULL;
int rc = -ENOENT;
-
+ __u32 target_net = PTL_NIDNET(target_nid);
+
/* Caller wants to know if 'target_nid' can be reached via a gateway
* ON HER OWN NETWORK */
- CDEBUG (D_NET, "lookup "LPX64" from NAL %x\n", target_nid,
- ne->kpne_interface.kprni_nalid);
+ CDEBUG (D_NET, "lookup "LPX64" from %s\n", target_nid,
+ (ni == NULL) ? "<>" : libcfs_nid2str(ni->ni_nid));
LASSERT (!in_interrupt());
+ if (ni == NULL) { /* ni not determined yet */
+ gwni = ptl_net2ni(target_net); /* is it a local network? */
+ if (gwni != NULL) {
+ *nip = gwni;
+ return ni->ni_nid;
+ }
+ }
+
read_lock (&kpr_rwlock);
- if (ne->kpne_shutdown) { /* caller is shutting down */
+ if (ni != NULL && ni->ni_shutdown) {
+ /* pre-determined ni is shutting down */
read_unlock (&kpr_rwlock);
- return (-ENOENT);
+ return PTL_NID_ANY;
}
/* Search routes for one that has a gateway to target_nid on the callers network */
-
list_for_each (e, &kpr_routes) {
re = list_entry (e, kpr_route_entry_t, kpre_list);
- if (re->kpre_lo_nid > target_nid ||
- re->kpre_hi_nid < target_nid)
+ if (re->kpre_net != target_net) /* incorrect target net */
continue;
- /* found table entry */
-
- if (re->kpre_gateway->kpge_nalid != ne->kpne_interface.kprni_nalid ||
- !re->kpre_gateway->kpge_alive) {
- /* different NAL or gateway down */
- rc = -EHOSTUNREACH;
+ if (!re->kpre_gateway->kpge_alive) /* gateway down */
continue;
+
+ if (ni != NULL) {
+ /* local ni determined */
+ if (PTL_NIDNET(ni->ni_nid) != /* gateway not on ni's net */
+ PTL_NIDNET(re->kpre_gateway->kpge_nid))
+ continue;
+ tmpni = NULL;
+ } else {
+ tmpni = ptl_net2ni(PTL_NIDNET(ge->kpge_nid));
+ if (tmpni == NULL) /* gateway not on a local net */
+ continue;
}
if (ge == NULL ||
- kpr_ge_isbetter (re->kpre_gateway, ge))
- ge = re->kpre_gateway;
+ kpr_ge_isbetter (re->kpre_gateway, ge)) {
+ if (gwni != NULL)
+ ptl_ni_decref(gwni);
+ ge = re->kpre_gateway;
+ gwni = tmpni;
+ } else if (tmpni != NULL) {
+ ptl_ni_decref(tmpni);
+ }
}
- if (ge != NULL) {
- kpr_update_weight (ge, nob);
- *gateway_nidp = ge->kpge_nid;
- rc = 0;
+ if (ge == NULL) {
+ read_unlock (&kpr_rwlock);
+ LASSERT (gwni == NULL);
+
+ return PTL_NID_ANY;
}
+ kpr_update_weight (ge, nob);
+ gwnid = ge->kpge_nid;
read_unlock (&kpr_rwlock);
-
- /* NB can't deref 're' now; it might have been removed! */
-
- CDEBUG (D_NET, "lookup "LPX64" from NAL %x: %d ("LPX64")\n",
- target_nid, ne->kpne_interface.kprni_nalid, rc,
- (rc == 0) ? *gateway_nidp : (ptl_nid_t)0);
- return (rc);
-}
-
-kpr_nal_entry_t *
-kpr_find_nal_entry_locked (int nal_id)
-{
- struct list_head *e;
- /* Called with kpr_rwlock held */
+ /* NB can't deref 're/ge' after lock released! */
+ CDEBUG (D_NET, "lookup %s from %s: %s\n",
+ libcfs_nid2str(target_nid),
+ (ni == NULL) ? "<>" : libcfs_nid2str(ni->ni_nid),
+ libcfs_nid2str(gwnid));
- list_for_each (e, &kpr_nals) {
- kpr_nal_entry_t *ne = list_entry (e, kpr_nal_entry_t, kpne_list);
+ LASSERT ((gwni == NULL) != (ni == NULL));
- if (nal_id != ne->kpne_interface.kprni_nalid) /* no match */
- continue;
+ if (gwni == NULL)
+ ptl_ni_addref(ni); /* extra ref so caller can drop blindly */
+ else
+ *nip = gwni; /* already got a ref */
- return (ne);
- }
-
- return (NULL);
+ return gwnid;
}
void
-kpr_forward_packet (void *arg, kpr_fwd_desc_t *fwd)
+kpr_fwd_start (ptl_ni_t *src_ni, kpr_fwd_desc_t *fwd)
{
- kpr_nal_entry_t *src_ne = (kpr_nal_entry_t *)arg;
ptl_nid_t target_nid = fwd->kprfd_target_nid;
+ __u32 target_net = PTL_NIDNET(target_nid);
+ __u32 source_net = PTL_NIDNET(src_ni->ni_nid);
int nob = fwd->kprfd_nob;
kpr_gateway_entry_t *ge = NULL;
- kpr_nal_entry_t *dst_ne = NULL;
+ ptl_ni_t *dst_ni = NULL;
+ ptl_ni_t *tmp_ni;
struct list_head *e;
kpr_route_entry_t *re;
- kpr_nal_entry_t *tmp_ne;
int rc;
- CDEBUG (D_NET, "forward [%p] "LPX64" from NAL %x\n", fwd,
- target_nid, src_ne->kpne_interface.kprni_nalid);
+ CDEBUG (D_NET, "forward [%p] %s from %s\n", fwd,
+ libcfs_nid2str(target_nid), libcfs_nid2str(src_ni->ni_nid));
LASSERT (nob == ptl_kiov_nob (fwd->kprfd_niov, fwd->kprfd_kiov));
LASSERT (!in_interrupt());
+ fwd->kprfd_src_ni = src_ni; /* stash calling ni */
+
read_lock (&kpr_rwlock);
- kpr_fwd_packets++; /* (loose) stats accounting */
+ kpr_fwd_packets++; /* (loose) stats accounting */
kpr_fwd_bytes += nob + sizeof(ptl_hdr_t);
- if (src_ne->kpne_shutdown) { /* caller is shutting down */
+ if (src_ni->ni_shutdown) { /* caller is shutting down */
rc = -ESHUTDOWN;
goto out;
}
- fwd->kprfd_router_arg = src_ne; /* stash caller's nal entry */
-
/* Search routes for one that has a gateway to target_nid NOT on the caller's network */
list_for_each (e, &kpr_routes) {
re = list_entry (e, kpr_route_entry_t, kpre_list);
- if (re->kpre_lo_nid > target_nid || /* no match */
- re->kpre_hi_nid < target_nid)
+ if (re->kpre_net != target_net) /* no match */
continue;
- if (re->kpre_gateway->kpge_nalid == src_ne->kpne_interface.kprni_nalid)
- continue; /* don't route to same NAL */
+ if (PTL_NIDNET(re->kpre_gateway->kpge_nid) == source_net)
+ continue; /* don't route to same net */
if (!re->kpre_gateway->kpge_alive)
continue; /* gateway is dead */
-
- tmp_ne = kpr_find_nal_entry_locked (re->kpre_gateway->kpge_nalid);
- if (tmp_ne == NULL ||
- tmp_ne->kpne_shutdown) {
- /* NAL must be registered and not shutting down */
+ tmp_ni = ptl_net2ni(PTL_NIDNET(re->kpre_gateway->kpge_nid));
+ if (tmp_ni == NULL)
continue;
- }
+ if (tmp_ni->ni_nal->nal_fwd == NULL) {
+ ptl_ni_decref(tmp_ni); /* doesn't forward */
+ continue;
+ }
+
if (ge == NULL ||
kpr_ge_isbetter (re->kpre_gateway, ge)) {
+ if (dst_ni != NULL)
+ ptl_ni_decref(dst_ni);
+
+ dst_ni = tmp_ni;
ge = re->kpre_gateway;
- dst_ne = tmp_ne;
}
}
if (ge != NULL) {
- LASSERT (dst_ne != NULL);
+ LASSERT (dst_ni != NULL);
kpr_update_weight (ge, nob);
fwd->kprfd_gateway_nid = ge->kpge_nid;
- atomic_inc (&src_ne->kpne_refcount); /* source and dest nals are */
- atomic_inc (&dst_ne->kpne_refcount); /* busy until fwd completes */
atomic_inc (&kpr_queue_depth);
read_unlock (&kpr_rwlock);
- CDEBUG (D_NET, "forward [%p] "LPX64" from NAL %x: "
- "to "LPX64" on NAL %x\n",
- fwd, target_nid, src_ne->kpne_interface.kprni_nalid,
- fwd->kprfd_gateway_nid, dst_ne->kpne_interface.kprni_nalid);
+ CDEBUG (D_NET, "forward [%p] %s: src ni %s dst ni %s gw %s\n",
+ fwd, libcfs_nid2str(target_nid),
+ libcfs_nid2str(src_ni->ni_nid),
+ libcfs_nid2str(dst_ni->ni_nid),
+ libcfs_nid2str(fwd->kprfd_gateway_nid));
- dst_ne->kpne_interface.kprni_fwd (dst_ne->kpne_interface.kprni_arg, fwd);
+ dst_ni->ni_nal->nal_fwd(dst_ni, fwd);
+ ptl_ni_decref(dst_ni);
return;
}
out:
kpr_fwd_errors++;
- CDEBUG (D_NET, "Failed to forward [%p] "LPX64" from NAL %x: %d\n",
- fwd, target_nid, src_ne->kpne_interface.kprni_nalid, rc);
+ CDEBUG (D_NET, "Failed to forward [%p] %s from %s\n", fwd,
+ libcfs_nid2str(target_nid), libcfs_nid2str(src_ni->ni_nid));
- (fwd->kprfd_callback)(fwd->kprfd_callback_arg, rc);
+ (fwd->kprfd_callback)(src_ni, fwd->kprfd_callback_arg, rc);
read_unlock (&kpr_rwlock);
}
void
-kpr_complete_packet (void *arg, kpr_fwd_desc_t *fwd, int error)
+kpr_fwd_done (ptl_ni_t *dst_ni, kpr_fwd_desc_t *fwd, int error)
{
- kpr_nal_entry_t *dst_ne = (kpr_nal_entry_t *)arg;
- kpr_nal_entry_t *src_ne = (kpr_nal_entry_t *)fwd->kprfd_router_arg;
-
- CDEBUG (D_NET, "complete(1) [%p] from NAL %x to NAL %x: %d\n", fwd,
- src_ne->kpne_interface.kprni_nalid, dst_ne->kpne_interface.kprni_nalid, error);
+ ptl_ni_t *src_ni = fwd->kprfd_src_ni;
- atomic_dec (&dst_ne->kpne_refcount); /* CAVEAT EMPTOR dst_ne can disappear now!!! */
+ CDEBUG (D_NET, "complete(1) [%p] from %s to %s: %d\n", fwd,
+ libcfs_nid2str(src_ni->ni_nid),
+ libcfs_nid2str(dst_ni->ni_nid), error);
- (fwd->kprfd_callback)(fwd->kprfd_callback_arg, error);
-
- CDEBUG (D_NET, "complete(2) [%p] from NAL %x: %d\n", fwd,
- src_ne->kpne_interface.kprni_nalid, error);
+ (fwd->kprfd_callback)(src_ni, fwd->kprfd_callback_arg, error);
atomic_dec (&kpr_queue_depth);
- atomic_dec (&src_ne->kpne_refcount); /* CAVEAT EMPTOR src_ne can disappear now!!! */
}
int
-kpr_add_route (int gateway_nalid, ptl_nid_t gateway_nid,
- ptl_nid_t lo_nid, ptl_nid_t hi_nid)
+kpr_add_route (__u32 net, ptl_nid_t gateway_nid)
{
unsigned long flags;
struct list_head *e;
kpr_gateway_entry_t *ge;
int dup = 0;
- CDEBUG(D_NET, "Add route: %x "LPX64" : "LPX64" - "LPX64"\n",
- gateway_nalid, gateway_nid, lo_nid, hi_nid);
+ CDEBUG(D_NET, "Add route: net %s : gw %s\n",
+ libcfs_net2str(net), libcfs_nid2str(gateway_nid));
- if (gateway_nalid == PTL_NID_ANY ||
- lo_nid == PTL_NID_ANY ||
- hi_nid == PTL_NID_ANY ||
- lo_nid > hi_nid)
+ if (gateway_nid == PTL_NID_ANY)
return (-EINVAL);
PORTAL_ALLOC (ge, sizeof (*ge));
if (ge == NULL)
return (-ENOMEM);
- ge->kpge_nalid = gateway_nalid;
ge->kpge_nid = gateway_nid;
ge->kpge_alive = 1;
ge->kpge_timestamp = 0;
return (-ENOMEM);
}
- re->kpre_lo_nid = lo_nid;
- re->kpre_hi_nid = hi_nid;
+ re->kpre_net = net;
LASSERT(!in_interrupt());
write_lock_irqsave (&kpr_rwlock, flags);
kpr_gateway_entry_t *ge2 = list_entry(e, kpr_gateway_entry_t,
kpge_list);
- if (ge2->kpge_nalid == gateway_nalid &&
- ge2->kpge_nid == gateway_nid) {
+ if (ge2->kpge_nid == gateway_nid) {
PORTAL_FREE (ge, sizeof (*ge));
ge = ge2;
dup = 1;
}
int
-kpr_sys_notify (int gateway_nalid, ptl_nid_t gateway_nid,
- int alive, time_t when)
+kpr_del_route (__u32 net, ptl_nid_t gw_nid)
{
- return (kpr_do_notify (0, gateway_nalid, gateway_nid, alive, when));
-}
-
-int
-kpr_del_route (int gw_nalid, ptl_nid_t gw_nid,
- ptl_nid_t lo, ptl_nid_t hi)
-{
- int specific = (lo != PTL_NID_ANY);
unsigned long flags;
int rc = -ENOENT;
struct list_head *e;
struct list_head *n;
- CDEBUG(D_NET, "Del route [%x] "LPX64" : "LPX64" - "LPX64"\n",
- gw_nalid, gw_nid, lo, hi);
-
+ CDEBUG(D_NET, "Del route: net %s : gw %s\n",
+ libcfs_net2str(net), libcfs_nid2str(gw_nid));
LASSERT(!in_interrupt());
/* NB Caller may specify either all routes via the given gateway
- * (lo/hi == PTL_NID_ANY) or a specific route entry (lo/hi are
- * actual NIDs) */
- if (specific ? (hi == PTL_NID_ANY || hi < lo) : (hi != PTL_NID_ANY))
- return (-EINVAL);
+ * or a specific route entry actual NIDs) */
write_lock_irqsave(&kpr_rwlock, flags);
kpre_list);
kpr_gateway_entry_t *ge = re->kpre_gateway;
- if (ge->kpge_nalid != gw_nalid ||
- ge->kpge_nid != gw_nid ||
- (specific &&
- (lo != re->kpre_lo_nid || hi != re->kpre_hi_nid)))
+ if (!(net == PTL_NIDNET(PTL_NID_ANY) ||
+ net == re->kpre_net))
+ continue;
+
+ if (!(gw_nid == PTL_NID_ANY ||
+ gw_nid == ge->kpge_nid))
continue;
rc = 0;
list_del (&re->kpre_list);
PORTAL_FREE(re, sizeof (*re));
-
- if (specific)
- break;
}
kpr_routes_generation++;
}
int
-kpr_get_route (int idx, __u32 *gateway_nalid, ptl_nid_t *gateway_nid,
- ptl_nid_t *lo_nid, ptl_nid_t *hi_nid, __u32 *alive)
+kpr_get_route (int idx, __u32 *net, ptl_nid_t *gateway_nid, __u32 *alive)
{
struct list_head *e;
kpr_gateway_entry_t *ge = re->kpre_gateway;
if (idx-- == 0) {
- *gateway_nalid = ge->kpge_nalid;
+ *net = re->kpre_net;
*gateway_nid = ge->kpge_nid;
*alive = ge->kpge_alive;
- *lo_nid = re->kpre_lo_nid;
- *hi_nid = re->kpre_hi_nid;
read_unlock(&kpr_rwlock);
return (0);
return (-ENOENT);
}
-static int
-kpr_nal_cmd(struct portals_cfg *pcfg, void * private)
+int
+kpr_ctl(unsigned int cmd, void *arg)
{
- int err = -EINVAL;
- ENTRY;
+ struct portal_ioctl_data *data = arg;
- switch(pcfg->pcfg_command) {
+ switch(cmd) {
default:
- CDEBUG(D_IOCTL, "Inappropriate cmd: %d\n", pcfg->pcfg_command);
- break;
+ return -EINVAL;
- case NAL_CMD_ADD_ROUTE:
- CDEBUG(D_IOCTL, "Adding route: [%x] "LPU64" : "LPU64" - "LPU64"\n",
- pcfg->pcfg_nal, pcfg->pcfg_nid,
- pcfg->pcfg_nid2, pcfg->pcfg_nid3);
- err = kpr_add_route(pcfg->pcfg_gw_nal, pcfg->pcfg_nid,
- pcfg->pcfg_nid2, pcfg->pcfg_nid3);
- break;
+ case IOC_PORTAL_ADD_ROUTE:
+ return kpr_add_route(data->ioc_net, data->ioc_nid);
- case NAL_CMD_DEL_ROUTE:
- CDEBUG (D_IOCTL, "Removing routes via [%x] "LPU64" : "LPU64" - "LPU64"\n",
- pcfg->pcfg_gw_nal, pcfg->pcfg_nid,
- pcfg->pcfg_nid2, pcfg->pcfg_nid3);
- err = kpr_del_route (pcfg->pcfg_gw_nal, pcfg->pcfg_nid,
- pcfg->pcfg_nid2, pcfg->pcfg_nid3);
- break;
+ case IOC_PORTAL_DEL_ROUTE:
+ return kpr_del_route (data->ioc_net, data->ioc_nid);
- case NAL_CMD_NOTIFY_ROUTER: {
- CDEBUG (D_IOCTL, "Notifying peer [%x] "LPU64" %s @ %ld\n",
- pcfg->pcfg_gw_nal, pcfg->pcfg_nid,
- pcfg->pcfg_flags ? "Enabling" : "Disabling",
- (time_t)pcfg->pcfg_nid3);
-
- err = kpr_sys_notify (pcfg->pcfg_gw_nal, pcfg->pcfg_nid,
- pcfg->pcfg_flags, (time_t)pcfg->pcfg_nid3);
- break;
- }
-
- case NAL_CMD_GET_ROUTE:
- CDEBUG (D_IOCTL, "Getting route [%d]\n", pcfg->pcfg_count);
- err = kpr_get_route(pcfg->pcfg_count, &pcfg->pcfg_gw_nal,
- &pcfg->pcfg_nid,
- &pcfg->pcfg_nid2, &pcfg->pcfg_nid3,
- &pcfg->pcfg_flags);
- break;
+ case IOC_PORTAL_GET_ROUTE:
+ return kpr_get_route(data->ioc_count, &data->ioc_net,
+ &data->ioc_nid, &data->ioc_flags);
+
+ case IOC_PORTAL_NOTIFY_ROUTER:
+ return kpr_notify(NULL, data->ioc_nid, data->ioc_flags,
+ (time_t)data->ioc_u64[0]);
}
- RETURN(err);
}
-static void /*__exit*/
+void
kpr_finalise (void)
{
- LASSERT (list_empty (&kpr_nals));
-
- libcfs_nal_cmd_unregister(ROUTER);
-
- PORTAL_SYMBOL_UNREGISTER(kpr_router_interface);
-
+#ifdef __KERNEL__
kpr_proc_fini();
-
+#endif
while (!list_empty (&kpr_routes)) {
kpr_route_entry_t *re = list_entry(kpr_routes.next,
kpr_route_entry_t,
PORTAL_FREE(re, sizeof (*re));
}
+ while (!list_empty (&kpr_gateways)) {
+ kpr_gateway_entry_t *ge = list_entry(kpr_gateways.next,
+ kpr_gateway_entry_t,
+ kpge_list);
+
+ list_del(&ge->kpge_list);
+ PORTAL_FREE(ge, sizeof (*ge));
+ }
+
CDEBUG(D_MALLOC, "kpr_finalise: kmem back to %d\n",
atomic_read(&portal_kmemory));
}
-static int __init
+void
kpr_initialise (void)
{
int rc;
atomic_read(&portal_kmemory));
kpr_routes_generation = 0;
- kpr_proc_init();
- rc = libcfs_nal_cmd_register(ROUTER, kpr_nal_cmd, NULL);
- if (rc != 0) {
- CERROR("Can't register nal cmd handler\n");
- return (rc);
- }
-
- PORTAL_SYMBOL_REGISTER(kpr_router_interface);
- return (0);
+#ifdef __KERNEL__
+ kpr_proc_init();
+#endif
}
-MODULE_AUTHOR("Eric Barton");
-MODULE_DESCRIPTION("Kernel Portals Router v0.01");
-MODULE_LICENSE("GPL");
-
-module_init (kpr_initialise);
-module_exit (kpr_finalise);
-
-EXPORT_SYMBOL (kpr_router_interface);
+EXPORT_SYMBOL(kpr_routing);
+EXPORT_SYMBOL(kpr_lookup);
+EXPORT_SYMBOL(kpr_fwd_start);
+EXPORT_SYMBOL(kpr_fwd_done);
+EXPORT_SYMBOL(kpr_notify);
typedef struct
{
- struct list_head kpne_list;
- kpr_nal_interface_t kpne_interface;
- atomic_t kpne_refcount;
- int kpne_shutdown;
-} kpr_nal_entry_t;
-
-typedef struct
-{
struct list_head kpge_list;
atomic_t kpge_weight;
time_t kpge_timestamp;
int kpge_alive;
- int kpge_nalid;
int kpge_refcount;
ptl_nid_t kpge_nid;
} kpr_gateway_entry_t;
{
struct list_head kpre_list;
kpr_gateway_entry_t *kpre_gateway;
- ptl_nid_t kpre_lo_nid;
- ptl_nid_t kpre_hi_nid;
+ __u32 kpre_net;
} kpr_route_entry_t;
typedef struct
{
work_struct_t kpru_tq;
- int kpru_nal_id;
ptl_nid_t kpru_nid;
int kpru_alive;
time_t kpru_when;
} kpr_upcall_t;
-extern int kpr_register_nal (kpr_nal_interface_t *nalif, void **argp);
-extern int kpr_lookup_target (void *arg, ptl_nid_t target_nid, int nob,
- ptl_nid_t *gateway_nidp);
-extern kpr_nal_entry_t *kpr_find_nal_entry_locked (int nal_id);
-extern void kpr_forward_packet (void *arg, kpr_fwd_desc_t *fwd);
-extern void kpr_complete_packet (void *arg, kpr_fwd_desc_t *fwd, int error);
-extern void kpr_nal_notify (void *arg, ptl_nid_t peer,
- int alive, time_t when);
-extern void kpr_shutdown_nal (void *arg);
-extern void kpr_deregister_nal (void *arg);
-
extern void kpr_proc_init (void);
extern void kpr_proc_fini (void);
struct pingcli_data {
- struct portal_ioctl_data *args;
+ int count;
+ int size;
+ ptl_nid_t nid;
+ int timeout;
ptl_handle_me_t me;
ptl_handle_eq_t eq;
char *inbuf;
static void
pingcli_shutdown(ptl_handle_ni_t nih, int err)
{
- struct portal_ioctl_data *args = client->args;
int rc;
/* Yes, we are intentionally allowing us to fall through each
case 4:
/* Free our buffers */
if (client->outbuf != NULL)
- PORTAL_FREE (client->outbuf, STDSIZE + args->ioc_size);
+ PORTAL_FREE (client->outbuf, STDSIZE + client->size);
if (client->inbuf != NULL)
PORTAL_FREE (client->inbuf,
- (args->ioc_size + STDSIZE) * args->ioc_count);
+ (client->size + STDSIZE) * client->count);
if (client != NULL)
PORTAL_FREE (client,
}
-static struct pingcli_data *
+static void
pingcli_start(struct portal_ioctl_data *args)
{
ptl_handle_ni_t nih = PTL_INVALID_HANDLE;
struct timeval tv1, tv2;
client->tsk = cfs_current();
- client->args = args;
- CDEBUG (D_OTHER, "pingcli_setup args: nid "LPX64" (%s), \
+ client->nid = args->ioc_nid;
+ client->count = args->ioc_count;
+ client->size = args->ioc_u32[0];
+ client->timeout = args->ioc_u32[1];
+
+ CDEBUG (D_OTHER, "pingcli_setup args: nid "LPX64" (%s), \
size %u, count: %u, timeout: %u\n",
- args->ioc_nid,
- libcfs_nid2str(args->ioc_nid),
- args->ioc_size, args->ioc_count, args->ioc_timeout);
+ client->nid,
+ libcfs_nid2str(client->nid),
+ client->size, client->count, client->timeout);
- PORTAL_ALLOC (client->outbuf, STDSIZE + args->ioc_size) ;
+ PORTAL_ALLOC (client->outbuf, STDSIZE + client->size) ;
if (client->outbuf == NULL)
{
CERROR ("Unable to allocate out_buf ("LPSZ" bytes)\n", STDSIZE);
pingcli_shutdown (nih, 4);
- return (NULL);
+ return;
}
PORTAL_ALLOC (client->inbuf,
- (args->ioc_size + STDSIZE) * args->ioc_count);
+ (client->size + STDSIZE) * client->count);
if (client->inbuf == NULL)
{
CERROR ("Unable to allocate out_buf ("LPSZ" bytes)\n", STDSIZE);
pingcli_shutdown (nih, 4);
- return (NULL);
+ return;
}
rc = PtlNIInit(PTL_IFACE_DEFAULT, 0, NULL, NULL, &nih);
{
CERROR ("PtlNIInit: error %d\n", rc);
pingcli_shutdown (nih, 4);
- return (NULL);
+ return;
}
/* Based on the initialization aquire our unique portal ID. */
{
CERROR ("PtlGetId error %d\n", rc);
pingcli_shutdown (nih, 2);
- return (NULL);
+ return;
}
/* Setup the local match entries */
client->id_local.pid = PTL_PID_ANY;
/* Setup the remote match entries */
- client->id_remote.nid = args->ioc_nid;
+ client->id_remote.nid = client->nid;
client->id_remote.pid = 0;
if ((rc = PtlMEAttach (nih, PTL_PING_CLIENT,
{
CERROR ("PtlMEAttach error %d\n", rc);
pingcli_shutdown (nih, 2);
- return (NULL);
+ return;
}
/* Allocate the event queue for this network interface */
{
CERROR ("PtlEQAlloc error %d\n", rc);
pingcli_shutdown (nih, 2);
- return (NULL);
+ return;
}
- count = args->ioc_count;
+ count = client->count;
client->md_in_head.start = client->inbuf;
- client->md_in_head.length = (args->ioc_size + STDSIZE)
- * count;
+ client->md_in_head.length = (client->size + STDSIZE) * count;
client->md_in_head.threshold = PTL_MD_THRESH_INF;
client->md_in_head.options = PTL_MD_EVENT_START_DISABLE | PTL_MD_OP_PUT;
client->md_in_head.user_ptr = NULL;
client->md_in_head.eq_handle = client->eq;
- memset (client->inbuf, 0, (args->ioc_size + STDSIZE) * count);
+ memset (client->inbuf, 0, (client->size + STDSIZE) * count);
/* Attach the incoming buffer */
if ((rc = PtlMDAttach (client->me, client->md_in_head,
PTL_UNLINK, &client->md_in_head_h))) {
CERROR ("PtlMDAttach error %d\n", rc);
pingcli_shutdown (nih, 1);
- return (NULL);
+ return;
}
/* Setup the outgoing ping header */
client->md_out_head.start = client->outbuf;
- client->md_out_head.length = STDSIZE + args->ioc_size;
- client->md_out_head.threshold = args->ioc_count;
+ client->md_out_head.length = STDSIZE + client->size;
+ client->md_out_head.threshold = client->count;
client->md_out_head.options = PTL_MD_EVENT_START_DISABLE | PTL_MD_OP_PUT;
client->md_out_head.user_ptr = NULL;
client->md_out_head.eq_handle = PTL_EQ_NONE;
PTL_UNLINK, &client->md_out_head_h))) {
CERROR ("PtlMDBind error %d\n", rc);
pingcli_shutdown (nih, 1);
- return NULL;
+ return;
}
- while ((args->ioc_count - count)) {
+ while ((client->count - count)) {
unsigned __count;
__count = __cpu_to_le32(count);
client->id_remote, PTL_PING_SERVER, 0, 0, 0, 0))) {
PDEBUG ("PtlPut (header)", rc);
pingcli_shutdown (nih, 1);
- return NULL;
+ return;
}
CWARN ("Lustre: sent msg no %d.\n", count);
set_current_state (TASK_INTERRUPTIBLE);
- rc = schedule_timeout (cfs_time_seconds(args->ioc_timeout));
+ rc = schedule_timeout (cfs_time_seconds(client->timeout));
if (rc == 0) {
CERROR ("timeout .....\n");
} else {
pingcli_shutdown (nih, 2);
- /* Success! */
- return NULL;
} /* pingcli_setup() */
}
-static struct pingcli_data *
+static void
pingcli_start(struct portal_ioctl_data *args)
{
ptl_handle_ni_t nih = PTL_INVALID_HANDLE;
int rc;
client->tsk = current;
- client->args = args;
-
+ client->nid = args->ioc_nid;
+ client->count = args->ioc_count;
+ client->size = args->ioc_u32[0];
+ client->timeout = args->ioc_u32[1];
+
CDEBUG (D_OTHER, "pingcli_setup args: nid "LPX64" (%s), "
"size %u, count: %u, timeout: %u\n",
- args->ioc_nid,
- libcfs_nid2str(args->ioc_nid),
- args->ioc_size, args->ioc_count, args->ioc_timeout);
+ client->nid,
+ libcfs_nid2str(client->nid),
+ client->size, client->count, client->timeout);
PORTAL_ALLOC (client->outbuf, STDSIZE) ;
{
CERROR ("Unable to allocate out_buf ("LPSZ" bytes)\n", STDSIZE);
pingcli_shutdown (nih, 4);
- return (NULL);
+ return;
}
PORTAL_ALLOC (client->inbuf, STDSIZE);
{
CERROR ("Unable to allocate out_buf ("LPSZ" bytes)\n", STDSIZE);
pingcli_shutdown (nih, 4);
- return (NULL);
+ return;
}
/* Aquire and initialize the proper nal for portals. */
{
CERROR ("PtlNIInit: error %d\n", rc);
pingcli_shutdown (nih, 4);
- return (NULL);
+ return;
}
/* Based on the initialization aquire our unique portal ID. */
{
CERROR ("PtlGetId error %d\n", rc);
pingcli_shutdown (nih, 2);
- return (NULL);
+ return;
}
/* Setup the local match entries */
client->id_local.pid = PTL_PID_ANY;
/* Setup the remote match entries */
- client->id_remote.nid = args->ioc_nid;
+ client->id_remote.nid = client->nid;
client->id_remote.pid = 0;
if ((rc = PtlMEAttach (nih, PTL_PING_CLIENT,
{
CERROR ("PtlMEAttach error %d\n", rc);
pingcli_shutdown (nih, 2);
- return (NULL);
+ return;
}
/* Allocate the event queue for this network interface */
{
CERROR ("PtlEQAlloc error %d\n", rc);
pingcli_shutdown (nih, 2);
- return (NULL);
+ return;
}
PTL_UNLINK, &client->md_in_head_h))) {
CERROR ("PtlMDAttach error %d\n", rc);
pingcli_shutdown (nih, 1);
- return (NULL);
+ return;
}
/* Setup the outgoing ping header */
PTL_UNLINK, &client->md_out_head_h))) {
CERROR ("PtlMDBind error %d\n", rc);
pingcli_shutdown (nih, 1);
- return (NULL);
+ return;
}
/* Put the ping packet */
if((rc = PtlPut (client->md_out_head_h, PTL_NOACK_REQ,
client->id_remote, PTL_PING_SERVER, 0, 0, 0, 0))) {
PDEBUG ("PtlPut (header)", rc);
pingcli_shutdown (nih, 1);
- return NULL;
+ return;
}
count = 0;
set_current_state (TASK_INTERRUPTIBLE);
- rc = schedule_timeout (20 * args->ioc_timeout);
+ rc = schedule_timeout (20 * client->timeout);
if (rc == 0) {
CERROR ("Time out on the server\n");
pingcli_shutdown (nih, 2);
- return NULL;
+ return;
} else {
CWARN("Received respose from the server \n");
}
pingcli_shutdown (nih, 2);
- /* Success! */
- return NULL;
} /* pingcli_setup() */
ptl_msg_t *cookie,
ptl_hdr_t *hdr,
int type,
- ptl_nid_t nid,
- ptl_pid_t pid,
+ ptl_process_id_t target,
+ int routing,
unsigned int niov,
struct iovec *iov,
size_t offset,
int ntiov;
int i;
+ if (routing) {
+ CERROR("Can't route\n");
+ return PTL_FAIL;
+ }
+
if (!(c=force_tcp_connection((manager)b->lower,
- PNAL_IP(nid,b),
- PNAL_PORT(nid,pid),
+ PNAL_IP(target.nid,b),
+ PNAL_PORT(target.nid,target.pid),
b->local)))
return(PTL_FAIL);
ptl_msg_t *cookie,
ptl_hdr_t *hdr,
int type,
- ptl_nid_t nid,
- ptl_pid_t pid,
+ ptl_process_id_t target,
+ int routing,
unsigned int niov,
struct iovec *iov,
size_t offset,
int ntiov;
int i;
+ if (routing) {
+ CERROR("Can't route\n");
+ return PTL_FAIL;
+ }
+
if (!(c=force_tcp_connection((manager)b->lower,
- PNAL_IP(nid,b),
- PNAL_PORT(nid,pid),
+ PNAL_IP(target.nid,b),
+ PNAL_PORT(target.nid,target.pid),
b->local)))
return(PTL_FAIL);
lib_LIBRARIES = libptlctl.a
-libptlctl_a_SOURCES = portals.c debug.c l_ioctl.c parser.c parser.h
+libptlctl_a_SOURCES = portals.c nidstrings.c debug.c l_ioctl.c parser.c parser.h
if UTILS
if !CRAY_PORTALS
debugctl_SOURCES = debugctl.c
debugctl_LDADD = -L. -lptlctl $(LIBREADLINE) $(LIBEFENCE)
debugctl_DEPENDENCIES = libptlctl.a
+
+nidstrings.c: @top_srcdir@/portals/libcfs/nidstrings.c
+ ln -sf $< $@
+++ /dev/null
-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- */
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/tcp.h>
-#include <netdb.h>
-#include <stdlib.h>
-#include <string.h>
-#include <fcntl.h>
-#include <sys/ioctl.h>
-#include <unistd.h>
-#include <syslog.h>
-#include <errno.h>
-#ifdef HAVE_LIBWRAP
-#include <arpa/inet.h>
-#include <netinet/in.h>
-#include <tcpd.h>
-#endif
-
-#include <libcfs/portals_utils.h>
-#include <portals/api-support.h>
-#include <portals/lib-types.h>
-#include <portals/socknal.h>
-
-/* should get this from autoconf somehow */
-#ifndef PIDFILE_DIR
-#define PIDFILE_DIR "/var/run"
-#endif
-
-#define PROGNAME "acceptor"
-
-#ifdef HAVE_LIBWRAP
-/* needed because libwrap declares these as externs */
-int allow_severity = LOG_INFO;
-int deny_severity = LOG_WARNING;
-#endif
-
-void create_pidfile(char *name, int port)
-{
- char pidfile[1024];
- FILE *fp;
-
- snprintf(pidfile, sizeof(pidfile), "%s/%s-%d.pid",
- PIDFILE_DIR, name, port);
-
- if ((fp = fopen(pidfile, "w"))) {
- fprintf(fp, "%d\n", getpid());
- fclose(fp);
- } else {
- syslog(LOG_ERR, "%s: %s\n", pidfile,
- strerror(errno));
- }
-}
-
-int pidfile_exists(char *name, int port)
-{
- char pidfile[1024];
-
- snprintf(pidfile, sizeof(pidfile), "%s/%s-%d.pid",
- PIDFILE_DIR, name, port);
-
- if (!access(pidfile, F_OK)) {
- fprintf(stderr, "%s: exists, acceptor already running.\n",
- pidfile);
- return (1);
- }
- return (0);
-}
-
-void
-show_connection (int fd, __u32 net_ip)
-{
- struct hostent *h = gethostbyaddr ((char *)&net_ip, sizeof net_ip, AF_INET);
- __u32 host_ip = ntohl (net_ip);
- int len;
- char host[1024];
-
- if (h == NULL)
- snprintf (host, sizeof(host), "%d.%d.%d.%d", (host_ip >> 24) & 0xff,
- (host_ip >> 16) & 0xff, (host_ip >> 8) & 0xff, host_ip & 0xff);
- else
- snprintf (host, sizeof(host), "%s", h->h_name);
-
- syslog (LOG_INFO, "Accepted host: %s\n", host);
-}
-
-void
-usage (char *myname)
-{
- fprintf (stderr,
- "Usage: %s [-N nal_id] [-p] [-l] port\n\n"
- " -l\tKeep stdin/stdout open\n"
- " -p\tAllow connections from non-privileged ports\n",
- myname);
- exit (1);
-}
-
-int main(int argc, char **argv)
-{
- int o, fd, rc, port, pfd;
- struct sockaddr_in srvaddr;
- int c;
- int noclose = 0;
- int nal = SOCKNAL;
- int rport;
- int require_privports = 1;
-
- while ((c = getopt (argc, argv, "N:lp")) != -1) {
- switch (c) {
- case 'N':
- if (sscanf(optarg, "%d", &nal) != 1 ||
- nal < 0 || nal > NAL_MAX_NR)
- usage(argv[0]);
- break;
- case 'l':
- noclose = 1;
- break;
- case 'p':
- require_privports = 0;
- break;
- default:
- usage (argv[0]);
- break;
- }
- }
-
- if (optind >= argc)
- usage (argv[0]);
-
- port = atol(argv[optind++]);
-
- if (pidfile_exists(PROGNAME, port))
- exit(1);
-
- memset(&srvaddr, 0, sizeof(srvaddr));
- srvaddr.sin_family = AF_INET;
- srvaddr.sin_port = htons(port);
- srvaddr.sin_addr.s_addr = INADDR_ANY;
-
- fd = socket(PF_INET, SOCK_STREAM, 0);
- if (fd < 0) {
- perror("opening socket");
- exit(1);
- }
-
- o = 1;
- if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &o, sizeof(o))) {
- perror("Cannot set REUSEADDR socket opt");
- exit(1);
- }
-
- rc = bind(fd, (struct sockaddr *)&srvaddr, sizeof(srvaddr));
- if ( rc == -1 ) {
- perror("bind: ");
- exit(1);
- }
-
- if (listen(fd, 127)) {
- perror("listen: ");
- exit(1);
- }
- fprintf(stderr, "listening on port %d\n", port);
-
- pfd = open("/dev/portals", O_RDWR);
- if ( pfd < 0 ) {
- perror("opening portals device");
- exit(1);
- }
-
- rc = daemon(0, noclose);
- if (rc < 0) {
- perror("daemon(): ");
- exit(1);
- }
-
- openlog(PROGNAME, LOG_PID, LOG_DAEMON);
- syslog(LOG_INFO, "started, listening on port %d\n", port);
- create_pidfile(PROGNAME, port);
-
- while (1) {
- struct sockaddr_in clntaddr;
- int len = sizeof(clntaddr);
- int cfd;
- struct portal_ioctl_data data;
- struct portals_cfg pcfg;
-#ifdef HAVE_LIBWRAP
- struct request_info request;
-#endif
- char addrstr[INET_ADDRSTRLEN];
-
- cfd = accept(fd, (struct sockaddr *)&clntaddr, &len);
- if ( cfd < 0 ) {
- perror("accept");
- exit(0);
- continue;
- }
-
-#ifdef HAVE_LIBWRAP
- /* libwrap access control */
- request_init(&request, RQ_DAEMON, "lustre", RQ_FILE, cfd, 0);
- sock_host(&request);
- if (!hosts_access(&request)) {
- inet_ntop(AF_INET, &clntaddr.sin_addr,
- addrstr, INET_ADDRSTRLEN);
- syslog(LOG_WARNING, "Unauthorized access from %s:%hd\n",
- addrstr, ntohs(clntaddr.sin_port));
- close (cfd);
- continue;
- }
-#endif
-
- if (require_privports && ntohs(clntaddr.sin_port) >= IPPORT_RESERVED) {
- inet_ntop(AF_INET, &clntaddr.sin_addr,
- addrstr, INET_ADDRSTRLEN);
- syslog(LOG_ERR, "Closing non-privileged connection from %s:%d\n",
- addrstr, ntohs(clntaddr.sin_port));
- rc = close(cfd);
- if (rc)
- perror ("close un-privileged client failed");
- continue;
- }
-
- show_connection (cfd, clntaddr.sin_addr.s_addr);
-
- PCFG_INIT(pcfg, NAL_CMD_REGISTER_PEER_FD);
- pcfg.pcfg_nal = nal;
- pcfg.pcfg_fd = cfd;
- pcfg.pcfg_misc = SOCKNAL_CONN_NONE; /* == incoming connection */
-
- PORTAL_IOC_INIT(data);
- data.ioc_pbuf1 = (char*)&pcfg;
- data.ioc_plen1 = sizeof(pcfg);
-
- if (ioctl(pfd, IOC_PORTAL_NAL_CMD, &data) < 0) {
- perror("ioctl failed");
- } else {
- printf("client registered\n");
- }
- rc = close(cfd);
- if (rc)
- perror ("close failed");
- }
-
- closelog();
- exit(0);
-
-}
#include <gm.h>
-#define GMNAL_IOC_GET_GNID 1
/*
* portals always uses unit 0
* Can this be configurable?
#include <libcfs/portals_utils.h>
#include <portals/api-support.h>
#include <portals/ptlctl.h>
-#include <portals/lib-types.h>
#include <portals/socknal.h>
#include "parser.h"
unsigned int portal_debug;
unsigned int portal_printk;
-static unsigned int g_nal = 0;
-
-typedef struct
-{
- char *name;
- int num;
-} name2num_t;
-
-static name2num_t nalnames[] = {
- {"any", 0},
-#if !CRAY_PORTALS
- {"tcp", SOCKNAL},
- {"elan", QSWNAL},
- {"gm", GMNAL},
- {"openib", OPENIBNAL},
- {"iib", IIBNAL},
- {"vib", VIBNAL},
- {"lo", LONAL},
- {"ra", RANAL},
-#else
- {"cray_kern_nal", CRAY_KERN_NAL},
- {"cray_user_nal", CRAY_USER_NAL},
- {"cray_qk_nal", CRAY_QK_NAL},
-#endif
- {NULL, -1}
-};
-
-static cfg_record_cb_t g_record_cb;
+static int g_net_set;
+static __u32 g_net;
/* Convert a string boolean to an int; "enable" -> 1 */
-int ptl_parse_bool (int *b, char *str) {
+int
+ptl_parse_bool (int *b, char *str)
+{
if (!strcasecmp (str, "no") ||
!strcasecmp (str, "n") ||
!strcasecmp (str, "off") ||
return (-1);
}
-/* Convert human readable size string to and int; "1k" -> 1000 */
-int ptl_parse_size (int *sizep, char *str) {
- int size;
- char mod[32];
-
- switch (sscanf (str, "%d%1[gGmMkK]", &size, mod)) {
- default:
- return (-1);
-
- case 1:
- *sizep = size;
- return (0);
-
- case 2:
- switch (*mod) {
- case 'g':
- case 'G':
- *sizep = size << 30;
- return (0);
-
- case 'm':
- case 'M':
- *sizep = size << 20;
- return (0);
-
- case 'k':
- case 'K':
- *sizep = size << 10;
- return (0);
-
- default:
- *sizep = size;
- return (0);
- }
- }
-}
-
-int
-ptl_set_cfg_record_cb(cfg_record_cb_t cb)
-{
- g_record_cb = cb;
- return 0;
-}
-
-int
-pcfg_ioctl(struct portals_cfg *pcfg)
-{
- int rc;
-
- if (pcfg->pcfg_nal ==0)
- pcfg->pcfg_nal = g_nal;
-
- if (g_record_cb) {
- rc = g_record_cb(PORTALS_CFG_TYPE, sizeof(*pcfg), pcfg);
- } else {
- struct portal_ioctl_data data;
- PORTAL_IOC_INIT (data);
- data.ioc_pbuf1 = (char*)pcfg;
- data.ioc_plen1 = sizeof(*pcfg);
- /* XXX liblustre hack XXX */
- data.ioc_nal_cmd = pcfg->pcfg_command;
- data.ioc_nid = pcfg->pcfg_nid;
-
- rc = l_ioctl (PORTALS_DEV_ID, IOC_PORTAL_NAL_CMD, &data);
-
- if (rc == 0 && pcfg->pcfg_version != PORTALS_CFG_VERSION)
- return -EINVAL;
- }
-
- return (rc);
-}
-
-
-
-static name2num_t *
-name2num_lookup_name (name2num_t *table, char *str)
-{
- while (table->name != NULL)
- if (!strcmp (str, table->name))
- return (table);
- else
- table++;
- return (NULL);
-}
-
-static name2num_t *
-name2num_lookup_num (name2num_t *table, int num)
-{
- while (table->name != NULL)
- if (num == table->num)
- return (table);
- else
- table++;
- return (NULL);
-}
-
int
-ptl_name2nal (char *str)
-{
- name2num_t *e = name2num_lookup_name (nalnames, str);
-
- return ((e == NULL) ? -1 : e->num);
-}
-
-static char *
-nal2name (int nal)
+ptl_parse_port (int *port, char *str)
{
- name2num_t *e = name2num_lookup_num (nalnames, nal);
+ char *end;
+
+ *port = strtol (str, &end, 0);
- return ((e == NULL) ? "???" : e->name);
+ if (*end == 0 && /* parsed whole string */
+ *port > 0 && *port < 65536) /* minimal sanity check */
+ return (0);
+
+ return (-1);
}
#ifdef HAVE_GETHOSTBYNAME
#endif
int
-ptl_parse_port (int *port, char *str)
-{
- char *end;
-
- *port = strtol (str, &end, 0);
-
- if (*end == 0 && /* parsed whole string */
- *port > 0 && *port < 65536) /* minimal sanity check */
- return (0);
-
- return (-1);
-}
-
-int
-ptl_parse_time (time_t *t, char *str)
-{
- char *end;
- int n;
- struct tm tm;
-
- *t = strtol (str, &end, 0);
- if (*end == 0) /* parsed whole string */
- return (0);
-
- memset (&tm, 0, sizeof (tm));
- n = sscanf (str, "%d-%d-%d-%d:%d:%d",
- &tm.tm_year, &tm.tm_mon, &tm.tm_mday,
- &tm.tm_hour, &tm.tm_min, &tm.tm_sec);
- if (n != 6)
- return (-1);
-
- tm.tm_mon--; /* convert to 0 == Jan */
- tm.tm_year -= 1900; /* y2k quirk */
- tm.tm_isdst = -1; /* dunno if it's daylight savings... */
-
- *t = mktime (&tm);
- if (*t == (time_t)-1)
- return (-1);
-
- return (0);
-}
-
-int
ptl_parse_ipquad (__u32 *ipaddrp, char *str)
{
int a;
}
int
-ptl_parse_nid (ptl_nid_t *nidp, char *str)
+ptl_parse_time (time_t *t, char *str)
{
- __u32 ipaddr;
- char *end;
- unsigned long long ullval;
+ char *end;
+ int n;
+ struct tm tm;
- if (ptl_parse_ipaddr (&ipaddr, str) == 0) {
-#if !CRAY_PORTALS
- *nidp = (ptl_nid_t)ipaddr;
-#else
- *nidp = (((ptl_nid_t)ipaddr & PNAL_HOSTID_MASK) << PNAL_VNODE_SHIFT);
-#endif
- return (0);
- }
-
- ullval = strtoull(str, &end, 0);
- if (end != str && *end == 0) {
- /* parsed whole non-empty string */
- *nidp = (ptl_nid_t)ullval;
+ *t = strtol (str, &end, 0);
+ if (*end == 0) /* parsed whole string */
return (0);
- }
-
- return (-1);
+
+ memset (&tm, 0, sizeof (tm));
+ n = sscanf (str, "%d-%d-%d-%d:%d:%d",
+ &tm.tm_year, &tm.tm_mon, &tm.tm_mday,
+ &tm.tm_hour, &tm.tm_min, &tm.tm_sec);
+ if (n != 6)
+ return (-1);
+
+ tm.tm_mon--; /* convert to 0 == Jan */
+ tm.tm_year -= 1900; /* y2k quirk */
+ tm.tm_isdst = -1; /* dunno if it's daylight savings... */
+
+ *t = mktime (&tm);
+ if (*t == (time_t)-1)
+ return (-1);
+
+ return (0);
}
-int
-ptl_parse_anynid (ptl_nid_t *nidp, char *str)
+#if CRAY_PORTALS
+void cray_not_compatible_msg(char *cmd)
{
- if (!strcmp (str, "_all_")) {
- *nidp = PTL_NID_ANY;
- return 0;
- }
-
- return ptl_parse_nid(nidp, str);
+ /* Don't complain verbosely if we've not been passed a command
+ * name to complain about! */
+ if (cmd != NULL)
+ fprintf(stderr,
+ "Command %s not compatible with CRAY portals\n",
+ cmd);
}
-__u64 ptl_nid2u64(ptl_nid_t nid)
+int g_net_is_set (char *cmd)
{
- switch (sizeof (nid)) {
- case 8:
- return (nid);
- case 4:
- return ((__u32)nid);
- default:
- fprintf(stderr, "Unexpected sizeof(ptl_nid_t) == %u\n", sizeof(nid));
- abort();
- /* notreached */
- return (-1);
- }
+ cray_not_compatible_msg(cmd);
+ return 0;
}
-char *
-ptl_nid2str (char *buffer, ptl_nid_t nid)
+int g_net_is_compatible (char *cmd, ...)
{
- __u64 nid64 = ptl_nid2u64(nid);
-#ifdef HAVE_GETHOSTBYNAME
- struct hostent *he = 0;
-
- /* Don't try to resolve NIDs that are e.g. Elan host IDs. Assume
- * TCP addresses in the 0.x.x.x subnet are not in use. This can
- * happen on routers and slows things down a _lot_. Bug 3442. */
- if (nid & 0xff000000) {
- __u32 addr = htonl((__u32)nid); /* back to NETWORK byte order */
-
- he = gethostbyaddr((const char *)&addr, sizeof(addr), AF_INET);
- }
-
- if (he != NULL)
- sprintf(buffer, "%#x:%s", (int)(nid64 >> 32), he->h_name);
- else
-#endif /* HAVE_GETHOSTBYNAME */
- sprintf(buffer, LPX64, nid64);
-
- return (buffer);
+ cray_not_compatible_msg(cmd);
+ return 0;
}
-
-int g_nal_is_set ()
+#else
+int g_net_is_set (char *cmd)
{
- if (g_nal == 0) {
- fprintf (stderr, "Error: you must run the 'network' command first.\n");
- return (0);
- }
-
- return (1);
+ if (g_net_set)
+ return 1;
+
+ if (cmd != NULL)
+ fprintf(stderr,
+ "You must run the 'network' command before '%s'.\n",
+ cmd);
+ return 0;
}
-int g_nal_is_compatible (char *cmd, ...)
+int g_net_is_compatible (char *cmd, ...)
{
va_list ap;
int nal;
- if (!g_nal_is_set ())
- return (0);
+ if (!g_net_is_set(cmd))
+ return 0;
- va_start (ap, cmd);
+ va_start(ap, cmd);
do {
nal = va_arg (ap, int);
- } while (nal != 0 && nal != g_nal);
+ if (nal == PTL_NETNAL(g_net)) {
+ va_end (ap);
+ return 1;
+ }
+ } while (nal != 0);
va_end (ap);
- if (g_nal == nal)
- return (1);
-
- if (cmd != NULL) {
- /* Don't complain verbosely if we've not been passed a command
- * name to complain about! */
- fprintf (stderr, "Command %s not compatible with nal %s\n",
- cmd, nal2name (g_nal));
- }
- return (0);
+ if (cmd != NULL)
+ fprintf (stderr,
+ "Command %s not compatible with %s NAL\n",
+ cmd,
+ libcfs_nal2str(PTL_NETNAL(g_net)));
+ return 0;
}
+#endif
-int
-sock_write (int cfd, void *buffer, int nob)
+int ptl_initialize(int argc, char **argv)
{
- while (nob > 0)
- {
- int rc = write (cfd, buffer, nob);
+ register_ioc_dev(PORTALS_DEV_ID, PORTALS_DEV_PATH);
+ return 0;
+}
- if (rc < 0)
- {
- if (errno == EINTR)
- continue;
-
- return (rc);
- }
- if (rc == 0)
- {
- fprintf (stderr, "Unexpected zero sock_write\n");
- abort();
+int jt_ptl_network(int argc, char **argv)
+{
+#if CRAY_PORTALS
+ cray_not_compatible_msg(argv[0]);
+ return -1;
+#else
+ struct portal_ioctl_data data;
+ __u32 net = PTL_NIDNET(PTL_NID_ANY);
+ int set = argc >= 2;
+ int count;
+ int rc;
+
+ if (set) {
+ net = libcfs_str2net(argv[1]);
+ if (net == PTL_NIDNET(PTL_NID_ANY)) {
+ fprintf(stderr, "Can't parse net %s\n", argv[1]);
+ return -1;
}
-
- nob -= rc;
- buffer = (char *)buffer + nob;
}
-
- return (0);
-}
-int
-sock_read (int cfd, void *buffer, int nob)
-{
- while (nob > 0)
- {
- int rc = read (cfd, buffer, nob);
-
- if (rc < 0)
- {
- if (errno == EINTR)
+ for (count = 0;; count++) {
+ PORTAL_IOC_INIT (data);
+ data.ioc_count = count;
+ rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_GET_NI, &data);
+
+ if (rc >= 0) {
+ if (!set) {
+ printf("%s\n", libcfs_nid2str(data.ioc_nid));
continue;
+ }
- return (rc);
- }
-
- if (rc == 0) /* EOF */
- {
- errno = ECONNABORTED;
- return (-1);
+ if (net == PTL_NIDNET(data.ioc_nid)) {
+ g_net_set = 1;
+ return 0;
+ }
+ continue;
}
-
- nob -= rc;
- buffer = (char *)buffer + nob;
- }
-
- return (0);
-}
-
-int ptl_initialize(int argc, char **argv)
-{
- register_ioc_dev(PORTALS_DEV_ID, PORTALS_DEV_PATH);
- return 0;
-}
+ if (errno == ENOENT)
+ break;
-int jt_ptl_network(int argc, char **argv)
-{
- name2num_t *entry;
- int nal;
+ fprintf(stderr,"IOC_PORTAL_GET_NI error %d: %s\n",
+ errno, strerror(errno));
+ return -1;
+ }
- if (argc == 2 &&
- (nal = ptl_name2nal (argv[1])) >= 0) {
- g_nal = nal;
- return (0);
+ if (!set) {
+ if (count == 0)
+ printf("<no networks>\n");
+ return 0;
}
-
- fprintf(stderr, "usage: %s \n", argv[0]);
- for (entry = nalnames; entry->name != NULL; entry++)
- fprintf (stderr, "%s%s", entry == nalnames ? "<" : "|", entry->name);
- fprintf(stderr, ">\n");
- return (-1);
+
+ if (count == 0) {
+ fprintf(stderr,"No local networks\n");
+ return -1;
+ }
+
+ fprintf(stderr,"%s not a local network (%s on its own to list)\n",
+ argv[1]);
+ return -1;
+#endif
}
int
jt_ptl_print_interfaces (int argc, char **argv)
{
- struct portals_cfg pcfg;
+ struct portal_ioctl_data data;
char buffer[3][64];
int index;
int rc;
- if (!g_nal_is_compatible (argv[0], SOCKNAL, 0))
+ if (!g_net_is_compatible (argv[0], SOCKNAL, 0))
return -1;
for (index = 0;;index++) {
- PCFG_INIT (pcfg, NAL_CMD_GET_INTERFACE);
- pcfg.pcfg_count = index;
-
- rc = pcfg_ioctl (&pcfg);
+ PORTAL_IOC_INIT(data);
+ data.ioc_net = g_net;
+ data.ioc_count = index;
+
+ rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_GET_INTERFACE, &data);
if (rc != 0)
break;
printf ("%s: (%s/%s) npeer %d nroute %d\n",
- ptl_ipaddr_2_str(pcfg.pcfg_id, buffer[2], 1),
- ptl_ipaddr_2_str(pcfg.pcfg_id, buffer[0], 0),
- ptl_ipaddr_2_str(pcfg.pcfg_misc, buffer[1], 0),
- pcfg.pcfg_fd, pcfg.pcfg_count);
+ ptl_ipaddr_2_str(data.ioc_u32[0], buffer[2], 1),
+ ptl_ipaddr_2_str(data.ioc_u32[0], buffer[0], 0),
+ ptl_ipaddr_2_str(data.ioc_u32[1], buffer[1], 0),
+ data.ioc_u32[2], data.ioc_u32[3]);
}
if (index == 0) {
int
jt_ptl_add_interface (int argc, char **argv)
{
- struct portals_cfg pcfg;
+ struct portal_ioctl_data data;
__u32 ipaddr;
int rc;
__u32 netmask = 0xffffff00;
return 0;
}
- if (!g_nal_is_compatible(argv[0], SOCKNAL, 0))
+ if (!g_net_is_compatible(argv[0], SOCKNAL, 0))
return -1;
if (ptl_parse_ipaddr(&ipaddr, argv[1]) != 0) {
}
}
- PCFG_INIT(pcfg, NAL_CMD_ADD_INTERFACE);
- pcfg.pcfg_id = ipaddr;
- pcfg.pcfg_misc = netmask;
+ PORTAL_IOC_INIT(data);
+ data.ioc_net = g_net;
+ data.ioc_u32[0] = ipaddr;
+ data.ioc_u32[1] = netmask;
- rc = pcfg_ioctl (&pcfg);
+ rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_ADD_INTERFACE, &data);
if (rc != 0) {
fprintf (stderr, "failed to add interface: %s\n",
strerror (errno));
int
jt_ptl_del_interface (int argc, char **argv)
{
- struct portals_cfg pcfg;
+ struct portal_ioctl_data data;
int rc;
__u32 ipaddr = 0;
return 0;
}
- if (!g_nal_is_compatible(argv[0], SOCKNAL, 0))
+ if (!g_net_is_compatible(argv[0], SOCKNAL, 0))
return -1;
if (argc == 2 &&
return -1;
}
- PCFG_INIT(pcfg, NAL_CMD_DEL_INTERFACE);
- pcfg.pcfg_id = ipaddr;
+ PORTAL_IOC_INIT(data);
+ data.ioc_net = g_net;
+ data.ioc_u32[0] = ipaddr;
- rc = pcfg_ioctl (&pcfg);
+ rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_DEL_INTERFACE, &data);
if (rc != 0) {
fprintf (stderr, "failed to delete interface: %s\n",
strerror (errno));
int
jt_ptl_print_peers (int argc, char **argv)
{
- struct portals_cfg pcfg;
+ struct portal_ioctl_data data;
char buffer[2][64];
int index;
int rc;
- if (!g_nal_is_compatible (argv[0], SOCKNAL, RANAL,
+ if (!g_net_is_compatible (argv[0], SOCKNAL, RANAL,
OPENIBNAL, IIBNAL, VIBNAL, 0))
return -1;
for (index = 0;;index++) {
- PCFG_INIT (pcfg, NAL_CMD_GET_PEER);
- pcfg.pcfg_count = index;
-
- rc = pcfg_ioctl (&pcfg);
+ PORTAL_IOC_INIT(data);
+ data.ioc_net = g_net;
+ data.ioc_count = index;
+
+ rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_GET_PEER, &data);
if (rc != 0)
break;
- if (g_nal_is_compatible(NULL, SOCKNAL, 0))
+ if (g_net_is_compatible(NULL, SOCKNAL, 0))
printf (LPX64"[%d]%s@%s:%d #%d\n",
- pcfg.pcfg_nid, pcfg.pcfg_wait,
- ptl_ipaddr_2_str (pcfg.pcfg_size, buffer[0], 1),
- ptl_ipaddr_2_str (pcfg.pcfg_id, buffer[1], 1),
- pcfg.pcfg_misc, pcfg.pcfg_count);
- else if (g_nal_is_compatible(NULL, RANAL, OPENIBNAL, VIBNAL, 0))
+ data.ioc_nid,
+ data.ioc_count, /* persistence */
+ ptl_ipaddr_2_str (data.ioc_u32[2], buffer[0], 1), /* my ip */
+ ptl_ipaddr_2_str (data.ioc_u32[0], buffer[1], 1), /* peer ip */
+ data.ioc_u32[1], /* peer port */
+ data.ioc_u32[3]); /* conn_count */
+ else if (g_net_is_compatible(NULL, RANAL, OPENIBNAL, VIBNAL, 0))
printf (LPX64"[%d]@%s:%d\n",
- pcfg.pcfg_nid, pcfg.pcfg_wait,
- ptl_ipaddr_2_str (pcfg.pcfg_id, buffer[1], 1),
- pcfg.pcfg_misc);
+ data.ioc_nid, data.ioc_count,
+ ptl_ipaddr_2_str (data.ioc_u32[0], buffer[1], 1), /* peer ip */
+ data.ioc_u32[1]); /* peer port */
else
printf (LPX64"[%d]\n",
- pcfg.pcfg_nid, pcfg.pcfg_wait);
+ data.ioc_nid, data.ioc_count);
}
if (index == 0) {
int
jt_ptl_add_peer (int argc, char **argv)
{
- struct portals_cfg pcfg;
+ struct portal_ioctl_data data;
ptl_nid_t nid;
__u32 ip = 0;
int port = 0;
int rc;
- if (!g_nal_is_compatible (argv[0], SOCKNAL, RANAL,
+ if (!g_net_is_compatible (argv[0], SOCKNAL, RANAL,
OPENIBNAL, IIBNAL, VIBNAL, 0))
return -1;
- if (g_nal_is_compatible(NULL, SOCKNAL, OPENIBNAL, RANAL, 0)) {
+ if (g_net_is_compatible(NULL, SOCKNAL, OPENIBNAL, RANAL, 0)) {
if (argc != 4) {
fprintf (stderr, "usage(tcp,openib,ra): %s nid ipaddr port\n",
argv[0]);
return 0;
}
- } else if (g_nal_is_compatible(NULL, VIBNAL, 0)) {
+ } else if (g_net_is_compatible(NULL, VIBNAL, 0)) {
if (argc != 3) {
fprintf (stderr, "usage(vib): %s nid ipaddr\n",
argv[0]);
return 0;
}
- if (ptl_parse_nid (&nid, argv[1]) != 0 ||
- nid == PTL_NID_ANY) {
+ nid = libcfs_str2nid(argv[1]);
+ if (nid == PTL_NID_ANY) {
fprintf (stderr, "Can't parse NID: %s\n", argv[1]);
return -1;
}
- if (g_nal_is_compatible (NULL, SOCKNAL, OPENIBNAL, VIBNAL, RANAL, 0) &&
+ if (g_net_is_compatible (NULL, SOCKNAL, OPENIBNAL, VIBNAL, RANAL, 0) &&
ptl_parse_ipaddr (&ip, argv[2]) != 0) {
fprintf (stderr, "Can't parse ip addr: %s\n", argv[2]);
return -1;
}
- if (g_nal_is_compatible (NULL, SOCKNAL, OPENIBNAL, RANAL, 0) &&
+ if (g_net_is_compatible (NULL, SOCKNAL, OPENIBNAL, RANAL, 0) &&
ptl_parse_port (&port, argv[3]) != 0) {
fprintf (stderr, "Can't parse port: %s\n", argv[3]);
return -1;
}
- PCFG_INIT(pcfg, NAL_CMD_ADD_PEER);
- pcfg.pcfg_nid = nid;
- pcfg.pcfg_id = ip;
- pcfg.pcfg_misc = port;
+ PORTAL_IOC_INIT(data);
+ data.ioc_net = g_net;
+ data.ioc_nid = nid;
+ data.ioc_u32[0] = ip;
+ data.ioc_u32[1] = port;
- rc = pcfg_ioctl (&pcfg);
+ rc = l_ioctl (PORTALS_DEV_ID, IOC_PORTAL_ADD_PEER, &data);
if (rc != 0) {
fprintf (stderr, "failed to add peer: %s\n",
strerror (errno));
int
jt_ptl_del_peer (int argc, char **argv)
{
- struct portals_cfg pcfg;
+ struct portal_ioctl_data data;
ptl_nid_t nid = PTL_NID_ANY;
__u32 ip = 0;
- int single_share = 0;
- int argidx;
int rc;
- if (!g_nal_is_compatible (argv[0], SOCKNAL, RANAL,
+ if (!g_net_is_compatible (argv[0], SOCKNAL, RANAL,
OPENIBNAL, IIBNAL, VIBNAL, 0))
return -1;
- if (g_nal_is_compatible(NULL, SOCKNAL, 0)) {
- if (argc > 4) {
- fprintf (stderr, "usage: %s [nid] [ipaddr] [single_share]\n",
+ if (g_net_is_compatible(NULL, SOCKNAL, 0)) {
+ if (argc > 3) {
+ fprintf (stderr, "usage: %s [nid] [ipaddr]\n",
argv[0]);
return 0;
}
- } else if (argc > 3) {
- fprintf (stderr, "usage: %s [nid] [single_share]\n", argv[0]);
+ } else if (argc > 2) {
+ fprintf (stderr, "usage: %s [nid]\n", argv[0]);
return 0;
}
if (argc > 1 &&
- ptl_parse_anynid (&nid, argv[1]) != 0) {
+ !libcfs_str2anynid(&nid, argv[1])) {
fprintf (stderr, "Can't parse nid: %s\n", argv[1]);
return -1;
}
- argidx = 2;
- if (g_nal_is_compatible(NULL, SOCKNAL, 0)) {
- if (argc > argidx &&
- ptl_parse_ipaddr (&ip, argv[argidx]) != 0) {
+ if (g_net_is_compatible(NULL, SOCKNAL, 0)) {
+ if (argc > 2 &&
+ ptl_parse_ipaddr (&ip, argv[2]) != 0) {
fprintf (stderr, "Can't parse ip addr: %s\n",
- argv[argidx]);
+ argv[2]);
return -1;
}
- argidx++;
}
- if (argc > argidx) {
- if (!strcmp (argv[argidx], "single_share")) {
- single_share = 1;
- } else {
- fprintf (stderr, "Unrecognised arg %s'\n", argv[3]);
- return -1;
- }
- }
-
- PCFG_INIT(pcfg, NAL_CMD_DEL_PEER);
- pcfg.pcfg_nid = nid;
- pcfg.pcfg_id = ip;
- pcfg.pcfg_flags = single_share;
+ PORTAL_IOC_INIT(data);
+ data.ioc_net = g_net;
+ data.ioc_nid = nid;
+ data.ioc_u32[0] = ip;
- rc = pcfg_ioctl (&pcfg);
+ rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_DEL_PEER, &data);
if (rc != 0) {
fprintf (stderr, "failed to remove peer: %s\n",
strerror (errno));
int
jt_ptl_print_connections (int argc, char **argv)
{
- struct portals_cfg pcfg;
+ struct portal_ioctl_data data;
char buffer[2][64];
int index;
int rc;
- if (!g_nal_is_compatible (argv[0], SOCKNAL, RANAL,
+ if (!g_net_is_compatible (argv[0], SOCKNAL, RANAL,
OPENIBNAL, IIBNAL, VIBNAL, 0))
return -1;
for (index = 0; ; index++) {
- PCFG_INIT (pcfg, NAL_CMD_GET_CONN);
- pcfg.pcfg_count = index;
+ PORTAL_IOC_INIT(data);
+ data.ioc_net = g_net;
+ data.ioc_count = index;
- rc = pcfg_ioctl (&pcfg);
+ rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_GET_CONN, &data);
if (rc != 0)
break;
- if (g_nal_is_compatible (NULL, SOCKNAL, 0))
+ if (g_net_is_compatible (NULL, SOCKNAL, 0))
printf ("[%d]%s:"LPX64"@%s:%d:%s %d/%d %s\n",
- pcfg.pcfg_gw_nal, /* scheduler */
- ptl_ipaddr_2_str (pcfg.pcfg_fd, buffer[0], 1), /* local IP addr */
- pcfg.pcfg_nid,
- ptl_ipaddr_2_str (pcfg.pcfg_id, buffer[1], 1), /* remote IP addr */
- pcfg.pcfg_misc, /* remote port */
- (pcfg.pcfg_flags == SOCKNAL_CONN_ANY) ? "A" :
- (pcfg.pcfg_flags == SOCKNAL_CONN_CONTROL) ? "C" :
- (pcfg.pcfg_flags == SOCKNAL_CONN_BULK_IN) ? "I" :
- (pcfg.pcfg_flags == SOCKNAL_CONN_BULK_OUT) ? "O" : "?",
- pcfg.pcfg_count, /* tx buffer size */
- pcfg.pcfg_size, /* rx buffer size */
- pcfg.pcfg_wait ? "nagle" : "nonagle");
- else if (g_nal_is_compatible (NULL, RANAL, 0))
- printf ("[%d]"LPX64"\n",
- pcfg.pcfg_id, /* device id */
- pcfg.pcfg_nid);
+ data.ioc_u32[4], /* scheduler */
+ ptl_ipaddr_2_str (data.ioc_u32[2], buffer[0], 1), /* local IP addr */
+ data.ioc_nid,
+ ptl_ipaddr_2_str (data.ioc_u32[0], buffer[1], 1), /* remote IP addr */
+ data.ioc_u32[1], /* remote port */
+ (data.ioc_u32[3] == SOCKNAL_CONN_ANY) ? "A" :
+ (data.ioc_u32[3] == SOCKNAL_CONN_CONTROL) ? "C" :
+ (data.ioc_u32[3] == SOCKNAL_CONN_BULK_IN) ? "I" :
+ (data.ioc_u32[3] == SOCKNAL_CONN_BULK_OUT) ? "O" : "?",
+ data.ioc_count, /* tx buffer size */
+ data.ioc_u32[5], /* rx buffer size */
+ data.ioc_flags ? "nagle" : "nonagle");
+ else if (g_net_is_compatible (NULL, RANAL, 0))
+ printf ("[%d]"LPX64"@%s:%d\n",
+ data.ioc_u32[0], /* device id */
+ data.ioc_nid);
else
printf (LPX64"\n",
- pcfg.pcfg_nid);
+ data.ioc_nid);
}
if (index == 0) {
int jt_ptl_disconnect(int argc, char **argv)
{
- struct portals_cfg pcfg;
+ struct portal_ioctl_data data;
ptl_nid_t nid = PTL_NID_ANY;
__u32 ipaddr = 0;
int rc;
return 0;
}
- if (!g_nal_is_compatible (NULL, SOCKNAL, RANAL,
+ if (!g_net_is_compatible (NULL, SOCKNAL, RANAL,
OPENIBNAL, IIBNAL, VIBNAL, 0))
return 0;
if (argc >= 2 &&
- ptl_parse_anynid (&nid, argv[1]) != 0) {
+ !libcfs_str2anynid(&nid, argv[1])) {
fprintf (stderr, "Can't parse nid %s\n", argv[1]);
return -1;
}
- if (g_nal_is_compatible (NULL, SOCKNAL, 0) &&
+ if (g_net_is_compatible (NULL, SOCKNAL, 0) &&
argc >= 3 &&
ptl_parse_ipaddr (&ipaddr, argv[2]) != 0) {
fprintf (stderr, "Can't parse ip addr %s\n", argv[2]);
return -1;
}
- PCFG_INIT(pcfg, NAL_CMD_CLOSE_CONNECTION);
- pcfg.pcfg_nid = nid;
- pcfg.pcfg_id = ipaddr;
+ PORTAL_IOC_INIT(data);
+ data.ioc_net = g_net;
+ data.ioc_nid = nid;
+ data.ioc_u32[0] = ipaddr;
- rc = pcfg_ioctl(&pcfg);
- if (rc) {
+ rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_CLOSE_CONNECTION, &data);
+ if (rc != 0) {
fprintf(stderr, "failed to remove connection: %s\n",
strerror(errno));
return -1;
int jt_ptl_push_connection (int argc, char **argv)
{
- struct portals_cfg pcfg;
+ struct portal_ioctl_data data;
int rc;
ptl_nid_t nid = PTL_NID_ANY;
- __u32 ipaddr = 0;
- if (argc > 3) {
- fprintf(stderr, "usage: %s [nid] [ip]\n", argv[0]);
+ if (argc > 2) {
+ fprintf(stderr, "usage: %s [nid]\n", argv[0]);
return 0;
}
- if (!g_nal_is_compatible (argv[0], SOCKNAL, 0))
+ if (!g_net_is_compatible (argv[0], SOCKNAL, 0))
return -1;
if (argc > 1 &&
- ptl_parse_anynid (&nid, argv[1]) != 0) {
+ !libcfs_str2anynid(&nid, argv[1])) {
fprintf(stderr, "Can't parse nid: %s\n", argv[1]);
return -1;
}
- if (argc > 2 &&
- ptl_parse_ipaddr (&ipaddr, argv[2]) != 0) {
- fprintf(stderr, "Can't parse ipaddr: %s\n", argv[2]);
- }
-
- PCFG_INIT(pcfg, NAL_CMD_PUSH_CONNECTION);
- pcfg.pcfg_nid = nid;
- pcfg.pcfg_id = ipaddr;
+ PORTAL_IOC_INIT(data);
+ data.ioc_net = g_net;
+ data.ioc_nid = nid;
- rc = pcfg_ioctl(&pcfg);
- if (rc) {
+ rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_PUSH_CONNECTION, &data);
+ if (rc != 0) {
fprintf(stderr, "failed to push connection: %s\n",
strerror(errno));
return -1;
int
jt_ptl_print_active_txs (int argc, char **argv)
{
- struct portals_cfg pcfg;
+ struct portal_ioctl_data data;
int index;
int rc;
- if (!g_nal_is_compatible (argv[0], QSWNAL, 0))
+ if (!g_net_is_compatible (argv[0], QSWNAL, 0))
return -1;
for (index = 0;;index++) {
- PCFG_INIT(pcfg, NAL_CMD_GET_TXDESC);
- pcfg.pcfg_count = index;
-
- rc = pcfg_ioctl(&pcfg);
+ PORTAL_IOC_INIT(data);
+ data.ioc_net = g_net;
+ data.ioc_count = index;
+
+ rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_GET_TXDESC, &data);
if (rc != 0)
break;
- printf ("%5s payload %6d bytes to "LPX64" via "LPX64" by pid %6d: %s, %s, state %d\n",
- pcfg.pcfg_count == PTL_MSG_ACK ? "ACK" :
- pcfg.pcfg_count == PTL_MSG_PUT ? "PUT" :
- pcfg.pcfg_count == PTL_MSG_GET ? "GET" :
- pcfg.pcfg_count == PTL_MSG_REPLY ? "REPLY" : "<weird message>",
- pcfg.pcfg_size,
- pcfg.pcfg_nid,
- pcfg.pcfg_nid2,
- pcfg.pcfg_misc,
- (pcfg.pcfg_flags & 1) ? "delayed" : "immediate",
- (pcfg.pcfg_flags & 2) ? "nblk" : "normal",
- pcfg.pcfg_flags >> 2);
+ printf ("type %u payload %6d to %s via %s by pid %6d: "
+ "%s, %s, state %d\n",
+ data.ioc_u32[0],
+ data.ioc_count,
+ data.ioc_nid,
+ data.ioc_u64[0],
+ data.ioc_u32[1],
+ (data.ioc_flags & 1) ? "delayed" : "immediate",
+ (data.ioc_flags & 2) ? "nblk" : "normal",
+ data.ioc_flags >> 2);
}
if (index == 0) {
return 0;
}
- if (!g_nal_is_set())
- return -1;
-
- if (ptl_parse_nid (&nid, argv[1]) != 0)
- {
+ nid = libcfs_str2nid(argv[1]);
+ if (nid == PTL_NID_ANY) {
fprintf (stderr, "Can't parse nid \"%s\"\n", argv[1]);
return (-1);
}
PORTAL_IOC_INIT (data);
data.ioc_count = count;
- data.ioc_size = size;
data.ioc_nid = nid;
- data.ioc_nal = g_nal;
- data.ioc_timeout = timeout;
+ data.ioc_u32[0] = size;
+ data.ioc_u32[1] = timeout;
rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_PING, &data);
if (rc) {
return 0;
}
-int jt_ptl_shownid(int argc, char **argv)
-{
- struct portal_ioctl_data data;
- int rc;
-
- if (argc > 1) {
- fprintf(stderr, "usage: %s\n", argv[0]);
- return 0;
- }
-
- if (!g_nal_is_set())
- return -1;
-
- PORTAL_IOC_INIT (data);
- data.ioc_nal = g_nal;
- rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_GET_NID, &data);
- if (rc < 0)
- fprintf(stderr, "getting my NID failed: %s\n",
- strerror (errno));
- else
- printf(LPX64"\n", data.ioc_nid);
- return 0;
-}
-
int jt_ptl_mynid(int argc, char **argv)
{
+#if CRAY_PORTALS
+ fprintf(stderr, "command %s not supported\n", argv[0]);
+ return -1;
+#else
+ struct portal_ioctl_data data;
+ ptl_nid_t nid;
int rc;
- char hostname[1024];
- char *nidstr;
- struct portals_cfg pcfg;
- ptl_nid_t mynid;
- if (argc > 2) {
- fprintf(stderr, "usage: %s [NID]\n", argv[0]);
- fprintf(stderr, "NID defaults to the primary IP address of the machine.\n");
+ if (argc != 2) {
+ fprintf(stderr, "usage: %s NID\n", argv[0]);
return 0;
}
- if (!g_nal_is_set())
- return -1;
-
- if (argc >= 2)
- nidstr = argv[1];
- else if (gethostname(hostname, sizeof(hostname)) != 0) {
- fprintf(stderr, "gethostname failed: %s\n",
- strerror(errno));
+ nid = libcfs_str2nid(argv[1]);
+ if (nid == PTL_NID_ANY) {
+ fprintf(stderr, "Can't parse NID '%s'\n", argv[1]);
return -1;
}
- else
- nidstr = hostname;
- rc = ptl_parse_nid (&mynid, nidstr);
- if (rc != 0) {
- fprintf (stderr, "Can't convert '%s' into a NID\n", nidstr);
- return -1;
- }
-
- PCFG_INIT(pcfg, NAL_CMD_REGISTER_MYNID);
- pcfg.pcfg_nid = mynid;
+ PORTAL_IOC_INIT(data);
+ data.ioc_net = PTL_NIDNET(nid);
+ data.ioc_nid = nid;
- rc = pcfg_ioctl(&pcfg);
+ rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_REGISTER_MYNID, &data);
if (rc < 0)
fprintf(stderr, "setting my NID failed: %s\n",
strerror(errno));
else
- printf("registered my nid "LPX64" (%s)\n",
- ptl_nid2u64(mynid), hostname);
+ printf("registered my nid %s\n", libcfs_nid2str(nid));
+
return 0;
+#endif
}
int
if (argc < 2 || argc > 3)
{
- fprintf (stderr, "usage: %s nid|\"_all_\" [count (0 == mend)]\n", argv[0]);
+ fprintf (stderr, "usage: %s nid|\"*\" [count (0 == mend)]\n", argv[0]);
return (0);
}
- if (!g_nal_is_set())
- return (-1);
-
- if (!strcmp (argv[1], "_all_"))
- nid = PTL_NID_ANY;
- else if (ptl_parse_anynid (&nid, argv[1]) != 0)
+ if (!libcfs_str2anynid(&nid, argv[1]))
{
fprintf (stderr, "Can't parse nid \"%s\"\n", argv[1]);
return (-1);
}
- if (argc < 3)
+ if (argc < 3) {
threshold = PTL_MD_THRESH_INF;
- else if (sscanf (argv[2], "%i", &threshold) != 1) {
+ } else if (sscanf (argv[2], "%i", &threshold) != 1) {
fprintf (stderr, "Can't parse count \"%s\"\n", argv[2]);
return (-1);
}
PORTAL_IOC_INIT (data);
- data.ioc_nal = g_nal;
data.ioc_nid = nid;
data.ioc_count = threshold;
int
jt_ptl_add_route (int argc, char **argv)
{
- struct portals_cfg pcfg;
- ptl_nid_t nid1;
- ptl_nid_t nid2;
+ struct portal_ioctl_data data;
ptl_nid_t gateway_nid;
int rc;
- if (argc < 3)
+ if (argc != 2)
{
- fprintf (stderr, "usage: %s gateway target [target]\n", argv[0]);
+ fprintf (stderr, "usage: %s gateway\n", argv[0]);
return (0);
}
- if (!g_nal_is_set())
+ if (!g_net_is_set(argv[0]))
return (-1);
- if (ptl_parse_nid (&gateway_nid, argv[1]) != 0)
- {
+ gateway_nid = libcfs_str2nid(argv[1]);
+ if (gateway_nid == PTL_NID_ANY) {
fprintf (stderr, "Can't parse gateway NID \"%s\"\n", argv[1]);
return (-1);
}
- if (ptl_parse_nid (&nid1, argv[2]) != 0)
- {
- fprintf (stderr, "Can't parse first target NID \"%s\"\n", argv[2]);
- return (-1);
- }
-
- if (argc < 4)
- nid2 = nid1;
- else if (ptl_parse_nid (&nid2, argv[3]) != 0)
- {
- fprintf (stderr, "Can't parse second target NID \"%s\"\n", argv[4]);
- return (-1);
- }
-
- PCFG_INIT(pcfg, NAL_CMD_ADD_ROUTE);
- pcfg.pcfg_nid = gateway_nid;
- pcfg.pcfg_nal = ROUTER;
- pcfg.pcfg_gw_nal = g_nal;
- pcfg.pcfg_nid2 = MIN (nid1, nid2);
- pcfg.pcfg_nid3 = MAX (nid1, nid2);
+ PORTAL_IOC_INIT(data);
+ data.ioc_net = g_net;
+ data.ioc_nid = gateway_nid;
- rc = pcfg_ioctl(&pcfg);
- if (rc != 0)
- {
- fprintf (stderr, "NAL_CMD_ADD_ROUTE failed: %s\n", strerror (errno));
+ rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_ADD_ROUTE, &data);
+ if (rc != 0) {
+ fprintf (stderr, "IOC_PORTAL_ADD_ROUTE failed: %s\n", strerror (errno));
return (-1);
}
int
jt_ptl_del_route (int argc, char **argv)
{
- struct portals_cfg pcfg;
+ struct portal_ioctl_data data;
ptl_nid_t nid;
- ptl_nid_t nid1 = PTL_NID_ANY;
- ptl_nid_t nid2 = PTL_NID_ANY;
int rc;
- if (argc < 2)
- {
- fprintf (stderr, "usage: %s targetNID\n", argv[0]);
+ if (argc != 2) {
+ fprintf (stderr, "usage: %s gatewayNID\n", argv[0]);
return (0);
}
- if (!g_nal_is_set())
- return (-1);
-
- if (ptl_parse_nid (&nid, argv[1]) != 0)
- {
- fprintf (stderr, "Can't parse gateway NID \"%s\"\n", argv[1]);
- return (-1);
- }
-
- if (argc >= 3 &&
- ptl_parse_nid (&nid1, argv[2]) != 0)
- {
- fprintf (stderr, "Can't parse target NID \"%s\"\n", argv[2]);
- return (-1);
+ if (!libcfs_str2anynid(&nid, argv[1])) {
+ fprintf (stderr, "Can't parse gateway NID "
+ "\"%s\"\n", argv[1]);
+ return -1;
}
- if (argc < 4) {
- nid2 = nid1;
- } else {
- if (ptl_parse_nid (&nid2, argv[3]) != 0) {
- fprintf (stderr, "Can't parse target NID \"%s\"\n", argv[3]);
- return (-1);
- }
+ PORTAL_IOC_INIT(data);
+ data.ioc_net = g_net;
+ data.ioc_nid = nid;
- if (nid1 > nid2) {
- ptl_nid_t tmp = nid1;
-
- nid1 = nid2;
- nid2 = tmp;
- }
- }
-
- PCFG_INIT(pcfg, NAL_CMD_DEL_ROUTE);
- pcfg.pcfg_nal = ROUTER;
- pcfg.pcfg_gw_nal = g_nal;
- pcfg.pcfg_nid = nid;
- pcfg.pcfg_nid2 = nid1;
- pcfg.pcfg_nid3 = nid2;
-
- rc = pcfg_ioctl(&pcfg);
- if (rc != 0)
- {
- fprintf (stderr, "NAL_CMD_DEL_ROUTE ("LPX64") failed: %s\n",
- ptl_nid2u64(nid), strerror (errno));
+ rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_DEL_ROUTE, &data);
+ if (rc != 0) {
+ fprintf (stderr, "IOC_PORTAL_DEL_ROUTE (%s) failed: %s\n",
+ libcfs_nid2str(nid), strerror (errno));
return (-1);
}
int
jt_ptl_notify_router (int argc, char **argv)
{
- struct portals_cfg pcfg;
+ struct portal_ioctl_data data;
int enable;
ptl_nid_t nid;
int rc;
return (0);
}
- if (ptl_parse_nid (&nid, argv[1]) != 0)
- {
+ nid = libcfs_str2nid(argv[1]);
+ if (nid == PTL_NID_ANY) {
fprintf (stderr, "Can't parse target NID \"%s\"\n", argv[1]);
return (-1);
}
return (-1);
}
- PCFG_INIT(pcfg, NAL_CMD_NOTIFY_ROUTER);
- pcfg.pcfg_nal = ROUTER;
- pcfg.pcfg_gw_nal = g_nal;
- pcfg.pcfg_nid = nid;
- pcfg.pcfg_flags = enable;
+ PORTAL_IOC_INIT(data);
+ data.ioc_nid = nid;
+ data.ioc_flags = enable;
/* Yeuch; 'cept I need a __u64 on 64 bit machines... */
- pcfg.pcfg_nid3 = (__u64)when;
+ data.ioc_u64[0] = (__u64)when;
- rc = pcfg_ioctl(&pcfg);
- if (rc != 0)
- {
- fprintf (stderr, "NAL_CMD_NOTIFY_ROUTER ("LPX64") failed: %s\n",
- ptl_nid2u64(nid), strerror (errno));
+ rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_NOTIFY_ROUTER, &data);
+ if (rc != 0) {
+ fprintf (stderr, "IOC_PORTAL_NOTIFY_ROUTER (%s) failed: %s\n",
+ libcfs_nid2str(nid), strerror (errno));
return (-1);
}
int
jt_ptl_print_routes (int argc, char **argv)
{
- char buffer[3][128];
- struct portals_cfg pcfg;
+ struct portal_ioctl_data data;
int rc;
int index;
- int gateway_nal;
- ptl_nid_t gateway_nid;
- ptl_nid_t nid1;
- ptl_nid_t nid2;
+ __u32 net;
+ ptl_nid_t nid;
int alive;
for (index = 0;;index++)
{
- PCFG_INIT(pcfg, NAL_CMD_GET_ROUTE);
- pcfg.pcfg_nal = ROUTER;
- pcfg.pcfg_count = index;
+ PORTAL_IOC_INIT(data);
+ data.ioc_count = index;
- rc = pcfg_ioctl(&pcfg);
+ rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_GET_ROUTE, &data);
if (rc != 0)
break;
- gateway_nal = pcfg.pcfg_gw_nal;
- gateway_nid = pcfg.pcfg_nid;
- nid1 = pcfg.pcfg_nid2;
- nid2 = pcfg.pcfg_nid3;
- alive = pcfg.pcfg_flags;
-
- printf ("%8s %18s : %s - %s, %s\n",
- nal2name (gateway_nal),
- ptl_nid2str (buffer[0], gateway_nid),
- ptl_nid2str (buffer[1], nid1),
- ptl_nid2str (buffer[2], nid2),
+ net = data.ioc_net;
+ nid = data.ioc_nid;
+ alive = data.ioc_flags;
+
+ printf ("net %18s gw %32s %s\n",
+ libcfs_net2str(net), libcfs_nid2str(nid),
alive ? "up" : "down");
}
- if (index == 0 && errno != ENOENT) {
+ if (errno != ENOENT)
fprintf(stderr, "Error getting routes: %s: check dmesg.\n",
strerror(errno));
- }
+
return (0);
}
int rc;
PORTAL_IOC_INIT(data);
- data.ioc_flags = enable;
- data.ioc_misc = clear;
+ data.ioc_flags = (enable ? 1 : 0) | (clear ? 2 : 0);
rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_LWT_CONTROL, &data);
if (rc == 0)
}
/* crappy overloads */
- if (data.ioc_nid2 != sizeof(lwt_event_t) ||
- data.ioc_nid3 != offsetof(lwt_event_t, lwte_where)) {
+ if (data.ioc_u32[2] != sizeof(lwt_event_t) ||
+ data.ioc_u32[3] != offsetof(lwt_event_t, lwte_where)) {
fprintf(stderr,"kernel/user LWT event mismatch %d(%d),%d(%d)\n",
- (int)data.ioc_nid2, sizeof(lwt_event_t),
- (int)data.ioc_nid3,
+ (int)data.ioc_u32[2], sizeof(lwt_event_t),
+ (int)data.ioc_u32[3],
(int)offsetof(lwt_event_t, lwte_where));
return (-1);
}
- LASSERT (data.ioc_count != 0);
- LASSERT (data.ioc_misc != 0);
-
if (now != NULL)
- *now = data.ioc_nid;
+ *now = data.ioc_u64[0];
+ LASSERT (data.ioc_u32[0] != 0);
if (ncpu != NULL)
- *ncpu = data.ioc_count;
+ *ncpu = data.ioc_u32[0];
+ LASSERT (data.ioc_u32[1] != 0);
if (totalsize != NULL)
- *totalsize = data.ioc_misc;
+ *totalsize = data.ioc_u32[1];
return (0);
}
{"push", jt_ptl_push_connection, 0, "flush connection to a remote nid (args: [nid]"},
{"active_tx", jt_ptl_print_active_txs, 0, "print active transmits (no args)"},
{"ping", jt_ptl_ping, 0, "do a ping test (args: nid [count] [size] [timeout])"},
- {"shownid", jt_ptl_shownid, 0, "print the local NID"},
{"mynid", jt_ptl_mynid, 0, "inform the socknal of the local NID (args: [hostname])"},
{"add_route", jt_ptl_add_route, 0,
"add an entry to the routing table (args: gatewayNID targetNID [targetNID])"},
#include <sys/types.h>
#include <sys/wait.h>
#include <portals/api-support.h>
+
+/* This ghastly hack to allows me to include lib-types.h It doesn't affect any
+ * assertions generated here (but fails-safe if it ever does) */
+typedef struct {
+ int counter;
+} atomic_t;
+
#include <portals/lib-types.h>
#include <string.h>
#define STRINGIFY(a) #a
-#define CHECK_DEFINE(a) \
-do { \
- printf (" CLASSERT ("#a" == "STRINGIFY(a)");\n"); \
+#define CHECK_DEFINE(a) \
+do { \
+ printf (" CLASSERT ("#a" == "STRINGIFY(a)");\n"); \
} while (0)
#define CHECK_VALUE(a) \
do { \
- printf (" CLASSERT ("#a" == %d);\n", a); \
+ printf (" CLASSERT ("#a" == %d);\n", a); \
} while (0)
#define CHECK_MEMBER_OFFSET(s,m) \