#include <lnet/lib-lnet.h>
#include <lnet/socklnd.h>
-#ifdef HAVE_TCP_SENDPAGE_USE_SOCKET
-# define cfs_tcp_sendpage(sk, page, offset, size, flags) \
- tcp_sendpage((sk)->sk_socket, page, offset, size, flags)
-#else /* !HAVE_TCP_SENDPAGE_USE_SOCKET */
-# define cfs_tcp_sendpage(sk, page, offset, size, flags) \
- tcp_sendpage(sk, page, offset, size, flags)
-#endif /* HAVE_TCP_SENDPAGE_USE_SOCKET */
-
#ifndef NETIF_F_CSUM_MASK
# define NETIF_F_CSUM_MASK NETIF_F_ALL_CSUM
#endif
# define SOCKNAL_RISK_KMAP_DEADLOCK 1
#endif
-struct ksock_sched_info;
-
-struct ksock_sched { /* per scheduler state */
- spinlock_t kss_lock; /* serialise */
- struct list_head kss_rx_conns; /* conn waiting to be read */
+/* per scheduler state */
+struct ksock_sched {
+ /* serialise */
+ spinlock_t kss_lock;
/* conn waiting to be written */
- struct list_head kss_tx_conns;
+ struct list_head kss_rx_conns;
+ struct list_head kss_tx_conns;
/* zombie noop tx list */
- struct list_head kss_zombie_noop_txs;
- wait_queue_head_t kss_waitq; /* where scheduler sleeps */
+ struct list_head kss_zombie_noop_txs;
+ /* where scheduler sleeps */
+ wait_queue_head_t kss_waitq;
/* # connections assigned to this scheduler */
- int kss_nconns;
- struct ksock_sched_info *kss_info; /* owner of it */
-#if !SOCKNAL_SINGLE_FRAG_RX
- struct page *kss_rx_scratch_pgs[LNET_MAX_IOV];
-#endif
-#if !SOCKNAL_SINGLE_FRAG_TX || !SOCKNAL_SINGLE_FRAG_RX
- struct kvec kss_scratch_iov[LNET_MAX_IOV];
-#endif
-};
-
-struct ksock_sched_info {
- int ksi_nthreads_max; /* max allowed threads */
- int ksi_nthreads; /* number of threads */
- int ksi_cpt; /* CPT id */
- struct ksock_sched *ksi_scheds; /* array of schedulers */
+ int kss_nconns;
+ /* max allowed threads */
+ int kss_nthreads_max;
+ /* number of threads */
+ int kss_nthreads;
+ /* CPT id */
+ int kss_cpt;
};
#define KSOCK_CPT_SHIFT 16
unsigned int *ksnd_zc_min_payload; /* minimum zero copy payload size */
int *ksnd_zc_recv; /* enable ZC receive (for Chelsio TOE) */
int *ksnd_zc_recv_min_nfrags; /* minimum # of fragments to enable ZC receive */
-#ifdef CPU_AFFINITY
int *ksnd_irq_affinity; /* enable IRQ affinity? */
-#endif
#ifdef SOCKNAL_BACKOFF
int *ksnd_backoff_init; /* initial TCP backoff */
int *ksnd_backoff_max; /* maximum TCP backoff */
int ksnd_nthreads; /* # live threads */
int ksnd_shuttingdown; /* tell threads to exit */
/* schedulers information */
- struct ksock_sched_info **ksnd_sched_info;
+ struct ksock_sched **ksnd_schedulers;
atomic_t ksnd_nactive_txs; /* #active txs */
time64_t ksnp_last_alive;/* when (in seconds) I was last alive */
struct lnet_process_id ksnp_id; /* who's on the other end(s) */
atomic_t ksnp_refcount; /* # users */
- int ksnp_sharecount; /* lconf usage counter */
int ksnp_closing; /* being closed */
int ksnp_accepting;/* # passive connections pending */
int ksnp_error; /* errno on closing last conn */
extern void ksocknal_queue_tx_locked(struct ksock_tx *tx, struct ksock_conn *conn);
extern void ksocknal_txlist_done(struct lnet_ni *ni, struct list_head *txlist,
int error);
-extern void ksocknal_notify(struct lnet_ni *ni, lnet_nid_t gw_nid, int alive);
+extern void ksocknal_notify(lnet_nid_t gw_nid);
extern void ksocknal_query(struct lnet_ni *ni, lnet_nid_t nid, time64_t *when);
extern int ksocknal_thread_start(int (*fn)(void *arg), void *arg, char *name);
extern void ksocknal_thread_fini(void);
extern void ksocknal_lib_push_conn(struct ksock_conn *conn);
extern int ksocknal_lib_get_conn_addrs(struct ksock_conn *conn);
extern int ksocknal_lib_setup_sock(struct socket *so);
-extern int ksocknal_lib_send_iov(struct ksock_conn *conn, struct ksock_tx *tx);
-extern int ksocknal_lib_send_kiov(struct ksock_conn *conn, struct ksock_tx *tx);
+extern int ksocknal_lib_send_iov(struct ksock_conn *conn, struct ksock_tx *tx,
+ struct kvec *scratch_iov);
+extern int ksocknal_lib_send_kiov(struct ksock_conn *conn, struct ksock_tx *tx,
+ struct kvec *scratch_iov);
extern void ksocknal_lib_eager_ack(struct ksock_conn *conn);
-extern int ksocknal_lib_recv_iov(struct ksock_conn *conn);
-extern int ksocknal_lib_recv_kiov(struct ksock_conn *conn);
+extern int ksocknal_lib_recv_iov(struct ksock_conn *conn,
+ struct kvec *scratchiov);
+extern int ksocknal_lib_recv_kiov(struct ksock_conn *conn, struct page **pages,
+ struct kvec *scratchiov);
extern int ksocknal_lib_get_conn_tunables(struct ksock_conn *conn, int *txmem,
int *rxmem, int *nagle);