X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=sidebyside;f=lnet%2Fklnds%2Fsocklnd%2Fsocklnd_lib-linux.c;h=54513addcf9a900eb9863d104647067d3bef1551;hb=2120ef466f9748774086177a3119fe641067a53d;hp=5b972711f2c7b72ae4d40dc9aae7da78c312b695;hpb=9f8e9741e1cc770c766cf714f8327254c0d5fed0;p=fs%2Flustre-release.git diff --git a/lnet/klnds/socklnd/socklnd_lib-linux.c b/lnet/klnds/socklnd/socklnd_lib-linux.c index 5b97271..54513ad 100644 --- a/lnet/klnds/socklnd/socklnd_lib-linux.c +++ b/lnet/klnds/socklnd/socklnd_lib-linux.c @@ -1,6 +1,4 @@ -/* -*- 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. @@ -26,8 +24,10 @@ * 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, 2012, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -38,336 +38,296 @@ # if defined(CONFIG_SYSCTL) && !CFS_SYSFS_MODULE_PARM -#ifndef HAVE_SYSCTL_UNNUMBERED - -enum { - SOCKLND_TIMEOUT = 1, - SOCKLND_CREDITS, - SOCKLND_PEER_CREDITS, - SOCKLND_NCONNDS, - SOCKLND_RECONNECTS_MIN, - SOCKLND_RECONNECTS_MAX, - SOCKLND_EAGER_ACK, - SOCKLND_ZERO_COPY, - SOCKLND_TYPED, - SOCKLND_BULK_MIN, - SOCKLND_RX_BUFFER_SIZE, - SOCKLND_TX_BUFFER_SIZE, - SOCKLND_NAGLE, - SOCKLND_IRQ_AFFINITY, - SOCKLND_ROUND_ROBIN, - SOCKLND_KEEPALIVE, - SOCKLND_KEEPALIVE_IDLE, - SOCKLND_KEEPALIVE_COUNT, - SOCKLND_KEEPALIVE_INTVL, - SOCKLND_BACKOFF_INIT, - SOCKLND_BACKOFF_MAX, - SOCKLND_PROTOCOL, - SOCKLND_ZERO_COPY_RECV, - SOCKLND_ZERO_COPY_RECV_MIN_NFRAGS -}; -#else - -#define SOCKLND_TIMEOUT CTL_UNNUMBERED -#define SOCKLND_CREDITS CTL_UNNUMBERED -#define SOCKLND_PEER_CREDITS CTL_UNNUMBERED -#define SOCKLND_NCONNDS CTL_UNNUMBERED -#define SOCKLND_RECONNECTS_MIN CTL_UNNUMBERED -#define SOCKLND_RECONNECTS_MAX CTL_UNNUMBERED -#define SOCKLND_EAGER_ACK CTL_UNNUMBERED -#define SOCKLND_ZERO_COPY CTL_UNNUMBERED -#define SOCKLND_TYPED CTL_UNNUMBERED -#define SOCKLND_BULK_MIN CTL_UNNUMBERED -#define SOCKLND_RX_BUFFER_SIZE CTL_UNNUMBERED -#define SOCKLND_TX_BUFFER_SIZE CTL_UNNUMBERED -#define SOCKLND_NAGLE CTL_UNNUMBERED -#define SOCKLND_IRQ_AFFINITY CTL_UNNUMBERED -#define SOCKLND_ROUND_ROBIN CTL_UNNUMBERED -#define SOCKLND_KEEPALIVE CTL_UNNUMBERED -#define SOCKLND_KEEPALIVE_IDLE CTL_UNNUMBERED -#define SOCKLND_KEEPALIVE_COUNT CTL_UNNUMBERED -#define SOCKLND_KEEPALIVE_INTVL CTL_UNNUMBERED -#define SOCKLND_BACKOFF_INIT CTL_UNNUMBERED -#define SOCKLND_BACKOFF_MAX CTL_UNNUMBERED -#define SOCKLND_PROTOCOL CTL_UNNUMBERED -#define SOCKLND_ZERO_COPY_RECV CTL_UNNUMBERED -#define SOCKLND_ZERO_COPY_RECV_MIN_NFRAGS CTL_UNNUMBERED -#endif - -static cfs_sysctl_table_t ksocknal_ctl_table[] = { - { - .ctl_name = SOCKLND_TIMEOUT, - .procname = "timeout", - .data = &ksocknal_tunables.ksnd_timeout, - .maxlen = sizeof (int), - .mode = 0644, - .proc_handler = &proc_dointvec, - .strategy = &sysctl_intvec, - }, - { - .ctl_name = SOCKLND_CREDITS, - .procname = "credits", - .data = &ksocknal_tunables.ksnd_credits, - .maxlen = sizeof (int), - .mode = 0444, - .proc_handler = &proc_dointvec, - .strategy = &sysctl_intvec, - }, - { - .ctl_name = SOCKLND_PEER_CREDITS, - .procname = "peer_credits", - .data = &ksocknal_tunables.ksnd_peercredits, - .maxlen = sizeof (int), - .mode = 0444, - .proc_handler = &proc_dointvec, - .strategy = &sysctl_intvec, - }, - { - .ctl_name = SOCKLND_NCONNDS, - .procname = "nconnds", - .data = &ksocknal_tunables.ksnd_nconnds, - .maxlen = sizeof (int), - .mode = 0444, - .proc_handler = &proc_dointvec, - .strategy = &sysctl_intvec, - }, - { - .ctl_name = SOCKLND_RECONNECTS_MIN, - .procname = "min_reconnectms", - .data = &ksocknal_tunables.ksnd_min_reconnectms, - .maxlen = sizeof (int), - .mode = 0444, - .proc_handler = &proc_dointvec, - .strategy = &sysctl_intvec, - }, - { - .ctl_name = SOCKLND_RECONNECTS_MAX, - .procname = "max_reconnectms", - .data = &ksocknal_tunables.ksnd_max_reconnectms, - .maxlen = sizeof (int), - .mode = 0444, - .proc_handler = &proc_dointvec, - .strategy = &sysctl_intvec, - }, - { - .ctl_name = SOCKLND_EAGER_ACK, - .procname = "eager_ack", - .data = &ksocknal_tunables.ksnd_eager_ack, - .maxlen = sizeof (int), - .mode = 0644, - .proc_handler = &proc_dointvec, - .strategy = &sysctl_intvec, - }, - { - .ctl_name = SOCKLND_ZERO_COPY, - .procname = "zero_copy", - .data = &ksocknal_tunables.ksnd_zc_min_payload, - .maxlen = sizeof (int), - .mode = 0644, - .proc_handler = &proc_dointvec, - .strategy = &sysctl_intvec, - }, - { - .ctl_name = SOCKLND_ZERO_COPY_RECV, - .procname = "zero_copy_recv", - .data = &ksocknal_tunables.ksnd_zc_recv, - .maxlen = sizeof (int), - .mode = 0644, - .proc_handler = &proc_dointvec, - .strategy = &sysctl_intvec, - }, - - { - .ctl_name = SOCKLND_ZERO_COPY_RECV_MIN_NFRAGS, - .procname = "zero_copy_recv", - .data = &ksocknal_tunables.ksnd_zc_recv_min_nfrags, - .maxlen = sizeof (int), - .mode = 0644, - .proc_handler = &proc_dointvec, - .strategy = &sysctl_intvec, - }, - { - .ctl_name = SOCKLND_TYPED, - .procname = "typed", - .data = &ksocknal_tunables.ksnd_typed_conns, - .maxlen = sizeof (int), - .mode = 0444, - .proc_handler = &proc_dointvec, - .strategy = &sysctl_intvec, - }, - { - .ctl_name = SOCKLND_BULK_MIN, - .procname = "min_bulk", - .data = &ksocknal_tunables.ksnd_min_bulk, - .maxlen = sizeof (int), - .mode = 0644, - .proc_handler = &proc_dointvec, - .strategy = &sysctl_intvec, - }, - { - .ctl_name = SOCKLND_RX_BUFFER_SIZE, - .procname = "rx_buffer_size", - .data = &ksocknal_tunables.ksnd_rx_buffer_size, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = &proc_dointvec, - .strategy = &sysctl_intvec, - }, - { - .ctl_name = SOCKLND_TX_BUFFER_SIZE, - .procname = "tx_buffer_size", - .data = &ksocknal_tunables.ksnd_tx_buffer_size, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = &proc_dointvec, - .strategy = &sysctl_intvec, - }, - { - .ctl_name = SOCKLND_NAGLE, - .procname = "nagle", - .data = &ksocknal_tunables.ksnd_nagle, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = &proc_dointvec, - .strategy = &sysctl_intvec, - }, +static struct ctl_table ksocknal_ctl_table[] = { + { + INIT_CTL_NAME + .procname = "timeout", + .data = &ksocknal_tunables.ksnd_timeout, + .maxlen = sizeof (int), + .mode = 0644, + .proc_handler = &proc_dointvec, + INIT_STRATEGY + }, + { + INIT_CTL_NAME + .procname = "credits", + .data = &ksocknal_tunables.ksnd_credits, + .maxlen = sizeof (int), + .mode = 0444, + .proc_handler = &proc_dointvec, + INIT_STRATEGY + }, + { + INIT_CTL_NAME + .procname = "peer_credits", + .data = &ksocknal_tunables.ksnd_peertxcredits, + .maxlen = sizeof (int), + .mode = 0444, + .proc_handler = &proc_dointvec, + INIT_STRATEGY + }, + { + INIT_CTL_NAME + .procname = "peer_buffer_credits", + .data = &ksocknal_tunables.ksnd_peerrtrcredits, + .maxlen = sizeof (int), + .mode = 0444, + .proc_handler = &proc_dointvec, + INIT_STRATEGY + }, + { + INIT_CTL_NAME + .procname = "peer_timeout", + .data = &ksocknal_tunables.ksnd_peertimeout, + .maxlen = sizeof (int), + .mode = 0444, + .proc_handler = &proc_dointvec + INIT_STRATEGY + }, + { + INIT_CTL_NAME + .procname = "nconnds", + .data = &ksocknal_tunables.ksnd_nconnds, + .maxlen = sizeof (int), + .mode = 0444, + .proc_handler = &proc_dointvec, + INIT_STRATEGY + }, + { + INIT_CTL_NAME + .procname = "min_reconnectms", + .data = &ksocknal_tunables.ksnd_min_reconnectms, + .maxlen = sizeof (int), + .mode = 0444, + .proc_handler = &proc_dointvec, + INIT_STRATEGY + }, + { + INIT_CTL_NAME + .procname = "max_reconnectms", + .data = &ksocknal_tunables.ksnd_max_reconnectms, + .maxlen = sizeof (int), + .mode = 0444, + .proc_handler = &proc_dointvec, + INIT_STRATEGY + }, + { + INIT_CTL_NAME + .procname = "eager_ack", + .data = &ksocknal_tunables.ksnd_eager_ack, + .maxlen = sizeof (int), + .mode = 0644, + .proc_handler = &proc_dointvec, + INIT_STRATEGY + }, + { + INIT_CTL_NAME + .procname = "zero_copy", + .data = &ksocknal_tunables.ksnd_zc_min_payload, + .maxlen = sizeof (int), + .mode = 0644, + .proc_handler = &proc_dointvec, + INIT_STRATEGY + }, + { + INIT_CTL_NAME + .procname = "zero_copy_recv", + .data = &ksocknal_tunables.ksnd_zc_recv, + .maxlen = sizeof (int), + .mode = 0644, + .proc_handler = &proc_dointvec, + INIT_STRATEGY + }, + { + INIT_CTL_NAME + .procname = "zero_copy_recv", + .data = &ksocknal_tunables.ksnd_zc_recv_min_nfrags, + .maxlen = sizeof (int), + .mode = 0644, + .proc_handler = &proc_dointvec, + INIT_STRATEGY + }, + { + INIT_CTL_NAME + .procname = "typed", + .data = &ksocknal_tunables.ksnd_typed_conns, + .maxlen = sizeof (int), + .mode = 0444, + .proc_handler = &proc_dointvec, + INIT_STRATEGY + }, + { + INIT_CTL_NAME + .procname = "min_bulk", + .data = &ksocknal_tunables.ksnd_min_bulk, + .maxlen = sizeof (int), + .mode = 0644, + .proc_handler = &proc_dointvec, + INIT_STRATEGY + }, + { + INIT_CTL_NAME + .procname = "rx_buffer_size", + .data = &ksocknal_tunables.ksnd_rx_buffer_size, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec, + INIT_STRATEGY + }, + { + INIT_CTL_NAME + .procname = "tx_buffer_size", + .data = &ksocknal_tunables.ksnd_tx_buffer_size, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec, + INIT_STRATEGY + }, + { + INIT_CTL_NAME + .procname = "nagle", + .data = &ksocknal_tunables.ksnd_nagle, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec, + INIT_STRATEGY + }, #ifdef CPU_AFFINITY - { - .ctl_name = SOCKLND_IRQ_AFFINITY, - .procname = "irq_affinity", - .data = &ksocknal_tunables.ksnd_irq_affinity, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = &proc_dointvec, - .strategy = &sysctl_intvec, - }, + { + INIT_CTL_NAME + .procname = "irq_affinity", + .data = &ksocknal_tunables.ksnd_irq_affinity, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec, + INIT_STRATEGY + }, #endif - { - .ctl_name = SOCKLND_ROUND_ROBIN, - .procname = "round_robin", - .data = &ksocknal_tunables.ksnd_round_robin, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = &proc_dointvec, - .strategy = &sysctl_intvec, - }, - { - .ctl_name = SOCKLND_KEEPALIVE, - .procname = "keepalive", - .data = &ksocknal_tunables.ksnd_keepalive, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = &proc_dointvec, - .strategy = &sysctl_intvec, - }, - { - .ctl_name = SOCKLND_KEEPALIVE_IDLE, - .procname = "keepalive_idle", - .data = &ksocknal_tunables.ksnd_keepalive_idle, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = &proc_dointvec, - .strategy = &sysctl_intvec, - }, - { - .ctl_name = SOCKLND_KEEPALIVE_COUNT, - .procname = "keepalive_count", - .data = &ksocknal_tunables.ksnd_keepalive_count, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = &proc_dointvec, - .strategy = &sysctl_intvec, - }, - { - .ctl_name = SOCKLND_KEEPALIVE_INTVL, - .procname = "keepalive_intvl", - .data = &ksocknal_tunables.ksnd_keepalive_intvl, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = &proc_dointvec, - .strategy = &sysctl_intvec, - }, + { + INIT_CTL_NAME + .procname = "round_robin", + .data = &ksocknal_tunables.ksnd_round_robin, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec, + INIT_STRATEGY + }, + { + INIT_CTL_NAME + .procname = "keepalive", + .data = &ksocknal_tunables.ksnd_keepalive, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec, + INIT_STRATEGY + }, + { + INIT_CTL_NAME + .procname = "keepalive_idle", + .data = &ksocknal_tunables.ksnd_keepalive_idle, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec, + INIT_STRATEGY + }, + { + INIT_CTL_NAME + .procname = "keepalive_count", + .data = &ksocknal_tunables.ksnd_keepalive_count, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec, + INIT_STRATEGY + }, + { + INIT_CTL_NAME + .procname = "keepalive_intvl", + .data = &ksocknal_tunables.ksnd_keepalive_intvl, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec, + INIT_STRATEGY + }, #ifdef SOCKNAL_BACKOFF - { - .ctl_name = SOCKLND_BACKOFF_INIT, - .procname = "backoff_init", - .data = &ksocknal_tunables.ksnd_backoff_init, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = &proc_dointvec, - .strategy = &sysctl_intvec, - }, - { - .ctl_name = SOCKLND_BACKOFF_MAX, - .procname = "backoff_max", - .data = &ksocknal_tunables.ksnd_backoff_max, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = &proc_dointvec, - .strategy = &sysctl_intvec, - }, + { + INIT_CTL_NAME + .procname = "backoff_init", + .data = &ksocknal_tunables.ksnd_backoff_init, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec, + INIT_STRATEGY + }, + { + INIT_CTL_NAME + .procname = "backoff_max", + .data = &ksocknal_tunables.ksnd_backoff_max, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec, + INIT_STRATEGY + }, #endif #if SOCKNAL_VERSION_DEBUG - { - .ctl_name = SOCKLND_PROTOCOL, - .procname = "protocol", - .data = &ksocknal_tunables.ksnd_protocol, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = &proc_dointvec, - .strategy = &sysctl_intvec, - }, + { + INIT_CTL_NAME + .procname = "protocol", + .data = &ksocknal_tunables.ksnd_protocol, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec, + INIT_STRATEGY + }, #endif - {0} + { 0 } }; - -cfs_sysctl_table_t ksocknal_top_ctl_table[] = { - { - .ctl_name = CTL_SOCKLND, - .procname = "socknal", - .data = NULL, - .maxlen = 0, - .mode = 0555, - .child = ksocknal_ctl_table - }, - { 0 } +struct ctl_table ksocknal_top_ctl_table[] = { + { + INIT_CTL_NAME + .procname = "socknal", + .data = NULL, + .maxlen = 0, + .mode = 0555, + .child = ksocknal_ctl_table + }, + { 0 } }; int ksocknal_lib_tunables_init () { - if (!*ksocknal_tunables.ksnd_typed_conns) { - int rc = -EINVAL; + if (!*ksocknal_tunables.ksnd_typed_conns) { + int rc = -EINVAL; #if SOCKNAL_VERSION_DEBUG - if (*ksocknal_tunables.ksnd_protocol < 3) - rc = 0; + if (*ksocknal_tunables.ksnd_protocol < 3) + rc = 0; #endif - if (rc != 0) { - CERROR("Protocol V3.x MUST have typed connections\n"); - return rc; - } - } + if (rc != 0) { + CERROR("Protocol V3.x MUST have typed connections\n"); + return rc; + } + } - if (*ksocknal_tunables.ksnd_zc_recv_min_nfrags < 2) - *ksocknal_tunables.ksnd_zc_recv_min_nfrags = 2; - if (*ksocknal_tunables.ksnd_zc_recv_min_nfrags > LNET_MAX_IOV) - *ksocknal_tunables.ksnd_zc_recv_min_nfrags = LNET_MAX_IOV; + if (*ksocknal_tunables.ksnd_zc_recv_min_nfrags < 2) + *ksocknal_tunables.ksnd_zc_recv_min_nfrags = 2; + if (*ksocknal_tunables.ksnd_zc_recv_min_nfrags > LNET_MAX_IOV) + *ksocknal_tunables.ksnd_zc_recv_min_nfrags = LNET_MAX_IOV; - ksocknal_tunables.ksnd_sysctl = - cfs_register_sysctl_table(ksocknal_top_ctl_table, 0); + ksocknal_tunables.ksnd_sysctl = + register_sysctl_table(ksocknal_top_ctl_table); - if (ksocknal_tunables.ksnd_sysctl == NULL) - CWARN("Can't setup /proc tunables\n"); + if (ksocknal_tunables.ksnd_sysctl == NULL) + CWARN("Can't setup /proc tunables\n"); - return 0; + return 0; } void ksocknal_lib_tunables_fini () { - if (ksocknal_tunables.ksnd_sysctl != NULL) - cfs_unregister_sysctl_table(ksocknal_tunables.ksnd_sysctl); + if (ksocknal_tunables.ksnd_sysctl != NULL) + unregister_sysctl_table(ksocknal_tunables.ksnd_sysctl); } #else int @@ -382,53 +342,6 @@ ksocknal_lib_tunables_fini () } #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) { @@ -454,44 +367,17 @@ 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) { - int caps = conn->ksnc_sock->sk->sk_route_caps; + int caps = conn->ksnc_sock->sk->sk_route_caps; - if (conn->ksnc_proto == &ksocknal_protocol_v1x) - return 0; + if (conn->ksnc_proto == &ksocknal_protocol_v1x) + return 0; - /* ZC if the socket supports scatter/gather and doesn't need software - * checksums */ - return ((caps & NETIF_F_SG) != 0 && - (caps & (NETIF_F_IP_CSUM | NETIF_F_NO_CSUM | NETIF_F_HW_CSUM)) != 0); + /* ZC if the socket supports scatter/gather and doesn't need software + * checksums */ + return ((caps & NETIF_F_SG) != 0 && (caps & NETIF_F_ALL_CSUM) != 0); } int @@ -536,7 +422,7 @@ ksocknal_lib_send_iov (ksock_conn_t *conn, ksock_tx_t *tx) 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; @@ -571,7 +457,7 @@ ksocknal_lib_send_kiov (ksock_conn_t *conn, ksock_tx_t *tx) 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; @@ -579,7 +465,8 @@ ksocknal_lib_send_kiov (ksock_conn_t *conn, ksock_tx_t *tx) 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 @@ -611,7 +498,7 @@ ksocknal_lib_send_kiov (ksock_conn_t *conn, ksock_tx_t *tx) 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; @@ -739,7 +626,8 @@ ksocknal_lib_kiov_vmap(lnet_kiov_t *kiov, int niov, for (nob = i = 0; i < niov; i++) { if ((kiov[i].kiov_offset != 0 && i > 0) || - (kiov[i].kiov_offset + kiov[i].kiov_len != CFS_PAGE_SIZE && i < niov - 1)) + (kiov[i].kiov_offset + kiov[i].kiov_len != + PAGE_CACHE_SIZE && i < niov - 1)) return NULL; pages[i] = kiov[i].kiov_page; @@ -1064,30 +952,11 @@ ksocknal_lib_setup_sock (struct socket *sock) 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)) -#define sock2tcp_opt(sk) tcp_sk(sk) -#else -struct tcp_opt *sock2tcp_opt(struct sock *sk) -{ - struct tcp_sock *s = (struct tcp_sock *)sk; - return &s->tcp; -} -#endif - void ksocknal_lib_push_conn (ksock_conn_t *conn) { struct sock *sk; -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,11)) - struct tcp_opt *tp; -#else struct tcp_sock *tp; -#endif int nonagle; int val = 1; int rc; @@ -1097,8 +966,8 @@ ksocknal_lib_push_conn (ksock_conn_t *conn) if (rc != 0) /* being shut down */ return; - sk = conn->ksnc_sock->sk; - tp = sock2tcp_opt(sk); + sk = conn->ksnc_sock->sk; + tp = tcp_sk(sk); lock_sock (sk); nonagle = tp->nonagle; @@ -1134,7 +1003,7 @@ ksocknal_data_ready (struct sock *sk, int n) /* interleave correctly with closing sockets... */ LASSERT(!in_irq()); - cfs_read_lock (&ksocknal_data.ksnd_global_lock); + read_lock(&ksocknal_data.ksnd_global_lock); conn = sk->sk_user_data; if (conn == NULL) { /* raced with ksocknal_terminate_conn */ @@ -1143,7 +1012,7 @@ ksocknal_data_ready (struct sock *sk, int n) } else ksocknal_read_callback(conn); - cfs_read_unlock (&ksocknal_data.ksnd_global_lock); + read_unlock(&ksocknal_data.ksnd_global_lock); EXIT; } @@ -1157,7 +1026,7 @@ ksocknal_write_space (struct sock *sk) /* interleave correctly with closing sockets... */ LASSERT(!in_irq()); - cfs_read_lock (&ksocknal_data.ksnd_global_lock); + read_lock(&ksocknal_data.ksnd_global_lock); conn = sk->sk_user_data; wspace = SOCKNAL_WSPACE(sk); @@ -1169,14 +1038,14 @@ ksocknal_write_space (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 */ LASSERT (sk->sk_write_space != &ksocknal_write_space); sk->sk_write_space (sk); - cfs_read_unlock (&ksocknal_data.ksnd_global_lock); + read_unlock(&ksocknal_data.ksnd_global_lock); return; } @@ -1190,7 +1059,7 @@ ksocknal_write_space (struct sock *sk) clear_bit (SOCK_NOSPACE, &sk->sk_socket->flags); } - cfs_read_unlock (&ksocknal_data.ksnd_global_lock); + read_unlock(&ksocknal_data.ksnd_global_lock); } void @@ -1229,12 +1098,12 @@ ksocknal_lib_reset_callback(struct socket *sock, ksock_conn_t *conn) int ksocknal_lib_memory_pressure(ksock_conn_t *conn) { - int rc = 0; - ksock_sched_t *sched; - - sched = conn->ksnc_scheduler; - cfs_spin_lock_bh (&sched->kss_lock); - + int rc = 0; + ksock_sched_t *sched; + + 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 @@ -1247,27 +1116,8 @@ ksocknal_lib_memory_pressure(ksock_conn_t *conn) * after a timeout */ rc = -ENOMEM; } - - cfs_spin_unlock_bh (&sched->kss_lock); - return rc; -} - -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; + spin_unlock_bh(&sched->kss_lock); -#else - return 0; -#endif + return rc; }