-/* -*- 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.
* GPL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright (c) 2011, Whamcloud, Inc.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
enum {
SOCKLND_TIMEOUT = 1,
SOCKLND_CREDITS,
- SOCKLND_PEER_CREDITS,
+ SOCKLND_PEER_TXCREDITS,
+ SOCKLND_PEER_RTRCREDITS,
+ SOCKLND_PEER_TIMEOUT,
SOCKLND_NCONNDS,
SOCKLND_RECONNECTS_MIN,
SOCKLND_RECONNECTS_MAX,
#define SOCKLND_TIMEOUT CTL_UNNUMBERED
#define SOCKLND_CREDITS CTL_UNNUMBERED
-#define SOCKLND_PEER_CREDITS CTL_UNNUMBERED
+#define SOCKLND_PEER_TXCREDITS CTL_UNNUMBERED
+#define SOCKLND_PEER_RTRCREDITS CTL_UNNUMBERED
+#define SOCKLND_PEER_TIMEOUT CTL_UNNUMBERED
#define SOCKLND_NCONNDS CTL_UNNUMBERED
#define SOCKLND_RECONNECTS_MIN CTL_UNNUMBERED
#define SOCKLND_RECONNECTS_MAX CTL_UNNUMBERED
.strategy = &sysctl_intvec,
},
{
- .ctl_name = SOCKLND_PEER_CREDITS,
+ .ctl_name = SOCKLND_PEER_TXCREDITS,
.procname = "peer_credits",
- .data = &ksocknal_tunables.ksnd_peercredits,
+ .data = &ksocknal_tunables.ksnd_peertxcredits,
+ .maxlen = sizeof (int),
+ .mode = 0444,
+ .proc_handler = &proc_dointvec,
+ .strategy = &sysctl_intvec,
+ },
+ {
+ .ctl_name = SOCKLND_PEER_RTRCREDITS,
+ .procname = "peer_buffer_credits",
+ .data = &ksocknal_tunables.ksnd_peerrtrcredits,
.maxlen = sizeof (int),
.mode = 0444,
.proc_handler = &proc_dointvec,
.strategy = &sysctl_intvec,
},
{
+ .ctl_name = SOCKLND_PEER_TIMEOUT,
+ .procname = "peer_timeout",
+ .data = &ksocknal_tunables.ksnd_peertimeout,
+ .maxlen = sizeof (int),
+ .mode = 0444,
+ .proc_handler = &proc_dointvec
+ .strategy = &sysctl_intvec,
+ },
+ {
.ctl_name = SOCKLND_NCONNDS,
.procname = "nconnds",
.data = &ksocknal_tunables.ksnd_nconnds,
}
#endif /* # if CONFIG_SYSCTL && !CFS_SYSFS_MODULE_PARM */
-void
-ksocknal_lib_bind_irq (unsigned int irq)
-{
-#if (defined(CONFIG_SMP) && defined(CPU_AFFINITY))
- int bind;
- int cpu;
- char cmdline[64];
- ksock_irqinfo_t *info;
- char *argv[] = {"/bin/sh",
- "-c",
- cmdline,
- NULL};
- char *envp[] = {"HOME=/",
- "PATH=/sbin:/bin:/usr/sbin:/usr/bin",
- NULL};
-
- LASSERT (irq < NR_IRQS);
- if (irq == 0) /* software NIC or affinity disabled */
- return;
-
- info = &ksocknal_data.ksnd_irqinfo[irq];
-
- cfs_write_lock_bh (&ksocknal_data.ksnd_global_lock);
-
- LASSERT (info->ksni_valid);
- bind = !info->ksni_bound;
- info->ksni_bound = 1;
-
- cfs_write_unlock_bh (&ksocknal_data.ksnd_global_lock);
-
- if (!bind) /* bound already */
- return;
-
- cpu = ksocknal_irqsched2cpu(info->ksni_sched);
- snprintf (cmdline, sizeof (cmdline),
- "echo %d > /proc/irq/%u/smp_affinity", 1 << cpu, irq);
-
- LCONSOLE_INFO("Binding irq %u to CPU %d with cmd: %s\n",
- irq, cpu, cmdline);
-
- /* FIXME: Find a better method of setting IRQ affinity...
- */
-
- USERMODEHELPER(argv[0], argv, envp);
-#endif
-}
-
int
ksocknal_lib_get_conn_addrs (ksock_conn_t *conn)
{
return 0;
}
-unsigned int
-ksocknal_lib_sock_irq (struct socket *sock)
-{
- int irq = 0;
-#ifdef CPU_AFFINITY
- struct dst_entry *dst;
-
- if (!*ksocknal_tunables.ksnd_irq_affinity)
- return 0;
-
- dst = sk_dst_get (sock->sk);
- if (dst != NULL) {
- if (dst->dev != NULL) {
- irq = dst->dev->irq;
- if (irq >= NR_IRQS) {
- CERROR ("Unexpected IRQ %x\n", irq);
- irq = 0;
- }
- }
- dst_release (dst);
- }
-
-#endif
- return irq;
-}
-
int
ksocknal_lib_zc_capable(ksock_conn_t *conn)
{
nob += scratchiov[i].iov_len;
}
- if (!list_empty(&conn->ksnc_tx_queue) ||
+ if (!cfs_list_empty(&conn->ksnc_tx_queue) ||
nob < tx->tx_resid)
msg.msg_flags |= MSG_MORE;
CDEBUG(D_NET, "page %p + offset %x for %d\n",
page, offset, kiov->kiov_len);
- if (!list_empty(&conn->ksnc_tx_queue) ||
+ if (!cfs_list_empty(&conn->ksnc_tx_queue) ||
fragsize < tx->tx_resid)
msgflg |= MSG_MORE;
rc = sk->sk_prot->sendpage(sk, page,
offset, fragsize, msgflg);
} else {
- rc = tcp_sendpage(sock, page, offset, fragsize, msgflg);
+ rc = cfs_tcp_sendpage(sk, page, offset, fragsize,
+ msgflg);
}
} else {
#if SOCKNAL_SINGLE_FRAG_TX || !SOCKNAL_RISK_KMAP_DEADLOCK
nob += scratchiov[i].iov_len = kiov[i].kiov_len;
}
- if (!list_empty(&conn->ksnc_tx_queue) ||
+ if (!cfs_list_empty(&conn->ksnc_tx_queue) ||
nob < tx->tx_resid)
msg.msg_flags |= MSG_MORE;
return (0);
}
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
-struct tcp_opt *sock2tcp_opt(struct sock *sk)
-{
- return &(sk->tp_pinfo.af_tcp);
-}
-#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10))
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10))
#define sock2tcp_opt(sk) tcp_sk(sk)
#else
struct tcp_opt *sock2tcp_opt(struct sock *sk)
" ready" : " blocked"),
(conn == NULL) ? "" : (conn->ksnc_tx_scheduled ?
" scheduled" : " idle"),
- (conn == NULL) ? "" : (list_empty (&conn->ksnc_tx_queue) ?
+ (conn == NULL) ? "" : (cfs_list_empty (&conn->ksnc_tx_queue) ?
" empty" : " queued"));
if (conn == NULL) { /* raced with ksocknal_terminate_conn */
sched = conn->ksnc_scheduler;
cfs_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
* after a timeout */
rc = -ENOMEM;
}
-
+
cfs_spin_unlock_bh (&sched->kss_lock);
return rc;
}
-
-__u64
-ksocknal_lib_new_incarnation(void)
-{
- struct timeval tv;
-
- /* The incarnation number is the time this module loaded and it
- * identifies this particular instance of the socknal. Hopefully
- * we won't be able to reboot more frequently than 1MHz for the
- * forseeable future :) */
-
- do_gettimeofday(&tv);
-
- return (((__u64)tv.tv_sec) * 1000000) + tv.tv_usec;
-}
-
-int
-ksocknal_lib_bind_thread_to_cpu(int id)
-{
-#if defined(CONFIG_SMP) && defined(CPU_AFFINITY)
- id = ksocknal_sched2cpu(id);
- if (cpu_online(id)) {
- cpumask_t m = CPU_MASK_NONE;
- cpu_set(id, m);
- set_cpus_allowed(current, m);
- return 0;
- }
-
- return -1;
-
-#else
- return 0;
-#endif
-}