/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
* vim:expandtab:shiftwidth=8:tabstop=8:
*
- * Copyright (C) 2001, 2002 Cluster File Systems, Inc.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved
+ *
* Author: Zach Brown <zab@zabbo.net>
* Author: Peter J. Braam <braam@clusterfs.com>
* Author: Phil Schwan <phil@clusterfs.com>
#include "socklnd.h"
ksock_tx_t *
-ksocknal_alloc_tx (int size)
+ksocknal_alloc_tx (int size)
{
ksock_tx_t *tx = NULL;
LASSERT(tx->tx_desc_size == size);
list_del(&tx->tx_list);
}
-
+
spin_unlock(&ksocknal_data.ksnd_tx_lock);
}
-
+
if (tx == NULL)
LIBCFS_ALLOC(tx, size);
- if (tx == NULL)
+ if (tx == NULL)
return NULL;
atomic_set(&tx->tx_refcount, 1);
int
ksocknal_send_iov (ksock_conn_t *conn, ksock_tx_t *tx)
-{
+{
struct iovec *iov = tx->tx_iov;
int nob;
int rc;
/* Never touch tx->tx_iov inside ksocknal_lib_send_iov() */
rc = ksocknal_lib_send_iov(conn, tx);
- if (rc <= 0) /* sent nothing? */
+ if (rc <= 0) /* sent nothing? */
return (rc);
- nob = rc;
- LASSERT (nob <= tx->tx_resid);
+ nob = rc;
+ LASSERT (nob <= tx->tx_resid);
tx->tx_resid -= nob;
- /* "consume" iov */
- do {
- LASSERT (tx->tx_niov > 0);
+ /* "consume" iov */
+ do {
+ LASSERT (tx->tx_niov > 0);
- if (nob < iov->iov_len) {
- iov->iov_base = (void *)(((unsigned long)(iov->iov_base)) + nob);
- iov->iov_len -= nob;
- return (rc);
- }
+ if (nob < (int) iov->iov_len) {
+ iov->iov_base = (void *)((char *)iov->iov_base + nob);
+ iov->iov_len -= nob;
+ return (rc);
+ }
- nob -= iov->iov_len;
- tx->tx_iov = ++iov;
- tx->tx_niov--;
+ nob -= iov->iov_len;
+ tx->tx_iov = ++iov;
+ tx->tx_niov--;
} while (nob != 0);
return (rc);
int
ksocknal_send_kiov (ksock_conn_t *conn, ksock_tx_t *tx)
-{
+{
lnet_kiov_t *kiov = tx->tx_kiov;
int nob;
int rc;
- LASSERT (tx->tx_niov == 0);
+ LASSERT (tx->tx_niov == 0);
LASSERT (tx->tx_nkiov > 0);
/* Never touch tx->tx_kiov inside ksocknal_lib_send_kiov() */
rc = ksocknal_lib_send_kiov(conn, tx);
- if (rc <= 0) /* sent nothing? */
- return (rc);
-
- nob = rc;
- LASSERT (nob <= tx->tx_resid);
- tx->tx_resid -= nob;
-
- /* "consume" kiov */
- do {
- LASSERT(tx->tx_nkiov > 0);
-
- if (nob < kiov->kiov_len) {
- kiov->kiov_offset += nob;
- kiov->kiov_len -= nob;
- return rc;
- }
-
- nob -= kiov->kiov_len;
- tx->tx_kiov = ++kiov;
- tx->tx_nkiov--;
+ if (rc <= 0) /* sent nothing? */
+ return (rc);
+
+ nob = rc;
+ LASSERT (nob <= tx->tx_resid);
+ tx->tx_resid -= nob;
+
+ /* "consume" kiov */
+ do {
+ LASSERT(tx->tx_nkiov > 0);
+
+ if (nob < (int)kiov->kiov_len) {
+ kiov->kiov_offset += nob;
+ kiov->kiov_len -= nob;
+ return rc;
+ }
+
+ nob -= (int)kiov->kiov_len;
+ tx->tx_kiov = ++kiov;
+ tx->tx_nkiov--;
} while (nob != 0);
return (rc);
{
int rc;
int bufnob;
-
+
if (ksocknal_data.ksnd_stall_tx != 0) {
cfs_pause(cfs_time_seconds(ksocknal_data.ksnd_stall_tx));
}
bufnob = SOCK_WMEM_QUEUED(conn->ksnc_sock);
if (rc > 0) /* sent something? */
conn->ksnc_tx_bufnob += rc; /* account it */
-
+
if (bufnob < conn->ksnc_tx_bufnob) {
/* allocated send buffer bytes < computed; infer
* something got ACKed */
- conn->ksnc_tx_deadline =
+ conn->ksnc_tx_deadline =
cfs_time_shift(*ksocknal_tunables.ksnd_timeout);
conn->ksnc_peer->ksnp_last_alive = cfs_time_current();
conn->ksnc_tx_bufnob = bufnob;
sched = conn->ksnc_scheduler;
spin_lock_bh (&sched->kss_lock);
-
+
if (!SOCK_TEST_NOSPACE(conn->ksnc_sock) &&
!conn->ksnc_tx_ready) {
/* SOCK_NOSPACE is set when the socket fills
int
ksocknal_recv_iov (ksock_conn_t *conn)
-{
+{
struct iovec *iov = conn->ksnc_rx_iov;
int nob;
int rc;
/* Never touch conn->ksnc_rx_iov or change connection
* status inside ksocknal_lib_recv_iov */
- rc = ksocknal_lib_recv_iov(conn);
+ rc = ksocknal_lib_recv_iov(conn);
- if (rc <= 0)
- return (rc);
+ if (rc <= 0)
+ return (rc);
- /* received something... */
- nob = rc;
-
- conn->ksnc_peer->ksnp_last_alive = cfs_time_current();
- conn->ksnc_rx_deadline =
- cfs_time_shift(*ksocknal_tunables.ksnd_timeout);
- mb(); /* order with setting rx_started */
- conn->ksnc_rx_started = 1;
-
- conn->ksnc_rx_nob_wanted -= nob;
+ /* received something... */
+ nob = rc;
+
+ conn->ksnc_peer->ksnp_last_alive = cfs_time_current();
+ conn->ksnc_rx_deadline =
+ cfs_time_shift(*ksocknal_tunables.ksnd_timeout);
+ mb(); /* order with setting rx_started */
+ conn->ksnc_rx_started = 1;
+
+ conn->ksnc_rx_nob_wanted -= nob;
conn->ksnc_rx_nob_left -= nob;
- do {
- LASSERT (conn->ksnc_rx_niov > 0);
+ do {
+ LASSERT (conn->ksnc_rx_niov > 0);
- if (nob < iov->iov_len) {
- iov->iov_len -= nob;
- iov->iov_base = (void *)(((unsigned long)iov->iov_base) + nob);
- return (-EAGAIN);
- }
+ if (nob < (int)iov->iov_len) {
+ iov->iov_len -= nob;
+ iov->iov_base = (void *)((char *)iov->iov_base + nob);
+ return (-EAGAIN);
+ }
- nob -= iov->iov_len;
- conn->ksnc_rx_iov = ++iov;
- conn->ksnc_rx_niov--;
+ nob -= iov->iov_len;
+ conn->ksnc_rx_iov = ++iov;
+ conn->ksnc_rx_niov--;
} while (nob != 0);
return (rc);
/* Never touch conn->ksnc_rx_kiov or change connection
* status inside ksocknal_lib_recv_iov */
- rc = ksocknal_lib_recv_kiov(conn);
-
- if (rc <= 0)
- return (rc);
-
- /* received something... */
- nob = rc;
+ rc = ksocknal_lib_recv_kiov(conn);
- conn->ksnc_peer->ksnp_last_alive = cfs_time_current();
- conn->ksnc_rx_deadline =
- cfs_time_shift(*ksocknal_tunables.ksnd_timeout);
- mb(); /* order with setting rx_started */
+ if (rc <= 0)
+ return (rc);
+
+ /* received something... */
+ nob = rc;
+
+ conn->ksnc_peer->ksnp_last_alive = cfs_time_current();
+ conn->ksnc_rx_deadline =
+ cfs_time_shift(*ksocknal_tunables.ksnd_timeout);
+ mb(); /* order with setting rx_started */
conn->ksnc_rx_started = 1;
- conn->ksnc_rx_nob_wanted -= nob;
- conn->ksnc_rx_nob_left -= nob;
-
- do {
- LASSERT (conn->ksnc_rx_nkiov > 0);
-
- if (nob < kiov->kiov_len) {
- kiov->kiov_offset += nob;
- kiov->kiov_len -= nob;
- return -EAGAIN;
- }
-
- nob -= kiov->kiov_len;
- conn->ksnc_rx_kiov = ++kiov;
- conn->ksnc_rx_nkiov--;
+ conn->ksnc_rx_nob_wanted -= nob;
+ conn->ksnc_rx_nob_left -= nob;
+
+ do {
+ LASSERT (conn->ksnc_rx_nkiov > 0);
+
+ if (nob < (int) kiov->kiov_len) {
+ kiov->kiov_offset += nob;
+ kiov->kiov_len -= nob;
+ return -EAGAIN;
+ }
+
+ nob -= kiov->kiov_len;
+ conn->ksnc_rx_kiov = ++kiov;
+ conn->ksnc_rx_nkiov--;
} while (nob != 0);
return 1;
}
int
-ksocknal_receive (ksock_conn_t *conn)
+ksocknal_receive (ksock_conn_t *conn)
{
/* Return 1 on success, 0 on EOF, < 0 on error.
* Caller checks ksnc_rx_nob_wanted to determine
* progress/completion. */
int rc;
ENTRY;
-
+
if (ksocknal_data.ksnd_stall_rx != 0) {
cfs_pause(cfs_time_seconds (ksocknal_data.ksnd_stall_rx));
}
if (tx->tx_conn != NULL)
ksocknal_conn_decref(tx->tx_conn);
- if (ni == NULL && tx->tx_conn != NULL)
+ if (ni == NULL && tx->tx_conn != NULL)
ni = tx->tx_conn->ksnc_peer->ksnp_ni;
ksocknal_free_tx (tx);
ksocknal_txlist_done (lnet_ni_t *ni, struct list_head *txlist, int error)
{
ksock_tx_t *tx;
-
+
while (!list_empty (txlist)) {
tx = list_entry (txlist->next, ksock_tx_t, tx_list);
if (conn->ksnc_proto != &ksocknal_protocol_v2x ||
!conn->ksnc_zc_capable)
return;
-
+
while (nkiov > 0) {
if (kiov->kiov_len >= *ksocknal_tunables.ksnd_zc_min_frag)
break;
if (nkiov == 0)
return;
-
+
/* assign cookie and queue tx to pending list, it will be released when
* a matching ack is received. See ksocknal_handle_zc_ack() */
spin_lock(&peer->ksnp_lock);
+ /* ZC_REQ is going to be pinned to the peer */
+ tx->tx_deadline =
+ cfs_time_shift(*ksocknal_tunables.ksnd_timeout);
+
LASSERT (tx->tx_msg.ksm_zc_req_cookie == 0);
- tx->tx_msg.ksm_zc_req_cookie = peer->ksnp_zc_next_cookie++;
+ tx->tx_msg.ksm_zc_req_cookie = peer->ksnp_zc_next_cookie++;
list_add_tail(&tx->tx_zc_list, &peer->ksnp_zc_req_list);
spin_unlock(&peer->ksnp_lock);
tx->tx_checked_zc = 1;
ksocknal_check_zc_req(tx);
}
-
+
rc = ksocknal_transmit (conn, tx);
CDEBUG (D_NET, "send(%d) %d\n", tx->tx_resid, rc);
SOCKNAL_ENOMEM_RETRY),
ksocknal_data.ksnd_reaper_waketime))
cfs_waitq_signal (&ksocknal_data.ksnd_reaper_waitq);
-
+
spin_unlock_bh (&ksocknal_data.ksnd_reaper_lock);
return (rc);
}
libcfs_id2str(conn->ksnc_peer->ksnp_id),
HIPQUAD(conn->ksnc_ipaddr),
conn->ksnc_port);
- }
-
+ }
+
ksocknal_unzc_req(tx);
/* it's not an error if conn is being closed */
- ksocknal_close_conn_and_siblings (conn,
+ ksocknal_close_conn_and_siblings (conn,
(conn->ksnc_closing) ? 0 : rc);
return (rc);
LASSERT (!route->ksnr_scheduled);
LASSERT (!route->ksnr_connecting);
LASSERT ((ksocknal_route_mask() & ~route->ksnr_connected) != 0);
-
+
route->ksnr_scheduled = 1; /* scheduling conn for connd */
ksocknal_route_addref(route); /* extra ref for connd */
-
+
spin_lock_bh (&ksocknal_data.ksnd_connd_lock);
-
+
list_add_tail (&route->ksnr_connd_list,
&ksocknal_data.ksnd_connd_routes);
cfs_waitq_signal (&ksocknal_data.ksnd_connd_waitq);
-
+
spin_unlock_bh (&ksocknal_data.ksnd_connd_lock);
}
} else {
/* lnet packet */
hdr_nob = (c->ksnc_proto == &ksocknal_protocol_v2x)?
- offsetof(ksock_msg_t, ksm_u.lnetmsg.ksnm_payload):
- sizeof(lnet_hdr_t);
+ sizeof(ksock_msg_t) : sizeof(lnet_hdr_t);
}
switch (c->ksnc_type) {
* ksnc_sock... */
LASSERT(!conn->ksnc_closing);
- CDEBUG (D_NET, "Sending to %s ip %d.%d.%d.%d:%d\n",
+ CDEBUG (D_NET, "Sending to %s ip %d.%d.%d.%d:%d\n",
libcfs_id2str(conn->ksnc_peer->ksnp_id),
HIPQUAD(conn->ksnc_ipaddr),
conn->ksnc_port);
* We always expect at least 1 mapped fragment containing the
* complete ksocknal message header. */
LASSERT (lnet_iov_nob (tx->tx_niov, tx->tx_iov) +
- lnet_kiov_nob (tx->tx_nkiov, tx->tx_kiov) == tx->tx_nob);
+ lnet_kiov_nob(tx->tx_nkiov, tx->tx_kiov) ==
+ (unsigned int)tx->tx_nob);
LASSERT (tx->tx_niov >= 1);
LASSERT (tx->tx_resid == tx->tx_nob);
CDEBUG (D_NET, "Packet %p type %d, nob %d niov %d nkiov %d\n",
- tx, (tx->tx_lnetmsg != NULL)? tx->tx_lnetmsg->msg_hdr.type:
- KSOCK_MSG_NOOP,
+ tx, (tx->tx_lnetmsg != NULL)? tx->tx_lnetmsg->msg_hdr.type:
+ KSOCK_MSG_NOOP,
tx->tx_nob, tx->tx_niov, tx->tx_nkiov);
-
+
atomic_add (tx->tx_nob, &conn->ksnc_tx_nob);
tx->tx_conn = conn;
ksocknal_conn_addref(conn); /* +1 ref for tx */
- /*
- * NB Darwin: SOCK_WMEM_QUEUED()->sock_getsockopt() will take
- * a blockable lock(socket lock), so SOCK_WMEM_QUEUED can't be
- * put in spinlock.
+ /*
+ * FIXME: SOCK_WMEM_QUEUED and SOCK_ERROR could block in __DARWIN8__
+ * but they're used inside spinlocks a lot.
*/
bufnob = SOCK_WMEM_QUEUED(conn->ksnc_sock);
spin_lock_bh (&sched->kss_lock);
if (list_empty(&conn->ksnc_tx_queue) && bufnob == 0) {
/* First packet starts the timeout */
- conn->ksnc_tx_deadline =
+ conn->ksnc_tx_deadline =
cfs_time_shift(*ksocknal_tunables.ksnd_timeout);
conn->ksnc_tx_bufnob = 0;
mb(); /* order with adding to tx_queue */
LASSERT(msg->ksm_zc_ack_cookie == 0);
if (conn->ksnc_proto == &ksocknal_protocol_v2x && /* V2.x packet */
- conn->ksnc_tx_mono != NULL) {
+ conn->ksnc_tx_mono != NULL) {
if (conn->ksnc_tx_mono->tx_msg.ksm_type == KSOCK_MSG_NOOP) {
/* There is a noop zc-ack can be piggybacked */
ztx = conn->ksnc_tx_mono;
if (ztx != NULL)
list_add_tail(&ztx->tx_list, &sched->kss_zombie_noop_txs);
-
+
if (conn->ksnc_tx_ready && /* able to send */
!conn->ksnc_tx_scheduled) { /* not scheduled to send */
/* +1 ref for scheduler */
ksocknal_conn_addref(conn);
- list_add_tail (&conn->ksnc_tx_list,
+ list_add_tail (&conn->ksnc_tx_list,
&sched->kss_tx_conns);
conn->ksnc_tx_scheduled = 1;
cfs_waitq_signal (&sched->kss_waitq);
{
struct list_head *tmp;
ksock_route_t *route;
-
+
list_for_each (tmp, &peer->ksnp_routes) {
route = list_entry (tmp, ksock_route_t, ksnr_list);
/* too soon to retry this guy? */
if (!(route->ksnr_retry_interval == 0 || /* first attempt */
- cfs_time_aftereq (cfs_time_current(),
+ cfs_time_aftereq (cfs_time_current(),
route->ksnr_timeout)))
continue;
-
+
return (route);
}
-
+
return (NULL);
}
route = list_entry (tmp, ksock_route_t, ksnr_list);
LASSERT (!route->ksnr_connecting || route->ksnr_scheduled);
-
+
if (route->ksnr_scheduled)
return (route);
}
-
+
return (NULL);
}
rwlock_t *g_lock;
int retry;
int rc;
-
+
LASSERT (tx->tx_conn == NULL);
LASSERT (tx->tx_lnetmsg != NULL);
g_lock = &ksocknal_data.ksnd_global_lock;
-
+
for (retry = 0;; retry = 1) {
#if !SOCKNAL_ROUND_ROBIN
read_lock (g_lock);
}
}
}
-
+
/* I'll need a write lock... */
read_unlock (g_lock);
#endif
write_lock_bh (g_lock);
peer = ksocknal_find_peer_locked(ni, id);
- if (peer != NULL)
+ if (peer != NULL)
break;
-
+
write_unlock_bh (g_lock);
if ((id.pid & LNET_PID_USERFLAG) != 0) {
"userspace process %s\n", libcfs_id2str(id));
return -EHOSTUNREACH;
}
-
+
if (retry) {
CERROR("Can't find peer %s\n", libcfs_id2str(id));
return -EHOSTUNREACH;
}
-
- rc = ksocknal_add_peer(ni, id,
+
+ rc = ksocknal_add_peer(ni, id,
LNET_NIDADDR(id.nid),
lnet_acceptor_port());
if (rc != 0) {
if (peer->ksnp_accepting > 0 ||
ksocknal_find_connecting_route_locked (peer) != NULL) {
+ /* the message is going to be pinned to the peer */
+ tx->tx_deadline =
+ cfs_time_shift(*ksocknal_tunables.ksnd_timeout);
+
/* Queue the message until a connection is established */
list_add_tail (&tx->tx_list, &peer->ksnp_tx_queue);
write_unlock_bh (g_lock);
return 0;
}
-
+
write_unlock_bh (g_lock);
/* NB Routes may be ignored if connections to them failed recently */
int
ksocknal_send(lnet_ni_t *ni, void *private, lnet_msg_t *lntmsg)
{
- int type = lntmsg->msg_type;
+ int type = lntmsg->msg_type;
lnet_process_id_t target = lntmsg->msg_target;
- unsigned int payload_niov = lntmsg->msg_niov;
- struct iovec *payload_iov = lntmsg->msg_iov;
+ unsigned int payload_niov = lntmsg->msg_niov;
+ struct iovec *payload_iov = lntmsg->msg_iov;
lnet_kiov_t *payload_kiov = lntmsg->msg_kiov;
unsigned int payload_offset = lntmsg->msg_offset;
unsigned int payload_nob = lntmsg->msg_len;
/* payload is either all vaddrs or all pages */
LASSERT (!(payload_kiov != NULL && payload_iov != NULL));
LASSERT (!in_interrupt ());
-
+
if (payload_iov != NULL)
- desc_size = offsetof(ksock_tx_t,
+ desc_size = offsetof(ksock_tx_t,
tx_frags.virt.iov[1 + payload_niov]);
else
- desc_size = offsetof(ksock_tx_t,
+ desc_size = offsetof(ksock_tx_t,
tx_frags.paged.kiov[payload_niov]);
-
+
tx = ksocknal_alloc_tx(desc_size);
if (tx == NULL) {
CERROR("Can't allocate tx desc type %d size %d\n",
tx->tx_kiov = NULL;
tx->tx_nkiov = 0;
tx->tx_iov = tx->tx_frags.virt.iov;
- tx->tx_niov = 1 +
+ tx->tx_niov = 1 +
lnet_extract_iov(payload_niov, &tx->tx_iov[1],
payload_niov, payload_iov,
payload_offset, payload_nob);
rc = ksocknal_launch_packet(ni, tx, target);
if (rc == 0)
return (0);
-
+
ksocknal_free_tx(tx);
return (-EIO);
}
if (nob_to_skip == 0) { /* right at next packet boundary now */
conn->ksnc_rx_started = 0;
mb (); /* racing with timeout thread */
-
+
switch (conn->ksnc_proto->pro_version) {
case KSOCK_PROTO_V2:
conn->ksnc_rx_state = SOCKNAL_RX_KSM_HEADER;
default:
LBUG ();
- }
+ }
conn->ksnc_rx_niov = 1;
conn->ksnc_rx_kiov = NULL;
spin_lock(&peer->ksnp_lock);
list_for_each(ctmp, &peer->ksnp_zc_req_list) {
- tx = list_entry (ctmp, ksock_tx_t, tx_zc_list);
- if (tx->tx_msg.ksm_zc_req_cookie != cookie)
+ tx = list_entry (ctmp, ksock_tx_t, tx_zc_list);
+ if (tx->tx_msg.ksm_zc_req_cookie != cookie)
continue;
tx->tx_msg.ksm_zc_req_cookie = 0;
ksocknal_process_receive (ksock_conn_t *conn)
{
int rc;
-
+
LASSERT (atomic_read(&conn->ksnc_conn_refcount) > 0);
/* NB: sched lock NOT held */
if (rc == 0)
CDEBUG (D_NET, "[%p] EOF from %s"
- " ip %d.%d.%d.%d:%d\n", conn,
+ " ip %d.%d.%d.%d:%d\n", conn,
libcfs_id2str(conn->ksnc_peer->ksnp_id),
HIPQUAD(conn->ksnc_ipaddr),
conn->ksnc_port);
else if (!conn->ksnc_closing)
CERROR ("[%p] Error %d on read from %s"
" ip %d.%d.%d.%d:%d\n",
- conn, rc,
+ conn, rc,
libcfs_id2str(conn->ksnc_peer->ksnp_id),
HIPQUAD(conn->ksnc_ipaddr),
conn->ksnc_port);
/* it's not an error if conn is being closed */
- ksocknal_close_conn_and_siblings (conn,
+ ksocknal_close_conn_and_siblings (conn,
(conn->ksnc_closing) ? 0 : rc);
return (rc == 0 ? -ESHUTDOWN : rc);
}
-
+
if (conn->ksnc_rx_nob_wanted != 0) {
/* short read */
return (-EAGAIN);
__swab32s(&conn->ksnc_msg.ksm_csum);
__swab64s(&conn->ksnc_msg.ksm_zc_req_cookie);
__swab64s(&conn->ksnc_msg.ksm_zc_ack_cookie);
- }
+ }
+
+ if (conn->ksnc_msg.ksm_type != KSOCK_MSG_NOOP &&
+ conn->ksnc_msg.ksm_type != KSOCK_MSG_LNET) {
+ CERROR("%s: Unknown message type: %x\n",
+ libcfs_id2str(conn->ksnc_peer->ksnp_id),
+ conn->ksnc_msg.ksm_type);
+ ksocknal_new_packet(conn, 0);
+ ksocknal_close_conn_and_siblings(conn, -EPROTO);
+ return (-EPROTO);
+ }
if (conn->ksnc_msg.ksm_type == KSOCK_MSG_NOOP &&
conn->ksnc_msg.ksm_csum != 0 && /* has checksum */
- conn->ksnc_msg.ksm_csum != conn->ksnc_rx_csum) {
+ conn->ksnc_msg.ksm_csum != conn->ksnc_rx_csum) {
/* NOOP Checksum error */
CERROR("%s: Checksum error, wire:0x%08X data:0x%08X\n",
libcfs_id2str(conn->ksnc_peer->ksnp_id),
}
}
- if (conn->ksnc_msg.ksm_type == KSOCK_MSG_NOOP) {
+ if (conn->ksnc_msg.ksm_type == KSOCK_MSG_NOOP) {
ksocknal_new_packet (conn, 0);
return 0; /* NOOP is done and just return */
}
- LASSERT (conn->ksnc_msg.ksm_type == KSOCK_MSG_LNET);
conn->ksnc_rx_state = SOCKNAL_RX_LNET_HEADER;
conn->ksnc_rx_nob_wanted = sizeof(ksock_lnet_msg_t);
conn->ksnc_rx_nob_left = sizeof(ksock_lnet_msg_t);
-
+
conn->ksnc_rx_iov = (struct iovec *)&conn->ksnc_rx_iov_space;
conn->ksnc_rx_iov[0].iov_base = (char *)&conn->ksnc_msg.ksm_u.lnetmsg;
conn->ksnc_rx_iov[0].iov_len = sizeof(ksock_lnet_msg_t);
/* unpack message header */
conn->ksnc_proto->pro_unpack(&conn->ksnc_msg);
- if ((conn->ksnc_peer->ksnp_id.pid & LNET_PID_USERFLAG) != 0) {
+ if ((conn->ksnc_peer->ksnp_id.pid & LNET_PID_USERFLAG) != 0) {
/* Userspace peer */
lnet_process_id_t *id = &conn->ksnc_peer->ksnp_id;
lnet_hdr_t *lhdr = &conn->ksnc_msg.ksm_u.lnetmsg.ksnm_hdr;
-
+
/* Substitute process ID assigned at connection time */
lhdr->src_pid = cpu_to_le32(id->pid);
lhdr->src_nid = cpu_to_le64(id->nid);
conn->ksnc_rx_state = SOCKNAL_RX_PARSE;
ksocknal_conn_addref(conn); /* ++ref while parsing */
-
- rc = lnet_parse(conn->ksnc_peer->ksnp_ni,
- &conn->ksnc_msg.ksm_u.lnetmsg.ksnm_hdr,
+
+ rc = lnet_parse(conn->ksnc_peer->ksnp_ni,
+ &conn->ksnc_msg.ksm_u.lnetmsg.ksnm_hdr,
conn->ksnc_peer->ksnp_id.nid, conn, 0);
if (rc < 0) {
/* I just received garbage: give up on this conn */
/* I'm racing with ksocknal_recv() */
LASSERT (conn->ksnc_rx_state == SOCKNAL_RX_PARSE ||
conn->ksnc_rx_state == SOCKNAL_RX_LNET_PAYLOAD);
-
+
if (conn->ksnc_rx_state != SOCKNAL_RX_LNET_PAYLOAD)
return 0;
-
+
/* ksocknal_recv() got called */
goto again;
if (conn->ksnc_rx_nob_left == 0 && /* not truncating */
conn->ksnc_msg.ksm_csum != 0 && /* has checksum */
- conn->ksnc_msg.ksm_csum != conn->ksnc_rx_csum) {
+ conn->ksnc_msg.ksm_csum != conn->ksnc_rx_csum) {
CERROR("%s: Checksum error, wire:0x%08X data:0x%08X\n",
libcfs_id2str(conn->ksnc_peer->ksnp_id),
conn->ksnc_msg.ksm_csum, conn->ksnc_rx_csum);
LASSERT (mlen <= rlen);
LASSERT (niov <= LNET_MAX_IOV);
-
+
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 =
+ conn->ksnc_rx_nkiov =
lnet_extract_kiov(LNET_MAX_IOV, conn->ksnc_rx_kiov,
niov, kiov, offset, mlen);
}
-
- LASSERT (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));
cfs_waitq_signal (&sched->kss_waitq);
LASSERT (conn->ksnc_rx_ready);
break;
-
+
case SOCKNAL_RX_PARSE:
/* scheduler hasn't noticed I'm parsing yet */
break;
}
conn->ksnc_rx_state = SOCKNAL_RX_LNET_PAYLOAD;
-
+
spin_unlock_bh (&sched->kss_lock);
ksocknal_conn_decref(conn);
return (0);
rc = (!ksocknal_data.ksnd_shuttingdown &&
list_empty(&sched->kss_rx_conns) &&
list_empty(&sched->kss_tx_conns));
-
+
spin_unlock_bh (&sched->kss_lock);
return (rc);
}
ksock_tx_t *tx;
int rc;
int nloops = 0;
- int id = sched - ksocknal_data.ksnd_schedulers;
+ int id = (int)(sched - ksocknal_data.ksnd_schedulers);
char name[16];
snprintf (name, sizeof (name),"socknal_sd%02d", id);
CFS_LIST_HEAD (zlist);
if (!list_empty(&sched->kss_zombie_noop_txs)) {
- list_add(&zlist, &sched->kss_zombie_noop_txs);
+ list_add(&zlist, &sched->kss_zombie_noop_txs);
list_del_init(&sched->kss_zombie_noop_txs);
}
conn = list_entry(sched->kss_tx_conns.next,
ksock_conn_t, ksnc_tx_list);
list_del (&conn->ksnc_tx_list);
-
+
LASSERT(conn->ksnc_tx_scheduled);
LASSERT(conn->ksnc_tx_ready);
LASSERT(!list_empty(&conn->ksnc_tx_queue));
-
+
tx = list_entry(conn->ksnc_tx_queue.next,
ksock_tx_t, tx_list);
} else if (conn->ksnc_tx_ready &&
!list_empty (&conn->ksnc_tx_queue)) {
/* reschedule for tx */
- list_add_tail (&conn->ksnc_tx_list,
+ list_add_tail (&conn->ksnc_tx_list,
&sched->kss_tx_conns);
} else {
conn->ksnc_tx_scheduled = 0;
/* drop my ref */
ksocknal_conn_decref(conn);
}
-
+
did_something = 1;
}
if (!did_something || /* nothing to do */
nloops = 0;
if (!did_something) { /* wait for something to do */
- rc = wait_event_interruptible_exclusive(
+ cfs_wait_event_interruptible_exclusive(
sched->kss_waitq,
- !ksocknal_sched_cansleep(sched));
+ !ksocknal_sched_cansleep(sched), rc);
LASSERT (rc == 0);
} else {
our_cond_resched();
*/
void ksocknal_read_callback (ksock_conn_t *conn)
{
- ksock_sched_t *sched;
+ ksock_sched_t *sched;
ENTRY;
- sched = conn->ksnc_scheduler;
+ sched = conn->ksnc_scheduler;
spin_lock_bh (&sched->kss_lock);
- conn->ksnc_rx_ready = 1;
+ conn->ksnc_rx_ready = 1;
- if (!conn->ksnc_rx_scheduled) { /* not being progressed */
- list_add_tail(&conn->ksnc_rx_list,
- &sched->kss_rx_conns);
- conn->ksnc_rx_scheduled = 1;
- /* extra ref for scheduler */
+ if (!conn->ksnc_rx_scheduled) { /* not being progressed */
+ list_add_tail(&conn->ksnc_rx_list,
+ &sched->kss_rx_conns);
+ conn->ksnc_rx_scheduled = 1;
+ /* extra ref for scheduler */
ksocknal_conn_addref(conn);
- cfs_waitq_signal (&sched->kss_waitq);
- }
+ cfs_waitq_signal (&sched->kss_waitq);
+ }
spin_unlock_bh (&sched->kss_lock);
EXIT;
-}
+}
/*
* Add connection to kss_tx_conns of scheduler
* and wakeup the scheduler.
*/
void ksocknal_write_callback (ksock_conn_t *conn)
-{
- ksock_sched_t *sched;
+{
+ ksock_sched_t *sched;
ENTRY;
-
- sched = conn->ksnc_scheduler;
+
+ sched = conn->ksnc_scheduler;
spin_lock_bh (&sched->kss_lock);
- conn->ksnc_tx_ready = 1;
+ conn->ksnc_tx_ready = 1;
if (!conn->ksnc_tx_scheduled && // not being progressed
!list_empty(&conn->ksnc_tx_queue)){//packets to send
- list_add_tail (&conn->ksnc_tx_list,
- &sched->kss_tx_conns);
- conn->ksnc_tx_scheduled = 1;
- /* extra ref for scheduler */
- ksocknal_conn_addref(conn);
+ list_add_tail (&conn->ksnc_tx_list,
+ &sched->kss_tx_conns);
+ conn->ksnc_tx_scheduled = 1;
+ /* extra ref for scheduler */
+ ksocknal_conn_addref(conn);
- cfs_waitq_signal (&sched->kss_waitq);
- }
+ cfs_waitq_signal (&sched->kss_waitq);
+ }
spin_unlock_bh (&sched->kss_lock);
if (hello->kshm_nips == 0)
goto out;
- for (i = 0; i < hello->kshm_nips; i++) {
+ for (i = 0; i < (int) hello->kshm_nips; i++) {
hello->kshm_ips[i] = __cpu_to_le32 (hello->kshm_ips[i]);
}
-
+
rc = libcfs_sock_write(sock, hello->kshm_ips,
hello->kshm_nips * sizeof(__u32),
lnet_acceptor_timeout());
if (rc != 0) {
CDEBUG (D_NETERROR, "Error %d sending HELLO payload (%d)"
- " to %u.%u.%u.%u/%d\n", rc, hello->kshm_nips,
+ " to %u.%u.%u.%u/%d\n", rc, hello->kshm_nips,
HIPQUAD(conn->ksnc_ipaddr), conn->ksnc_port);
}
out:
LIBCFS_FREE(hdr, sizeof(*hdr));
return rc;
-}
+}
static int
ksocknal_send_hello_v2 (ksock_conn_t *conn, ksock_hello_msg_t *hello)
goto out;
}
- for (i = 0; i < hello->kshm_nips; i++) {
+ for (i = 0; i < (int) hello->kshm_nips; i++) {
hello->kshm_ips[i] = __le32_to_cpu(hello->kshm_ips[i]);
-
+
if (hello->kshm_ips[i] == 0) {
CERROR("Zero IP[%d] from ip %u.%u.%u.%u\n",
i, HIPQUAD(conn->ksnc_ipaddr));
}
static int
-ksocknal_recv_hello_v2 (ksock_conn_t *conn, ksock_hello_msg_t *hello, int timeout)
+ksocknal_recv_hello_v2 (ksock_conn_t *conn, ksock_hello_msg_t *hello, int timeout)
{
cfs_socket_t *sock = conn->ksnc_sock;
- int rc;
+ int rc;
int i;
if (hello->kshm_magic == LNET_PROTO_MAGIC)
rc = libcfs_sock_read(sock, &hello->kshm_src_nid,
offsetof(ksock_hello_msg_t, kshm_ips) -
offsetof(ksock_hello_msg_t, kshm_src_nid),
- timeout);
+ timeout);
if (rc != 0) {
CERROR ("Error %d reading HELLO from %u.%u.%u.%u\n",
rc, HIPQUAD(conn->ksnc_ipaddr));
if (hello->kshm_nips == 0)
return 0;
-
+
rc = libcfs_sock_read(sock, hello->kshm_ips,
hello->kshm_nips * sizeof(__u32), timeout);
if (rc != 0) {
return rc;
}
- for (i = 0; i < hello->kshm_nips; i++) {
+ for (i = 0; i < (int) hello->kshm_nips; i++) {
if (conn->ksnc_flip)
__swab32s(&hello->kshm_ips[i]);
-
+
if (hello->kshm_ips[i] == 0) {
CERROR("Zero IP[%d] from ip %u.%u.%u.%u\n",
i, HIPQUAD(conn->ksnc_ipaddr));
LASSERT(tx->tx_msg.ksm_type != KSOCK_MSG_NOOP);
tx->tx_msg.ksm_u.lnetmsg.ksnm_hdr = tx->tx_lnetmsg->msg_hdr;
- tx->tx_iov[0].iov_len = offsetof(ksock_msg_t, ksm_u.lnetmsg.ksnm_payload);
- tx->tx_resid = tx->tx_nob = offsetof(ksock_msg_t, ksm_u.lnetmsg.ksnm_payload) +
- tx->tx_lnetmsg->msg_len;
+ tx->tx_iov[0].iov_len = sizeof(ksock_msg_t);
+ tx->tx_resid = tx->tx_nob = sizeof(ksock_msg_t) + tx->tx_lnetmsg->msg_len;
} else {
LASSERT(tx->tx_msg.ksm_type == KSOCK_MSG_NOOP);
{
/* CAVEAT EMPTOR: this byte flips 'ipaddrs' */
ksock_net_t *net = (ksock_net_t *)ni->ni_data;
- lnet_nid_t srcnid;
- LASSERT (0 <= hello->kshm_nips && hello->kshm_nips <= LNET_MAX_INTERFACES);
+ LASSERT (hello->kshm_nips <= LNET_MAX_INTERFACES);
- /* No need for getconnsock/putconnsock */
- LASSERT (!conn->ksnc_closing);
+ /* rely on caller to hold a ref on socket so it wouldn't disappear */
LASSERT (conn->ksnc_proto != NULL);
- srcnid = lnet_ptlcompat_srcnid(ni->ni_nid, peer_nid);
-
- hello->kshm_src_nid = srcnid;
+ hello->kshm_src_nid = ni->ni_nid;
hello->kshm_dst_nid = peer_nid;
hello->kshm_src_pid = the_lnet.ln_pid;
}
int
-ksocknal_recv_hello (lnet_ni_t *ni, ksock_conn_t *conn,
+ksocknal_recv_hello (lnet_ni_t *ni, ksock_conn_t *conn,
ksock_hello_msg_t *hello, lnet_process_id_t *peerid,
__u64 *incarnation)
{
/* socket type set on active connections - not set on passive */
LASSERT (!active == !(conn->ksnc_type != SOCKLND_CONN_NONE));
-
+
timeout = active ? *ksocknal_tunables.ksnd_timeout :
lnet_acceptor_timeout();
hello->kshm_magic != __swab32(LNET_PROTO_MAGIC) &&
hello->kshm_magic != le32_to_cpu (LNET_PROTO_TCP_MAGIC)) {
/* Unexpected magic! */
- if (active ||
- the_lnet.ln_ptlcompat == 0) {
- CERROR ("Bad magic(1) %#08x (%#08x expected) from "
- "%u.%u.%u.%u\n", __cpu_to_le32 (hello->kshm_magic),
- LNET_PROTO_TCP_MAGIC,
- HIPQUAD(conn->ksnc_ipaddr));
- return -EPROTO;
- }
-
- /* When portals compatibility is set, I may be passed a new
- * connection "blindly" by the acceptor, and I have to
- * determine if my peer has sent an acceptor connection request
- * or not. This isn't a 'hello', so I'll get the acceptor to
- * look at it... */
- rc = lnet_accept(ni, sock, hello->kshm_magic);
- if (rc != 0)
- return -EPROTO;
-
- /* ...and if it's OK I'm back to looking for a 'hello'... */
- rc = libcfs_sock_read(sock, &hello->kshm_magic,
- sizeof (hello->kshm_magic), timeout);
- if (rc != 0) {
- CERROR ("Error %d reading HELLO from %u.%u.%u.%u\n",
- rc, HIPQUAD(conn->ksnc_ipaddr));
- LASSERT (rc < 0);
- return rc;
- }
-
- /* Only need to check V1.x magic */
- if (hello->kshm_magic != le32_to_cpu (LNET_PROTO_TCP_MAGIC)) {
- CERROR ("Bad magic(2) %#08x (%#08x expected) from "
- "%u.%u.%u.%u\n", __cpu_to_le32 (hello->kshm_magic),
- LNET_PROTO_TCP_MAGIC,
- HIPQUAD(conn->ksnc_ipaddr));
- return -EPROTO;
- }
+ CERROR ("Bad magic(1) %#08x (%#08x expected) from "
+ "%u.%u.%u.%u\n", __cpu_to_le32 (hello->kshm_magic),
+ LNET_PROTO_TCP_MAGIC,
+ HIPQUAD(conn->ksnc_ipaddr));
+ return -EPROTO;
}
rc = libcfs_sock_read(sock, &hello->kshm_version,
proto = ksocknal_parse_proto_version(hello);
if (proto == NULL) {
- if (!active) {
+ if (!active) {
/* unknown protocol from peer, tell peer my protocol */
conn->ksnc_proto = &ksocknal_protocol_v2x;
#if SOCKNAL_VERSION_DEBUG
return -EPROTO;
}
- if (conn->ksnc_port > LNET_ACCEPTOR_MAX_RESERVED_PORT) {
+ if (!active &&
+ conn->ksnc_port > LNET_ACCEPTOR_MAX_RESERVED_PORT) {
/* Userspace NAL assigns peer process ID from socket */
recv_id.pid = conn->ksnc_port | LNET_PID_USERFLAG;
recv_id.nid = LNET_MKNID(LNET_NIDNET(ni->ni_nid), conn->ksnc_ipaddr);
} else {
recv_id.nid = hello->kshm_src_nid;
-
- if (the_lnet.ln_ptlcompat > 1 && /* portals peers may exist */
- LNET_NIDNET(recv_id.nid) == 0) /* this is one */
- recv_id.pid = the_lnet.ln_pid; /* give it a sensible pid */
- else
- recv_id.pid = hello->kshm_src_pid;
-
+ recv_id.pid = hello->kshm_src_pid;
}
-
+
if (!active) {
*peerid = recv_id;
conn->ksnc_type = ksocknal_invert_type(hello->kshm_ctype);
if (conn->ksnc_type == SOCKLND_CONN_NONE) {
CERROR ("Unexpected type %d from %s ip %u.%u.%u.%u\n",
- hello->kshm_ctype, libcfs_id2str(*peerid),
+ hello->kshm_ctype, libcfs_id2str(*peerid),
HIPQUAD(conn->ksnc_ipaddr));
return -EPROTO;
}
}
if (peerid->pid != recv_id.pid ||
- !lnet_ptlcompat_matchnid(peerid->nid, recv_id.nid)) {
+ peerid->nid != recv_id.nid) {
LCONSOLE_ERROR_MSG(0x130, "Connected successfully to %s on host"
" %u.%u.%u.%u, but they claimed they were "
"%s; please check your Lustre "
int retry_later = 0;
int rc = 0;
- deadline = cfs_time_add(cfs_time_current(),
+ deadline = cfs_time_add(cfs_time_current(),
cfs_time_seconds(*ksocknal_tunables.ksnd_timeout));
write_lock_bh (&ksocknal_data.ksnd_global_lock);
if (retry_later) /* needs reschedule */
break;
-
+
if ((wanted & (1 << SOCKLND_CONN_ANY)) != 0) {
type = SOCKLND_CONN_ANY;
} else if ((wanted & (1 << SOCKLND_CONN_CONTROL)) != 0) {
route->ksnr_port);
goto failed;
}
-
+
rc = lnet_connect(&sock, peer->ksnp_id.nid,
- route->ksnr_myipaddr,
+ route->ksnr_myipaddr,
route->ksnr_ipaddr, route->ksnr_port);
if (rc != 0)
goto failed;
rc = ksocknal_create_conn(peer->ksnp_ni, route, sock, type);
if (rc < 0) {
lnet_connect_console_error(rc, peer->ksnp_id.nid,
- route->ksnr_ipaddr,
+ route->ksnr_ipaddr,
route->ksnr_port);
goto failed;
}
if (retry_later)
CDEBUG(D_NET, "peer %s: conn race, retry later.\n",
libcfs_nid2str(peer->ksnp_id.nid));
-
+
write_lock_bh (&ksocknal_data.ksnd_global_lock);
}
/* This is a retry rather than a new connection */
route->ksnr_retry_interval *= 2;
- route->ksnr_retry_interval =
+ route->ksnr_retry_interval =
MAX(route->ksnr_retry_interval,
cfs_time_seconds(*ksocknal_tunables.ksnd_min_reconnectms)/1000);
- route->ksnr_retry_interval =
+ route->ksnr_retry_interval =
MIN(route->ksnr_retry_interval,
cfs_time_seconds(*ksocknal_tunables.ksnd_max_reconnectms)/1000);
-
+
LASSERT (route->ksnr_retry_interval != 0);
route->ksnr_timeout = cfs_time_add(cfs_time_current(),
route->ksnr_retry_interval);
ksocknal_connd_ready(void)
{
int rc;
-
+
spin_lock_bh (&ksocknal_data.ksnd_connd_lock);
-
+
rc = ksocknal_data.ksnd_shuttingdown ||
!list_empty(&ksocknal_data.ksnd_connd_connreqs) ||
ksocknal_connd_connect_route_locked();
-
+
spin_unlock_bh (&ksocknal_data.ksnd_connd_lock);
return rc;
int
ksocknal_connd (void *arg)
{
- long id = (long)arg;
+ long id = (long)(long_ptr_t)arg;
char name[16];
ksock_connreq_t *cr;
ksock_route_t *route;
+ int rc = 0;
snprintf (name, sizeof (name), "socknal_cd%02ld", id);
cfs_daemonize (name);
/* Connection accepted by the listener */
cr = list_entry(ksocknal_data.ksnd_connd_connreqs.next,
ksock_connreq_t, ksncr_list);
-
+
list_del(&cr->ksncr_list);
spin_unlock_bh (&ksocknal_data.ksnd_connd_lock);
-
- ksocknal_create_conn(cr->ksncr_ni, NULL,
+
+ ksocknal_create_conn(cr->ksncr_ni, NULL,
cr->ksncr_sock, SOCKLND_CONN_NONE);
lnet_ni_decref(cr->ksncr_ni);
LIBCFS_FREE(cr, sizeof(*cr));
-
+
spin_lock_bh (&ksocknal_data.ksnd_connd_lock);
}
spin_unlock_bh (&ksocknal_data.ksnd_connd_lock);
- wait_event_interruptible_exclusive(
+ cfs_wait_event_interruptible_exclusive(
ksocknal_data.ksnd_connd_waitq,
- ksocknal_connd_ready());
+ ksocknal_connd_ready(), rc);
spin_lock_bh (&ksocknal_data.ksnd_connd_lock);
}
return (NULL);
}
+static inline void
+ksocknal_flush_stale_txs(ksock_peer_t *peer)
+{
+ ksock_tx_t *tx;
+ CFS_LIST_HEAD (stale_txs);
+
+ write_lock_bh (&ksocknal_data.ksnd_global_lock);
+
+ while (!list_empty (&peer->ksnp_tx_queue)) {
+ tx = list_entry (peer->ksnp_tx_queue.next,
+ ksock_tx_t, tx_list);
+
+ if (!cfs_time_aftereq(cfs_time_current(),
+ tx->tx_deadline))
+ break;
+
+ list_del (&tx->tx_list);
+ list_add_tail (&tx->tx_list, &stale_txs);
+ }
+
+ write_unlock_bh (&ksocknal_data.ksnd_global_lock);
+
+ ksocknal_txlist_done(peer->ksnp_ni, &stale_txs, 1);
+}
+
void
ksocknal_check_peer_timeouts (int idx)
{
ksocknal_conn_decref(conn);
goto again;
}
+
+ /* we can't process stale txs right here because we're
+ * holding only shared lock */
+ if (!list_empty (&peer->ksnp_tx_queue)) {
+ ksock_tx_t *tx = list_entry (peer->ksnp_tx_queue.next,
+ ksock_tx_t, tx_list);
+
+ if (cfs_time_aftereq(cfs_time_current(),
+ tx->tx_deadline)) {
+
+ ksocknal_peer_addref(peer);
+ read_unlock (&ksocknal_data.ksnd_global_lock);
+
+ ksocknal_flush_stale_txs(peer);
+
+ ksocknal_peer_decref(peer);
+ goto again;
+ }
+ }
}
+ /* print out warnings about stale ZC_REQs */
+ cfs_list_for_each_entry_typed(peer, peers, ksock_peer_t, ksnp_list) {
+ ksock_tx_t *tx;
+ int n = 0;
+
+ cfs_list_for_each_entry_typed(tx, &peer->ksnp_zc_req_list,
+ ksock_tx_t, tx_zc_list) {
+ if (!cfs_time_aftereq(cfs_time_current(),
+ tx->tx_deadline))
+ break;
+ n++;
+ }
+
+ if (n != 0) {
+ tx = list_entry (peer->ksnp_zc_req_list.next,
+ ksock_tx_t, tx_zc_list);
+ CWARN("Stale ZC_REQs for peer %s detected: %d; the "
+ "oldest (%p) timed out %ld secs ago\n",
+ libcfs_nid2str(peer->ksnp_id.nid), n, tx,
+ cfs_duration_sec(cfs_time_current() -
+ tx->tx_deadline));
+ }
+ }
+
read_unlock (&ksocknal_data.ksnd_global_lock);
}
conn = list_entry (ksocknal_data.ksnd_deathrow_conns.next,
ksock_conn_t, ksnc_list);
list_del (&conn->ksnc_list);
-
+
spin_unlock_bh (&ksocknal_data.ksnd_reaper_lock);
ksocknal_terminate_conn (conn);
conn = list_entry (ksocknal_data.ksnd_zombie_conns.next,
ksock_conn_t, ksnc_list);
list_del (&conn->ksnc_list);
-
+
spin_unlock_bh (&ksocknal_data.ksnd_reaper_lock);
ksocknal_destroy_conn (conn);