From: eeb Date: Fri, 29 Apr 2005 15:19:45 +0000 (+0000) Subject: * placeholder commit X-Git-Tag: v1_7_100~1^25~6^2~275 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=d3f6a945087acd6f987f94a5ef11eaf05d506c7a;p=fs%2Flustre-release.git * placeholder commit --- diff --git a/lnet/include/libcfs/darwin/darwin-mem.h b/lnet/include/libcfs/darwin/darwin-mem.h index 922a1b8..ce4a42b 100644 --- a/lnet/include/libcfs/darwin/darwin-mem.h +++ b/lnet/include/libcfs/darwin/darwin-mem.h @@ -184,6 +184,9 @@ extern void cfs_mem_cache_free ( cfs_mem_cache_t *, void *); #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") diff --git a/lnet/include/libcfs/kp30.h b/lnet/include/libcfs/kp30.h index 66cf0e1..a74756c 100644 --- a/lnet/include/libcfs/kp30.h +++ b/lnet/include/libcfs/kp30.h @@ -208,10 +208,26 @@ void portals_debug_dumplog(void); #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) @@ -235,9 +251,33 @@ struct portals_device_userstate * 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; @@ -364,59 +404,52 @@ extern int portal_ioctl_getdata(char *buf, char *end, void *arg); /* 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, diff --git a/lnet/include/libcfs/libcfs.h b/lnet/include/libcfs/libcfs.h index ac8ecab..ec8d5b1 100644 --- a/lnet/include/libcfs/libcfs.h +++ b/lnet/include/libcfs/libcfs.h @@ -253,117 +253,15 @@ do { \ #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 +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) \ diff --git a/lnet/include/lnet/api.h b/lnet/include/lnet/api.h index 5a6d32a..5de6d2a 100644 --- a/lnet/include/lnet/api.h +++ b/lnet/include/lnet/api.h @@ -39,19 +39,13 @@ ptl_err_t PtlNIDist(ptl_handle_ni_t interface_in, 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: @@ -153,4 +147,6 @@ ptl_err_t PtlGet(ptl_handle_md_t md_in, ptl_ac_index_t cookie_in, ptl_match_bits_t match_bits_in, ptl_size_t offset_in); + + #endif diff --git a/lnet/include/lnet/kpr.h b/lnet/include/lnet/kpr.h index 23d6e7c..bba2047 100644 --- a/lnet/include/lnet/kpr.h +++ b/lnet/include/lnet/kpr.h @@ -6,171 +6,5 @@ # include /* 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 */ diff --git a/lnet/include/lnet/lib-lnet.h b/lnet/include/lnet/lib-lnet.h index f4e681a..2647e2e 100644 --- a/lnet/include/lnet/lib-lnet.h +++ b/lnet/include/lnet/lib-lnet.h @@ -357,16 +357,56 @@ ptl_handle2me (ptl_handle_me_t *handle) 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, @@ -375,7 +415,7 @@ extern ptl_err_t ptl_parse (ptl_ni_t *ni, ptl_hdr_t *hdr, void *private); 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, @@ -398,7 +438,7 @@ extern int ptl_extract_kiov (int dst_niov, ptl_kiov_t *dst, 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); diff --git a/lnet/include/lnet/lib-p30.h b/lnet/include/lnet/lib-p30.h index f4e681a..2647e2e 100644 --- a/lnet/include/lnet/lib-p30.h +++ b/lnet/include/lnet/lib-p30.h @@ -357,16 +357,56 @@ ptl_handle2me (ptl_handle_me_t *handle) 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, @@ -375,7 +415,7 @@ extern ptl_err_t ptl_parse (ptl_ni_t *ni, ptl_hdr_t *hdr, void *private); 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, @@ -398,7 +438,7 @@ extern int ptl_extract_kiov (int dst_niov, ptl_kiov_t *dst, 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); diff --git a/lnet/include/lnet/lib-types.h b/lnet/include/lnet/lib-types.h index 0d33782..ae84a5e 100644 --- a/lnet/include/lnet/lib-types.h +++ b/lnet/include/lnet/lib-types.h @@ -220,17 +220,48 @@ typedef struct { 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 @@ -242,16 +273,16 @@ typedef struct ptl_nal * 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 @@ -274,8 +305,12 @@ typedef struct ptl_nal 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 { @@ -283,6 +318,8 @@ 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 */ @@ -311,6 +348,8 @@ typedef struct 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 */ diff --git a/lnet/include/lnet/lnetctl.h b/lnet/include/lnet/lnetctl.h index c55e11e..8b3c997 100644 --- a/lnet/include/lnet/lnetctl.h +++ b/lnet/include/lnet/lnetctl.h @@ -32,12 +32,6 @@ #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); @@ -51,7 +45,6 @@ int jt_ptl_disconnect(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 */ @@ -77,8 +70,6 @@ int jt_dbg_mark_debug_buf(int argc, char **argv); 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); diff --git a/lnet/include/lnet/ptlctl.h b/lnet/include/lnet/ptlctl.h index c55e11e..8b3c997 100644 --- a/lnet/include/lnet/ptlctl.h +++ b/lnet/include/lnet/ptlctl.h @@ -32,12 +32,6 @@ #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); @@ -51,7 +45,6 @@ int jt_ptl_disconnect(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 */ @@ -77,8 +70,6 @@ int jt_dbg_mark_debug_buf(int argc, char **argv); 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); diff --git a/lnet/klnds/gmlnd/gmlnd.h b/lnet/klnds/gmlnd/gmlnd.h index 826e455..84377b7 100644 --- a/lnet/klnds/gmlnd/gmlnd.h +++ b/lnet/klnds/gmlnd/gmlnd.h @@ -251,11 +251,6 @@ typedef struct _gmnal_data_t { extern gmnal_data_t *global_nal_data; /* - * for ioctl get pid - */ -#define GMNAL_IOC_GET_GNID 1 - -/* * Return codes */ #define GMNAL_STATUS_OK 0 diff --git a/lnet/klnds/gmlnd/gmlnd_api.c b/lnet/klnds/gmlnd/gmlnd_api.c index 0af6295..88d8671 100644 --- a/lnet/klnds/gmlnd/gmlnd_api.c +++ b/lnet/klnds/gmlnd/gmlnd_api.c @@ -31,7 +31,7 @@ gmnal_data_t *global_nal_data = NULL; #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 @@ -68,9 +68,6 @@ gmnal_shutdown(ptl_ni_t *ni) 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 @@ -292,23 +289,6 @@ gmnal_startup(ptl_ni_t *ni, char **interfaces) 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; @@ -318,6 +298,7 @@ gmnal_startup(ptl_ni_t *ni, char **interfaces) global_nal_data = nal_data; + PORTAL_MODULE_USE; return(PTL_OK); } @@ -325,6 +306,7 @@ ptl_nal_t the_gm_nal = { .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, diff --git a/lnet/klnds/gmlnd/gmlnd_cb.c b/lnet/klnds/gmlnd/gmlnd_cb.c index 5ee7e98..87121f4 100644 --- a/lnet/klnds/gmlnd/gmlnd_cb.c +++ b/lnet/klnds/gmlnd/gmlnd_cb.c @@ -152,9 +152,9 @@ ptl_err_t gmnal_cb_recv_pages(ptl_ni_t *ni, void *private, 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; @@ -163,11 +163,16 @@ ptl_err_t gmnal_cb_send(ptl_ni_t *ni, void *private, ptl_msg_t *cookie, 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"); /* @@ -198,13 +203,13 @@ ptl_err_t gmnal_cb_send(ptl_ni_t *ni, void *private, ptl_msg_t *cookie, } 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); @@ -212,8 +217,9 @@ ptl_err_t gmnal_cb_send(ptl_ni_t *ni, void *private, ptl_msg_t *cookie, 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; @@ -222,12 +228,17 @@ ptl_err_t gmnal_cb_send_pages(ptl_ni_t *ni, void *private, 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 @@ -275,8 +286,8 @@ ptl_err_t gmnal_cb_send_pages(ptl_ni_t *ni, void *private, } 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; @@ -299,8 +310,8 @@ ptl_err_t gmnal_cb_send_pages(ptl_ni_t *ni, void *private, 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; ikiov_page); kiov_dup++; diff --git a/lnet/klnds/gmlnd/gmlnd_module.c b/lnet/klnds/gmlnd/gmlnd_module.c index 3851649..77a6172 100644 --- a/lnet/klnds/gmlnd/gmlnd_module.c +++ b/lnet/klnds/gmlnd/gmlnd_module.c @@ -33,8 +33,9 @@ int num_stxds = 5; 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; @@ -42,18 +43,20 @@ gmnal_cmd(struct portals_cfg *pcfg, void *private) 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); @@ -61,9 +64,13 @@ gmnal_cmd(struct portals_cfg *pcfg, void *private) 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); @@ -71,18 +78,18 @@ gmnal_cmd(struct portals_cfg *pcfg, void *private) 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); } diff --git a/lnet/klnds/iiblnd/iiblnd.c b/lnet/klnds/iiblnd/iiblnd.c index dc92f36..6a59e59 100644 --- a/lnet/klnds/iiblnd/iiblnd.c +++ b/lnet/klnds/iiblnd/iiblnd.c @@ -27,6 +27,7 @@ ptl_nal_t kibnal_nal = { .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, @@ -294,7 +295,7 @@ kibnal_set_mynid(ptl_nid_t nid) /* 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 */ @@ -338,7 +339,7 @@ kibnal_set_mynid(ptl_nid_t nid) 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; @@ -515,19 +516,13 @@ kibnal_add_persistent_peer (ptl_nid_t nid) } 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); @@ -545,7 +540,7 @@ kibnal_del_peer_locked (kib_peer_t *peer, int single_share) } int -kibnal_del_peer (ptl_nid_t nid, int single_share) +kibnal_del_peer (ptl_nid_t) { unsigned long flags; struct list_head *ptmp; @@ -575,11 +570,8 @@ kibnal_del_peer (ptl_nid_t nid, int single_share) 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: @@ -925,63 +917,55 @@ kibnal_close_matching_conns (ptl_nid_t nid) 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; } } @@ -1175,10 +1159,6 @@ kibnal_shutdown (ptl_ni_t *ni) 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); @@ -1296,6 +1276,7 @@ kibnal_shutdown (ptl_ni_t *ni) atomic_read(&portal_kmemory)); kibnal_data.kib_init = IBNAL_INIT_NOTHING; + PORTAL_MODULE_UNUSE; } #define roundup_power(val, power) \ @@ -1346,6 +1327,8 @@ kibnal_startup (ptl_ni_t *ni, char **interfaces) 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; @@ -1619,14 +1602,6 @@ kibnal_startup (ptl_ni_t *ni, char **interfaces) } } - /*****************************************************/ - - 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; /*****************************************************/ diff --git a/lnet/klnds/iiblnd/iiblnd.h b/lnet/klnds/iiblnd/iiblnd.h index 1354ba2..4eadbc9 100644 --- a/lnet/klnds/iiblnd/iiblnd.h +++ b/lnet/klnds/iiblnd/iiblnd.h @@ -858,14 +858,17 @@ kibnal_whole_mem(void) 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); @@ -875,7 +878,7 @@ extern ptl_err_t kibnal_recv_pages (ptl_ni_t *ni, void *private, ptl_msg_t *msg, 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, diff --git a/lnet/klnds/iiblnd/iiblnd_cb.c b/lnet/klnds/iiblnd/iiblnd_cb.c index 45655a9..bb1bb07 100644 --- a/lnet/klnds/iiblnd/iiblnd_cb.c +++ b/lnet/klnds/iiblnd/iiblnd_cb.c @@ -1488,18 +1488,18 @@ init_tx: } 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; @@ -1507,8 +1507,8 @@ kibnal_sendmsg(ptl_ni_t *ni, /* 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); @@ -1518,6 +1518,11 @@ kibnal_sendmsg(ptl_ni_t *ni, /* 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(); @@ -1539,7 +1544,7 @@ kibnal_sendmsg(ptl_ni_t *ni, /* 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); } @@ -1547,7 +1552,7 @@ kibnal_sendmsg(ptl_ni_t *ni, 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; @@ -1558,7 +1563,7 @@ kibnal_sendmsg(ptl_ni_t *ni, 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: @@ -1570,7 +1575,7 @@ kibnal_sendmsg(ptl_ni_t *ni, 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; } @@ -1580,7 +1585,7 @@ kibnal_sendmsg(ptl_ni_t *ni, 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); } @@ -1605,30 +1610,30 @@ kibnal_sendmsg(ptl_ni_t *ni, /* 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)); } diff --git a/lnet/klnds/lolnd/lolnd.c b/lnet/klnds/lolnd/lolnd.c index 1f63d25..0469b23 100644 --- a/lnet/klnds/lolnd/lolnd.c +++ b/lnet/klnds/lolnd/lolnd.c @@ -57,8 +57,6 @@ klonal_startup (ptl_ni_t *ni, char **interfaces) CDEBUG (D_NET, "start\n"); -#warning fixme - ni->ni_nid = 0; klonal_instanced = 1; PORTAL_MODULE_USE; diff --git a/lnet/klnds/openiblnd/openiblnd.c b/lnet/klnds/openiblnd/openiblnd.c index 582b3de..a2ee0ed 100644 --- a/lnet/klnds/openiblnd/openiblnd.c +++ b/lnet/klnds/openiblnd/openiblnd.c @@ -27,6 +27,7 @@ ptl_nal_t kibnal_nal = { .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, @@ -1180,19 +1181,13 @@ kibnal_add_persistent_peer (ptl_nid_t nid, __u32 ip, int port) } 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); @@ -1210,7 +1205,7 @@ kibnal_del_peer_locked (kib_peer_t *peer, int single_share) } 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; @@ -1240,11 +1235,8 @@ kibnal_del_peer (ptl_nid_t nid, int single_share) 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: @@ -1576,65 +1568,59 @@ kibnal_close_matching_conns (ptl_nid_t nid) } 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; } } @@ -1805,10 +1791,6 @@ kibnal_shutdown (ptl_ni_t *ni) 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); @@ -1823,9 +1805,7 @@ kibnal_shutdown (ptl_ni_t *ni) 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); @@ -1898,6 +1878,7 @@ kibnal_shutdown (ptl_ni_t *ni) atomic_read(&portal_kmemory)); kibnal_data.kib_init = IBNAL_INIT_NOTHING; + PORTAL_MODULE_UNUSE; } ptl_err_t @@ -1916,6 +1897,7 @@ kibnal_startup (ptl_ni_t *ni, char **interfaces) return PTL_FAIL; } + PORTAL_MODULE_USE; memset (&kibnal_data, 0, sizeof (kibnal_data)); /* zero pointers, flags etc */ kibnal_data.kib_ni = ni; @@ -2097,16 +2079,6 @@ kibnal_startup (ptl_ni_t *ni, char **interfaces) 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; /*****************************************************/ diff --git a/lnet/klnds/openiblnd/openiblnd.h b/lnet/klnds/openiblnd/openiblnd.h index 9641fbb..fdfc043 100644 --- a/lnet/klnds/openiblnd/openiblnd.h +++ b/lnet/klnds/openiblnd/openiblnd.h @@ -207,8 +207,7 @@ typedef struct #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 */ { @@ -507,17 +506,16 @@ kibnal_wreqid_is_rx (__u64 wreqid) 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, @@ -540,7 +538,7 @@ extern int kibnal_listener_procint(ctl_table *table, int write, 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, @@ -577,8 +575,3 @@ extern void kibnal_start_active_rdma (int type, int status, unsigned int niov, struct iovec *iov, ptl_kiov_t *kiov, int offset, int nob); - - - - - diff --git a/lnet/klnds/openiblnd/openiblnd_cb.c b/lnet/klnds/openiblnd/openiblnd_cb.c index 6d2492b..6d38da0 100644 --- a/lnet/klnds/openiblnd/openiblnd_cb.c +++ b/lnet/klnds/openiblnd/openiblnd_cb.c @@ -1210,18 +1210,18 @@ kibnal_start_active_rdma (int type, int status, } 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; @@ -1229,8 +1229,8 @@ kibnal_sendmsg(ptl_ni_t *ni, /* 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); @@ -1240,6 +1240,11 @@ kibnal_sendmsg(ptl_ni_t *ni, /* 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(); @@ -1261,7 +1266,7 @@ kibnal_sendmsg(ptl_ni_t *ni, /* 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); } @@ -1269,7 +1274,7 @@ kibnal_sendmsg(ptl_ni_t *ni, 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; @@ -1280,7 +1285,7 @@ kibnal_sendmsg(ptl_ni_t *ni, 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: @@ -1292,7 +1297,7 @@ kibnal_sendmsg(ptl_ni_t *ni, 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; } @@ -1302,7 +1307,7 @@ kibnal_sendmsg(ptl_ni_t *ni, 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); } @@ -1327,30 +1332,30 @@ kibnal_sendmsg(ptl_ni_t *ni, /* 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)); } diff --git a/lnet/klnds/qswlnd/qswlnd.c b/lnet/klnds/qswlnd/qswlnd.c index 8ccf8f8..db7184f 100644 --- a/lnet/klnds/qswlnd/qswlnd.c +++ b/lnet/klnds/qswlnd/qswlnd.c @@ -27,29 +27,24 @@ ptl_nal_t kqswnal_nal = .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); @@ -61,16 +56,14 @@ kqswnal_get_tx_desc (struct portals_cfg *pcfg) 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; } @@ -80,22 +73,26 @@ kqswnal_get_tx_desc (struct portals_cfg *pcfg) } 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); @@ -119,23 +116,11 @@ kqswnal_shutdown(ptl_ni_t *ni) 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; @@ -224,15 +209,10 @@ kqswnal_shutdown(ptl_ni_t *ni) 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 */ @@ -323,6 +303,7 @@ kqswnal_shutdown(ptl_ni_t *ni) printk (KERN_INFO "Lustre: Routing QSW NAL unloaded (final mem %d)\n", atomic_read(&portal_kmemory)); + PORTAL_MODULE_UNUSE; } ptl_err_t @@ -347,7 +328,7 @@ kqswnal_startup (ptl_ni_t *ni, char **interfaces) } CDEBUG (D_MALLOC, "start kmem %d\n", atomic_read(&portal_kmemory)); - + /* ensure all pointers NULL etc */ memset (&kqswnal_data, 0, sizeof (kqswnal_data)); @@ -377,6 +358,7 @@ kqswnal_startup (ptl_ni_t *ni, char **interfaces) /* pointers/lists/locks initialised */ kqswnal_data.kqn_init = KQN_INIT_DATA; + PORTAL_MODULE_USE; #if MULTIRAIL_EKC kqswnal_data.kqn_ep = ep_system(); @@ -404,9 +386,10 @@ kqswnal_startup (ptl_ni_t *ni, char **interfaces) } #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 */ @@ -681,25 +664,11 @@ kqswnal_startup (ptl_ni_t *ni, char **interfaces) } } - /**********************************************************************/ - /* 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); } diff --git a/lnet/klnds/qswlnd/qswlnd.h b/lnet/klnds/qswlnd/qswlnd.h index 005407b..6caa8c3 100644 --- a/lnet/klnds/qswlnd/qswlnd.h +++ b/lnet/klnds/qswlnd/qswlnd.h @@ -260,9 +260,7 @@ typedef struct 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 */ @@ -281,24 +279,22 @@ extern kqswnal_data_t kqswnal_data; 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 @@ -378,15 +374,16 @@ ep_free_rcvr(EP_RCVR *r) 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); diff --git a/lnet/klnds/qswlnd/qswlnd_cb.c b/lnet/klnds/qswlnd/qswlnd_cb.c index 7f2b1c9..b951939 100644 --- a/lnet/klnds/qswlnd/qswlnd_cb.c +++ b/lnet/klnds/qswlnd/qswlnd_cb.c @@ -32,7 +32,7 @@ kqswnal_notify_peer_down(kqswnal_tx_t *ktx) 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 @@ -424,7 +424,7 @@ kqswnal_tx_done (kqswnal_tx_t *ktx, int error) { 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; @@ -1001,22 +1001,21 @@ kqswnal_rdma (kqswnal_rx_t *krx, ptl_msg_t *ptlmsg, int type, } 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; @@ -1026,8 +1025,8 @@ kqswnal_sendmsg (ptl_ni_t *ni, /* 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); @@ -1052,20 +1051,10 @@ kqswnal_sendmsg (ptl_ni_t *ni, 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 @@ -1074,13 +1063,13 @@ kqswnal_sendmsg (ptl_ni_t *ni, 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 */ @@ -1129,7 +1118,7 @@ kqswnal_sendmsg (ptl_ni_t *ni, * 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) >= @@ -1183,7 +1172,7 @@ kqswnal_sendmsg (ptl_ni_t *ni, 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; @@ -1239,10 +1228,10 @@ kqswnal_sendmsg (ptl_ni_t *ni, 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 && @@ -1266,43 +1255,43 @@ kqswnal_sendmsg (ptl_ni_t *ni, } 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; @@ -1323,15 +1312,9 @@ kqswnal_fwd_packet (void *arg, kpr_fwd_desc_t *fwd) 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)); @@ -1342,6 +1325,12 @@ kqswnal_fwd_packet (void *arg, kpr_fwd_desc_t *fwd) 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 */ @@ -1384,7 +1373,7 @@ kqswnal_fwd_packet (void *arg, kpr_fwd_desc_t *fwd) } 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; @@ -1552,7 +1541,7 @@ kqswnal_parse (kqswnal_rx_t *krx) 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 */ diff --git a/lnet/klnds/ralnd/ralnd.c b/lnet/klnds/ralnd/ralnd.c index 6caaca9..5cab1d0 100644 --- a/lnet/klnds/ralnd/ralnd.c +++ b/lnet/klnds/ralnd/ralnd.c @@ -29,6 +29,7 @@ ptl_nal_t kranal_nal = { .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, @@ -1280,7 +1281,7 @@ kranal_set_mynid(ptl_nid_t nid) /* 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(); @@ -1460,19 +1461,13 @@ kranal_add_persistent_peer (ptl_nid_t nid, __u32 ip, int port) } 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); @@ -1487,7 +1482,7 @@ kranal_del_peer_locked (kra_peer_t *peer, int single_share) } 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; @@ -1516,11 +1511,8 @@ kranal_del_peer (ptl_nid_t nid, int single_share) 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: @@ -1629,65 +1621,60 @@ kranal_close_matching_conns (ptl_nid_t nid) } 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; } } @@ -1825,10 +1812,6 @@ kranal_shutdown (ptl_ni_t *ni) 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); @@ -1920,6 +1903,7 @@ kranal_shutdown (ptl_ni_t *ni) atomic_read(&portal_kmemory)); kranal_data.kra_init = RANAL_INIT_NOTHING; + PORTAL_MODULE_UNUSE; } ptl_err_t @@ -1985,6 +1969,7 @@ kranal_startup (ptl_ni_t *ni, char **interfaces) /* 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, @@ -2054,16 +2039,10 @@ kranal_startup (ptl_ni_t *ni, char **interfaces) } } - 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); diff --git a/lnet/klnds/ralnd/ralnd.h b/lnet/klnds/ralnd/ralnd.h index 532daec..942e5bb 100644 --- a/lnet/klnds/ralnd/ralnd.h +++ b/lnet/klnds/ralnd/ralnd.h @@ -447,17 +447,16 @@ kranal_page2phys (struct page *p) 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, @@ -479,7 +478,7 @@ extern void kranal_schedule_conn (kra_conn_t *conn); 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); diff --git a/lnet/klnds/ralnd/ralnd_cb.c b/lnet/klnds/ralnd/ralnd_cb.c index 67ccbbe..53dabb8 100644 --- a/lnet/klnds/ralnd/ralnd_cb.c +++ b/lnet/klnds/ralnd/ralnd_cb.c @@ -569,18 +569,18 @@ kranal_consume_rxmsg (kra_conn_t *conn, void *buffer, int nob) } 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; @@ -588,8 +588,8 @@ kranal_do_send (ptl_ni_t *ni, /* 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); @@ -598,6 +598,11 @@ kranal_do_send (ptl_ni_t *ni, /* 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(); @@ -610,7 +615,7 @@ kranal_do_send (ptl_ni_t *ni, 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 */ @@ -619,7 +624,7 @@ kranal_do_send (ptl_ni_t *ni, /* 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; } @@ -677,10 +682,9 @@ kranal_do_send (ptl_ni_t *ni, 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; } @@ -688,7 +692,7 @@ kranal_do_send (ptl_ni_t *ni, 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: @@ -714,7 +718,7 @@ kranal_do_send (ptl_ni_t *ni, 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; } @@ -736,32 +740,30 @@ kranal_do_send (ptl_ni_t *ni, 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 diff --git a/lnet/klnds/socklnd/socklnd.c b/lnet/klnds/socklnd/socklnd.c index 5d42135..af36f04 100644 --- a/lnet/klnds/socklnd/socklnd.c +++ b/lnet/klnds/socklnd/socklnd.c @@ -29,19 +29,16 @@ ptl_nal_t ksocknal_nal = { .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) @@ -57,6 +54,7 @@ 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); } @@ -181,7 +179,7 @@ ksocknal_find_peer_locked (ptl_nid_t nid) } ksock_peer_t * -ksocknal_get_peer (ptl_nid_t nid) +ksocknal_find_peer (ptl_nid_t nid) { ksock_peer_t *peer; @@ -471,7 +469,7 @@ ksocknal_add_peer (ptl_nid_t nid, __u32 ipaddr, int port) } 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; @@ -487,25 +485,13 @@ ksocknal_del_peer_locked (ksock_peer_t *peer, __u32 ip, int single_share) 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; @@ -538,7 +524,7 @@ ksocknal_del_peer_locked (ksock_peer_t *peer, __u32 ip, int single_share) } 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; @@ -565,11 +551,8 @@ ksocknal_del_peer (ptl_nid_t nid, __u32 ip, int single_share) 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; } } @@ -1380,7 +1363,7 @@ ksocknal_terminate_conn (ksock_conn_t *conn) 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); } @@ -1424,7 +1407,8 @@ ksocknal_destroy_conn (ksock_conn_t *conn) 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: @@ -1547,7 +1531,7 @@ ksocknal_close_matching_conns (ptl_nid_t nid, __u32 ipaddr) } 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.... */ @@ -1607,7 +1591,7 @@ ksocknal_push (ptl_nid_t nid) int rc = -ENOENT; if (nid != PTL_NID_ANY) { - peer = ksocknal_get_peer (nid); + peer = ksocknal_find_peer (nid); if (peer != NULL) { rc = 0; @@ -1791,42 +1775,45 @@ ksocknal_del_interface(__u32 ipaddress) } 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; @@ -1834,48 +1821,30 @@ ksocknal_cmd(struct portals_cfg *pcfg, void * private) 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; @@ -1887,31 +1856,31 @@ ksocknal_cmd(struct portals_cfg *pcfg, void * private) 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: @@ -1972,17 +1941,13 @@ ksocknal_shutdown (ptl_ni_t *ni) 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; @@ -1996,11 +1961,8 @@ ksocknal_shutdown (ptl_ni_t *ni) /* 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; @@ -2034,9 +1996,6 @@ ksocknal_shutdown (ptl_ni_t *ni) 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); @@ -2061,14 +2020,9 @@ ksocknal_shutdown (ptl_ni_t *ni) } 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; } @@ -2077,7 +2031,6 @@ ksocknal_shutdown (ptl_ni_t *ni) printk(KERN_INFO "Lustre: Routing socket NAL unloaded (final mem %d)\n", atomic_read(&portal_kmemory)); - PORTAL_MODULE_UNUSE; } @@ -2208,12 +2161,7 @@ ksocknal_startup (ptl_ni_t *ni, char **interfaces) 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 + @@ -2258,22 +2206,12 @@ ksocknal_startup (ptl_ni_t *ni, char **interfaces) 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); } diff --git a/lnet/klnds/socklnd/socklnd.h b/lnet/klnds/socklnd/socklnd.h index 0111087..916ba9c 100644 --- a/lnet/klnds/socklnd/socklnd.h +++ b/lnet/klnds/socklnd/socklnd.h @@ -177,7 +177,7 @@ typedef struct 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 */ @@ -210,8 +210,7 @@ typedef struct #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), @@ -486,17 +485,16 @@ ksocknal_peer_decref (ksock_peer_t *peer) 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, @@ -510,7 +508,7 @@ ptl_err_t ksocknal_recv_pages(ptl_ni_t *ni, void *private, 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); @@ -522,9 +520,9 @@ extern int ksocknal_close_matching_conns (ptl_nid_t nid, __u32 ipaddr); 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); diff --git a/lnet/klnds/socklnd/socklnd_cb.c b/lnet/klnds/socklnd/socklnd_cb.c index 58c6002..627b0c1 100644 --- a/lnet/klnds/socklnd/socklnd_cb.c +++ b/lnet/klnds/socklnd/socklnd_cb.c @@ -378,7 +378,7 @@ ksocknal_tx_done (ksock_tx_t *tx, int asynch) } 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; @@ -513,42 +513,6 @@ ksocknal_launch_connection_locked (ksock_route_t *route) 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) { @@ -718,7 +682,7 @@ ksocknal_find_connecting_route_locked (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; @@ -762,7 +726,6 @@ ksocknal_launch_packet (ksock_tx_t *tx, ptl_nid_t nid) #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) { @@ -783,7 +746,6 @@ ksocknal_launch_packet (ksock_tx_t *tx, ptl_nid_t nid) #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); @@ -830,18 +792,18 @@ ksocknal_launch_packet (ksock_tx_t *tx, ptl_nid_t nid) } 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; @@ -850,8 +812,8 @@ ksocknal_sendmsg(ptl_ni_t *ni, /* 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); @@ -918,7 +880,7 @@ ksocknal_sendmsg(ptl_ni_t *ni, 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); @@ -928,40 +890,41 @@ ksocknal_sendmsg(ptl_ni_t *ni, 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 */ @@ -975,9 +938,9 @@ ksocknal_fwd_packet (void *arg, kpr_fwd_desc_t *fwd) 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 @@ -1006,7 +969,7 @@ ksocknal_thread_fini (void) } 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; @@ -1071,7 +1034,6 @@ ksocknal_get_idle_fmb (ksock_conn_t *conn) 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; @@ -1144,7 +1106,7 @@ ksocknal_init_fmb (ksock_conn_t *conn, ksock_fmb_t *fmb) 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); @@ -1192,16 +1154,6 @@ ksocknal_fwd_parse (ksock_conn_t *conn) 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", @@ -1214,7 +1166,7 @@ ksocknal_fwd_parse (ksock_conn_t *conn) } /* 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", @@ -1402,7 +1354,7 @@ ksocknal_process_receive (ksock_conn_t *conn) /* 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); diff --git a/lnet/klnds/viblnd/viblnd.c b/lnet/klnds/viblnd/viblnd.c index b960020..7e28052 100644 --- a/lnet/klnds/viblnd/viblnd.c +++ b/lnet/klnds/viblnd/viblnd.c @@ -28,6 +28,7 @@ ptl_nal_t kibnal_nal = { .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, @@ -672,19 +673,13 @@ kibnal_add_persistent_peer (ptl_nid_t nid, __u32 ip) } 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); @@ -702,7 +697,7 @@ kibnal_del_peer_locked (kib_peer_t *peer, int single_share) } 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; @@ -732,11 +727,8 @@ kibnal_del_peer (ptl_nid_t nid, int single_share) 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: @@ -1177,63 +1169,57 @@ kibnal_close_matching_conns (ptl_nid_t nid) } 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; } } @@ -1503,10 +1489,6 @@ kibnal_shutdown (ptl_ni_t *ni) 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); @@ -1603,6 +1585,7 @@ kibnal_shutdown (ptl_ni_t *ni) atomic_read(&portal_kmemory)); kibnal_data.kib_init = IBNAL_INIT_NOTHING; + PORTAL_MODULE_UNUSE; } ptl_err_t @@ -1623,6 +1606,7 @@ kibnal_startup (ptl_ni_t *ni, char **interfaces) return PTL_FAIL; } + PORTAL_MODULE_USE; memset (&kibnal_data, 0, sizeof (kibnal_data)); /* zero pointers, flags etc */ kibnal_data.kib_ni = ni; @@ -1842,14 +1826,6 @@ kibnal_startup (ptl_ni_t *ni, char **interfaces) } } - /*****************************************************/ - - 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; /*****************************************************/ diff --git a/lnet/klnds/viblnd/viblnd.h b/lnet/klnds/viblnd/viblnd.h index 5d0796e..be45e8f 100644 --- a/lnet/klnds/viblnd/viblnd.h +++ b/lnet/klnds/viblnd/viblnd.h @@ -411,17 +411,16 @@ extern kib_tunables_t kibnal_tunables; 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, @@ -438,7 +437,7 @@ extern void kibnal_pack_msg(kib_msg_t *msg, int credits, ptl_nid_t dstnid, 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, diff --git a/lnet/klnds/viblnd/viblnd_cb.c b/lnet/klnds/viblnd/viblnd_cb.c index 91033b0..60ccfc7 100644 --- a/lnet/klnds/viblnd/viblnd_cb.c +++ b/lnet/klnds/viblnd/viblnd_cb.c @@ -1305,18 +1305,18 @@ kibnal_launch_tx (kib_tx_t *tx, ptl_nid_t nid) } 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; @@ -1326,8 +1326,8 @@ kibnal_sendmsg(ptl_ni_t *ni, /* 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); @@ -1337,6 +1337,11 @@ kibnal_sendmsg(ptl_ni_t *ni, /* 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(); @@ -1354,9 +1359,9 @@ kibnal_sendmsg(ptl_ni_t *ni, 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; @@ -1365,7 +1370,7 @@ kibnal_sendmsg(ptl_ni_t *ni, /* 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; } @@ -1374,7 +1379,7 @@ kibnal_sendmsg(ptl_ni_t *ni, 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; } @@ -1389,7 +1394,7 @@ kibnal_sendmsg(ptl_ni_t *ni, 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; } @@ -1399,7 +1404,7 @@ kibnal_sendmsg(ptl_ni_t *ni, 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); @@ -1439,7 +1444,7 @@ kibnal_sendmsg(ptl_ni_t *ni, 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; } @@ -1448,16 +1453,16 @@ kibnal_sendmsg(ptl_ni_t *ni, 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: @@ -1482,7 +1487,7 @@ kibnal_sendmsg(ptl_ni_t *ni, 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; } @@ -1494,7 +1499,7 @@ kibnal_sendmsg(ptl_ni_t *ni, 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; } @@ -1504,7 +1509,7 @@ kibnal_sendmsg(ptl_ni_t *ni, 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; } @@ -1526,32 +1531,30 @@ kibnal_sendmsg(ptl_ni_t *ni, 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)); } diff --git a/lnet/klnds/viblnd/wirecheck.c b/lnet/klnds/viblnd/wirecheck.c index 7e2a6c3..d5744c8 100644 --- a/lnet/klnds/viblnd/wirecheck.c +++ b/lnet/klnds/viblnd/wirecheck.c @@ -5,7 +5,15 @@ #include #include #include + #include + +/* 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 #include "vibnal_wire.h" diff --git a/lnet/libcfs/linux/linux-module.c b/lnet/libcfs/linux/linux-module.c index 4b2558b..0d9a1ec 100644 --- a/lnet/libcfs/linux/linux-module.c +++ b/lnet/libcfs/linux/linux-module.c @@ -76,7 +76,7 @@ int portal_ioctl_getdata(char *buf, char *end, void *arg) RETURN(0); } - + extern struct cfs_psdev_ops libcfs_psdev_ops; static int diff --git a/lnet/libcfs/module.c b/lnet/libcfs/module.c index c6b63f8..2a85f9f 100644 --- a/lnet/libcfs/module.c +++ b/lnet/libcfs/module.c @@ -28,15 +28,6 @@ #include #include -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) { @@ -180,144 +171,36 @@ static int libcfs_psdev_release(unsigned long flags, void *args) 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); @@ -352,7 +235,8 @@ static int libcfs_ioctl(struct cfs_psdev_file *pfile, unsigned long cmd, void *a 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: { @@ -362,13 +246,13 @@ static int libcfs_ioctl(struct cfs_psdev_file *pfile, unsigned long cmd, void *a 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))) @@ -384,46 +268,6 @@ static int libcfs_ioctl(struct cfs_psdev_file *pfile, unsigned long cmd, void *a 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; @@ -438,17 +282,39 @@ static int libcfs_ioctl(struct cfs_psdev_file *pfile, unsigned long cmd, void *a } 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); @@ -484,7 +350,6 @@ static int init_libcfs_module(void) 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); diff --git a/lnet/libcfs/nidstrings.c b/lnet/libcfs/nidstrings.c index 6f78cd9..71a5dc5 100644 --- a/lnet/libcfs/nidstrings.c +++ b/lnet/libcfs/nidstrings.c @@ -24,10 +24,18 @@ # define EXPORT_SYMTAB #endif -# define DEBUG_SUBSYSTEM S_PORTALS +#define DEBUG_SUBSYSTEM S_PORTALS +#include #include -#include +#ifndef __KERNEL__ +#include +#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 @@ -36,31 +44,38 @@ * 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; } @@ -72,14 +87,14 @@ static int libcfs_ip_str2addr(char *str, int nob, __u32 *addr); 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}, @@ -90,7 +105,7 @@ static struct nettype libcfs_nettypes[] = { {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) @@ -111,7 +126,19 @@ libcfs_lo_str2addr(char *str, int nob, __u32 *addr) 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 @@ -122,17 +149,31 @@ libcfs_ip_str2addr(char *str, int nob, __u32 *addr) 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 @@ -155,118 +196,200 @@ libcfs_num_str2addr(char *str, int nob, __u32 *addr) 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"; } @@ -279,6 +402,12 @@ libcfs_nid2str(ptl_nid_t nid) snprintf(str, PTL_NALFMT_SIZE, "%llx", (unsigned long long)nid); } +__u32 +libcfs_str2net(char *str) +{ + return 0; +} + ptl_nid_t libcfs_str2nid(char *str) { @@ -318,7 +447,26 @@ libcfs_id2str(ptl_process_id_t id) 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 diff --git a/lnet/lnet/Makefile.in b/lnet/lnet/Makefile.in index 0fed502..3c00d77 100644 --- a/lnet/lnet/Makefile.in +++ b/lnet/lnet/Makefile.in @@ -1,6 +1,18 @@ 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@ diff --git a/lnet/lnet/api-ni.c b/lnet/lnet/api-ni.c index 4b0a891..c73068a 100644 --- a/lnet/lnet/api-ni.c +++ b/lnet/lnet/api-ni.c @@ -166,11 +166,11 @@ ptl_register_nal (ptl_nal_t *nal) 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(); } @@ -182,7 +182,7 @@ ptl_unregister_nal (ptl_nal_t *nal) 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); @@ -409,9 +409,9 @@ ptl_invalidate_handle (ptl_libhandle_t *lh) } 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; @@ -435,6 +435,7 @@ ptl_startup_apini(ptl_pid_t requested_pid, 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); @@ -490,7 +491,7 @@ ptl_startup_apini(ptl_pid_t requested_pid, } int -ptl_shutdown_apini (void) +ptl_apini_fini (void) { int idx; @@ -499,9 +500,14 @@ ptl_shutdown_apini (void) * 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, @@ -553,24 +559,103 @@ ptl_shutdown_apini (void) 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--; } } @@ -579,9 +664,12 @@ ptl_startup_nalnis (void) { 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); @@ -589,25 +677,29 @@ ptl_startup_nalnis (void) 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) @@ -681,14 +773,15 @@ PtlNIInit(ptl_interface_t interface, ptl_pid_t requested_pid, 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; } @@ -715,13 +808,78 @@ PtlNIFini(ptl_handle_ni_t ni) 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) { diff --git a/lnet/lnet/autoMakefile.am b/lnet/lnet/autoMakefile.am index 8af6fee..2eb95de 100644 --- a/lnet/lnet/autoMakefile.am +++ b/lnet/lnet/autoMakefile.am @@ -1,6 +1,7 @@ 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 diff --git a/lnet/lnet/lib-move.c b/lnet/lnet/lib-move.c index 7a708b6..6c48234 100644 --- a/lnet/lnet/lib-move.c +++ b/lnet/lnet/lib-move.c @@ -39,8 +39,7 @@ static ptl_err_t do_ptl_parse(ptl_ni_t *ni, ptl_hdr_t *hdr, 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) @@ -53,8 +52,8 @@ ptl_match_md(int index, int op_mask, 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", @@ -82,14 +81,11 @@ ptl_match_md(int index, int op_mask, /* 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? */ @@ -121,18 +117,17 @@ ptl_match_md(int index, int op_mask, } /* 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; @@ -156,16 +151,15 @@ ptl_match_md(int index, int op_mask, } 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; @@ -693,9 +687,6 @@ ptl_lo_txkiov (ptl_ni_t *ni, 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, @@ -790,9 +781,6 @@ ptl_lo_txiov (ptl_ni_t *ni, 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, @@ -853,49 +841,82 @@ ptl_recv (ptl_ni_t *ni, void *private, ptl_msg_t *msg, ptl_libmd_t *md, 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 @@ -955,6 +976,8 @@ ptl_parse_put(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private, { 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; @@ -966,8 +989,7 @@ ptl_parse_put(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private, 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); @@ -997,8 +1019,8 @@ ptl_parse_put(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private, 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); } @@ -1009,6 +1031,8 @@ ptl_parse_get(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private, { 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; @@ -1022,8 +1046,7 @@ ptl_parse_get(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private, 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); @@ -1041,23 +1064,16 @@ ptl_parse_get(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private, 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) @@ -1071,6 +1087,8 @@ static ptl_err_t 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; @@ -1082,8 +1100,9 @@ ptl_parse_reply(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private, /* 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); @@ -1098,10 +1117,10 @@ ptl_parse_reply(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private, 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); @@ -1109,16 +1128,14 @@ ptl_parse_reply(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private, 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; @@ -1137,8 +1154,8 @@ ptl_parse_reply(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private, 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); } @@ -1147,8 +1164,10 @@ static ptl_err_t 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); @@ -1159,25 +1178,24 @@ ptl_parse_ack(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private, /* 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; @@ -1222,11 +1240,15 @@ hdr_type_string (ptl_hdr_t *hdr) 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: @@ -1310,11 +1332,11 @@ do_ptl_parse(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private, int loopback) 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); @@ -1322,11 +1344,11 @@ do_ptl_parse(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private, int 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; } @@ -1336,17 +1358,19 @@ do_ptl_parse(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private, int loopback) 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; } @@ -1356,20 +1380,19 @@ do_ptl_parse(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private, int loopback) 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; } @@ -1435,7 +1458,6 @@ PtlPut(ptl_handle_md_t mdh, ptl_ack_req_t ack, 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; @@ -1448,48 +1470,33 @@ PtlPut(ptl_handle_md_t mdh, ptl_ack_req_t ack, 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) { @@ -1508,7 +1515,7 @@ PtlPut(ptl_handle_md_t mdh, ptl_ack_req_t ack, 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; @@ -1525,12 +1532,12 @@ PtlPut(ptl_handle_md_t mdh, ptl_ack_req_t ack, 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 */ @@ -1556,21 +1563,22 @@ ptl_create_reply_msg (ptl_ni_t *ni, ptl_nid_t peer_nid, ptl_msg_t *getmsg) 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); @@ -1606,7 +1614,6 @@ PtlGet(ptl_handle_md_t mdh, ptl_process_id_t target, 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; @@ -1619,48 +1626,33 @@ PtlGet(ptl_handle_md_t mdh, ptl_process_id_t target, 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 = @@ -1675,7 +1667,7 @@ PtlGet(ptl_handle_md_t mdh, ptl_process_id_t target, 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; @@ -1691,12 +1683,12 @@ PtlGet(ptl_handle_md_t mdh, ptl_process_id_t target, 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 */ diff --git a/lnet/lnet/lib-msg.c b/lnet/lnet/lib-msg.c index 667a7cc..edd0ce4 100644 --- a/lnet/lnet/lib-msg.c +++ b/lnet/lnet/lib-msg.c @@ -84,21 +84,12 @@ ptl_finalize (ptl_ni_t *ni, void *private, ptl_msg_t *msg, ptl_err_t status) 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", diff --git a/lnet/lnet/module.c b/lnet/lnet/module.c index 56300f7..526183f 100644 --- a/lnet/lnet/module.c +++ b/lnet/lnet/module.c @@ -25,82 +25,20 @@ #define DEBUG_SUBSYSTEM S_PORTALS #include -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); diff --git a/lnet/router/Makefile.in b/lnet/router/Makefile.in index 3bb6cf7..c43bc9f 100644 --- a/lnet/router/Makefile.in +++ b/lnet/router/Makefile.in @@ -1,4 +1,2 @@ -MODULES := kptlrouter -kptlrouter-objs := router.o proc.o @INCLUDE_RULES@ diff --git a/lnet/router/autoMakefile.am b/lnet/router/autoMakefile.am index 08db593..e00d06e 100644 --- a/lnet/router/autoMakefile.am +++ b/lnet/router/autoMakefile.am @@ -3,15 +3,5 @@ # 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 diff --git a/lnet/router/proc.c b/lnet/router/proc.c index 61b6880..d44ae07 100644 --- a/lnet/router/proc.c +++ b/lnet/router/proc.c @@ -143,11 +143,11 @@ static int kpr_proc_routes_read(char *page, char **start, off_t off, 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; diff --git a/lnet/router/router.c b/lnet/router/router.c index 9d74754..aabd9a0 100644 --- a/lnet/router/router.c +++ b/lnet/router/router.c @@ -25,7 +25,6 @@ LIST_HEAD(kpr_routes); LIST_HEAD(kpr_gateways); -LIST_HEAD(kpr_nals); unsigned int kpr_routes_generation; unsigned long long kpr_fwd_bytes; @@ -39,99 +38,47 @@ atomic_t kpr_queue_depth; * 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; @@ -141,35 +88,39 @@ kpr_upcall (int gw_nalid, ptl_nid_t gw_nid, int alive, time_t 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); @@ -177,9 +128,7 @@ kpr_do_notify (int byNal, int gateway_nalid, ptl_nid_t gateway_nid, 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; @@ -211,7 +160,8 @@ kpr_do_notify (int byNal, int gateway_nalid, ptl_nid_t gateway_nid, } 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 @@ -223,95 +173,24 @@ kpr_do_notify (int byNal, int gateway_nalid, ptl_nid_t gateway_nid, } } - 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 @@ -351,167 +230,185 @@ kpr_update_weight (kpr_gateway_entry_t *ge, int nob) 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; } @@ -519,37 +416,30 @@ kpr_forward_packet (void *arg, kpr_fwd_desc_t *fwd) 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; @@ -557,20 +447,16 @@ kpr_add_route (int gateway_nalid, ptl_nid_t gateway_nid, 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; @@ -583,8 +469,7 @@ kpr_add_route (int gateway_nalid, ptl_nid_t gateway_nid, 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); @@ -593,8 +478,7 @@ kpr_add_route (int gateway_nalid, ptl_nid_t gateway_nid, 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; @@ -626,32 +510,19 @@ kpr_add_route (int gateway_nalid, ptl_nid_t gateway_nid, } 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); @@ -660,10 +531,12 @@ kpr_del_route (int gw_nalid, ptl_nid_t gw_nid, 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; @@ -675,9 +548,6 @@ kpr_del_route (int gw_nalid, ptl_nid_t gw_nid, list_del (&re->kpre_list); PORTAL_FREE(re, sizeof (*re)); - - if (specific) - break; } kpr_routes_generation++; @@ -687,8 +557,7 @@ kpr_del_route (int gw_nalid, ptl_nid_t gw_nid, } 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; @@ -701,11 +570,9 @@ kpr_get_route (int idx, __u32 *gateway_nalid, ptl_nid_t *gateway_nid, 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); @@ -716,67 +583,38 @@ kpr_get_route (int idx, __u32 *gateway_nalid, ptl_nid_t *gateway_nid, 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, @@ -786,11 +624,20 @@ kpr_finalise (void) 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; @@ -799,23 +646,14 @@ kpr_initialise (void) 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); diff --git a/lnet/router/router.h b/lnet/router/router.h index 44f307a..5e5fa78 100644 --- a/lnet/router/router.h +++ b/lnet/router/router.h @@ -42,19 +42,10 @@ 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; @@ -63,30 +54,17 @@ typedef struct { 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); diff --git a/lnet/tests/ping.h b/lnet/tests/ping.h index ef937af..3e7eec5 100644 --- a/lnet/tests/ping.h +++ b/lnet/tests/ping.h @@ -53,7 +53,10 @@ struct pingsrv_data { 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; diff --git a/lnet/tests/ping_cli.c b/lnet/tests/ping_cli.c index f33a997..398e069 100644 --- a/lnet/tests/ping_cli.c +++ b/lnet/tests/ping_cli.c @@ -44,7 +44,6 @@ static int count = 0; 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 @@ -72,11 +71,11 @@ pingcli_shutdown(ptl_handle_ni_t nih, int err) 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, @@ -105,7 +104,7 @@ static void pingcli_callback(ptl_event_t *ev) } -static struct pingcli_data * +static void pingcli_start(struct portal_ioctl_data *args) { ptl_handle_ni_t nih = PTL_INVALID_HANDLE; @@ -114,29 +113,33 @@ pingcli_start(struct portal_ioctl_data *args) 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); @@ -144,7 +147,7 @@ pingcli_start(struct portal_ioctl_data *args) { CERROR ("PtlNIInit: error %d\n", rc); pingcli_shutdown (nih, 4); - return (NULL); + return; } /* Based on the initialization aquire our unique portal ID. */ @@ -152,7 +155,7 @@ pingcli_start(struct portal_ioctl_data *args) { CERROR ("PtlGetId error %d\n", rc); pingcli_shutdown (nih, 2); - return (NULL); + return; } /* Setup the local match entries */ @@ -160,7 +163,7 @@ pingcli_start(struct portal_ioctl_data *args) 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, @@ -169,7 +172,7 @@ pingcli_start(struct portal_ioctl_data *args) { CERROR ("PtlMEAttach error %d\n", rc); pingcli_shutdown (nih, 2); - return (NULL); + return; } /* Allocate the event queue for this network interface */ @@ -177,31 +180,30 @@ pingcli_start(struct portal_ioctl_data *args) { 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; @@ -215,9 +217,9 @@ pingcli_start(struct portal_ioctl_data *args) 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); @@ -233,12 +235,12 @@ pingcli_start(struct portal_ioctl_data *args) 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 { @@ -252,8 +254,6 @@ pingcli_start(struct portal_ioctl_data *args) pingcli_shutdown (nih, 2); - /* Success! */ - return NULL; } /* pingcli_setup() */ diff --git a/lnet/tests/sping_cli.c b/lnet/tests/sping_cli.c index 251a6c7..43b6b65 100644 --- a/lnet/tests/sping_cli.c +++ b/lnet/tests/sping_cli.c @@ -98,7 +98,7 @@ static void pingcli_callback(ptl_event_t *ev) } -static struct pingcli_data * +static void pingcli_start(struct portal_ioctl_data *args) { ptl_handle_ni_t nih = PTL_INVALID_HANDLE; @@ -106,13 +106,16 @@ pingcli_start(struct portal_ioctl_data *args) 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) ; @@ -120,7 +123,7 @@ pingcli_start(struct portal_ioctl_data *args) { CERROR ("Unable to allocate out_buf ("LPSZ" bytes)\n", STDSIZE); pingcli_shutdown (nih, 4); - return (NULL); + return; } PORTAL_ALLOC (client->inbuf, STDSIZE); @@ -129,7 +132,7 @@ pingcli_start(struct portal_ioctl_data *args) { 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. */ @@ -138,7 +141,7 @@ pingcli_start(struct portal_ioctl_data *args) { CERROR ("PtlNIInit: error %d\n", rc); pingcli_shutdown (nih, 4); - return (NULL); + return; } /* Based on the initialization aquire our unique portal ID. */ @@ -146,7 +149,7 @@ pingcli_start(struct portal_ioctl_data *args) { CERROR ("PtlGetId error %d\n", rc); pingcli_shutdown (nih, 2); - return (NULL); + return; } /* Setup the local match entries */ @@ -154,7 +157,7 @@ pingcli_start(struct portal_ioctl_data *args) 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, @@ -163,7 +166,7 @@ pingcli_start(struct portal_ioctl_data *args) { CERROR ("PtlMEAttach error %d\n", rc); pingcli_shutdown (nih, 2); - return (NULL); + return; } /* Allocate the event queue for this network interface */ @@ -171,7 +174,7 @@ pingcli_start(struct portal_ioctl_data *args) { CERROR ("PtlEQAlloc error %d\n", rc); pingcli_shutdown (nih, 2); - return (NULL); + return; } @@ -188,7 +191,7 @@ pingcli_start(struct portal_ioctl_data *args) 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 */ @@ -206,31 +209,29 @@ pingcli_start(struct portal_ioctl_data *args) 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() */ diff --git a/lnet/ulnds/socklnd/tcplnd.c b/lnet/ulnds/socklnd/tcplnd.c index e805ff8..813e134 100644 --- a/lnet/ulnds/socklnd/tcplnd.c +++ b/lnet/ulnds/socklnd/tcplnd.c @@ -60,8 +60,8 @@ ptl_err_t tcpnal_send(ptl_ni_t *ni, 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, @@ -77,9 +77,14 @@ ptl_err_t tcpnal_send(ptl_ni_t *ni, 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); diff --git a/lnet/ulnds/tcplnd.c b/lnet/ulnds/tcplnd.c index e805ff8..813e134 100644 --- a/lnet/ulnds/tcplnd.c +++ b/lnet/ulnds/tcplnd.c @@ -60,8 +60,8 @@ ptl_err_t tcpnal_send(ptl_ni_t *ni, 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, @@ -77,9 +77,14 @@ ptl_err_t tcpnal_send(ptl_ni_t *ni, 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); diff --git a/lnet/utils/Makefile.am b/lnet/utils/Makefile.am index b8dbf2c..39c10ec 100644 --- a/lnet/utils/Makefile.am +++ b/lnet/utils/Makefile.am @@ -19,7 +19,7 @@ sbin_PROGRAMS = debugctl 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 @@ -46,3 +46,6 @@ routerstat_SOURCES = routerstat.c debugctl_SOURCES = debugctl.c debugctl_LDADD = -L. -lptlctl $(LIBREADLINE) $(LIBEFENCE) debugctl_DEPENDENCIES = libptlctl.a + +nidstrings.c: @top_srcdir@/portals/libcfs/nidstrings.c + ln -sf $< $@ diff --git a/lnet/utils/acceptor.c b/lnet/utils/acceptor.c deleted file mode 100644 index e5bb46b..0000000 --- a/lnet/utils/acceptor.c +++ /dev/null @@ -1,249 +0,0 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef HAVE_LIBWRAP -#include -#include -#include -#endif - -#include -#include -#include -#include - -/* 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); - -} diff --git a/lnet/utils/gmlndnid.c b/lnet/utils/gmlndnid.c index f7e5250..6b9cfe6 100644 --- a/lnet/utils/gmlndnid.c +++ b/lnet/utils/gmlndnid.c @@ -37,7 +37,6 @@ #include -#define GMNAL_IOC_GET_GNID 1 /* * portals always uses unit 0 * Can this be configurable? diff --git a/lnet/utils/portals.c b/lnet/utils/portals.c index 54c716b..df8efd9 100644 --- a/lnet/utils/portals.c +++ b/lnet/utils/portals.c @@ -55,44 +55,19 @@ #include #include #include -#include #include #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") || @@ -116,116 +91,18 @@ int ptl_parse_bool (int *b, char *str) { 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 @@ -252,49 +129,6 @@ ptl_gethostbyname(char * hname) { #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; @@ -366,225 +200,193 @@ ptl_ipaddr_2_str (__u32 ipaddr, char *str, int lookup) } 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("\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) { @@ -603,7 +405,7 @@ jt_ptl_print_interfaces (int argc, char **argv) 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; @@ -616,7 +418,7 @@ jt_ptl_add_interface (int argc, char **argv) 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) { @@ -636,11 +438,12 @@ jt_ptl_add_interface (int argc, char **argv) } } - 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)); @@ -653,7 +456,7 @@ jt_ptl_add_interface (int argc, char **argv) int jt_ptl_del_interface (int argc, char **argv) { - struct portals_cfg pcfg; + struct portal_ioctl_data data; int rc; __u32 ipaddr = 0; @@ -662,7 +465,7 @@ jt_ptl_del_interface (int argc, char **argv) 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 && @@ -671,10 +474,11 @@ jt_ptl_del_interface (int argc, char **argv) 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)); @@ -687,37 +491,40 @@ jt_ptl_del_interface (int argc, char **argv) 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) { @@ -735,23 +542,23 @@ jt_ptl_print_peers (int argc, char **argv) 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]); @@ -762,30 +569,31 @@ jt_ptl_add_peer (int argc, char **argv) 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)); @@ -798,60 +606,47 @@ jt_ptl_add_peer (int argc, char **argv) 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)); @@ -864,44 +659,45 @@ jt_ptl_del_peer (int argc, char **argv) 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) { @@ -918,7 +714,7 @@ jt_ptl_print_connections (int argc, char **argv) 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; @@ -928,29 +724,30 @@ int jt_ptl_disconnect(int argc, char **argv) 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; @@ -961,36 +758,30 @@ int jt_ptl_disconnect(int argc, char **argv) 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; @@ -1002,33 +793,32 @@ int jt_ptl_push_connection (int argc, char **argv) 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" : "", - 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) { @@ -1057,11 +847,8 @@ int jt_ptl_ping(int argc, char **argv) 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); } @@ -1085,10 +872,9 @@ int jt_ptl_ping(int argc, char **argv) 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) { @@ -1099,74 +885,40 @@ int jt_ptl_ping(int argc, char **argv) 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 @@ -1179,30 +931,24 @@ jt_ptl_fail_nid (int argc, char **argv) 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; @@ -1219,52 +965,32 @@ jt_ptl_fail_nid (int argc, char **argv) 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); } @@ -1274,62 +1000,29 @@ jt_ptl_add_route (int argc, char **argv) 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); } @@ -1339,7 +1032,7 @@ jt_ptl_del_route (int argc, char **argv) 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; @@ -1353,8 +1046,8 @@ jt_ptl_notify_router (int argc, char **argv) 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); } @@ -1379,19 +1072,16 @@ jt_ptl_notify_router (int argc, char **argv) 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); } @@ -1401,44 +1091,35 @@ jt_ptl_notify_router (int argc, char **argv) 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); } @@ -1449,8 +1130,7 @@ lwt_control(int enable, int clear) 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) @@ -1480,26 +1160,25 @@ lwt_snapshot(cycles_t *now, int *ncpu, int *totalsize, } /* 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); } diff --git a/lnet/utils/ptlctl.c b/lnet/utils/ptlctl.c index 4287c55..5dcf01d 100644 --- a/lnet/utils/ptlctl.c +++ b/lnet/utils/ptlctl.c @@ -41,7 +41,6 @@ command_t list[] = { {"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])"}, diff --git a/lnet/utils/wirecheck.c b/lnet/utils/wirecheck.c index acdd4db..f97a268 100644 --- a/lnet/utils/wirecheck.c +++ b/lnet/utils/wirecheck.c @@ -5,6 +5,13 @@ #include #include #include + +/* 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 #include @@ -25,14 +32,14 @@ do { \ #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) \