if (net->ksnn_shutdown) {
spin_unlock_bh (&net->ksnn_lock);
-
+
LIBCFS_FREE(peer, sizeof(*peer));
CERROR("Can't create peer: network shutdown\n");
return -ESHUTDOWN;
{
ksock_net_t *net = peer->ksnp_ni->ni_data;
- CDEBUG (D_NET, "peer %s %p deleted\n",
+ CDEBUG (D_NET, "peer %s %p deleted\n",
libcfs_id2str(peer->ksnp_id), peer);
LASSERT (atomic_read (&peer->ksnp_refcount) == 0);
continue;
CDEBUG(D_NET, "got peer [%p] -> %s (%d)\n",
- peer, libcfs_id2str(id),
+ peer, libcfs_id2str(id),
atomic_read(&peer->ksnp_refcount));
return (peer);
}
}
int
-ksocknal_get_peer_info (lnet_ni_t *ni, int index,
+ksocknal_get_peer_info (lnet_ni_t *ni, int index,
lnet_process_id_t *id, __u32 *myip, __u32 *peer_ip, int *port,
int *conn_count, int *share_count)
{
if (route2->ksnr_ipaddr == route->ksnr_ipaddr) {
CERROR ("Duplicate route %s %u.%u.%u.%u\n",
- libcfs_id2str(peer->ksnp_id),
+ libcfs_id2str(peer->ksnp_id),
HIPQUAD(route->ksnr_ipaddr));
LBUG();
}
read_unlock (&ksocknal_data.ksnd_global_lock);
return 0;
}
-
+
for (i = 0; i < nip; i++) {
ipaddrs[i] = net->ksnn_interfaces[i].ksni_ipaddr;
LASSERT (ipaddrs[i] != 0);
write_unlock_bh (global_lock);
return;
}
-
+
LASSERT (npeer_ipaddrs <= LNET_MAX_INTERFACES);
for (i = 0; i < npeer_ipaddrs; i++) {
list_add_tail(&cr->ksncr_list, &ksocknal_data.ksnd_connd_connreqs);
cfs_waitq_signal(&ksocknal_data.ksnd_connd_waitq);
-
+
spin_unlock_bh (&ksocknal_data.ksnd_connd_lock);
return 0;
}
int
-ksocknal_connecting (ksock_peer_t *peer, __u32 ipaddr)
+ksocknal_connecting (ksock_peer_t *peer, __u32 ipaddr)
{
ksock_route_t *route;
-
+
list_for_each_entry (route, &peer->ksnp_routes, ksnr_list) {
if (route->ksnr_ipaddr == ipaddr)
}
int
-ksocknal_create_conn (lnet_ni_t *ni, ksock_route_t *route,
+ksocknal_create_conn (lnet_ni_t *ni, ksock_route_t *route,
cfs_socket_t *sock, int type)
{
rwlock_t *global_lock = &ksocknal_data.ksnd_global_lock;
write_lock_bh(global_lock);
conn->ksnc_proto = peer->ksnp_proto;
write_unlock_bh(global_lock);
-
+
if (conn->ksnc_proto == NULL) {
conn->ksnc_proto = &ksocknal_protocol_v2x;
#if SOCKNAL_VERSION_DEBUG
/* +1 ref for me */
ksocknal_peer_addref(peer);
peer->ksnp_accepting++;
-
+
/* Am I already connecting to this guy? Resolve in
* favour of higher NID... */
if (peerid.nid < ni->ni_nid &&
* wants a different protocol than the one I asked for.
*/
LASSERT (list_empty(&peer->ksnp_conns));
-
+
peer->ksnp_proto = conn->ksnc_proto;
peer->ksnp_incarnation = incarnation;
}
peer->ksnp_proto = NULL;
rc = ESTALE;
- warn = peer->ksnp_incarnation != incarnation ?
+ warn = peer->ksnp_incarnation != incarnation ?
"peer rebooted" :
"wrong proto version";
goto failed_2;
hello->kshm_nips);
rc = ksocknal_send_hello(ni, conn, peerid.nid, hello);
}
-
+
LIBCFS_FREE(hello, offsetof(ksock_hello_msg_t,
kshm_ips[LNET_MAX_INTERFACES]));
list_del_init(&peer->ksnp_tx_queue);
ksocknal_unlink_peer_locked(peer);
}
-
+
write_unlock_bh (global_lock);
if (warn != NULL) {
peer->ksnp_accepting--;
write_unlock_bh(global_lock);
}
-
+
ksocknal_txlist_done(ni, &zombies, 1);
ksocknal_peer_decref(peer);
/* There has been a connection failure or comms error; but I'll only
* tell LNET I think the peer is dead if it's to another kernel and
* there are no connections or connection attempts in existance. */
-
+
read_lock (&ksocknal_data.ksnd_global_lock);
if ((peer->ksnp_id.pid & LNET_PID_USERFLAG) == 0 &&
cfs_duration_sec(cfs_time_current() -
peer->ksnp_last_alive);
}
-
+
read_unlock (&ksocknal_data.ksnd_global_lock);
if (notify)
list_add_tail(&conn->ksnc_list, &ksocknal_data.ksnd_zombie_conns);
cfs_waitq_signal(&ksocknal_data.ksnd_reaper_waitq);
-
+
spin_unlock_bh (&ksocknal_data.ksnd_reaper_lock);
}
", ip %d.%d.%d.%d:%d, with error\n",
libcfs_id2str(conn->ksnc_peer->ksnp_id),
HIPQUAD(conn->ksnc_ipaddr), conn->ksnc_port);
- lnet_finalize (conn->ksnc_peer->ksnp_ni,
+ lnet_finalize (conn->ksnc_peer->ksnp_ni,
conn->ksnc_cookie, -EIO);
break;
case SOCKNAL_RX_LNET_HEADER:
* gateway state.... */
lnet_process_id_t id = {.nid = gw_nid, .pid = LNET_PID_ANY};
- CDEBUG (D_NET, "gw %s %s\n", libcfs_nid2str(gw_nid),
+ CDEBUG (D_NET, "gw %s %s\n", libcfs_nid2str(gw_nid),
alive ? "up" : "down");
if (!alive) {
data->ioc_u32[1]); /* net mask */
case IOC_LIBCFS_DEL_INTERFACE:
- return ksocknal_del_interface(ni,
+ return ksocknal_del_interface(ni,
data->ioc_u32[0]); /* IP address */
case IOC_LIBCFS_GET_PEER: {
&conn_count, &share_count);
if (rc != 0)
return rc;
-
+
data->ioc_nid = id.nid;
data->ioc_count = share_count;
data->ioc_u32[0] = ip;
}
case IOC_LIBCFS_REGISTER_MYNID:
/* Ignore if this is a noop */
- if (data->ioc_nid == ni->ni_nid)
- return 0;
+ if (data->ioc_nid == ni->ni_nid)
+ return 0;
- CERROR("obsolete IOC_LIBCFS_REGISTER_MYNID: %s(%s)\n",
- libcfs_nid2str(data->ioc_nid),
- libcfs_nid2str(ni->ni_nid));
- return -EINVAL;
+ CERROR("obsolete IOC_LIBCFS_REGISTER_MYNID: %s(%s)\n",
+ libcfs_nid2str(data->ioc_nid),
+ libcfs_nid2str(ni->ni_nid));
+ return -EINVAL;
case IOC_LIBCFS_PUSH_CONNECTION: {
lnet_process_id_t id = {.nid = data->ioc_nid,
.pid = LNET_PID_ANY};
-
+
return ksocknal_push(ni, id);
}
default:
* connecting */
if (*ksocknal_tunables.ksnd_nconnds < 2)
*ksocknal_tunables.ksnd_nconnds = 2;
-
+
for (i = 0; i < *ksocknal_tunables.ksnd_nconnds; i++) {
rc = ksocknal_thread_start (ksocknal_connd, (void *)((long)i));
if (rc != 0) {
}
LIBCFS_FREE(net, sizeof(*net));
-
+
ksocknal_data.ksnd_nnets--;
if (ksocknal_data.ksnd_nnets == 0)
ksocknal_base_shutdown();
int j;
int rc;
int n;
-
+
n = libcfs_ipif_enumerate(&names);
if (n <= 0) {
CERROR("Can't enumerate interfaces: %d\n", n);
names[i], rc);
continue;
}
-
+
if (!up) {
CWARN("Ignoring interface %s (down)\n",
names[i]);
}
libcfs_ipif_free_enumeration(names, n);
-
+
if (j == 0)
CERROR("Can't find any usable interfaces\n");
-
+
return j;
}
if (rc != 0)
return rc;
}
-
+
LIBCFS_ALLOC(net, sizeof(*net));
if (net == NULL)
goto fail_0;
-
+
memset(net, 0, sizeof(*net));
spin_lock_init(&net->ksnn_lock);
net->ksnn_incarnation = ksocknal_new_incarnation();
ni->ni_data = net;
ni->ni_maxtxcredits = *ksocknal_tunables.ksnd_credits;
ni->ni_peertxcredits = *ksocknal_tunables.ksnd_peercredits;
-
+
if (ni->ni_interfaces[0] == NULL) {
rc = ksocknal_enumerate_interfaces(net);
if (rc <= 0)
ni->ni_interfaces[i], &up,
&net->ksnn_interfaces[i].ksni_ipaddr,
&net->ksnn_interfaces[i].ksni_netmask);
-
+
if (rc != 0) {
CERROR("Can't get interface %s info: %d\n",
ni->ni_interfaces[i], rc);
goto fail_1;
}
-
+
if (!up) {
CERROR("Interface %s is down\n",
ni->ni_interfaces[i]);
ksocknal_data.ksnd_nnets++;
return 0;
-
+
fail_1:
LIBCFS_FREE(net, sizeof(*net));
fail_0:
/* check ksnr_connected/connecting field large enough */
CLASSERT(SOCKLND_CONN_NTYPES <= 4);
-
+
rc = ksocknal_lib_tunables_init();
if (rc != 0)
return rc;
#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 < iov->iov_len) {
+ iov->iov_base = (void *)(((unsigned long)(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 < kiov->kiov_len) {
+ kiov->kiov_offset += nob;
+ kiov->kiov_len -= nob;
+ return rc;
+ }
+
+ nob -= 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;
- /* 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_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 < iov->iov_len) {
+ iov->iov_len -= nob;
+ iov->iov_base = (void *)(((unsigned long)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 < 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);
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);
}
* 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);
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 */
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) {
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_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 */
}
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);
}
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 */
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);
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);