either VM frags (iov != NULL) or page frags (kiov != NULL) but not both.
* Ensure that the order of networks declared in the "networks" and "routes"
breaks ties when determining which peer NID to use.
lnet_match_bits_t match_bits_in,
lnet_size_t offset_in);
-int LNetDist (lnet_handle_ni_t interface, lnet_nid_t nid);
+int LNetDist(lnet_handle_ni_t interface, lnet_nid_t nid, int *order);
#endif
int lnet_notify(ptl_ni_t *ni, lnet_nid_t peer, int alive, time_t when);
/* internal APIs */
-int kpr_distance(lnet_nid_t nid);
+int kpr_distance(lnet_nid_t nid, int *order);
int kpr_ctl(unsigned int cmd, void *arg);
int kpr_add_route(__u32 net, unsigned int hops, lnet_nid_t gateway_nid);
int kpr_initialise(void);
extern ptl_ni_t *lnet_net2ni (__u32 net);
extern int ptl_islocalnid (lnet_nid_t nid);
-extern int ptl_islocalnet (__u32 net);
+extern int ptl_islocalnet (__u32 net, int *orderp);
extern void ptl_enq_event_locked (void *private,
ptl_eq_t *eq, lnet_event_t *ev);
extern void lnet_finalize (ptl_ni_t *ni, void *private, ptl_msg_t *msg,
unsigned int nal_type;
int (*nal_startup) (struct ptl_ni *ni);
- 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
- * specified remote process. The payload is scattered over 'niov'
- * fragments described by iov, starting at 'offset' for 'mlen'
- * bytes.
- * NB the NAL may NOT overwrite iov.
- * 0 on success => NAL has committed to send and will call
- * lnet_finalize on completion
- */
- int (*nal_send)
- (struct ptl_ni *ni, void *private, ptl_msg_t *msg,
- ptl_hdr_t *hdr, int type, lnet_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) */
- int (*nal_send_pages)
- (struct ptl_ni *ni, void *private, ptl_msg_t *cookie,
- ptl_hdr_t *hdr, int type, lnet_process_id_t target,
- int routing, unsigned int niov, lnet_kiov_t *iov,
- size_t offset, size_t mlen);
- /*
- * recv: Receives an incoming message from a remote process. The
- * payload is to be received into the scattered buffer of 'niov'
- * fragments described by iov, starting at 'offset' for 'mlen'
- * bytes. Payload bytes after 'mlen' up to 'rlen' are to be
- * discarded.
- * NB the NAL may NOT overwrite iov.
- * 0 on success => NAL has committed to receive and will call
- * lnet_finalize on completion
- */
- int (*nal_recv)
- (struct ptl_ni *ni, void *private, ptl_msg_t * cookie,
- unsigned int niov, struct iovec *iov,
- size_t offset, size_t mlen, size_t rlen);
-
- /* as recv, but with a set of page fragments (NULL if not supported) */
- int (*nal_recv_pages)
- (struct ptl_ni *ni, void *private, ptl_msg_t * cookie,
- unsigned int niov, lnet_kiov_t *iov,
- size_t offset, size_t mlen, size_t rlen);
+ void (*nal_shutdown) (struct ptl_ni *ni);
+ int (*nal_ctl)(struct ptl_ni *ni, unsigned int cmd, void *arg);
+
+ /* In data movement APIs below, payload buffers are described as a set
+ * of 'niov' fragments which are...
+ * EITHER
+ * in virtual memory (struct iovec *iov != NULL)
+ * OR
+ * in pages (kernel only: plt_kiov_t *kiov != NULL).
+ * The NAL may NOT overwrite these fragment descriptors.
+ * An 'offset' and may specify a byte offset within the set of
+ * fragments to start from
+ */
+
+ /* Start sending a preformatted header and 'mlen' bytes of payload data
+ * of to a specified remote process. 'private' is NULL for PUT and GET
+ * messages; otherwise this is a response to an incoming message and
+ * 'private' is the 'private' passed to lnet_parse(). Return non-zero
+ * for immediate failure, otherwise complete later with
+ * lnet_finalize() */
+ int (*nal_send) (struct ptl_ni *ni, void *private, ptl_msg_t *msg,
+ ptl_hdr_t *hdr, int type, lnet_process_id_t target,
+ int routing, unsigned int niov,
+ struct iovec *iov, lnet_kiov_t *kiov,
+ unsigned int offset, unsigned int mlen);
+
+ /* Start receiving 'mlen' bytes of payload data, skipping the following
+ * 'rlen' - 'mlen' bytes. 'private' is the 'private' passed to
+ * lnet_parse(). Return non-zero for immedaite failuyre, otherwise
+ * complete later with lnet_finalize() */
+ int (*nal_recv) (struct ptl_ni *ni, void *private, ptl_msg_t * cookie,
+ unsigned int niov, struct iovec *iov, lnet_kiov_t *kiov,
+ unsigned int offset, unsigned int mlen, unsigned int rlen);
/* forward a packet for the router */
void (*nal_fwd)(struct ptl_ni *ni, kpr_fwd_desc_t *fwd);
typedef struct ptl_ni {
struct list_head ni_list; /* chain on apini_nis */
- lnet_nid_t ni_nid; /* interface's NID */
+ lnet_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? */
{
unsigned int lod_type;
unsigned int lod_niov;
- size_t lod_offset;
- size_t lod_nob;
+ unsigned int lod_offset;
+ unsigned int lod_nob;
union {
struct iovec *iov;
lnet_kiov_t *kiov;
/* gmnal_cb.c */
int gmnal_recv(ptl_ni_t *ni, void *private, ptl_msg_t *ptlmsg,
- unsigned int niov, struct iovec *iov,
- size_t offset, size_t mlen, size_t rlen);
-int gmnal_recv_pages(ptl_ni_t *ni, void *private, ptl_msg_t *ptlmsg,
- unsigned int nkiov, lnet_kiov_t *kiov,
- size_t offset, size_t mlen, size_t rlen);
+ unsigned int niov, struct iovec *iov, lnet_kiov_t *kiov,
+ unsigned int offset, unsigned int mlen, unsigned int rlen);
int gmnal_send(ptl_ni_t *ni, void *private, ptl_msg_t *ptlmsg,
ptl_hdr_t *hdr, int type,
lnet_process_id_t tgt, int routing,
- unsigned int niov, struct iovec *iov,
- size_t offset, size_t len);
-int gmnal_send_pages(ptl_ni_t *ni, void *private, ptl_msg_t *ptlmsg,
- ptl_hdr_t *hdr, int type,
- lnet_process_id_t tgt, int routing,
- unsigned int nkiov, lnet_kiov_t *kiov,
- size_t offset, size_t len);
+ unsigned int niov, struct iovec *iov, lnet_kiov_t *kiov,
+ unsigned int offset, unsigned int len);
/* gmnal_util.c */
void gmnal_free_ltxbufs(gmnal_ni_t *gmni);
.nal_shutdown = gmnal_shutdown,
.nal_ctl = gmnal_ctl,
.nal_send = gmnal_send,
- .nal_send_pages = gmnal_send_pages,
.nal_recv = gmnal_recv,
- .nal_recv_pages = gmnal_recv_pages,
};
gmnal_ni_t *the_gmni = NULL;
#include "gmlnd.h"
int
-gmnal_recvmsg(ptl_ni_t *ni, void *private, ptl_msg_t *ptlmsg,
- unsigned int niov, struct iovec *iov, lnet_kiov_t *kiov,
- size_t offset, size_t mlen)
+gmnal_recv(ptl_ni_t *ni, void *private, ptl_msg_t *ptlmsg,
+ unsigned int niov, struct iovec *iov, lnet_kiov_t *kiov,
+ unsigned int offset, unsigned int mlen, unsigned int rlen)
{
gmnal_ni_t *gmni = ni->ni_data;
gmnal_rx_t *rx = (gmnal_rx_t*)private;
}
int
-gmnal_recv(ptl_ni_t *ni, void *private, ptl_msg_t *ptlmsg,
- unsigned int niov, struct iovec *iov,
- size_t offset, size_t mlen, size_t rlen)
-{
- return gmnal_recvmsg(ni, private, ptlmsg,
- niov, iov, NULL, offset, mlen);
-}
-
-int
-gmnal_recv_pages(ptl_ni_t *ni, void *private,
- ptl_msg_t *ptlmsg,
- unsigned int nkiov, lnet_kiov_t *kiov,
- size_t offset, size_t mlen, size_t rlen)
-{
- return gmnal_recvmsg(ni, private, ptlmsg,
- nkiov, NULL, kiov, offset, mlen);
-}
-
-int
-gmnal_sendmsg(ptl_ni_t *ni, void *private, ptl_msg_t *ptlmsg,
- ptl_hdr_t *hdr, int type, lnet_process_id_t pid,
- unsigned int niov, struct iovec *iov, lnet_kiov_t *kiov,
- size_t offset, size_t len)
+gmnal_send(ptl_ni_t *ni, void *private, ptl_msg_t *ptlmsg,
+ ptl_hdr_t *hdr, int type, lnet_process_id_t pid, int routing,
+ unsigned int niov, struct iovec *iov, lnet_kiov_t *kiov,
+ unsigned int offset, unsigned int len)
{
gmnal_ni_t *gmni = ni->ni_data;
gm_status_t gmrc;
return 0;
}
-
-int
-gmnal_send(ptl_ni_t *ni, void *private, ptl_msg_t *ptlmsg,
- ptl_hdr_t *hdr, int type,
- lnet_process_id_t pid, int routing,
- unsigned int niov, struct iovec *iov,
- size_t offset, size_t len)
-{
- return gmnal_sendmsg(ni, private, ptlmsg,
- hdr, type, pid,
- niov, iov, NULL, offset, len);
-}
-
-int
-gmnal_send_pages(ptl_ni_t *ni, void *private, ptl_msg_t *ptlmsg,
- ptl_hdr_t *hdr, int type,
- lnet_process_id_t pid, int routing,
- unsigned int nkiov, lnet_kiov_t *kiov,
- size_t offset, size_t len)
-{
- return gmnal_sendmsg(ni, private, ptlmsg,
- hdr, type, pid,
- nkiov, NULL, kiov, offset, len);
-}
.nal_shutdown = kibnal_shutdown,
.nal_ctl = kibnal_ctl,
.nal_send = kibnal_send,
- .nal_send_pages = kibnal_send_pages,
.nal_recv = kibnal_recv,
- .nal_recv_pages = kibnal_recv_pages,
};
lnet_handle_ni_t kibnal_ni;
extern void kibnal_shutdown (ptl_ni_t *ni);
extern int kibnal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg);
int kibnal_send (ptl_ni_t *ni, void *private,
- ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
- int type, lnet_process_id_t tgt, int routing,
- unsigned int payload_niov, struct iovec *payload_iov,
- size_t payload_offset, size_t payload_nob);
-int kibnal_send_pages (ptl_ni_t *ni, void *private,
- ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
- int type, lnet_process_id_t tgt, int routing,
- unsigned int payload_niov, lnet_kiov_t *payload_kiov,
- size_t payload_offset, size_t payload_nob);
+ ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
+ int type, lnet_process_id_t tgt, int routing,
+ unsigned int niov, struct iovec *iov, lnet_kiov_t *kiov,
+ unsigned int offset, unsigned int nob);
extern int kibnal_recv (ptl_ni_t *ni, void *private, ptl_msg_t *msg,
- unsigned int niov, struct iovec *iov,
- size_t offset, size_t mlen, size_t rlen);
-extern int kibnal_recv_pages (ptl_ni_t *ni, void *private, ptl_msg_t *msg,
- unsigned int niov, lnet_kiov_t *kiov,
- size_t offset, size_t mlen, size_t rlen);
+ unsigned int niov, struct iovec *iov, lnet_kiov_t *kiov,
+ unsigned int offset, unsigned int mlen, unsigned int rlen);
extern kib_peer_t *kibnal_create_peer (lnet_nid_t nid);
extern void kibnal_destroy_peer (kib_peer_t *peer);
kib_rx_t *rx, ptl_msg_t *ptlmsg,
unsigned int niov,
struct iovec *iov, lnet_kiov_t *kiov,
- size_t offset, size_t nob);
+ unsigned int offset, unsigned int nob);
void kibnal_ca_async_callback (void *ca_arg, IB_EVENT_RECORD *ev);
void kibnal_ca_callback (void *ca_arg, void *cq_arg);
kib_rx_t *rx, ptl_msg_t *ptlmsg,
unsigned int niov,
struct iovec *iov, lnet_kiov_t *kiov,
- size_t offset, size_t nob)
+ unsigned int offset, unsigned int nob)
{
kib_msg_t *rxmsg = rx->rx_msg;
kib_msg_t *txmsg;
kibnal_queue_tx(tx, rx->rx_conn);
}
-static int
-kibnal_sendmsg(ptl_ni_t *ni,
- void *private,
- ptl_msg_t *ptlmsg,
- ptl_hdr_t *hdr,
- int type,
- lnet_process_id_t target,
- int routing,
- unsigned int payload_niov,
- struct iovec *payload_iov,
- lnet_kiov_t *payload_kiov,
- size_t payload_offset,
- size_t payload_nob)
+int
+kibnal_send(ptl_ni_t *ni,
+ void *private,
+ ptl_msg_t *ptlmsg,
+ ptl_hdr_t *hdr,
+ int type,
+ lnet_process_id_t target,
+ int routing,
+ unsigned int payload_niov,
+ struct iovec *payload_iov,
+ lnet_kiov_t *payload_kiov,
+ unsigned int payload_offset,
+ unsigned int payload_nob)
{
kib_msg_t *ibmsg;
kib_tx_t *tx;
}
int
-kibnal_send (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
- ptl_hdr_t *hdr, int type, lnet_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, tgt, routing,
- payload_niov, payload_iov, NULL,
- payload_offset, payload_len));
-}
-
-int
-kibnal_send_pages (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
- ptl_hdr_t *hdr, int type, lnet_process_id_t tgt, int routing,
- unsigned int payload_niov, lnet_kiov_t *payload_kiov,
- size_t payload_offset, size_t payload_len)
-{
- return (kibnal_sendmsg(ni, private, cookie,
- hdr, type, tgt, routing,
- payload_niov, NULL, payload_kiov,
- payload_offset, payload_len));
-}
-
-static int
-kibnal_recvmsg (ptl_ni_t *ni, void *private, ptl_msg_t *ptlmsg,
- unsigned int niov, struct iovec *iov, lnet_kiov_t *kiov,
- size_t offset, size_t mlen, size_t rlen)
+kibnal_recv (ptl_ni_t *ni, void *private, ptl_msg_t *ptlmsg,
+ unsigned int niov, struct iovec *iov, lnet_kiov_t *kiov,
+ unsigned int offset, unsigned int mlen, unsigned int rlen)
{
kib_rx_t *rx = private;
kib_msg_t *rxmsg = rx->rx_msg;
}
}
-int
-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)
-{
- return (kibnal_recvmsg (ni, private, msg, niov, iov, NULL,
- offset, mlen, rlen));
-}
-
-int
-kibnal_recv_pages (ptl_ni_t *ni, void *private, ptl_msg_t *msg,
- unsigned int niov, lnet_kiov_t *kiov,
- size_t offset, size_t mlen, size_t rlen)
-{
- return (kibnal_recvmsg (ni, private, msg, niov, NULL, kiov,
- offset, mlen, rlen));
-}
-
/*****************************************************************************
* the rest of this file concerns connection management. active connetions
* start with connect_peer, passive connections start with passive_callback.
.nal_shutdown = kibnal_shutdown,
.nal_ctl = kibnal_ctl,
.nal_send = kibnal_send,
- .nal_send_pages = kibnal_send_pages,
.nal_recv = kibnal_recv,
- .nal_recv_pages = kibnal_recv_pages,
.nal_accept = kibnal_accept,
};
void kibnal_shutdown (ptl_ni_t *ni);
int kibnal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg);
int kibnal_send (ptl_ni_t *ni, void *private,
- ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
- int type, lnet_process_id_t tgt, int routing,
- unsigned int payload_niov, struct iovec *payload_iov,
- size_t payload_offset, size_t payload_nob);
-int kibnal_send_pages (ptl_ni_t *ni, void *private,
- ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
- int type, lnet_process_id_t tgt, int routing,
- unsigned int payload_niov, lnet_kiov_t *payload_kiov,
- size_t payload_offset, size_t payload_nob);
-int kibnal_recv(ptl_ni_t *ni, void *private,
- ptl_msg_t *ptlmsg, unsigned int niov,
- struct iovec *iov, size_t offset,
- size_t mlen, size_t rlen);
-int kibnal_recv_pages(ptl_ni_t *ni, void *private,
- ptl_msg_t *ptlmsg, unsigned int niov,
- lnet_kiov_t *kiov, size_t offset,
- size_t mlen, size_t rlen);
+ ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
+ int type, lnet_process_id_t tgt, int routing,
+ unsigned int niov, struct iovec *iov, lnet_kiov_t *kiov,
+ unsigned int offset, unsigned int nob);
+int kibnal_recv(ptl_ni_t *ni, void *private, ptl_msg_t *ptlmsg,
+ unsigned int niov, struct iovec *iov, lnet_kiov_t *kiov,
+ unsigned int offset, unsigned int mlen, unsigned int rlen);
int kibnal_accept(ptl_ni_t *ni, struct socket *sock);
extern void kibnal_init_msg(kib_msg_t *msg, int type, int body_nob);
extern void kibnal_free_acceptsock (kib_acceptsock_t *as);
extern int kibnal_listener_procint(ctl_table *table, int write,
struct file *filp, void *buffer,
- size_t *lenp);
+ unisgned int *lenp);
extern int kibnal_create_peer (kib_peer_t **peerp, lnet_nid_t nid);
extern void kibnal_put_peer (kib_peer_t *peer);
extern int kibnal_add_persistent_peer(lnet_nid_t nid, __u32 ip, int port);
}
int
-kibnal_sendmsg(ptl_ni_t *ni,
- void *private,
- ptl_msg_t *ptlmsg,
- ptl_hdr_t *hdr,
- int type,
- lnet_process_id_t target,
- int routing,
- unsigned int payload_niov,
- struct iovec *payload_iov,
- lnet_kiov_t *payload_kiov,
- int payload_offset,
- int payload_nob)
+kibnal_send(ptl_ni_t *ni,
+ void *private,
+ ptl_msg_t *ptlmsg,
+ ptl_hdr_t *hdr,
+ int type,
+ lnet_process_id_t target,
+ int routing,
+ unsigned int payload_niov,
+ struct iovec *payload_iov,
+ lnet_kiov_t *payload_kiov,
+ unsigned int payload_offset,
+ unsigned int payload_nob)
{
kib_msg_t *ibmsg;
kib_tx_t *tx;
kibnal_launch_tx(tx, target.nid);
return (0);
}
-
-int
-kibnal_send (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
- ptl_hdr_t *hdr, int type, lnet_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, tgt, routing,
- payload_niov, payload_iov, NULL,
- payload_offset, payload_len));
-}
-
-int
-kibnal_send_pages (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
- ptl_hdr_t *hdr, int type, lnet_process_id_t tgt, int routing,
- unsigned int payload_niov, lnet_kiov_t *payload_kiov,
- size_t payload_offset, size_t payload_len)
-{
- return (kibnal_sendmsg(ni, private, cookie,
- hdr, type, tgt, routing,
- payload_niov, NULL, payload_kiov,
- payload_offset, payload_len));
-}
-
int
-kibnal_recvmsg (ptl_ni_t *ni, void *private, ptl_msg_t *ptlmsg,
- unsigned int niov, struct iovec *iov, lnet_kiov_t *kiov,
- int offset, int mlen, int rlen)
+kibnal_recv (ptl_ni_t *ni, void *private, ptl_msg_t *ptlmsg,
+ unsigned int niov, struct iovec *iov, lnet_kiov_t *kiov,
+ unsigned int offset, unsigned int mlen, unsigned int rlen)
{
kib_rx_t *rx = private;
kib_msg_t *rxmsg = rx->rx_msg;
}
int
-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)
-{
- return (kibnal_recvmsg (ni, private, msg, niov, iov, NULL,
- offset, mlen, rlen));
-}
-
-int
-kibnal_recv_pages (ptl_ni_t *ni, void *private, ptl_msg_t *msg,
- unsigned int niov, lnet_kiov_t *kiov,
- size_t offset, size_t mlen, size_t rlen)
-{
- return (kibnal_recvmsg (ni, private, msg, niov, NULL, kiov,
- offset, mlen, rlen));
-}
-
-int
kibnal_thread_start (int (*fn)(void *arg), void *arg)
{
long pid = kernel_thread (fn, arg, 0);
.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,
};
void kqswnal_shutdown (ptl_ni_t *ni);
int kqswnal_ctl (ptl_ni_t *ni, unsigned int cmd, void *arg);
int kqswnal_send (ptl_ni_t *ni, void *private,
- ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
- int type, lnet_process_id_t tgt, int routing,
- unsigned int payload_niov,
- struct iovec *payload_iov,
- size_t payload_offset, size_t payload_nob);
-int kqswnal_send_pages (ptl_ni_t *ni, void *private,
- ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
- int type, lnet_process_id_t tgt, int routing,
- unsigned int payload_niov,
- lnet_kiov_t *payload_kiov,
- size_t payload_offset, size_t payload_nob);
-int kqswnal_recv(ptl_ni_t *ni, void *private,
- ptl_msg_t *ptlmsg, unsigned int niov,
- struct iovec *iov, size_t offset,
- size_t mlen, size_t rlen);
-int kqswnal_recv_pages(ptl_ni_t *ni, void *private,
- ptl_msg_t *ptlmsg, unsigned int niov,
- lnet_kiov_t *kiov, size_t offset,
- size_t mlen, size_t rlen);
+ ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
+ int type, lnet_process_id_t tgt, int routing,
+ unsigned int niov, struct iovec *iov, lnet_kiov_t *kiov,
+ unsigned int offset, unsigned int nob);
+int kqswnal_recv(ptl_ni_t *ni, void *private, ptl_msg_t *ptlmsg,
+ unsigned int niov, struct iovec *iov, lnet_kiov_t *kiov,
+ unsigned int offset, unsigned int mlen, unsigned int rlen);
int kqswnal_tunables_init(void);
void kqswnal_tunables_fini(void);
int
kqswnal_rdma (kqswnal_rx_t *krx, ptl_msg_t *ptlmsg, int type,
int niov, struct iovec *iov, lnet_kiov_t *kiov,
- size_t offset, size_t len)
+ unsigned int offset, unsigned int len)
{
kqswnal_remotemd_t *rmd;
kqswnal_tx_t *ktx;
return (rc);
}
-static int
-kqswnal_sendmsg (ptl_ni_t *ni,
- void *private,
- ptl_msg_t *ptlmsg,
- ptl_hdr_t *hdr,
- int type,
- lnet_process_id_t target,
- int routing,
- unsigned int payload_niov,
- struct iovec *payload_iov,
- lnet_kiov_t *payload_kiov,
- size_t payload_offset,
- size_t payload_nob)
+int
+kqswnal_send (ptl_ni_t *ni,
+ void *private,
+ ptl_msg_t *ptlmsg,
+ ptl_hdr_t *hdr,
+ int type,
+ lnet_process_id_t target,
+ int routing,
+ unsigned int payload_niov,
+ struct iovec *payload_iov,
+ lnet_kiov_t *payload_kiov,
+ unsigned int payload_offset,
+ unsigned int payload_nob)
{
kqswnal_tx_t *ktx;
int rc;
return (rc == 0 ? 0 : -EIO);
}
-int
-kqswnal_send (ptl_ni_t *ni,
- void *private,
- ptl_msg_t *ptlmsg,
- ptl_hdr_t *hdr,
- int type,
- lnet_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, tgt, routing,
- payload_niov, payload_iov, NULL,
- payload_offset, payload_nob));
-}
-
-int
-kqswnal_send_pages (ptl_ni_t *ni,
- void *private,
- ptl_msg_t *ptlmsg,
- ptl_hdr_t *hdr,
- int type,
- lnet_process_id_t tgt,
- int routing,
- unsigned int payload_niov,
- lnet_kiov_t *payload_kiov,
- size_t payload_offset,
- size_t payload_nob)
-{
- return (kqswnal_sendmsg (ni, private, ptlmsg, hdr, type, tgt, routing,
- payload_niov, NULL, payload_kiov,
- payload_offset, payload_nob));
-}
-
void
kqswnal_fwd_packet (ptl_ni_t *ni, kpr_fwd_desc_t *fwd)
{
}
#endif
-static int
-kqswnal_recvmsg (ptl_ni_t *ni,
- void *private,
- ptl_msg_t *ptlmsg,
- unsigned int niov,
- struct iovec *iov,
- lnet_kiov_t *kiov,
- size_t offset,
- size_t mlen,
- size_t rlen)
+int
+kqswnal_recv (ptl_ni_t *ni,
+ void *private,
+ ptl_msg_t *ptlmsg,
+ unsigned int niov,
+ struct iovec *iov,
+ lnet_kiov_t *kiov,
+ unsigned int offset,
+ unsigned int mlen,
+ unsigned int rlen)
{
kqswnal_rx_t *krx = (kqswnal_rx_t *)private;
char *buffer = page_address(krx->krx_kiov[0].kiov_page);
kqsw_csum_t senders_csum;
kqsw_csum_t payload_csum = 0;
kqsw_csum_t hdr_csum = kqsw_csum(0, hdr, sizeof(*hdr));
- size_t csum_len = mlen;
+ unsigned int csum_len = mlen;
int csum_frags = 0;
int csum_nob = 0;
static atomic_t csum_counter;
}
int
-kqswnal_recv(ptl_ni_t *ni,
- void *private,
- ptl_msg_t *ptlmsg,
- unsigned int niov,
- struct iovec *iov,
- size_t offset,
- size_t mlen,
- size_t rlen)
-{
- return (kqswnal_recvmsg(ni, private, ptlmsg,
- niov, iov, NULL,
- offset, mlen, rlen));
-}
-
-int
-kqswnal_recv_pages (ptl_ni_t *ni,
- void *private,
- ptl_msg_t *ptlmsg,
- unsigned int niov,
- lnet_kiov_t *kiov,
- size_t offset,
- size_t mlen,
- size_t rlen)
-{
- return (kqswnal_recvmsg(ni, private, ptlmsg,
- niov, NULL, kiov,
- offset, mlen, rlen));
-}
-
-int
kqswnal_thread_start (int (*fn)(void *arg), void *arg)
{
long pid = kernel_thread (fn, arg, 0);
.nal_shutdown = kranal_shutdown,
.nal_ctl = kranal_ctl,
.nal_send = kranal_send,
- .nal_send_pages = kranal_send_pages,
.nal_recv = kranal_recv,
- .nal_recv_pages = kranal_recv_pages,
.nal_accept = kranal_accept,
};
void kranal_shutdown (ptl_ni_t *ni);
int kranal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg);
int kranal_send (ptl_ni_t *ni, void *private,
- ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
- int type, lnet_process_id_t tgt, int routing,
- unsigned int payload_niov, struct iovec *payload_iov,
- size_t payload_offset, size_t payload_nob);
-int kranal_send_pages (ptl_ni_t *ni, void *private,
- ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
- int type, lnet_process_id_t tgt, int routing,
- unsigned int payload_niov, lnet_kiov_t *payload_kiov,
- size_t payload_offset, size_t payload_nob);
-int kranal_recv(ptl_ni_t *ni, void *private,
- ptl_msg_t *ptlmsg, unsigned int niov,
- struct iovec *iov, size_t offset,
- size_t mlen, size_t rlen);
-int kranal_recv_pages(ptl_ni_t *ni, void *private,
- ptl_msg_t *ptlmsg, unsigned int niov,
- lnet_kiov_t *kiov, size_t offset,
- size_t mlen, size_t rlen);
+ ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
+ int type, lnet_process_id_t tgt, int routing,
+ unsigned int niov, struct iovec *iov, lnet_kiov_t *kiov,
+ unsigned int offset, unsigned int nob);
+int kranal_recv(ptl_ni_t *ni, void *private, ptl_msg_t *ptlmsg,
+ unsigned int niov, struct iovec *iov, lnet_kiov_t *kiov,
+ unsigned int offset, unsigned int mlen, unsigned int rlen);
int kranal_accept(ptl_ni_t *ni, struct socket *sock);
extern void kranal_free_acceptsock (kra_acceptsock_t *ras);
}
int
-kranal_do_send (ptl_ni_t *ni,
- void *private,
- ptl_msg_t *ptlmsg,
- ptl_hdr_t *hdr,
- int type,
- lnet_process_id_t target,
- int routing,
- unsigned int niov,
- struct iovec *iov,
- lnet_kiov_t *kiov,
- int offset,
- int nob)
+kranal_send (ptl_ni_t *ni,
+ void *private,
+ ptl_msg_t *ptlmsg,
+ ptl_hdr_t *hdr,
+ int type,
+ lnet_process_id_t target,
+ int routing,
+ unsigned int niov,
+ struct iovec *iov,
+ lnet_kiov_t *kiov,
+ unsigned int offset,
+ unsigned int nob)
{
kra_conn_t *conn;
kra_tx_t *tx;
}
int
-kranal_send (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
- ptl_hdr_t *hdr, int type, lnet_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, tgt, routing,
- niov, iov, NULL, offset, len);
-}
-
-int
-kranal_send_pages (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
- ptl_hdr_t *hdr, int type, lnet_process_id_t tgt, int routing,
- unsigned int niov, lnet_kiov_t *kiov,
- size_t offset, size_t len)
-{
- return kranal_do_send(ni, private, cookie,
- hdr, type, tgt, routing,
- niov, NULL, kiov, offset, len);
-}
-
-int
-kranal_do_recv (ptl_ni_t *ni, void *private, ptl_msg_t *ptlmsg,
- unsigned int niov, struct iovec *iov, lnet_kiov_t *kiov,
- int offset, int mlen, int rlen)
+kranal_recv (ptl_ni_t *ni, void *private, ptl_msg_t *ptlmsg,
+ unsigned int niov, struct iovec *iov, lnet_kiov_t *kiov,
+ unsigned int offset, unsigned int mlen, unsigned int rlen)
{
kra_conn_t *conn = private;
kra_msg_t *rxmsg = conn->rac_rxmsg;
}
int
-kranal_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)
-{
- return kranal_do_recv(ni, private, msg, niov, iov, NULL,
- offset, mlen, rlen);
-}
-
-int
-kranal_recv_pages (ptl_ni_t *ni, void *private, ptl_msg_t *msg,
- unsigned int niov, lnet_kiov_t *kiov,
- size_t offset, size_t mlen, size_t rlen)
-{
- return kranal_do_recv(ni, private, msg, niov, NULL, kiov,
- offset, mlen, rlen);
-}
-
-int
kranal_thread_start (int(*fn)(void *arg), void *arg)
{
long pid = kernel_thread(fn, arg, 0);
.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,
.nal_accept = ksocknal_accept,
void ksocknal_shutdown (ptl_ni_t *ni);
int ksocknal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg);
int ksocknal_send (ptl_ni_t *ni, void *private,
- ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
- int type, lnet_process_id_t tgt, int routing,
- unsigned int payload_niov, struct iovec *payload_iov,
- size_t payload_offset, size_t payload_nob);
-int ksocknal_send_pages (ptl_ni_t *ni, void *private,
- ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
- int type, lnet_process_id_t tgt, int routing,
- unsigned int payload_niov, lnet_kiov_t *payload_kiov,
- size_t payload_offset, size_t payload_nob);
-int ksocknal_recv(ptl_ni_t *ni, void *private,
- ptl_msg_t *ptlmsg, unsigned int niov,
- struct iovec *iov, size_t offset,
- size_t mlen, size_t rlen);
-int ksocknal_recv_pages(ptl_ni_t *ni, void *private,
- ptl_msg_t *ptlmsg, unsigned int niov,
- lnet_kiov_t *kiov, size_t offset,
- size_t mlen, size_t rlen);
+ ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
+ int type, lnet_process_id_t tgt, int routing,
+ unsigned int niov, struct iovec *iov, lnet_kiov_t *kiov,
+ unsigned int offset, unsigned int nob);
+int ksocknal_recv(ptl_ni_t *ni, void *private, ptl_msg_t *ptlmsg,
+ unsigned int niov, struct iovec *iov, lnet_kiov_t *kiov,
+ unsigned int offset, unsigned int mlen, unsigned int rlen);
int ksocknal_accept(ptl_ni_t *ni, struct socket *sock);
extern int ksocknal_add_peer(ptl_ni_t *ni, lnet_process_id_t id, __u32 ip, int port);
}
int
-ksocknal_sendmsg(ptl_ni_t *ni,
- void *private,
- ptl_msg_t *cookie,
- ptl_hdr_t *hdr,
- int type,
- lnet_process_id_t target,
- unsigned int payload_niov,
- struct iovec *payload_iov,
- lnet_kiov_t *payload_kiov,
- size_t payload_offset,
- size_t payload_nob)
+ksocknal_send(ptl_ni_t *ni,
+ void *private,
+ ptl_msg_t *cookie,
+ ptl_hdr_t *hdr,
+ int type,
+ lnet_process_id_t target,
+ int routing,
+ unsigned int payload_niov,
+ struct iovec *payload_iov,
+ lnet_kiov_t *payload_kiov,
+ unsigned int payload_offset,
+ unsigned int payload_nob)
{
ksock_ltx_t *ltx;
int desc_size;
return (-EIO);
}
-int
-ksocknal_send (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
- ptl_hdr_t *hdr, int type, lnet_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, tgt,
- payload_niov, payload_iov, NULL,
- payload_offset, payload_len));
-}
-
-int
-ksocknal_send_pages (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
- ptl_hdr_t *hdr, int type, lnet_process_id_t tgt, int routing,
- unsigned int payload_niov, lnet_kiov_t *payload_kiov,
- size_t payload_offset, size_t payload_len)
-{
- return (ksocknal_sendmsg(ni, private, cookie,
- hdr, type, tgt,
- payload_niov, NULL, payload_kiov,
- payload_offset, payload_len));
-}
-
void
ksocknal_fwd_packet (ptl_ni_t *ni, kpr_fwd_desc_t *fwd)
{
int
ksocknal_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)
+ unsigned int niov, struct iovec *iov, lnet_kiov_t *kiov,
+ unsigned int offset, unsigned int mlen, unsigned int rlen)
{
ksock_conn_t *conn = (ksock_conn_t *)private;
conn->ksnc_rx_nob_wanted = mlen;
conn->ksnc_rx_nob_left = rlen;
- conn->ksnc_rx_nkiov = 0;
- conn->ksnc_rx_kiov = NULL;
- conn->ksnc_rx_iov = conn->ksnc_rx_iov_space.iov;
- conn->ksnc_rx_niov =
- lnet_extract_iov(PTL_MD_MAX_IOV, conn->ksnc_rx_iov,
- niov, iov, offset, mlen);
-
- LASSERT (mlen ==
- lnet_iov_nob (conn->ksnc_rx_niov, conn->ksnc_rx_iov) +
- lnet_kiov_nob (conn->ksnc_rx_nkiov, conn->ksnc_rx_kiov));
-
- return (0);
-}
-
-int
-ksocknal_recv_pages (ptl_ni_t *ni, void *private, ptl_msg_t *msg,
- unsigned int niov, lnet_kiov_t *kiov,
- size_t offset, size_t mlen, size_t rlen)
-{
- ksock_conn_t *conn = (ksock_conn_t *)private;
-
- LASSERT (mlen <= rlen);
- LASSERT (niov <= PTL_MD_MAX_IOV);
+ if (mlen == 0 || iov != NULL) {
+ conn->ksnc_rx_nkiov = 0;
+ conn->ksnc_rx_kiov = NULL;
+ conn->ksnc_rx_iov = conn->ksnc_rx_iov_space.iov;
+ conn->ksnc_rx_niov =
+ lnet_extract_iov(PTL_MD_MAX_IOV, conn->ksnc_rx_iov,
+ niov, iov, offset, mlen);
+ } else {
+ conn->ksnc_rx_niov = 0;
+ conn->ksnc_rx_iov = NULL;
+ conn->ksnc_rx_kiov = conn->ksnc_rx_iov_space.kiov;
+ conn->ksnc_rx_nkiov =
+ lnet_extract_kiov(PTL_MD_MAX_IOV, conn->ksnc_rx_kiov,
+ niov, kiov, offset, mlen);
+ }
- conn->ksnc_cookie = msg;
- conn->ksnc_rx_nob_wanted = mlen;
- conn->ksnc_rx_nob_left = rlen;
-
- conn->ksnc_rx_niov = 0;
- conn->ksnc_rx_iov = NULL;
- conn->ksnc_rx_kiov = conn->ksnc_rx_iov_space.kiov;
- conn->ksnc_rx_nkiov =
- lnet_extract_kiov(PTL_MD_MAX_IOV, conn->ksnc_rx_kiov,
- niov, kiov, offset, mlen);
-
LASSERT (mlen ==
lnet_iov_nob (conn->ksnc_rx_niov, conn->ksnc_rx_iov) +
lnet_kiov_nob (conn->ksnc_rx_nkiov, conn->ksnc_rx_kiov));
.nal_shutdown = kibnal_shutdown,
.nal_ctl = kibnal_ctl,
.nal_send = kibnal_send,
- .nal_send_pages = kibnal_send_pages,
.nal_recv = kibnal_recv,
- .nal_recv_pages = kibnal_recv_pages,
};
kib_data_t kibnal_data;
void kibnal_shutdown (ptl_ni_t *ni);
int kibnal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg);
int kibnal_send (ptl_ni_t *ni, void *private,
- ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
- int type, lnet_process_id_t tgt, int routing,
- unsigned int payload_niov, struct iovec *payload_iov,
- size_t payload_offset, size_t payload_nob);
-int kibnal_send_pages (ptl_ni_t *ni, void *private,
- ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
- int type, lnet_process_id_t tgt, int routing,
- unsigned int payload_niov, lnet_kiov_t *payload_kiov,
- size_t payload_offset, size_t payload_nob);
-int kibnal_recv(ptl_ni_t *ni, void *private,
- ptl_msg_t *ptlmsg, unsigned int niov,
- struct iovec *iov, size_t offset,
- size_t mlen, size_t rlen);
-int kibnal_recv_pages(ptl_ni_t *ni, void *private,
- ptl_msg_t *ptlmsg, unsigned int niov,
- lnet_kiov_t *kiov, size_t offset,
- size_t mlen, size_t rlen);
+ ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
+ int type, lnet_process_id_t tgt, int routing,
+ unsigned int niov, struct iovec *iov, lnet_kiov_t *kiov,
+ unsigned int offset, unsigned int nob);
+int kibnal_recv(ptl_ni_t *ni, void *private, ptl_msg_t *ptlmsg,
+ unsigned int niov, struct iovec *iov, lnet_kiov_t *kiov,
+ unsigned int offset, unsigned int mlen, unsigned int rlen);
extern void kibnal_init_msg(kib_msg_t *msg, int type, int body_nob);
extern void kibnal_pack_msg(kib_msg_t *msg, int credits, lnet_nid_t dstnid,
}
int
-kibnal_sendmsg(ptl_ni_t *ni,
- void *private,
- ptl_msg_t *ptlmsg,
- ptl_hdr_t *hdr,
- int type,
- lnet_process_id_t target,
- int routing,
- unsigned int payload_niov,
- struct iovec *payload_iov,
- lnet_kiov_t *payload_kiov,
- int payload_offset,
- int payload_nob)
+kibnal_send(ptl_ni_t *ni,
+ void *private,
+ ptl_msg_t *ptlmsg,
+ ptl_hdr_t *hdr,
+ int type,
+ lnet_process_id_t target,
+ int routing,
+ unsigned int payload_niov,
+ struct iovec *payload_iov,
+ lnet_kiov_t *payload_kiov,
+ unsigned int payload_offset,
+ unsigned int payload_nob)
{
kib_msg_t *ibmsg;
kib_tx_t *tx;
}
int
-kibnal_send (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
- ptl_hdr_t *hdr, int type, lnet_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, tgt, routing,
- payload_niov, payload_iov, NULL,
- payload_offset, payload_len));
-}
-
-int
-kibnal_send_pages (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
- ptl_hdr_t *hdr, int type, lnet_process_id_t tgt, int routing,
- unsigned int payload_niov, lnet_kiov_t *payload_kiov,
- size_t payload_offset, size_t payload_len)
-{
- return (kibnal_sendmsg(ni, private, cookie,
- hdr, type, tgt, routing,
- payload_niov, NULL, payload_kiov,
- payload_offset, payload_len));
-}
-
-int
kibnal_recvmsg (ptl_ni_t *ni, void *private, ptl_msg_t *ptlmsg,
unsigned int niov, struct iovec *iov, lnet_kiov_t *kiov,
- size_t offset, int mlen, int rlen)
+ unsigned int offset, unsigned int mlen, unsigned int rlen)
{
kib_rx_t *rx = private;
kib_msg_t *rxmsg = rx->rx_msg;
}
int
-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)
-{
- return (kibnal_recvmsg (ni, private, msg, niov, iov, NULL,
- offset, mlen, rlen));
-}
-
-int
-kibnal_recv_pages (ptl_ni_t *ni, void *private, ptl_msg_t *msg,
- unsigned int niov, lnet_kiov_t *kiov,
- size_t offset, size_t mlen, size_t rlen)
-{
- return (kibnal_recvmsg (ni, private, msg, niov, NULL, kiov,
- offset, mlen, rlen));
-}
-
-int
kibnal_thread_start (int (*fn)(void *arg), void *arg)
{
long pid = kernel_thread (fn, arg, 0);
}
int
-ptl_islocalnet (__u32 net)
+ptl_islocalnet (__u32 net, int *orderp)
{
struct list_head *tmp;
ptl_ni_t *ni;
unsigned long flags;
+ int order = 0;
int islocal = 0;
PTL_LOCK(flags);
if (PTL_NIDNET(ni->ni_nid) == net) {
islocal = 1;
+ if (orderp != NULL)
+ *orderp = order;
break;
}
+ order++;
}
PTL_UNLOCK(flags);
ptl_recv (ptl_ni_t *ni, void *private, ptl_msg_t *msg, ptl_libmd_t *md,
lnet_size_t offset, lnet_size_t mlen, lnet_size_t rlen)
{
- if (mlen == 0)
- return ((ni->ni_nal->nal_recv)(ni, private, msg,
- 0, NULL,
- offset, mlen, rlen));
-
- if ((md->md_options & LNET_MD_KIOV) == 0)
- return ((ni->ni_nal->nal_recv)(ni, private, msg,
- md->md_niov, md->md_iov.iov,
- offset, mlen, rlen));
-
- return ((ni->ni_nal->nal_recv_pages)(ni, private, msg,
- md->md_niov, md->md_iov.kiov,
- offset, mlen, rlen));
+ int niov = 0;
+ struct iovec *iov = NULL;
+ lnet_kiov_t *kiov = NULL;
+
+ if (mlen != 0) {
+ niov = md->md_niov;
+ if (((md->md_options) & LNET_MD_KIOV) != 0)
+ kiov = md->md_iov.kiov;
+ else
+ iov = md->md_iov.iov;
+ }
+
+ return (ni->ni_nal->nal_recv)(ni, private, msg,
+ niov, iov, kiov, offset, mlen, rlen);
}
int
{
unsigned long flags;
lnet_nid_t gw_nid;
+ int niov = 0;
+ struct iovec *iov = NULL;
+ lnet_kiov_t *kiov = NULL;
int routing = 0;
int rc;
}
target.nid = gw_nid;
+
+ if (len != 0) {
+ niov = md->md_niov;
+ if (((md->md_options) & LNET_MD_KIOV) != 0)
+ kiov = md->md_iov.kiov;
+ else
+ iov = md->md_iov.iov;
+ }
- if (len == 0)
- rc = (ni->ni_nal->nal_send)(ni, private, msg, hdr,
- type, target, routing,
- 0, NULL, offset, len);
- else if ((md->md_options & LNET_MD_KIOV) == 0)
- rc = (ni->ni_nal->nal_send)(ni, private, msg, hdr,
- type, target, routing,
- md->md_niov, md->md_iov.iov,
- offset, len);
- else
- rc = (ni->ni_nal->nal_send_pages)(ni, private, msg, hdr,
- type, target, routing,
- md->md_niov, md->md_iov.kiov,
- offset, len);
+ rc = (ni->ni_nal->nal_send)(ni, private, msg, hdr, type, target, routing,
+ niov, iov, kiov, offset, len);
ptl_ni_decref(ni); /* lose ref from lnet_lookup */
return rc;
}
int
-LNetDist (lnet_handle_ni_t interface, lnet_nid_t nid)
+LNetDist (lnet_handle_ni_t interface, lnet_nid_t nid, int *order)
{
LASSERT (lnet_apini.apini_init);
LASSERT (lnet_apini.apini_refcount > 0);
- return kpr_distance(nid);
+ return kpr_distance(nid, order);
}
#include <lnet/lib-lnet.h>
int
-lonal_send (ptl_ni_t *ni,
- void *private,
- ptl_msg_t *ptlmsg,
- ptl_hdr_t *hdr,
- int type,
+lonal_send (ptl_ni_t *ni,
+ void *private,
+ ptl_msg_t *ptlmsg,
+ ptl_hdr_t *hdr,
+ int type,
lnet_process_id_t target,
- int routing,
- unsigned int payload_niov,
- struct iovec *payload_iov,
- size_t payload_offset,
- size_t payload_nob)
+ int routing,
+ unsigned int payload_niov,
+ struct iovec *payload_iov,
+ lnet_kiov_t *payload_kiov,
+ unsigned int payload_offset,
+ unsigned int payload_nob)
{
- lo_desc_t lod = {
- .lod_type = LOD_IOV,
- .lod_niov = payload_niov,
- .lod_offset = payload_offset,
- .lod_nob = payload_nob,
- .lod_iov = { .iov = payload_iov } };
+ lo_desc_t lod = { .lod_niov = payload_niov,
+ .lod_offset = payload_offset,
+ .lod_nob = payload_nob};
int rc;
LASSERT (!routing);
+ if (payload_nob == 0 || payload_iov != NULL) {
+ lod.lod_type = LOD_IOV;
+ lod.lod_iov.iov = payload_iov;
+ } else {
+#ifndef __KERNEL__
+ LBUG();
+#else
+ lod.lod_type = LOD_KIOV;
+ lod.lod_iov.kiov = payload_kiov;
+#endif
+ }
+
rc = lnet_parse(ni, hdr, &lod);
if (rc == 0)
lnet_finalize(ni, private, ptlmsg, 0);
return rc;
}
-int
-lonal_recv(ptl_ni_t *ni,
- void *private,
- ptl_msg_t *ptlmsg,
- unsigned int niov,
- struct iovec *iov,
- size_t offset,
- size_t mlen,
- size_t rlen)
+void
+lonal_copy_iov(lo_desc_t *lod,
+ unsigned int niov,
+ struct iovec *iov,
+ unsigned int offset,
+ unsigned int mlen)
{
- lo_desc_t *lod = (lo_desc_t *)private;
-
- /* I only handle mapped->mapped matches */
- LASSERT(mlen == 0 || lod->lod_type == LOD_IOV);
-
- if (mlen == 0)
- goto out;
+ /* I only copy iovec->iovec */
+ LASSERT(lod->lod_type == LOD_IOV);
+ LASSERT(mlen > 0);
while (offset >= iov->iov_len) {
offset -= iov->iov_len;
mlen -= fraglen;
} while (mlen > 0);
-
- out:
- lnet_finalize(ni, private, ptlmsg, 0);
- return 0;
}
-#ifdef __KERNEL__
-int
-lonal_send_pages (ptl_ni_t *ni,
- void *private,
- ptl_msg_t *ptlmsg,
- ptl_hdr_t *hdr,
- int type,
- lnet_process_id_t target,
- int routing,
- unsigned int payload_niov,
- lnet_kiov_t *payload_kiov,
- size_t payload_offset,
- size_t payload_nob)
-{
- lo_desc_t lod = {
- .lod_type = LOD_KIOV,
- .lod_niov = payload_niov,
- .lod_offset = payload_offset,
- .lod_nob = payload_nob,
- .lod_iov = { .kiov = payload_kiov } };
- int rc;
-
- LASSERT (!routing);
-
- rc = lnet_parse(ni, hdr, &lod);
- if (rc == 0)
- lnet_finalize(ni, private, ptlmsg, 0);
-
- return rc;
-}
-
-int
-lonal_recv_pages(ptl_ni_t *ni,
- void *private,
- ptl_msg_t *ptlmsg,
- unsigned int niov,
- lnet_kiov_t *kiov,
- size_t offset,
- size_t mlen,
- size_t rlen)
+void
+lonal_copy_kiov(lo_desc_t *lod,
+ unsigned int niov,
+ lnet_kiov_t *kiov,
+ unsigned int offset,
+ unsigned int mlen)
{
+#ifndef __KERNEL__
+ LBUG();
+#else
void *srcaddr = NULL;
void *dstaddr = NULL;
unsigned long srcfrag = 0;
unsigned long dstfrag = 0;
unsigned long fraglen;
- lo_desc_t *lod = (lo_desc_t *)private;
-
- /* I only handle unmapped->unmapped matches */
- LASSERT(mlen == 0 || lod->lod_type == LOD_KIOV);
- if (mlen == 0)
- goto out;
+ /* I only copy kiov->kiov */
+ LASSERT(lod->lod_type == LOD_KIOV);
+ LASSERT(mlen > 0);
while (offset >= kiov->kiov_len) {
offset -= kiov->kiov_len;
if (srcaddr != NULL)
kunmap(lod->lod_iov.kiov->kiov_page);
+#endif
+}
+
+int
+lonal_recv(ptl_ni_t *ni,
+ void *private,
+ ptl_msg_t *ptlmsg,
+ unsigned int niov,
+ struct iovec *iov,
+ lnet_kiov_t *kiov,
+ unsigned int offset,
+ unsigned int mlen,
+ unsigned int rlen)
+{
+ lo_desc_t *lod = (lo_desc_t *)private;
+
+ if (mlen != 0) {
+ if (iov != NULL)
+ lonal_copy_iov(lod, niov, iov, offset, mlen);
+ else
+ lonal_copy_kiov(lod, niov, kiov, offset, mlen);
+ }
- out:
lnet_finalize(ni, private, ptlmsg, 0);
return 0;
}
-#endif
+
static int lonal_instanced;
.nal_shutdown = lonal_shutdown,
.nal_send = lonal_send,
.nal_recv = lonal_recv,
-#ifdef __KERNEL__
- .nal_send_pages = lonal_send_pages,
- .nal_recv_pages = lonal_recv_pages,
-#endif
};
ptl_ni_t *ptl_loni;
ptl_ni_t *gwni = NULL;
kpr_gateway_entry_t *ge = NULL;
__u32 target_net = PTL_NIDNET(target_nid);
+ __u32 gateway_net;
/* Return the NID I must send to, to reach 'target_nid' */
if (!re->kpre_gateway->kpge_alive) /* gateway down */
continue;
-
+
+ gateway_net = PTL_NIDNET(re->kpre_gateway->kpge_nid);
+
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))
+ if (gateway_net != /* gateway not on ni's net */
+ PTL_NIDNET(ni->ni_nid))
continue;
if (ge != NULL &&
kpr_ge_isbetter (ge, re->kpre_gateway))
continue;
- } else if (ge != NULL) { /* another gateway */
+ } else if (!ptl_islocalnet(gateway_net, NULL)) {
+ continue; /* not on a local net */
+ } else if (ge != NULL) {
+ /* already got 1 candidate gateway */
LASSERT (gwni != NULL);
- /* we don't allow gateways on different nets to get
- * into the route table */
- LASSERT (PTL_NIDNET(gwni->ni_nid) ==
- PTL_NIDNET(re->kpre_gateway->kpge_nid));
if (kpr_ge_isbetter(ge, re->kpre_gateway))
continue;
} else {
LASSERT (gwni == NULL);
+ gwni = lnet_net2ni(gateway_net);
- gwni = lnet_net2ni(PTL_NIDNET(re->kpre_gateway->kpge_nid));
- if (gwni == NULL) /* gateway not on a local net */
+ if (gwni == NULL) /* local nets changed */
continue;
}
}
int
-kpr_distance (lnet_nid_t nid)
+kpr_distance (lnet_nid_t nid, int *orderp)
{
unsigned long flags;
struct list_head *e;
kpr_net_entry_t *ne;
__u32 net = PTL_NIDNET(nid);
int dist = -ENETUNREACH;
-
- if (ptl_islocalnet(net))
+ int order = 0;
+
+ if (ptl_islocalnet(net, orderp))
return 0;
read_lock_irqsave(&kpr_state.kpr_rwlock, flags);
list_for_each (e, &kpr_state.kpr_nets) {
ne = list_entry (e, kpr_net_entry_t, kpne_list);
-
+
if (ne->kpne_net == net) {
dist = ne->kpne_hops;
+ if (orderp != NULL)
+ *orderp = order;
break;
}
+ order++;
}
read_unlock_irqrestore(&kpr_state.kpr_rwlock, flags);
*hops = ne->kpne_hops;
*gateway_nid = ge->kpge_nid;
*alive = ge->kpge_alive;
- *ignored = !ptl_islocalnet(ne->kpne_net) &&
- ptl_islocalnet(ge->kpge_nid);
+ *ignored = ptl_islocalnet(ne->kpne_net, NULL) ||
+ !ptl_islocalnet(PTL_NIDNET(ge->kpge_nid), NULL);
read_unlock_irqrestore(&kpr_state.kpr_rwlock,
flags);
}
int
-kpr_distance(lnet_nid_t nid)
+kpr_distance(lnet_nid_t nid, int *orderp)
{
+ if (!lnet_net2ni(PTL_NIDNET(nid), orderp))
+ return -ENETUNREACH;
+
return 0;
}
atomic_t kpge_weight;
time_t kpge_timestamp;
int kpge_alive;
+ int kpge_checked;
int kpge_refcount;
lnet_nid_t kpge_nid;
} kpr_gateway_entry_t;
hops = sri->sri_net->kpne_hops;
nid = sri->sri_route->kpre_gateway->kpge_nid;
alive = sri->sri_route->kpre_gateway->kpge_alive;
- ignored = !ptl_islocalnet(sri->sri_net->kpne_net) &&
- ptl_islocalnet(sri->sri_route->kpre_gateway->kpge_nid);
+ ignored = ptl_islocalnet(sri->sri_net->kpne_net, NULL) ||
+ !ptl_islocalnet(sri->sri_route->kpre_gateway->kpge_nid, NULL);
read_unlock_irqrestore(&kpr_state.kpr_rwlock, flags);
extern void procbridge_shutdown (ptl_ni_t *);
extern int tcpnal_send(ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
- ptl_hdr_t *hdr, int type, lnet_process_id_t target,
- int routing, unsigned int niov, struct iovec *iov,
- size_t offset, size_t len);
+ ptl_hdr_t *hdr, int type, lnet_process_id_t target,
+ int routing, unsigned int niov,
+ struct iovec *iov, ptl_kiov_t *kiov,
+ unsigned int offset, unsigned int len);
int tcpnal_recv(ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
- unsigned int niov, struct iovec *iov,
- size_t offset, size_t mlen, size_t rlen);
+ unsigned int niov, struct iovec *iov, ptl_kiov_t *kiov,
+ unsigned int offset, unsigned int mlen, unsigned int rlen);
#include <syscall.h>
#endif
-/* Function: tcpnal_send
- * Arguments: ni: pointer to NAL instance
- * private: unused
- * cookie: passed back to the portals library
- * hdr: pointer to the portals header
- * nid: destination node
- * pid: destination process
- * data: body of the message
- * len: length of the body
- * Returns: zero on success
- *
- * sends a packet to the peer, after insuring that a connection exists
- */
-int tcpnal_send(ptl_ni_t *ni,
- void *private,
- ptl_msg_t *cookie,
- ptl_hdr_t *hdr,
- int type,
- lnet_process_id_t target,
- int routing,
- unsigned int niov,
- struct iovec *iov,
- size_t offset,
- size_t len)
+int tcpnal_send(ptl_ni_t *ni,
+ void *private,
+ ptl_msg_t *cookie,
+ ptl_hdr_t *hdr,
+ int type,
+ lnet_process_id_t target,
+ int routing,
+ unsigned int niov,
+ struct iovec *iov,
+ ptl_kiov_t kiov,
+ unsigned int offset,
+ unsigned int len)
{
connection c;
bridge b=(bridge)ni->ni_data;
nonstandard */
LASSERT (niov <= 256);
+ LASSERT (len == 0 || iov != NULL); /* I don't understand kiovs */
tiov[0].iov_base = hdr;
tiov[0].iov_len = sizeof(ptl_hdr_t);
}
-/* Function: tcpnal_recv
- * Arguments: ptl_ni_t *: pointer to NAL instance
- * void *private: connection pointer passed through
- * lnet_parse()
- * ptl_msg_t *cookie: passed back to portals library
- * user_ptr data: pointer to the destination buffer
- * size_t mlen: length of the body
- * size_t rlen: length of data in the network
- * Returns: zero on success
- *
- * blocking read of the requested data. must drain out the
- * difference of mainpulated and requested lengths from the network
- */
-int tcpnal_recv(ptl_ni_t *ni,
- void *private,
- ptl_msg_t *cookie,
- unsigned int niov,
- struct iovec *iov,
- size_t offset,
- size_t mlen,
- size_t rlen)
+int tcpnal_recv(ptl_ni_t *ni,
+ void *private,
+ ptl_msg_t *cookie,
+ unsigned int niov,
+ struct iovec *iov,
+ plt_kiov_t *kiov,
+ unsigned int offset,
+ unsigned int mlen,
+ unsigned int rlen)
{
struct iovec tiov[256];
int ntiov;
int i;
- if (!niov)
+ if (mlen == 0)
goto finalize;
LASSERT(mlen);
LASSERT(rlen);
LASSERT(rlen >= mlen);
+ LASSERT(iov != NULL); /* I don't understand kiovs */
ntiov = lnet_extract_iov(256, tiov, niov, iov, offset, mlen);
.deps
routerstat
wirecheck
-gmnalnid
+gmlndnid
.*.cmd