#undef SDPSTATS_ON
#undef SDP_PROFILING
-#undef CONFIG_INFINIBAND_SDP_DEBUG_DATA
-#undef CONFIG_INFINIBAND_SDP_DEBUG
+//#undef CONFIG_INFINIBAND_SDP_DEBUG_DATA
+//#undef CONFIG_INFINIBAND_SDP_DEBUG
#define SDPSTATS_ON
//#define SDP_PROFILING
#define SDP_OP_RECV 0x800000000LL
#define SDP_OP_SEND 0x400000000LL
+/* how long (in jiffies) to block sender till tx completion*/
+#define SDP_BZCOPY_POLL_TIMEOUT (HZ / 10)
+
#define BZCOPY_STATE(skb) (*(struct bzcopy_state **)(skb->cb))
#ifndef MIN
#define MIN(a, b) (a < b ? a : b)
MODULE_PARM_DESC(data_debug_level, "Enable data path debug tracing if > 0.");
#endif
-static int send_poll_hit;
-
-module_param_named(send_poll_hit, send_poll_hit, int, 0644);
-MODULE_PARM_DESC(send_poll_hit, "How many times send poll helped.");
-
-static int send_poll_miss;
-
-module_param_named(send_poll_miss, send_poll_miss, int, 0644);
-MODULE_PARM_DESC(send_poll_miss, "How many times send poll missed.");
-
static int recv_poll_hit;
module_param_named(recv_poll_hit, recv_poll_hit, int, 0644);
module_param_named(recv_poll_miss, recv_poll_miss, int, 0644);
MODULE_PARM_DESC(recv_poll_miss, "How many times recv poll missed.");
-static int send_poll = 100;
-
-module_param_named(send_poll, send_poll, int, 0644);
-MODULE_PARM_DESC(send_poll, "How many times to poll send.");
-
static int recv_poll = 1000;
module_param_named(recv_poll, recv_poll, int, 0644);
MODULE_PARM_DESC(recv_poll, "How many times to poll recv.");
-static int send_poll_thresh = 8192;
-
-module_param_named(send_poll_thresh, send_poll_thresh, int, 0644);
-MODULE_PARM_DESC(send_poll_thresh, "Send message size thresh hold over which to start polling.");
-
static unsigned int sdp_keepalive_time = SDP_KEEPALIVE_TIME;
module_param_named(sdp_keepalive_time, sdp_keepalive_time, uint, 0644);
return 1;
}
-static inline void poll_send_cq(struct sock *sk)
-{
- int i;
- if (sdp_sk(sk)->tx_ring.cq) {
- for (i = 0; i < send_poll; ++i)
- if (sdp_xmit_poll(sdp_sk(sk), 1)) {
- ++send_poll_hit;
- return;
- }
- ++send_poll_miss;
- }
-}
-
/* Like tcp_recv_urg */
/*
* Handle reading urgent data. BSD has very simple semantics for
static inline struct bzcopy_state *sdp_bz_cleanup(struct bzcopy_state *bz)
{
- int i, max_retry;
+ int i;
struct sdp_sock *ssk = (struct sdp_sock *)bz->ssk;
/* Wait for in-flight sends; should be quick */
if (bz->busy) {
struct sock *sk = &ssk->isk.sk;
+ unsigned long timeout = jiffies + SDP_BZCOPY_POLL_TIMEOUT;
- for (max_retry = 0; max_retry < 10000; max_retry++) {
- poll_send_cq(sk);
-
+ while (jiffies < timeout) {
+ sdp_xmit_poll(sdp_sk(sk), 1);
if (!bz->busy)
break;
-
SDPSTATS_COUNTER_INC(bzcopy_poll_miss);
}