-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
* GPL HEADER START
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
/*
* Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright (c) 2012, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
{
unsigned long flags;
- cfs_write_lock_irqsave(&kranal_data.kra_global_lock, flags);
+ write_lock_irqsave(&kranal_data.kra_global_lock, flags);
conn->rac_my_connstamp = kranal_data.kra_connstamp++;
conn->rac_cqid = kranal_data.kra_next_cqid++;
} while (kranal_cqid2conn_locked(conn->rac_cqid) != NULL);
- cfs_write_unlock_irqrestore(&kranal_data.kra_global_lock, flags);
+ write_unlock_irqrestore(&kranal_data.kra_global_lock, flags);
}
int
CFS_INIT_LIST_HEAD(&conn->rac_fmaq);
CFS_INIT_LIST_HEAD(&conn->rac_rdmaq);
CFS_INIT_LIST_HEAD(&conn->rac_replyq);
- cfs_spin_lock_init(&conn->rac_lock);
+ spin_lock_init(&conn->rac_lock);
kranal_set_conn_uniqueness(conn);
unsigned long flags;
- cfs_write_lock_irqsave(&kranal_data.kra_global_lock, flags);
+ write_lock_irqsave(&kranal_data.kra_global_lock, flags);
if (conn->rac_state == RANAL_CONN_ESTABLISHED)
kranal_close_conn_locked(conn, error);
- cfs_write_unlock_irqrestore(&kranal_data.kra_global_lock, flags);
+ write_unlock_irqrestore(&kranal_data.kra_global_lock, flags);
}
int
kranal_set_conn_params(kra_conn_t *conn, kra_connreq_t *connreq,
__u32 peer_ip, int peer_port)
{
- kra_device_t *dev = conn->rac_device;
- unsigned long flags;
- RAP_RETURN rrc;
-
- /* CAVEAT EMPTOR: we're really overloading rac_last_tx + rac_keepalive
- * to do RapkCompleteSync() timekeeping (see kibnal_scheduler). */
- conn->rac_last_tx = jiffies;
- conn->rac_keepalive = 0;
-
- rrc = RapkSetRiParams(conn->rac_rihandle, &connreq->racr_riparams);
- if (rrc != RAP_SUCCESS) {
- CERROR("Error setting riparams from %u.%u.%u.%u/%d: %d\n",
- HIPQUAD(peer_ip), peer_port, rrc);
- return -ECONNABORTED;
- }
-
- /* Schedule conn on rad_new_conns */
- kranal_conn_addref(conn);
- cfs_spin_lock_irqsave(&dev->rad_lock, flags);
- cfs_list_add_tail(&conn->rac_schedlist, &dev->rad_new_conns);
- cfs_waitq_signal(&dev->rad_waitq);
- cfs_spin_unlock_irqrestore(&dev->rad_lock, flags);
-
- rrc = RapkWaitToConnect(conn->rac_rihandle);
- if (rrc != RAP_SUCCESS) {
- CERROR("Error waiting to connect to %u.%u.%u.%u/%d: %d\n",
- HIPQUAD(peer_ip), peer_port, rrc);
- return -ECONNABORTED;
- }
-
- /* Scheduler doesn't touch conn apart from to deschedule and decref it
- * after RapkCompleteSync() return success, so conn is all mine */
-
- conn->rac_peerstamp = connreq->racr_peerstamp;
- conn->rac_peer_connstamp = connreq->racr_connstamp;
- conn->rac_keepalive = RANAL_TIMEOUT2KEEPALIVE(connreq->racr_timeout);
- kranal_update_reaper_timeout(conn->rac_keepalive);
- return 0;
+ kra_device_t *dev = conn->rac_device;
+ unsigned long flags;
+ RAP_RETURN rrc;
+
+ /* CAVEAT EMPTOR: we're really overloading rac_last_tx + rac_keepalive
+ * to do RapkCompleteSync() timekeeping (see kibnal_scheduler). */
+ conn->rac_last_tx = jiffies;
+ conn->rac_keepalive = 0;
+
+ rrc = RapkSetRiParams(conn->rac_rihandle, &connreq->racr_riparams);
+ if (rrc != RAP_SUCCESS) {
+ CERROR("Error setting riparams from %u.%u.%u.%u/%d: %d\n",
+ HIPQUAD(peer_ip), peer_port, rrc);
+ return -ECONNABORTED;
+ }
+
+ /* Schedule conn on rad_new_conns */
+ kranal_conn_addref(conn);
+ spin_lock_irqsave(&dev->rad_lock, flags);
+ cfs_list_add_tail(&conn->rac_schedlist, &dev->rad_new_conns);
+ wake_up(&dev->rad_waitq);
+ spin_unlock_irqrestore(&dev->rad_lock, flags);
+
+ rrc = RapkWaitToConnect(conn->rac_rihandle);
+ if (rrc != RAP_SUCCESS) {
+ CERROR("Error waiting to connect to %u.%u.%u.%u/%d: %d\n",
+ HIPQUAD(peer_ip), peer_port, rrc);
+ return -ECONNABORTED;
+ }
+
+ /* Scheduler doesn't touch conn apart from to deschedule and decref it
+ * after RapkCompleteSync() return success, so conn is all mine */
+
+ conn->rac_peerstamp = connreq->racr_peerstamp;
+ conn->rac_peer_connstamp = connreq->racr_connstamp;
+ conn->rac_keepalive = RANAL_TIMEOUT2KEEPALIVE(connreq->racr_timeout);
+ kranal_update_reaper_timeout(conn->rac_keepalive);
+ return 0;
}
int
if (rc != 0)
return rc;
- cfs_write_lock_irqsave(&kranal_data.kra_global_lock, flags);
+ write_lock_irqsave(&kranal_data.kra_global_lock, flags);
if (!kranal_peer_active(peer)) {
/* raced with peer getting unlinked */
- cfs_write_unlock_irqrestore(&kranal_data. \
+ write_unlock_irqrestore(&kranal_data. \
kra_global_lock,
flags);
kranal_conn_decref(conn);
return -ENOMEM;
}
- cfs_write_lock_irqsave(&kranal_data.kra_global_lock, flags);
+ write_lock_irqsave(&kranal_data.kra_global_lock, flags);
peer2 = kranal_find_peer_locked(peer_nid);
if (peer2 == NULL) {
* this while holding the global lock, to synch with connection
* destruction on NID change. */
if (kranal_data.kra_ni->ni_nid != dst_nid) {
- cfs_write_unlock_irqrestore(&kranal_data.kra_global_lock,
+ write_unlock_irqrestore(&kranal_data.kra_global_lock,
flags);
CERROR("Stale/bad connection with %s: dst_nid %s, expected %s\n",
if (rc != 0) {
LASSERT (!cfs_list_empty(&peer->rap_conns));
LASSERT (cfs_list_empty(&peer->rap_tx_queue));
- cfs_write_unlock_irqrestore(&kranal_data.kra_global_lock,
+ write_unlock_irqrestore(&kranal_data.kra_global_lock,
flags);
CWARN("Not creating duplicate connection to %s: %d\n",
libcfs_nid2str(peer_nid), rc);
nstale = kranal_close_stale_conns_locked(peer, conn);
- cfs_write_unlock_irqrestore(&kranal_data.kra_global_lock, flags);
+ write_unlock_irqrestore(&kranal_data.kra_global_lock, flags);
/* CAVEAT EMPTOR: passive peer can disappear NOW */
CDEBUG(D_NET, "Done handshake %s:%d \n",
libcfs_nid2str(peer->rap_nid), rc);
- cfs_write_lock_irqsave(&kranal_data.kra_global_lock, flags);
+ write_lock_irqsave(&kranal_data.kra_global_lock, flags);
LASSERT (peer->rap_connecting);
peer->rap_connecting = 0;
peer->rap_reconnect_interval = 0; /* OK to reconnect at any time */
- cfs_write_unlock_irqrestore(&kranal_data.kra_global_lock,
+ write_unlock_irqrestore(&kranal_data.kra_global_lock,
flags);
return;
}
MIN(peer->rap_reconnect_interval,
*kranal_tunables.kra_max_reconnect_interval);
- peer->rap_reconnect_time = jiffies + peer->rap_reconnect_interval *
- CFS_HZ;
+ peer->rap_reconnect_time = jiffies + peer->rap_reconnect_interval * HZ;
/* Grab all blocked packets while we have the global lock */
cfs_list_add(&zombies, &peer->rap_tx_queue);
cfs_list_del_init(&peer->rap_tx_queue);
- cfs_write_unlock_irqrestore(&kranal_data.kra_global_lock, flags);
+ write_unlock_irqrestore(&kranal_data.kra_global_lock, flags);
if (cfs_list_empty(&zombies))
return;
int
kranal_accept (lnet_ni_t *ni, struct socket *sock)
{
- kra_acceptsock_t *ras;
- int rc;
- __u32 peer_ip;
- int peer_port;
- unsigned long flags;
+ kra_acceptsock_t *ras;
+ int rc;
+ __u32 peer_ip;
+ int peer_port;
+ unsigned long flags;
- rc = libcfs_sock_getaddr(sock, 1, &peer_ip, &peer_port);
- LASSERT (rc == 0); /* we succeeded before */
+ rc = libcfs_sock_getaddr(sock, 1, &peer_ip, &peer_port);
+ LASSERT (rc == 0); /* we succeeded before */
- LIBCFS_ALLOC(ras, sizeof(*ras));
- if (ras == NULL) {
- CERROR("ENOMEM allocating connection request from "
- "%u.%u.%u.%u\n", HIPQUAD(peer_ip));
- return -ENOMEM;
- }
+ LIBCFS_ALLOC(ras, sizeof(*ras));
+ if (ras == NULL) {
+ CERROR("ENOMEM allocating connection request from "
+ "%u.%u.%u.%u\n", HIPQUAD(peer_ip));
+ return -ENOMEM;
+ }
- ras->ras_sock = sock;
+ ras->ras_sock = sock;
- cfs_spin_lock_irqsave(&kranal_data.kra_connd_lock, flags);
+ spin_lock_irqsave(&kranal_data.kra_connd_lock, flags);
- cfs_list_add_tail(&ras->ras_list, &kranal_data.kra_connd_acceptq);
- cfs_waitq_signal(&kranal_data.kra_connd_waitq);
+ cfs_list_add_tail(&ras->ras_list, &kranal_data.kra_connd_acceptq);
+ wake_up(&kranal_data.kra_connd_waitq);
- cfs_spin_unlock_irqrestore(&kranal_data.kra_connd_lock, flags);
- return 0;
+ spin_unlock_irqrestore(&kranal_data.kra_connd_lock, flags);
+ return 0;
}
int
peer->rap_reconnect_interval = 0; /* OK to connect at any time */
- cfs_write_lock_irqsave(&kranal_data.kra_global_lock, flags);
+ write_lock_irqsave(&kranal_data.kra_global_lock, flags);
if (kranal_data.kra_nonewpeers) {
/* shutdown has started already */
- cfs_write_unlock_irqrestore(&kranal_data.kra_global_lock,
+ write_unlock_irqrestore(&kranal_data.kra_global_lock,
flags);
LIBCFS_FREE(peer, sizeof(*peer));
cfs_atomic_inc(&kranal_data.kra_npeers);
- cfs_write_unlock_irqrestore(&kranal_data.kra_global_lock, flags);
+ write_unlock_irqrestore(&kranal_data.kra_global_lock, flags);
*peerp = peer;
return 0;
{
kra_peer_t *peer;
- cfs_read_lock(&kranal_data.kra_global_lock);
+ read_lock(&kranal_data.kra_global_lock);
peer = kranal_find_peer_locked(nid);
if (peer != NULL) /* +1 ref for caller? */
kranal_peer_addref(peer);
- cfs_read_unlock(&kranal_data.kra_global_lock);
+ read_unlock(&kranal_data.kra_global_lock);
return peer;
}
cfs_list_t *ptmp;
int i;
- cfs_read_lock(&kranal_data.kra_global_lock);
+ read_lock(&kranal_data.kra_global_lock);
for (i = 0; i < kranal_data.kra_peer_hash_size; i++) {
*portp = peer->rap_port;
*persistencep = peer->rap_persistence;
- cfs_read_unlock(&kranal_data.kra_global_lock);
+ read_unlock(&kranal_data.kra_global_lock);
return 0;
}
}
- cfs_read_unlock(&kranal_data.kra_global_lock);
+ read_unlock(&kranal_data.kra_global_lock);
return -ENOENT;
}
if (rc != 0)
return rc;
- cfs_write_lock_irqsave(&kranal_data.kra_global_lock, flags);
+ write_lock_irqsave(&kranal_data.kra_global_lock, flags);
peer2 = kranal_find_peer_locked(nid);
if (peer2 != NULL) {
peer->rap_port = port;
peer->rap_persistence++;
- cfs_write_unlock_irqrestore(&kranal_data.kra_global_lock, flags);
+ write_unlock_irqrestore(&kranal_data.kra_global_lock, flags);
return 0;
}
int i;
int rc = -ENOENT;
- cfs_write_lock_irqsave(&kranal_data.kra_global_lock, flags);
+ write_lock_irqsave(&kranal_data.kra_global_lock, flags);
if (nid != LNET_NID_ANY)
lo = hi = kranal_nid2peerlist(nid) - kranal_data.kra_peers;
}
}
- cfs_write_unlock_irqrestore(&kranal_data.kra_global_lock, flags);
+ write_unlock_irqrestore(&kranal_data.kra_global_lock, flags);
return rc;
}
cfs_list_t *ctmp;
int i;
- cfs_read_lock (&kranal_data.kra_global_lock);
+ read_lock(&kranal_data.kra_global_lock);
for (i = 0; i < kranal_data.kra_peer_hash_size; i++) {
cfs_list_for_each (ptmp, &kranal_data.kra_peers[i]) {
libcfs_nid2str(conn->rac_peer->rap_nid),
cfs_atomic_read(&conn->rac_refcount));
cfs_atomic_inc(&conn->rac_refcount);
- cfs_read_unlock(&kranal_data.kra_global_lock);
+ read_unlock(&kranal_data.kra_global_lock);
return conn;
}
}
}
- cfs_read_unlock(&kranal_data.kra_global_lock);
+ read_unlock(&kranal_data.kra_global_lock);
return NULL;
}
int i;
int count = 0;
- cfs_write_lock_irqsave(&kranal_data.kra_global_lock, flags);
+ write_lock_irqsave(&kranal_data.kra_global_lock, flags);
if (nid != LNET_NID_ANY)
lo = hi = kranal_nid2peerlist(nid) - kranal_data.kra_peers;
}
}
- cfs_write_unlock_irqrestore(&kranal_data.kra_global_lock, flags);
+ write_unlock_irqrestore(&kranal_data.kra_global_lock, flags);
/* wildcards always succeed */
if (nid == LNET_NID_ANY)
case RANAL_INIT_ALL:
/* Prevent new peers from being created */
- cfs_write_lock_irqsave(&kranal_data.kra_global_lock, flags);
+ write_lock_irqsave(&kranal_data.kra_global_lock, flags);
kranal_data.kra_nonewpeers = 1;
- cfs_write_unlock_irqrestore(&kranal_data.kra_global_lock,
+ write_unlock_irqrestore(&kranal_data.kra_global_lock,
flags);
/* Remove all existing peers from the peer table */
/* Wait for pending conn reqs to be handled */
i = 2;
- cfs_spin_lock_irqsave(&kranal_data.kra_connd_lock, flags);
+ spin_lock_irqsave(&kranal_data.kra_connd_lock, flags);
while (!cfs_list_empty(&kranal_data.kra_connd_acceptq)) {
- cfs_spin_unlock_irqrestore(&kranal_data.kra_connd_lock,
+ spin_unlock_irqrestore(&kranal_data.kra_connd_lock,
flags);
i++;
CDEBUG(((i & (-i)) == i) ? D_WARNING : D_NET, /* 2**n */
"waiting for conn reqs to clean up\n");
cfs_pause(cfs_time_seconds(1));
- cfs_spin_lock_irqsave(&kranal_data.kra_connd_lock,
+ spin_lock_irqsave(&kranal_data.kra_connd_lock,
flags);
}
- cfs_spin_unlock_irqrestore(&kranal_data.kra_connd_lock, flags);
+ spin_unlock_irqrestore(&kranal_data.kra_connd_lock, flags);
/* Wait for all peers to be freed */
i = 2;
/* Flag threads to terminate */
kranal_data.kra_shutdown = 1;
- for (i = 0; i < kranal_data.kra_ndevs; i++) {
- kra_device_t *dev = &kranal_data.kra_devices[i];
+ for (i = 0; i < kranal_data.kra_ndevs; i++) {
+ kra_device_t *dev = &kranal_data.kra_devices[i];
- cfs_spin_lock_irqsave(&dev->rad_lock, flags);
- cfs_waitq_signal(&dev->rad_waitq);
- cfs_spin_unlock_irqrestore(&dev->rad_lock, flags);
- }
+ spin_lock_irqsave(&dev->rad_lock, flags);
+ wake_up(&dev->rad_waitq);
+ spin_unlock_irqrestore(&dev->rad_lock, flags);
+ }
- cfs_spin_lock_irqsave(&kranal_data.kra_reaper_lock, flags);
- cfs_waitq_broadcast(&kranal_data.kra_reaper_waitq);
- cfs_spin_unlock_irqrestore(&kranal_data.kra_reaper_lock, flags);
+ spin_lock_irqsave(&kranal_data.kra_reaper_lock, flags);
+ wake_up_all(&kranal_data.kra_reaper_waitq);
+ spin_unlock_irqrestore(&kranal_data.kra_reaper_lock, flags);
- LASSERT (cfs_list_empty(&kranal_data.kra_connd_peers));
- cfs_spin_lock_irqsave(&kranal_data.kra_connd_lock, flags);
- cfs_waitq_broadcast(&kranal_data.kra_connd_waitq);
- cfs_spin_unlock_irqrestore(&kranal_data.kra_connd_lock, flags);
+ LASSERT (cfs_list_empty(&kranal_data.kra_connd_peers));
+ spin_lock_irqsave(&kranal_data.kra_connd_lock, flags);
+ wake_up_all(&kranal_data.kra_connd_waitq);
+ spin_unlock_irqrestore(&kranal_data.kra_connd_lock, flags);
/* Wait for threads to exit */
i = 2;
CDEBUG(D_MALLOC, "after NAL cleanup: kmem %d\n",
cfs_atomic_read(&libcfs_kmemory));
- kranal_data.kra_init = RANAL_INIT_NOTHING;
- PORTAL_MODULE_UNUSE;
+ kranal_data.kra_init = RANAL_INIT_NOTHING;
+ module_put(THIS_MODULE);
}
int
int rc;
int i;
kra_device_t *dev;
+ char name[16];
LASSERT (ni->ni_lnd == &the_kralnd);
ni->ni_data = &kranal_data;
kranal_data.kra_ni = ni;
- /* CAVEAT EMPTOR: Every 'Fma' message includes the sender's NID and
- * a unique (for all time) connstamp so we can uniquely identify
- * the sender. The connstamp is an incrementing counter
- * initialised with seconds + microseconds at startup time. So we
- * rely on NOT creating connections more frequently on average than
- * 1MHz to ensure we don't use old connstamps when we reboot. */
- cfs_gettimeofday(&tv);
- kranal_data.kra_connstamp =
- kranal_data.kra_peerstamp = (((__u64)tv.tv_sec) * 1000000) + tv.tv_usec;
-
- cfs_rwlock_init(&kranal_data.kra_global_lock);
-
- for (i = 0; i < RANAL_MAXDEVS; i++ ) {
- kra_device_t *dev = &kranal_data.kra_devices[i];
-
- dev->rad_idx = i;
- CFS_INIT_LIST_HEAD(&dev->rad_ready_conns);
- CFS_INIT_LIST_HEAD(&dev->rad_new_conns);
- cfs_waitq_init(&dev->rad_waitq);
- cfs_spin_lock_init(&dev->rad_lock);
- }
-
- kranal_data.kra_new_min_timeout = CFS_MAX_SCHEDULE_TIMEOUT;
- cfs_waitq_init(&kranal_data.kra_reaper_waitq);
- cfs_spin_lock_init(&kranal_data.kra_reaper_lock);
-
- CFS_INIT_LIST_HEAD(&kranal_data.kra_connd_acceptq);
- CFS_INIT_LIST_HEAD(&kranal_data.kra_connd_peers);
- cfs_waitq_init(&kranal_data.kra_connd_waitq);
- cfs_spin_lock_init(&kranal_data.kra_connd_lock);
+ /* CAVEAT EMPTOR: Every 'Fma' message includes the sender's NID and
+ * a unique (for all time) connstamp so we can uniquely identify
+ * the sender. The connstamp is an incrementing counter
+ * initialised with seconds + microseconds at startup time. So we
+ * rely on NOT creating connections more frequently on average than
+ * 1MHz to ensure we don't use old connstamps when we reboot. */
+ do_gettimeofday(&tv);
+ kranal_data.kra_connstamp =
+ kranal_data.kra_peerstamp = (((__u64)tv.tv_sec) * 1000000) + tv.tv_usec;
+
+ rwlock_init(&kranal_data.kra_global_lock);
+
+ for (i = 0; i < RANAL_MAXDEVS; i++ ) {
+ kra_device_t *dev = &kranal_data.kra_devices[i];
+
+ dev->rad_idx = i;
+ CFS_INIT_LIST_HEAD(&dev->rad_ready_conns);
+ CFS_INIT_LIST_HEAD(&dev->rad_new_conns);
+ init_waitqueue_head(&dev->rad_waitq);
+ spin_lock_init(&dev->rad_lock);
+ }
+
+ kranal_data.kra_new_min_timeout = MAX_SCHEDULE_TIMEOUT;
+ init_waitqueue_head(&kranal_data.kra_reaper_waitq);
+ spin_lock_init(&kranal_data.kra_reaper_lock);
+
+ CFS_INIT_LIST_HEAD(&kranal_data.kra_connd_acceptq);
+ CFS_INIT_LIST_HEAD(&kranal_data.kra_connd_peers);
+ init_waitqueue_head(&kranal_data.kra_connd_waitq);
+ spin_lock_init(&kranal_data.kra_connd_lock);
CFS_INIT_LIST_HEAD(&kranal_data.kra_idle_txs);
- cfs_spin_lock_init(&kranal_data.kra_tx_lock);
+ spin_lock_init(&kranal_data.kra_tx_lock);
- /* OK to call kranal_api_shutdown() to cleanup now */
- kranal_data.kra_init = RANAL_INIT_DATA;
- PORTAL_MODULE_USE;
+ /* OK to call kranal_api_shutdown() to cleanup now */
+ kranal_data.kra_init = RANAL_INIT_DATA;
+ try_module_get(THIS_MODULE);
kranal_data.kra_peer_hash_size = RANAL_PEER_HASH_SIZE;
LIBCFS_ALLOC(kranal_data.kra_peers,
if (rc != 0)
goto failed;
- rc = kranal_thread_start(kranal_reaper, NULL);
+ rc = kranal_thread_start(kranal_reaper, NULL, "kranal_reaper");
if (rc != 0) {
CERROR("Can't spawn ranal reaper: %d\n", rc);
goto failed;
}
for (i = 0; i < *kranal_tunables.kra_n_connd; i++) {
- rc = kranal_thread_start(kranal_connd, (void *)(unsigned long)i);
+ snprintf(name, sizeof(name), "kranal_connd_%02ld", i);
+ rc = kranal_thread_start(kranal_connd,
+ (void *)(unsigned long)i, name);
if (rc != 0) {
CERROR("Can't spawn ranal connd[%d]: %d\n",
i, rc);
for (i = 0; i < kranal_data.kra_ndevs; i++) {
dev = &kranal_data.kra_devices[i];
- rc = kranal_thread_start(kranal_scheduler, dev);
+ snprintf(name, sizeof(name), "kranal_sd_%02d", dev->rad_idx);
+ rc = kranal_thread_start(kranal_scheduler, dev, name);
if (rc != 0) {
CERROR("Can't spawn ranal scheduler[%d]: %d\n",
i, rc);