-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
+/*
+ * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
*
- * Copyright (C) 2002 Cluster File Systems, Inc.
- * Author: Eric Barton <eric@bartonsoftware.com>
+ * Copyright (c) 2012, Intel Corporation.
+ *
+ * Author: Eric Barton <eric@bartonsoftware.com>
*
* This file is part of Portals, http://www.lustre.org
*
* You should have received a copy of the GNU General Public License
* along with Portals; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
*/
#include "qswlnd.h"
void
kqswnal_notify_peer_down(kqswnal_tx_t *ktx)
{
- struct timeval now;
time_t then;
- do_gettimeofday (&now);
- then = now.tv_sec - (jiffies - ktx->ktx_launchtime)/HZ;
+ then = cfs_time_current_sec() -
+ cfs_duration_sec(cfs_time_current() -
+ ktx->ktx_launchtime);
lnet_notify(kqswnal_data.kqn_ni, ktx->ktx_nid, 0, then);
}
void
kqswnal_put_idle_tx (kqswnal_tx_t *ktx)
{
- unsigned long flags;
+ unsigned long flags;
- kqswnal_unmap_tx (ktx); /* release temporary mappings */
- ktx->ktx_state = KTX_IDLE;
+ kqswnal_unmap_tx(ktx); /* release temporary mappings */
+ ktx->ktx_state = KTX_IDLE;
- spin_lock_irqsave (&kqswnal_data.kqn_idletxd_lock, flags);
+ spin_lock_irqsave(&kqswnal_data.kqn_idletxd_lock, flags);
- list_del (&ktx->ktx_list); /* take off active list */
- list_add (&ktx->ktx_list, &kqswnal_data.kqn_idletxds);
+ cfs_list_del(&ktx->ktx_list); /* take off active list */
+ cfs_list_add(&ktx->ktx_list, &kqswnal_data.kqn_idletxds);
- spin_unlock_irqrestore (&kqswnal_data.kqn_idletxd_lock, flags);
+ spin_unlock_irqrestore(&kqswnal_data.kqn_idletxd_lock, flags);
}
kqswnal_tx_t *
kqswnal_get_idle_tx (void)
{
- unsigned long flags;
- kqswnal_tx_t *ktx;
+ unsigned long flags;
+ kqswnal_tx_t *ktx;
- spin_lock_irqsave (&kqswnal_data.kqn_idletxd_lock, flags);
+ spin_lock_irqsave(&kqswnal_data.kqn_idletxd_lock, flags);
- if (kqswnal_data.kqn_shuttingdown ||
- list_empty (&kqswnal_data.kqn_idletxds)) {
- spin_unlock_irqrestore (&kqswnal_data.kqn_idletxd_lock, flags);
+ if (kqswnal_data.kqn_shuttingdown ||
+ cfs_list_empty(&kqswnal_data.kqn_idletxds)) {
+ spin_unlock_irqrestore(&kqswnal_data.kqn_idletxd_lock, flags);
- return NULL;
- }
+ return NULL;
+ }
- ktx = list_entry (kqswnal_data.kqn_idletxds.next, kqswnal_tx_t, ktx_list);
- list_del (&ktx->ktx_list);
+ ktx = cfs_list_entry (kqswnal_data.kqn_idletxds.next, kqswnal_tx_t,
+ ktx_list);
+ cfs_list_del (&ktx->ktx_list);
- list_add (&ktx->ktx_list, &kqswnal_data.kqn_activetxds);
+ cfs_list_add (&ktx->ktx_list, &kqswnal_data.kqn_activetxds);
ktx->ktx_launcher = current->pid;
- atomic_inc(&kqswnal_data.kqn_pending_txs);
+ atomic_inc(&kqswnal_data.kqn_pending_txs);
- spin_unlock_irqrestore (&kqswnal_data.kqn_idletxd_lock, flags);
+ spin_unlock_irqrestore(&kqswnal_data.kqn_idletxd_lock, flags);
/* Idle descs can't have any mapped (as opposed to pre-mapped) pages */
LASSERT (ktx->ktx_nmappedpages == 0);
void
kqswnal_tx_done_in_thread_context (kqswnal_tx_t *ktx)
{
- lnet_msg_t *lnetmsg0 = NULL;
- lnet_msg_t *lnetmsg1 = NULL;
- int status0 = 0;
- int status1 = 0;
- kqswnal_rx_t *krx;
-
- LASSERT (!in_interrupt());
-
- if (ktx->ktx_status == -EHOSTDOWN)
- kqswnal_notify_peer_down(ktx);
+ lnet_msg_t *lnetmsg0 = NULL;
+ lnet_msg_t *lnetmsg1 = NULL;
+ int status0 = 0;
+ int status1 = 0;
+ kqswnal_rx_t *krx;
+
+ LASSERT (!in_interrupt());
+
+ if (ktx->ktx_status == -EHOSTDOWN)
+ kqswnal_notify_peer_down(ktx);
switch (ktx->ktx_state) {
case KTX_RDMA_FETCH: /* optimized PUT/REPLY handled */
void
kqswnal_tx_done (kqswnal_tx_t *ktx, int status)
{
- unsigned long flags;
+ unsigned long flags;
- ktx->ktx_status = status;
+ ktx->ktx_status = status;
- if (!in_interrupt()) {
- kqswnal_tx_done_in_thread_context(ktx);
- return;
- }
+ if (!in_interrupt()) {
+ kqswnal_tx_done_in_thread_context(ktx);
+ return;
+ }
- /* Complete the send in thread context */
- spin_lock_irqsave(&kqswnal_data.kqn_sched_lock, flags);
-
- list_add_tail(&ktx->ktx_schedlist,
- &kqswnal_data.kqn_donetxds);
- wake_up(&kqswnal_data.kqn_sched_waitq);
-
- spin_unlock_irqrestore(&kqswnal_data.kqn_sched_lock, flags);
+ /* Complete the send in thread context */
+ spin_lock_irqsave(&kqswnal_data.kqn_sched_lock, flags);
+
+ cfs_list_add_tail(&ktx->ktx_schedlist,
+ &kqswnal_data.kqn_donetxds);
+ wake_up(&kqswnal_data.kqn_sched_waitq);
+
+ spin_unlock_irqrestore(&kqswnal_data.kqn_sched_lock, flags);
}
static void
if (status != EP_SUCCESS) {
- CDEBUG (D_NETERROR, "Tx completion to %s failed: %d\n",
+ CNETERR("Tx completion to %s failed: %d\n",
libcfs_nid2str(ktx->ktx_nid), status);
status = -EHOSTDOWN;
int
kqswnal_launch (kqswnal_tx_t *ktx)
{
- /* Don't block for transmit descriptor if we're in interrupt context */
- int attr = in_interrupt() ? (EP_NO_SLEEP | EP_NO_ALLOC) : 0;
- int dest = kqswnal_nid2elanid (ktx->ktx_nid);
- unsigned long flags;
- int rc;
+ /* Don't block for transmit descriptor if we're in interrupt context */
+ int attr = in_interrupt() ? (EP_NO_SLEEP | EP_NO_ALLOC) : 0;
+ int dest = kqswnal_nid2elanid (ktx->ktx_nid);
+ unsigned long flags;
+ int rc;
- ktx->ktx_launchtime = jiffies;
+ ktx->ktx_launchtime = cfs_time_current();
if (kqswnal_data.kqn_shuttingdown)
return (-ESHUTDOWN);
switch (ktx->ktx_state) {
case KTX_GETTING:
case KTX_PUTTING:
- if (the_lnet.ln_testprotocompat != 0 &&
- the_lnet.ln_ptlcompat == 0) {
+ if (the_lnet.ln_testprotocompat != 0) {
kqswnal_msg_t *msg = (kqswnal_msg_t *)ktx->ktx_buffer;
/* single-shot proto test:
kqswnal_txhandler, ktx,
NULL, ktx->ktx_frags, ktx->ktx_nfrag);
break;
-
+
default:
LBUG();
rc = -EINVAL; /* no compiler warning please */
return (0);
case EP_ENOMEM: /* can't allocate ep txd => queue for later */
- spin_lock_irqsave (&kqswnal_data.kqn_sched_lock, flags);
+ spin_lock_irqsave(&kqswnal_data.kqn_sched_lock, flags);
- list_add_tail (&ktx->ktx_schedlist, &kqswnal_data.kqn_delayedtxds);
- wake_up (&kqswnal_data.kqn_sched_waitq);
+ cfs_list_add_tail(&ktx->ktx_schedlist,
+ &kqswnal_data.kqn_delayedtxds);
+ wake_up(&kqswnal_data.kqn_sched_waitq);
- spin_unlock_irqrestore (&kqswnal_data.kqn_sched_lock, flags);
+ spin_unlock_irqrestore(&kqswnal_data.kqn_sched_lock,
+ flags);
return (0);
default: /* fatal error */
- CDEBUG (D_NETERROR, "Tx to %s failed: %d\n", libcfs_nid2str(ktx->ktx_nid), rc);
+ CNETERR ("Tx to %s failed: %d\n",
+ libcfs_nid2str(ktx->ktx_nid), rc);
kqswnal_notify_peer_down(ktx);
return (-EHOSTUNREACH);
}
ktx->ktx_args[0] = krx;
ktx->ktx_args[1] = lntmsg;
- LASSERT (atomic_read(&krx->krx_refcount) > 0);
+ LASSERT (atomic_read(&krx->krx_refcount) > 0);
/* Take an extra ref for the completion callback */
- atomic_inc(&krx->krx_refcount);
+ atomic_inc(&krx->krx_refcount);
/* Map on the rail the RPC prefers */
ktx->ktx_rail = ep_rcvr_prefrail(krx->krx_eprx,
kqswnal_put_idle_tx (ktx);
}
- atomic_dec(&kqswnal_data.kqn_pending_txs);
+ atomic_dec(&kqswnal_data.kqn_pending_txs);
return (rc);
}
CDEBUG(D_NET, "sending %u bytes in %d frags to %s\n",
payload_nob, payload_niov, libcfs_id2str(target));
- LASSERT (payload_nob == 0 || payload_niov > 0);
- LASSERT (payload_niov <= LNET_MAX_IOV);
+ LASSERT (payload_nob == 0 || payload_niov > 0);
+ LASSERT (payload_niov <= LNET_MAX_IOV);
- /* It must be OK to kmap() if required */
- LASSERT (payload_kiov == NULL || !in_interrupt ());
- /* payload is either all vaddrs or all pages */
- LASSERT (!(payload_kiov != NULL && payload_iov != NULL));
+ /* It must be OK to kmap() if required */
+ LASSERT (payload_kiov == NULL || !in_interrupt ());
+ /* payload is either all vaddrs or all pages */
+ LASSERT (!(payload_kiov != NULL && payload_iov != NULL));
- if (kqswnal_nid2elanid (target.nid) < 0) {
- CERROR("%s not in my cluster\n", libcfs_nid2str(target.nid));
- return -EIO;
- }
+ if (kqswnal_nid2elanid (target.nid) < 0) {
+ CERROR("%s not in my cluster\n", libcfs_nid2str(target.nid));
+ return -EIO;
+ }
/* I may not block for a transmit descriptor if I might block the
* router, receiver, or an interrupt handler. */
* ktx_frags[1] and onward with the network addresses
* of the buffer frags. */
- if (the_lnet.ln_ptlcompat == 2) {
- /* Strong portals compatibility: send "raw" LNET
- * header + rdma descriptor */
- mhdr = (lnet_hdr_t *)ktx->ktx_buffer;
- rmd = (kqswnal_remotemd_t *)(mhdr + 1);
- } else {
- /* Send an RDMA message */
- msg->kqm_magic = LNET_PROTO_QSW_MAGIC;
- msg->kqm_version = QSWLND_PROTO_VERSION;
- msg->kqm_type = QSWLND_MSG_RDMA;
+ /* Send an RDMA message */
+ msg->kqm_magic = LNET_PROTO_QSW_MAGIC;
+ msg->kqm_version = QSWLND_PROTO_VERSION;
+ msg->kqm_type = QSWLND_MSG_RDMA;
- mhdr = &msg->kqm_u.rdma.kqrm_hdr;
- rmd = &msg->kqm_u.rdma.kqrm_rmd;
- }
+ mhdr = &msg->kqm_u.rdma.kqrm_hdr;
+ rmd = &msg->kqm_u.rdma.kqrm_rmd;
*mhdr = *hdr;
nob = (((char *)rmd) - ktx->ktx_buffer);
ep_nmd_subset(&ktx->ktx_frags[0], &ktx->ktx_ebuffer, 0, nob);
#if KQSW_CKSUM
- LASSERT (the_lnet.ln_ptlcompat != 2);
msg->kqm_nob = nob + payload_nob;
msg->kqm_cksum = 0;
msg->kqm_cksum = kqswnal_csum(~0, (char *)msg, nob);
char *payload;
kqswnal_msg_t *msg = (kqswnal_msg_t *)ktx->ktx_buffer;
- /* small message: single frag copied into the pre-mapped buffer */
- if (the_lnet.ln_ptlcompat == 2) {
- /* Strong portals compatibility: send "raw" LNET header
- * + payload */
- mhdr = (lnet_hdr_t *)ktx->ktx_buffer;
- payload = (char *)(mhdr + 1);
- } else {
- /* Send an IMMEDIATE message */
- msg->kqm_magic = LNET_PROTO_QSW_MAGIC;
- msg->kqm_version = QSWLND_PROTO_VERSION;
- msg->kqm_type = QSWLND_MSG_IMMEDIATE;
+ /* single frag copied into the pre-mapped buffer */
+ msg->kqm_magic = LNET_PROTO_QSW_MAGIC;
+ msg->kqm_version = QSWLND_PROTO_VERSION;
+ msg->kqm_type = QSWLND_MSG_IMMEDIATE;
- mhdr = &msg->kqm_u.immediate.kqim_hdr;
- payload = msg->kqm_u.immediate.kqim_payload;
- }
+ mhdr = &msg->kqm_u.immediate.kqim_hdr;
+ payload = msg->kqm_u.immediate.kqim_payload;
*mhdr = *hdr;
nob = (payload - ktx->ktx_buffer) + payload_nob;
payload_niov, payload_iov,
payload_offset, payload_nob);
#if KQSW_CKSUM
- LASSERT (the_lnet.ln_ptlcompat != 2);
msg->kqm_nob = nob;
msg->kqm_cksum = 0;
msg->kqm_cksum = kqswnal_csum(~0, (char *)msg, nob);
lnet_hdr_t *mhdr;
kqswnal_msg_t *msg = (kqswnal_msg_t *)ktx->ktx_buffer;
- /* large message: multiple frags: first is hdr in pre-mapped buffer */
- if (the_lnet.ln_ptlcompat == 2) {
- /* Strong portals compatibility: send "raw" LNET header
- * + payload */
- mhdr = (lnet_hdr_t *)ktx->ktx_buffer;
- nob = sizeof(lnet_hdr_t);
- } else {
- /* Send an IMMEDIATE message */
- msg->kqm_magic = LNET_PROTO_QSW_MAGIC;
- msg->kqm_version = QSWLND_PROTO_VERSION;
- msg->kqm_type = QSWLND_MSG_IMMEDIATE;
+ /* multiple frags: first is hdr in pre-mapped buffer */
+ msg->kqm_magic = LNET_PROTO_QSW_MAGIC;
+ msg->kqm_version = QSWLND_PROTO_VERSION;
+ msg->kqm_type = QSWLND_MSG_IMMEDIATE;
- mhdr = &msg->kqm_u.immediate.kqim_hdr;
- nob = offsetof(kqswnal_msg_t,
- kqm_u.immediate.kqim_payload);
- }
+ mhdr = &msg->kqm_u.immediate.kqim_hdr;
+ nob = offsetof(kqswnal_msg_t, kqm_u.immediate.kqim_payload);
*mhdr = *hdr;
#endif
nob += payload_nob;
}
-
+
ktx->ktx_port = (nob <= KQSW_SMALLMSG) ?
EP_MSG_SVC_PORTALS_SMALL : EP_MSG_SVC_PORTALS_LARGE;
rc = kqswnal_launch (ktx);
out:
- CDEBUG(rc == 0 ? D_NET : D_NETERROR, "%s %d bytes to %s%s: rc %d\n",
- routing ? (rc == 0 ? "Routed" : "Failed to route") :
- (rc == 0 ? "Sent" : "Failed to send"),
- nob, libcfs_nid2str(target.nid),
- target_is_router ? "(router)" : "", rc);
+ CDEBUG_LIMIT(rc == 0? D_NET :D_NETERROR, "%s %d bytes to %s%s: rc %d\n",
+ routing ? (rc == 0 ? "Routed" : "Failed to route") :
+ (rc == 0 ? "Sent" : "Failed to send"),
+ nob, libcfs_nid2str(target.nid),
+ target_is_router ? "(router)" : "", rc);
if (rc != 0) {
lnet_msg_t *repmsg = (lnet_msg_t *)ktx->ktx_args[2];
int state = ktx->ktx_state;
-
+
kqswnal_put_idle_tx (ktx);
if (state == KTX_GETTING && repmsg != NULL) {
}
- atomic_dec(&kqswnal_data.kqn_pending_txs);
+ atomic_dec(&kqswnal_data.kqn_pending_txs);
return (rc == 0 ? 0 : -EIO);
}
void
kqswnal_requeue_rx (kqswnal_rx_t *krx)
{
- LASSERT (atomic_read(&krx->krx_refcount) == 0);
+ LASSERT (atomic_read(&krx->krx_refcount) == 0);
LASSERT (!krx->krx_rpc_reply_needed);
krx->krx_state = KRX_POSTED;
void
kqswnal_rx_done (kqswnal_rx_t *krx)
{
- int rc;
+ int rc;
- LASSERT (atomic_read(&krx->krx_refcount) == 0);
+ LASSERT (atomic_read(&krx->krx_refcount) == 0);
- if (krx->krx_rpc_reply_needed) {
- /* We've not completed the peer's RPC yet... */
- krx->krx_rpc_reply.msg.magic = LNET_PROTO_QSW_MAGIC;
- krx->krx_rpc_reply.msg.version = QSWLND_PROTO_VERSION;
+ if (krx->krx_rpc_reply_needed) {
+ /* We've not completed the peer's RPC yet... */
+ krx->krx_rpc_reply.msg.magic = LNET_PROTO_QSW_MAGIC;
+ krx->krx_rpc_reply.msg.version = QSWLND_PROTO_VERSION;
- LASSERT (!in_interrupt());
+ LASSERT (!in_interrupt());
- rc = ep_complete_rpc(krx->krx_rxd,
- kqswnal_rpc_complete, krx,
- &krx->krx_rpc_reply.ep_statusblk,
- NULL, NULL, 0);
- if (rc == EP_SUCCESS)
- return;
+ rc = ep_complete_rpc(krx->krx_rxd,
+ kqswnal_rpc_complete, krx,
+ &krx->krx_rpc_reply.ep_statusblk,
+ NULL, NULL, 0);
+ if (rc == EP_SUCCESS)
+ return;
- CERROR("can't complete RPC: %d\n", rc);
- krx->krx_rpc_reply_needed = 0;
- }
+ CERROR("can't complete RPC: %d\n", rc);
+ krx->krx_rpc_reply_needed = 0;
+ }
- kqswnal_requeue_rx(krx);
+ kqswnal_requeue_rx(krx);
}
void
int nob;
int rc;
- LASSERT (atomic_read(&krx->krx_refcount) == 1);
+ LASSERT (atomic_read(&krx->krx_refcount) == 1);
- /* If ln_ptlcompat is set, peers may send me an "old" unencapsulated
- * lnet hdr */
- LASSERT (offsetof(kqswnal_msg_t, kqm_u) <= sizeof(lnet_hdr_t));
-
if (krx->krx_nob < offsetof(kqswnal_msg_t, kqm_u)) {
CERROR("Short message %d received from %s\n",
krx->krx_nob, libcfs_nid2str(fromnid));
goto done;
}
- if (the_lnet.ln_ptlcompat != 0) {
- /* Portals compatibility (strong or weak)
- * This could be an unencapsulated LNET header. If it's big
- * enough, let LNET's parser sort it out */
-
- if (krx->krx_nob < sizeof(lnet_hdr_t)) {
- CERROR("Short portals-compatible message from %s\n",
- libcfs_nid2str(fromnid));
- goto done;
- }
-
- krx->krx_raw_lnet_hdr = 1;
- rc = lnet_parse(ni, (lnet_hdr_t *)msg,
- fromnid, krx, krx->krx_rpc_reply_needed);
- if (rc < 0)
- goto done;
- return;
- }
-
CERROR("Unrecognised magic %08x from %s\n",
msg->kqm_magic, libcfs_nid2str(fromnid));
done:
krx->krx_state = KRX_PARSE;
krx->krx_rxd = rxd;
krx->krx_nob = nob;
- krx->krx_raw_lnet_hdr = 0;
/* RPC reply iff rpc request received without error */
krx->krx_rpc_reply_needed = ep_rxd_isrpc(rxd) &&
/* Default to failure if an RPC reply is requested but not handled */
krx->krx_rpc_reply.msg.status = -EPROTO;
- atomic_set (&krx->krx_refcount, 1);
+ atomic_set (&krx->krx_refcount, 1);
if (status != EP_SUCCESS) {
/* receives complete with failure when receiver is removed */
else
CERROR("receive status failed with status %d nob %d\n",
ep_rxd_status(rxd), nob);
- kqswnal_rx_decref(krx);
- return;
- }
+ kqswnal_rx_decref(krx);
+ return;
+ }
- if (!in_interrupt()) {
- kqswnal_parse(krx);
- return;
- }
+ if (!in_interrupt()) {
+ kqswnal_parse(krx);
+ return;
+ }
- spin_lock_irqsave (&kqswnal_data.kqn_sched_lock, flags);
+ spin_lock_irqsave(&kqswnal_data.kqn_sched_lock, flags);
- list_add_tail (&krx->krx_list, &kqswnal_data.kqn_readyrxds);
- wake_up (&kqswnal_data.kqn_sched_waitq);
+ cfs_list_add_tail(&krx->krx_list, &kqswnal_data.kqn_readyrxds);
+ wake_up(&kqswnal_data.kqn_sched_waitq);
- spin_unlock_irqrestore (&kqswnal_data.kqn_sched_lock, flags);
+ spin_unlock_irqrestore(&kqswnal_data.kqn_sched_lock, flags);
}
int
unsigned int mlen,
unsigned int rlen)
{
- kqswnal_rx_t *krx = (kqswnal_rx_t *)private;
- lnet_nid_t fromnid;
- kqswnal_msg_t *msg;
- lnet_hdr_t *hdr;
- kqswnal_remotemd_t *rmd;
- int msg_offset;
- int rc;
-
- LASSERT (!in_interrupt ()); /* OK to map */
- /* Either all pages or all vaddrs */
- LASSERT (!(kiov != NULL && iov != NULL));
+ kqswnal_rx_t *krx = (kqswnal_rx_t *)private;
+ lnet_nid_t fromnid;
+ kqswnal_msg_t *msg;
+ lnet_hdr_t *hdr;
+ kqswnal_remotemd_t *rmd;
+ int msg_offset;
+ int rc;
+
+ LASSERT (!in_interrupt ()); /* OK to map */
+ /* Either all pages or all vaddrs */
+ LASSERT (!(kiov != NULL && iov != NULL));
fromnid = LNET_MKNID(LNET_NIDNET(ni->ni_nid), ep_rxd_node(krx->krx_rxd));
msg = (kqswnal_msg_t *)page_address(krx->krx_kiov[0].kiov_page);
if (krx->krx_rpc_reply_needed) {
/* optimized (rdma) request sent as RPC */
- if (krx->krx_raw_lnet_hdr) {
- LASSERT (the_lnet.ln_ptlcompat != 0);
- hdr = (lnet_hdr_t *)msg;
- rmd = kqswnal_get_portalscompat_rmd(krx);
- if (rmd == NULL)
- return (-EPROTO);
- } else {
- LASSERT (msg->kqm_type == QSWLND_MSG_RDMA);
- hdr = &msg->kqm_u.rdma.kqrm_hdr;
- rmd = &msg->kqm_u.rdma.kqrm_rmd;
- }
+ LASSERT (msg->kqm_type == QSWLND_MSG_RDMA);
+ hdr = &msg->kqm_u.rdma.kqrm_hdr;
+ rmd = &msg->kqm_u.rdma.kqrm_rmd;
/* NB header is still in wire byte order */
return rc;
}
- if (krx->krx_raw_lnet_hdr) {
- LASSERT (the_lnet.ln_ptlcompat != 0);
- msg_offset = sizeof(lnet_hdr_t);
- } else {
- LASSERT (msg->kqm_type == QSWLND_MSG_IMMEDIATE);
- msg_offset = offsetof(kqswnal_msg_t, kqm_u.immediate.kqim_payload);
- }
+ LASSERT (msg->kqm_type == QSWLND_MSG_IMMEDIATE);
+ msg_offset = offsetof(kqswnal_msg_t, kqm_u.immediate.kqim_payload);
if (krx->krx_nob < msg_offset + rlen) {
CERROR("Bad message size from %s: have %d, need %d + %d\n",
}
int
-kqswnal_thread_start (int (*fn)(void *arg), void *arg)
+kqswnal_thread_start(int (*fn)(void *arg), void *arg, char *name)
{
- long pid = kernel_thread (fn, arg, 0);
+ struct task_struct *task = cfs_thread_run(fn, arg, name);
- if (pid < 0)
- return ((int)pid);
+ if (IS_ERR(task))
+ return PTR_ERR(task);
- atomic_inc (&kqswnal_data.kqn_nthreads);
- return (0);
+ atomic_inc(&kqswnal_data.kqn_nthreads);
+ return 0;
}
void
kqswnal_thread_fini (void)
{
- atomic_dec (&kqswnal_data.kqn_nthreads);
+ atomic_dec (&kqswnal_data.kqn_nthreads);
}
int
int counter = 0;
int did_something;
- cfs_daemonize ("kqswnal_sched");
cfs_block_allsigs ();
-
- spin_lock_irqsave (&kqswnal_data.kqn_sched_lock, flags);
+
+ spin_lock_irqsave(&kqswnal_data.kqn_sched_lock, flags);
for (;;)
{
did_something = 0;
- if (!list_empty (&kqswnal_data.kqn_readyrxds))
+ if (!cfs_list_empty (&kqswnal_data.kqn_readyrxds))
{
- krx = list_entry(kqswnal_data.kqn_readyrxds.next,
- kqswnal_rx_t, krx_list);
- list_del (&krx->krx_list);
- spin_unlock_irqrestore(&kqswnal_data.kqn_sched_lock,
- flags);
+ krx = cfs_list_entry(kqswnal_data.kqn_readyrxds.next,
+ kqswnal_rx_t, krx_list);
+ cfs_list_del (&krx->krx_list);
+ spin_unlock_irqrestore(&kqswnal_data.kqn_sched_lock,
+ flags);
LASSERT (krx->krx_state == KRX_PARSE);
kqswnal_parse (krx);
did_something = 1;
- spin_lock_irqsave(&kqswnal_data.kqn_sched_lock, flags);
+ spin_lock_irqsave(&kqswnal_data.kqn_sched_lock,
+ flags);
}
- if (!list_empty (&kqswnal_data.kqn_donetxds))
+ if (!cfs_list_empty (&kqswnal_data.kqn_donetxds))
{
- ktx = list_entry(kqswnal_data.kqn_donetxds.next,
- kqswnal_tx_t, ktx_schedlist);
- list_del_init (&ktx->ktx_schedlist);
- spin_unlock_irqrestore(&kqswnal_data.kqn_sched_lock,
- flags);
+ ktx = cfs_list_entry(kqswnal_data.kqn_donetxds.next,
+ kqswnal_tx_t, ktx_schedlist);
+ cfs_list_del_init (&ktx->ktx_schedlist);
+ spin_unlock_irqrestore(&kqswnal_data.kqn_sched_lock,
+ flags);
kqswnal_tx_done_in_thread_context(ktx);
did_something = 1;
- spin_lock_irqsave (&kqswnal_data.kqn_sched_lock, flags);
+ spin_lock_irqsave(&kqswnal_data.kqn_sched_lock,
+ flags);
}
- if (!list_empty (&kqswnal_data.kqn_delayedtxds))
+ if (!cfs_list_empty (&kqswnal_data.kqn_delayedtxds))
{
- ktx = list_entry(kqswnal_data.kqn_delayedtxds.next,
- kqswnal_tx_t, ktx_schedlist);
- list_del_init (&ktx->ktx_schedlist);
- spin_unlock_irqrestore(&kqswnal_data.kqn_sched_lock,
- flags);
+ ktx = cfs_list_entry(kqswnal_data.kqn_delayedtxds.next,
+ kqswnal_tx_t, ktx_schedlist);
+ cfs_list_del_init (&ktx->ktx_schedlist);
+ spin_unlock_irqrestore(&kqswnal_data.kqn_sched_lock,
+ flags);
rc = kqswnal_launch (ktx);
if (rc != 0) {
libcfs_nid2str(ktx->ktx_nid), rc);
kqswnal_tx_done (ktx, rc);
}
- atomic_dec (&kqswnal_data.kqn_pending_txs);
+ atomic_dec (&kqswnal_data.kqn_pending_txs);
did_something = 1;
- spin_lock_irqsave (&kqswnal_data.kqn_sched_lock, flags);
+ spin_lock_irqsave(&kqswnal_data.kqn_sched_lock,
+ flags);
}
/* nothing to do or hogging CPU */
if (!did_something || counter++ == KQSW_RESCHED) {
- spin_unlock_irqrestore(&kqswnal_data.kqn_sched_lock,
- flags);
+ spin_unlock_irqrestore(&kqswnal_data.kqn_sched_lock,
+ flags);
counter = 0;
if (!did_something) {
if (kqswnal_data.kqn_shuttingdown == 2) {
- /* We only exit in stage 2 of shutdown when
- * there's nothing left to do */
+ /* We only exit in stage 2 of shutdown
+ * when there's nothing left to do */
break;
}
- rc = wait_event_interruptible_exclusive (
- kqswnal_data.kqn_sched_waitq,
- kqswnal_data.kqn_shuttingdown == 2 ||
- !list_empty(&kqswnal_data.kqn_readyrxds) ||
- !list_empty(&kqswnal_data.kqn_donetxds) ||
- !list_empty(&kqswnal_data.kqn_delayedtxds));
- LASSERT (rc == 0);
- } else if (need_resched())
- schedule ();
-
- spin_lock_irqsave (&kqswnal_data.kqn_sched_lock, flags);
- }
- }
-
- kqswnal_thread_fini ();
- return (0);
+ rc = wait_event_interruptible_exclusive (
+ kqswnal_data.kqn_sched_waitq,
+ kqswnal_data.kqn_shuttingdown == 2 ||
+ !cfs_list_empty(&kqswnal_data. \
+ kqn_readyrxds) ||
+ !cfs_list_empty(&kqswnal_data. \
+ kqn_donetxds) ||
+ !cfs_list_empty(&kqswnal_data. \
+ kqn_delayedtxds));
+ LASSERT (rc == 0);
+ } else if (need_resched())
+ schedule ();
+
+ spin_lock_irqsave(&kqswnal_data.kqn_sched_lock,
+ flags);
+ }
+ }
+
+ kqswnal_thread_fini ();
+ return 0;
}