From: eeb Date: Wed, 31 Dec 2003 14:58:38 +0000 (+0000) Subject: * Removed toenal X-Git-Tag: v1_7_100~2869 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=5fe9b2c1456cc251698bd9c02d62b237b1f35c74 * Removed toenal --- diff --git a/lnet/configure.in b/lnet/configure.in index 44657e0..bacf532 100644 --- a/lnet/configure.in +++ b/lnet/configure.in @@ -29,6 +29,6 @@ AM_CONFIG_HEADER(include/config.h) AC_OUTPUT([Makefile Kernelenv libcfs/Makefile portals/Makefile \ unals/Makefile knals/Makefile router/Makefile \ knals/socknal/Makefile knals/gmnal/Makefile knals/qswnal/Makefile \ - knals/scimacnal/Makefile knals/toenal/Makefile knals/ibnal/Makefile\ + knals/scimacnal/Makefile knals/ibnal/Makefile\ utils/Makefile tests/Makefile doc/Makefile ]) diff --git a/lnet/include/linux/kp30.h b/lnet/include/linux/kp30.h index 3ea46d1..815375c 100644 --- a/lnet/include/linux/kp30.h +++ b/lnet/include/linux/kp30.h @@ -1026,21 +1026,20 @@ static inline int portal_ioctl_getdata(char *buf, char *end, void *arg) #define IOC_PORTAL_MAX_NR 42 enum { - QSWNAL = 1, - SOCKNAL, - GMNAL, - TOENAL, - TCPNAL, - SCIMACNAL, - ROUTER, - IBNAL, + QSWNAL = 1, + SOCKNAL = 2, + GMNAL = 3, + /* 4 unused */ + TCPNAL = 5, + SCIMACNAL = 6, + ROUTER = 7, + IBNAL = 8, NAL_ENUM_END_MARKER }; #ifdef __KERNEL__ extern ptl_handle_ni_t kqswnal_ni; extern ptl_handle_ni_t ksocknal_ni; -extern ptl_handle_ni_t ktoenal_ni; extern ptl_handle_ni_t kgmnal_ni; extern ptl_handle_ni_t kibnal_ni; extern ptl_handle_ni_t kscimacnal_ni; diff --git a/lnet/klnds/Makefile.am b/lnet/klnds/Makefile.am index 25aab9d..df6ee5c 100644 --- a/lnet/klnds/Makefile.am +++ b/lnet/klnds/Makefile.am @@ -3,5 +3,5 @@ # This code is issued under the GNU General Public License. # See the file COPYING in this distribution -DIST_SUBDIRS= socknal toenal qswnal gmnal scimacnal ibnal -SUBDIRS= socknal toenal @QSWNAL@ @GMNAL@ @SCIMACNAL@ @IBNAL@ +DIST_SUBDIRS= socknal qswnal gmnal scimacnal ibnal +SUBDIRS= socknal @QSWNAL@ @GMNAL@ @SCIMACNAL@ @IBNAL@ diff --git a/lnet/klnds/toelnd/.cvsignore b/lnet/klnds/toelnd/.cvsignore deleted file mode 100644 index e995588..0000000 --- a/lnet/klnds/toelnd/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -.deps -Makefile -Makefile.in diff --git a/lnet/klnds/toelnd/Makefile.am b/lnet/klnds/toelnd/Makefile.am deleted file mode 100644 index 9bfff64..0000000 --- a/lnet/klnds/toelnd/Makefile.am +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (C) 2001 Cluster File Systems, Inc. -# -# This code is issued under the GNU General Public License. -# See the file COPYING in this distribution - -include ../../Rules.linux - -MODULE = ktoenal -modulenet_DATA = ktoenal.o -EXTRA_PROGRAMS = ktoenal - -DEFS = -ktoenal_SOURCES = toenal.c toenal_cb.c toenal.h diff --git a/lnet/klnds/toelnd/toenal.c b/lnet/klnds/toelnd/toenal.c deleted file mode 100644 index 07b93cb..0000000 --- a/lnet/klnds/toelnd/toenal.c +++ /dev/null @@ -1,629 +0,0 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * - * Copyright (C) 2001, 2002 Cluster File Systems, Inc. - * Author: Zach Brown - * Author: Peter J. Braam - * Author: Phil Schwan - * Author: Eric Barton - * Author: Kedar Sovani - * Author: Amey Inamdar - * - * This file is part of Portals, http://www.sf.net/projects/lustre/ - * - * Portals is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * Portals is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * 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 -#include "toenal.h" - -ptl_handle_ni_t ktoenal_ni; -static nal_t ktoenal_api; -static ksock_nal_data_t ktoenal_data; - -/* -ksocknal_interface_t ktoenal_interface = { - ksni_add_sock: ktoenal_add_sock, - ksni_close_sock: ktoenal_close_sock, - ksni_set_mynid: ktoenal_set_mynid, -}; -*/ - -kpr_nal_interface_t ktoenal_router_interface = { - kprni_nalid: TOENAL, - kprni_arg: &ktoenal_data, - kprni_fwd: ktoenal_fwd_packet, -}; - - -int -ktoenal_api_forward(nal_t *nal, int id, void *args, size_t args_len, - void *ret, size_t ret_len) -{ - ksock_nal_data_t *k; - nal_cb_t *nal_cb; - - k = nal->nal_data; - nal_cb = k->ksnd_nal_cb; - - lib_dispatch(nal_cb, k, id, args, ret); /* ktoenal_send needs k */ - return PTL_OK; -} - -int -ktoenal_api_shutdown(nal_t *nal, int ni) -{ - CDEBUG (D_NET, "closing all connections\n"); - - return ktoenal_close_sock(0); /* close all sockets */ -} - -void -ktoenal_api_yield(nal_t *nal) -{ - our_cond_resched(); - return; -} - -void -ktoenal_api_lock(nal_t *nal, unsigned long *flags) -{ - ksock_nal_data_t *k; - nal_cb_t *nal_cb; - - k = nal->nal_data; - nal_cb = k->ksnd_nal_cb; - nal_cb->cb_cli(nal_cb,flags); -} - -void -ktoenal_api_unlock(nal_t *nal, unsigned long *flags) -{ - ksock_nal_data_t *k; - nal_cb_t *nal_cb; - - k = nal->nal_data; - nal_cb = k->ksnd_nal_cb; - nal_cb->cb_sti(nal_cb,flags); -} - -nal_t * -ktoenal_init(int interface, ptl_pt_index_t ptl_size, - ptl_ac_index_t ac_size, ptl_pid_t requested_pid) -{ - CDEBUG(D_NET, "calling lib_init with nid "LPX64"\n", - ktoenal_data.ksnd_mynid); - lib_init(&ktoenal_lib, ktoenal_data.ksnd_mynid, 0, 10, ptl_size, - ac_size); - return (&ktoenal_api); -} - -/* - * EXTRA functions follow - */ -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) -#define SOCKET_I(inode) (&(inode)->u.socket_i) -#endif -static __inline__ struct socket * -socki_lookup(struct inode *inode) -{ - return SOCKET_I(inode); -} - -int -ktoenal_set_mynid(ptl_nid_t nid) -{ - lib_ni_t *ni = &ktoenal_lib.ni; - - /* FIXME: we have to do this because we call lib_init() at module - * insertion time, which is before we have 'mynid' available. lib_init - * sets the NAL's nid, which it uses to tell other nodes where packets - * are coming from. This is not a very graceful solution to this - * problem. */ - - CDEBUG(D_IOCTL, "setting mynid to "LPX64" (old nid="LPX64")\n", nid, ni->nid); - - ktoenal_data.ksnd_mynid = nid; - ni->nid = nid; - return (0); -} - -int -ktoenal_add_sock (ptl_nid_t nid, int fd) -{ - unsigned long flags; - ksock_conn_t *conn; - struct file *file = NULL; - struct socket *sock = NULL; - int ret; - ENTRY; - - file = fget(fd); - if (file == NULL) - RETURN(-EINVAL); - - ret = -EINVAL; - sock = socki_lookup(file->f_dentry->d_inode); - if (sock == NULL) - GOTO(error, ret); - - ret = -ENOMEM; - PORTAL_ALLOC(conn, sizeof(*conn)); - if (!conn) - GOTO(error, ret); - - memset (conn, 0, sizeof (conn)); /* zero for consistency */ - file->f_flags |= O_NONBLOCK; /* Does this have any conflicts */ - conn->ksnc_file = file; - conn->ksnc_sock = sock; - conn->ksnc_peernid = nid; - atomic_set (&conn->ksnc_refcount, 1); /* 1 ref for socklist */ - - conn->ksnc_rx_ready = 0; - conn->ksnc_rx_scheduled = 0; - ktoenal_new_packet (conn, 0); - - INIT_LIST_HEAD (&conn->ksnc_tx_queue); - conn->ksnc_tx_ready = 0; - conn->ksnc_tx_scheduled = 0; - - LASSERT (!in_interrupt()); - write_lock_irqsave (&ktoenal_data.ksnd_socklist_lock, flags); - - list_add(&conn->ksnc_list, &ktoenal_data.ksnd_socklist); - write_unlock_irqrestore (&ktoenal_data.ksnd_socklist_lock, flags); - - ktoenal_data_ready(conn); - ktoenal_write_space(conn); - - ktoenal_data.ksnd_slistchange = 1; - wake_up_process(ktoenal_data.ksnd_pollthread_tsk); - /* Schedule pollthread so that it will poll - * for newly created socket - */ - - - CDEBUG(D_IOCTL, "conn [%p] registered for nid "LPX64"\n", - conn, conn->ksnc_peernid); - - /* Can't unload while connection active */ - PORTAL_MODULE_USE; - RETURN(0); - -error: - fput(file); - return (ret); -} - -/* Passing in a zero nid will close all connections */ -int -ktoenal_close_sock(ptl_nid_t nid) -{ - unsigned long flags; - ksock_conn_t *conn; - LIST_HEAD (death_row); - struct list_head *tmp; - - LASSERT (!in_interrupt()); - write_lock_irqsave (&ktoenal_data.ksnd_socklist_lock, flags); - - if (nid == 0) /* close ALL connections */ - { - /* insert 'death row' into the socket list... */ - list_add (&death_row, &ktoenal_data.ksnd_socklist); - /* ...extract and reinitialise the socket list itself... */ - list_del_init (&ktoenal_data.ksnd_socklist); - /* ...and voila, death row is the proud owner of all conns */ - } else list_for_each (tmp, &ktoenal_data.ksnd_socklist) { - - conn = list_entry (tmp, ksock_conn_t, ksnc_list); - - if (conn->ksnc_peernid == nid) - { - list_del (&conn->ksnc_list); - list_add (&conn->ksnc_list, &death_row); - break; - } - } - - - write_unlock_irqrestore (&ktoenal_data.ksnd_socklist_lock, flags); - - if (list_empty (&death_row)) - return (-ENOENT); - - do { - conn = list_entry (death_row.next, ksock_conn_t, ksnc_list); - list_del (&conn->ksnc_list); - ktoenal_put_conn (conn); /* drop ref for ksnd_socklist */ - } while (!list_empty (&death_row)); - - ktoenal_data.ksnd_slistchange = 1; - wake_up_process(ktoenal_data.ksnd_pollthread_tsk); - - return (0); -} - - -ksock_conn_t * -ktoenal_get_conn (ptl_nid_t nid) -{ - struct list_head *tmp; - ksock_conn_t *conn; - - PROF_START(conn_list_walk); - - read_lock (&ktoenal_data.ksnd_socklist_lock); - - list_for_each(tmp, &ktoenal_data.ksnd_socklist) { - - conn = list_entry(tmp, ksock_conn_t, ksnc_list); - - if (conn->ksnc_peernid == nid) - { - /* caller is referencing */ - atomic_inc (&conn->ksnc_refcount); - - read_unlock (&ktoenal_data.ksnd_socklist_lock); - - CDEBUG(D_NET, "got conn [%p] -> "LPX64" (%d)\n", - conn, nid, atomic_read (&conn->ksnc_refcount)); - - PROF_FINISH(conn_list_walk); - return (conn); - } - } - - read_unlock (&ktoenal_data.ksnd_socklist_lock); - - CDEBUG(D_NET, "No connection found when looking for nid "LPX64"\n", nid); - PROF_FINISH(conn_list_walk); - return (NULL); -} - -void -ktoenal_close_conn (ksock_conn_t *conn) -{ - CDEBUG (D_NET, "connection [%p] closed \n", conn); - - fput (conn->ksnc_file); - PORTAL_FREE (conn, sizeof (*conn)); - /* One less connection keeping us hanging on */ - PORTAL_MODULE_UNUSE; -} - -void -_ktoenal_put_conn (ksock_conn_t *conn) -{ - unsigned long flags; - - CDEBUG (D_NET, "connection [%p] handed the black spot\n", conn); - - /* "But what is the black spot, captain?" I asked. - * "That's a summons, mate..." */ - - LASSERT (atomic_read (&conn->ksnc_refcount) == 0); - LASSERT (!conn->ksnc_rx_scheduled); - - if (!in_interrupt()) - { - ktoenal_close_conn (conn); - return; - } - - spin_lock_irqsave (&ktoenal_data.ksnd_reaper_lock, flags); - - list_add (&conn->ksnc_list, &ktoenal_data.ksnd_reaper_list); - wake_up (&ktoenal_data.ksnd_reaper_waitq); - - spin_unlock_irqrestore (&ktoenal_data.ksnd_reaper_lock, flags); -} - -void -ktoenal_free_buffers (void) -{ - if (ktoenal_data.ksnd_fmbs != NULL) - { - ksock_fmb_t *fmb = (ksock_fmb_t *)ktoenal_data.ksnd_fmbs; - int i; - int j; - - for (i = 0; i < (SOCKNAL_SMALL_FWD_NMSGS + SOCKNAL_LARGE_FWD_NMSGS); i++, fmb++) - for (j = 0; j < fmb->fmb_npages; j++) - if (fmb->fmb_pages[j] != NULL) - __free_page (fmb->fmb_pages[j]); - - PORTAL_FREE (ktoenal_data.ksnd_fmbs, - sizeof (ksock_fmb_t) * (SOCKNAL_SMALL_FWD_NMSGS + SOCKNAL_LARGE_FWD_NMSGS)); - } - - if (ktoenal_data.ksnd_ltxs != NULL) - PORTAL_FREE (ktoenal_data.ksnd_ltxs, - sizeof (ksock_ltx_t) * (SOCKNAL_NLTXS + SOCKNAL_NNBLK_LTXS)); -} - -int -ktoenal_cmd(struct portals_cfg *pcfg, void * private) -{ - int rc = -EINVAL; - - LASSERT (pcfg != NULL); - - switch(pcfg->pcfg_command) { - case NAL_CMD_REGISTER_PEER_FD: { - rc = ktoenal_add_sock(pcfg->pcfg_nid, pcfg->pcfg_fd); - break; - } - case NAL_CMD_CLOSE_CONNECTION: { - rc = ktoenal_close_sock(pcfg->pcfg_nid); - break; - } - case NAL_CMD_REGISTER_MYNID: { - rc = ktoenal_set_mynid (pcfg->pcfg_nid); - break; - } - } - - return rc; -} - - -void /*__exit*/ -ktoenal_module_fini (void) -{ - CDEBUG(D_MALLOC, "before NAL cleanup: kmem %d\n", - atomic_read (&portal_kmemory)); - - switch (ktoenal_data.ksnd_init) - { - default: - LASSERT (0); - - case SOCKNAL_INIT_ALL: - kportal_nal_unregister(TOENAL); - PORTAL_SYMBOL_UNREGISTER (ktoenal_ni); - /* fall through */ - - case SOCKNAL_INIT_PTL: - PtlNIFini(ktoenal_ni); - lib_fini(&ktoenal_lib); - /* fall through */ - - case SOCKNAL_INIT_DATA: - /* Module refcount only gets to zero when all connections - * have been closed so all lists must be empty */ - LASSERT (list_empty (&ktoenal_data.ksnd_socklist)); - LASSERT (list_empty (&ktoenal_data.ksnd_reaper_list)); - LASSERT (list_empty (&ktoenal_data.ksnd_rx_conns)); - LASSERT (list_empty (&ktoenal_data.ksnd_tx_conns)); - LASSERT (list_empty (&ktoenal_data.ksnd_small_fmp.fmp_blocked_conns)); - LASSERT (list_empty (&ktoenal_data.ksnd_large_fmp.fmp_blocked_conns)); - - kpr_shutdown (&ktoenal_data.ksnd_router); /* stop router calling me */ - - /* flag threads to terminate; wake and wait for them to die */ - ktoenal_data.ksnd_shuttingdown = 1; - wake_up_all (&ktoenal_data.ksnd_reaper_waitq); - wake_up_all (&ktoenal_data.ksnd_sched_waitq); - wake_up_process(ktoenal_data.ksnd_pollthread_tsk); - - while (atomic_read (&ktoenal_data.ksnd_nthreads) != 0) - { - CDEBUG (D_NET, "waitinf for %d threads to terminate\n", - atomic_read (&ktoenal_data.ksnd_nthreads)); - set_current_state (TASK_UNINTERRUPTIBLE); - schedule_timeout (HZ); - } - - kpr_deregister (&ktoenal_data.ksnd_router); - - ktoenal_free_buffers(); - /* fall through */ - - case SOCKNAL_INIT_NOTHING: - break; - } - - CDEBUG(D_MALLOC, "after NAL cleanup: kmem %d\n", - atomic_read (&portal_kmemory)); - - printk(KERN_INFO "Lustre: Routing socket NAL unloaded (final mem %d)\n", - atomic_read(&portal_kmemory)); -} - -int __init -ktoenal_module_init (void) -{ - int pkmem = atomic_read(&portal_kmemory); - int rc; - int i; - int j; - - /* packet descriptor must fit in a router descriptor's scratchpad */ - LASSERT(sizeof (ksock_tx_t) <= sizeof (kprfd_scratch_t)); - - LASSERT (ktoenal_data.ksnd_init == SOCKNAL_INIT_NOTHING); - - ktoenal_api.forward = ktoenal_api_forward; - ktoenal_api.shutdown = ktoenal_api_shutdown; - ktoenal_api.yield = ktoenal_api_yield; - ktoenal_api.validate = NULL; /* our api validate is a NOOP */ - ktoenal_api.lock = ktoenal_api_lock; - ktoenal_api.unlock = ktoenal_api_unlock; - ktoenal_api.nal_data = &ktoenal_data; - - ktoenal_lib.nal_data = &ktoenal_data; - - memset (&ktoenal_data, 0, sizeof (ktoenal_data)); /* zero pointers */ - - INIT_LIST_HEAD(&ktoenal_data.ksnd_socklist); - rwlock_init(&ktoenal_data.ksnd_socklist_lock); - - ktoenal_data.ksnd_nal_cb = &ktoenal_lib; - spin_lock_init (&ktoenal_data.ksnd_nal_cb_lock); - - spin_lock_init (&ktoenal_data.ksnd_sched_lock); - - init_waitqueue_head (&ktoenal_data.ksnd_sched_waitq); - - INIT_LIST_HEAD (&ktoenal_data.ksnd_rx_conns); - INIT_LIST_HEAD (&ktoenal_data.ksnd_tx_conns); - - INIT_LIST_HEAD(&ktoenal_data.ksnd_small_fmp.fmp_idle_fmbs); - INIT_LIST_HEAD(&ktoenal_data.ksnd_small_fmp.fmp_blocked_conns); - INIT_LIST_HEAD(&ktoenal_data.ksnd_large_fmp.fmp_idle_fmbs); - INIT_LIST_HEAD(&ktoenal_data.ksnd_large_fmp.fmp_blocked_conns); - - INIT_LIST_HEAD(&ktoenal_data.ksnd_idle_nblk_ltx_list); - INIT_LIST_HEAD(&ktoenal_data.ksnd_idle_ltx_list); - init_waitqueue_head(&ktoenal_data.ksnd_idle_ltx_waitq); - - INIT_LIST_HEAD (&ktoenal_data.ksnd_reaper_list); - init_waitqueue_head(&ktoenal_data.ksnd_reaper_waitq); - spin_lock_init (&ktoenal_data.ksnd_reaper_lock); - - ktoenal_data.ksnd_init = SOCKNAL_INIT_DATA; /* flag lists/ptrs/locks initialised */ - - PORTAL_ALLOC(ktoenal_data.ksnd_fmbs, - sizeof(ksock_fmb_t) * (SOCKNAL_SMALL_FWD_NMSGS + SOCKNAL_LARGE_FWD_NMSGS)); - if (ktoenal_data.ksnd_fmbs == NULL) - RETURN(-ENOMEM); - - /* NULL out buffer pointers etc */ - memset(ktoenal_data.ksnd_fmbs, 0, - sizeof(ksock_fmb_t) * (SOCKNAL_SMALL_FWD_NMSGS + SOCKNAL_LARGE_FWD_NMSGS)); - - for (i = 0; i < (SOCKNAL_SMALL_FWD_NMSGS + SOCKNAL_LARGE_FWD_NMSGS); i++) - { - ksock_fmb_t *fmb = &((ksock_fmb_t *)ktoenal_data.ksnd_fmbs)[i]; - - if (i < SOCKNAL_SMALL_FWD_NMSGS) - { - fmb->fmb_npages = SOCKNAL_SMALL_FWD_PAGES; - fmb->fmb_pool = &ktoenal_data.ksnd_small_fmp; - } - else - { - fmb->fmb_npages = SOCKNAL_LARGE_FWD_PAGES; - fmb->fmb_pool = &ktoenal_data.ksnd_large_fmp; - } - - LASSERT (fmb->fmb_npages > 0); - for (j = 0; j < fmb->fmb_npages; j++) - { - fmb->fmb_pages[j] = alloc_page(GFP_KERNEL); - - if (fmb->fmb_pages[j] == NULL) - { - ktoenal_module_fini (); - return (-ENOMEM); - } - - LASSERT (page_address (fmb->fmb_pages[j]) != NULL); - } - - list_add (&fmb->fmb_list, &fmb->fmb_pool->fmp_idle_fmbs); - } - - PORTAL_ALLOC(ktoenal_data.ksnd_ltxs, - sizeof (ksock_ltx_t) * (SOCKNAL_NLTXS + SOCKNAL_NNBLK_LTXS)); - if (ktoenal_data.ksnd_ltxs == NULL) - { - ktoenal_module_fini (); - return (-ENOMEM); - } - - /* Deterministic bugs please */ - memset (ktoenal_data.ksnd_ltxs, 0xeb, - sizeof (ksock_ltx_t) * (SOCKNAL_NLTXS + SOCKNAL_NNBLK_LTXS)); - - for (i = 0; i < SOCKNAL_NLTXS + SOCKNAL_NNBLK_LTXS; i++) - { - ksock_ltx_t *ltx = &((ksock_ltx_t *)ktoenal_data.ksnd_ltxs)[i]; - - ltx->ltx_idle = i < SOCKNAL_NLTXS ? - &ktoenal_data.ksnd_idle_ltx_list : - &ktoenal_data.ksnd_idle_nblk_ltx_list; - list_add (<x->ltx_tx.tx_list, ltx->ltx_idle); - } - - rc = PtlNIInit(ktoenal_init, 32, 4, 0, &ktoenal_ni); - if (rc != 0) - { - CERROR("ktoenal: PtlNIInit failed: error %d\n", rc); - ktoenal_module_fini (); - RETURN (rc); - } - PtlNIDebug(ktoenal_ni, ~0); - - ktoenal_data.ksnd_init = SOCKNAL_INIT_PTL; /* flag PtlNIInit() called */ - - ktoenal_data.ksnd_slistchange = 1; - for (i = 0; i < TOENAL_N_SCHED; i++) - { - rc = ktoenal_thread_start (ktoenal_scheduler, NULL); - if (rc != 0) - { - CERROR("Can't spawn socknal scheduler[%d]: %d\n", i, rc); - ktoenal_module_fini (); - RETURN (rc); - } - } - - rc = ktoenal_thread_start (ktoenal_reaper, NULL); - if (rc != 0) - { - CERROR("Can't spawn socknal reaper: %d\n", rc); - ktoenal_module_fini (); - RETURN (rc); - } - - rc = ktoenal_thread_start (ktoenal_pollthread, NULL); - if (rc != 0) - { - CERROR("Can't spawn socknal pollthread: %d\n", rc); - ktoenal_module_fini (); - RETURN (rc); - } - - rc = kpr_register(&ktoenal_data.ksnd_router, - &ktoenal_router_interface); - if (rc != 0) - CDEBUG (D_NET, "Can't initialise routing interface (rc = %d): not routing\n", rc); - - rc = kportal_nal_register(TOENAL, &ktoenal_cmd, NULL); - if (rc != 0) - CDEBUG(D_NET, "Can't initialise command interface (rc = %d)\n", - rc); - - PORTAL_SYMBOL_REGISTER(ktoenal_ni); - - /* flag everything initialised */ - ktoenal_data.ksnd_init = SOCKNAL_INIT_ALL; - - printk(KERN_INFO "Lustre: Routing TOE NAL loaded (Routing %s, initial mem %d)\n", - kpr_routing(&ktoenal_data.ksnd_router) ? "enabled" : "disabled", - pkmem); - - return (0); -} - -MODULE_AUTHOR("Cluster File Systems, Inc. "); -MODULE_DESCRIPTION("Kernel TCP Socket NAL v0.01"); -MODULE_LICENSE("GPL"); - -module_init(ktoenal_module_init); -module_exit(ktoenal_module_fini); - -EXPORT_SYMBOL (ktoenal_ni); diff --git a/lnet/klnds/toelnd/toenal.h b/lnet/klnds/toelnd/toenal.h deleted file mode 100644 index b211d6c..0000000 --- a/lnet/klnds/toelnd/toenal.h +++ /dev/null @@ -1,236 +0,0 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * - * Copyright (C) 2001, 2002 Cluster File Systems, Inc. - * Author: Zach Brown - * Author: Peter J. Braam - * Author: Phil Schwan - * Author: Eric Barton - * Author: Kedar Sovani - * Author: Amey Inamdar - * - * This file is part of Portals, http://www.sf.net/projects/lustre/ - * - * Portals is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * Portals is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * 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. - * - */ - -#define DEBUG_PORTAL_ALLOC -#ifndef EXPORT_SYMTAB -# define EXPORT_SYMTAB -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include - -#define DEBUG_SUBSYSTEM S_SOCKNAL - -#include -#include -#include - -#define SOCKNAL_NLTXS 128 /* # normal transmit messages */ -#define SOCKNAL_NNBLK_LTXS 128 /* # transmit messages reserved if can't block */ - -#define SOCKNAL_SMALL_FWD_NMSGS 128 /* # small messages I can be forwarding at any time */ -#define SOCKNAL_LARGE_FWD_NMSGS 32 /* # large messages I can be forwarding at any time */ - -#define SOCKNAL_SMALL_FWD_PAGES 1 /* # pages in a small message fwd buffer */ - -#define SOCKNAL_LARGE_FWD_PAGES (PAGE_ALIGN (sizeof (ptl_hdr_t) + PTL_MTU) >> PAGE_SHIFT) - /* # pages in a large message fwd buffer */ - -#define SOCKNAL_RESCHED 100 /* # scheduler loops before reschedule */ - -#define SOCKNAL_TX_LOW_WATER(sk) (((sk)->sndbuf*8)/10) - -#define TOENAL_N_SCHED 1 - -typedef struct /* pool of forwarding buffers */ -{ - struct list_head fmp_idle_fmbs; /* buffers waiting for a connection */ - struct list_head fmp_blocked_conns; /* connections waiting for a buffer */ -} ksock_fmb_pool_t; - -typedef struct { - int ksnd_init; /* initialisation state */ - - struct list_head ksnd_socklist; /* all my connections */ - rwlock_t ksnd_socklist_lock; /* stabilise add/find/remove */ - - - ptl_nid_t ksnd_mynid; - nal_cb_t *ksnd_nal_cb; - spinlock_t ksnd_nal_cb_lock; /* lib cli/sti lock */ - - atomic_t ksnd_nthreads; /* # live threads */ - int ksnd_shuttingdown; /* tell threads to exit */ - - kpr_router_t ksnd_router; /* THE router */ - - spinlock_t ksnd_sched_lock; /* serialise packet scheduling */ - wait_queue_head_t ksnd_sched_waitq; /* where scheduler(s) wait */ - - struct list_head ksnd_rx_conns; /* conn waiting to be read */ - struct list_head ksnd_tx_conns; /* conn waiting to be written */ - - void *ksnd_fmbs; /* all the pre-allocated FMBs */ - ksock_fmb_pool_t ksnd_small_fmp; /* small message forwarding buffers */ - ksock_fmb_pool_t ksnd_large_fmp; /* large message forwarding buffers */ - - void *ksnd_ltxs; /* all the pre-allocated LTXs */ - struct list_head ksnd_idle_ltx_list; /* where to get an idle LTX */ - struct list_head ksnd_idle_nblk_ltx_list; /* where to get an idle LTX if you can't block */ - wait_queue_head_t ksnd_idle_ltx_waitq; /* where to block for an idle LTX */ - - struct list_head ksnd_reaper_list; /* conn waiting to be reaped */ - wait_queue_head_t ksnd_reaper_waitq; /* reaper sleeps here */ - spinlock_t ksnd_reaper_lock; /* serialise */ - - struct task_struct *ksnd_pollthread_tsk;/* task_struct for the poll thread */ - poll_table ksnd_pwait; /* poll wait table for the socket */ - int ksnd_slistchange; /* informs the pollthread that - * the socklist has changed */ -} ksock_nal_data_t; - -#define SOCKNAL_INIT_NOTHING 0 -#define SOCKNAL_INIT_DATA 1 -#define SOCKNAL_INIT_PTL 2 -#define SOCKNAL_INIT_ALL 3 - -typedef struct /* transmit packet */ -{ - struct list_head tx_list; /* queue on conn for transmission etc */ - char tx_isfwd; /* forwarding / sourced here */ - int tx_nob; /* # packet bytes */ - int tx_niov; /* # packet frags */ - struct iovec *tx_iov; /* packet frags */ -} ksock_tx_t; - -typedef struct /* locally transmitted packet */ -{ - ksock_tx_t ltx_tx; /* send info */ - struct list_head *ltx_idle; /* where to put when idle */ - void *ltx_private; /* lib_finalize() callback arg */ - void *ltx_cookie; /* lib_finalize() callback arg */ - struct iovec ltx_iov[1 + PTL_MD_MAX_IOV]; /* msg frags */ - ptl_hdr_t ltx_hdr; /* buffer for packet header */ -} ksock_ltx_t; - -#define KSOCK_TX_2_KPR_FWD_DESC(ptr) list_entry (ptr, kpr_fwd_desc_t, kprfd_scratch) -/* forwarded packets (router->socknal) embedded in kpr_fwd_desc_t::kprfd_scratch */ - -#define KSOCK_TX_2_KSOCK_LTX(ptr) list_entry (ptr, ksock_ltx_t, ltx_tx) -/* local packets (lib->socknal) embedded in ksock_ltx_t::ltx_tx */ - -/* NB list_entry() is used here as convenient macro for calculating a - * pointer to a struct from the addres of a member. - */ - -typedef struct /* Kernel portals Socket Forwarding message buffer */ -{ /* (socknal->router) */ - struct list_head fmb_list; /* queue idle */ - kpr_fwd_desc_t fmb_fwd; /* router's descriptor */ - int fmb_npages; /* # pages allocated */ - ksock_fmb_pool_t *fmb_pool; /* owning pool */ - struct page *fmb_pages[SOCKNAL_LARGE_FWD_PAGES]; - struct iovec fmb_iov[SOCKNAL_LARGE_FWD_PAGES]; -} ksock_fmb_t; - -#define SOCKNAL_RX_HEADER 1 /* reading header */ -#define SOCKNAL_RX_BODY 2 /* reading body (to deliver here) */ -#define SOCKNAL_RX_BODY_FWD 3 /* reading body (to forward) */ -#define SOCKNAL_RX_SLOP 4 /* skipping body */ -#define SOCKNAL_RX_GET_FMB 5 /* scheduled for forwarding */ -#define SOCKNAL_RX_FMB_SLEEP 6 /* blocked waiting for a fwd desc */ - -typedef struct -{ - struct list_head ksnc_list; /* stash on global socket list */ - struct file *ksnc_file; /* socket filp */ - struct socket *ksnc_sock; /* socket */ - ptl_nid_t ksnc_peernid; /* who's on the other end */ - atomic_t ksnc_refcount; /* # users */ - - /* READER */ - struct list_head ksnc_rx_list; /* where I enq waiting input or a forwarding descriptor */ - unsigned long ksnc_rx_ready; /* data ready to read */ - int ksnc_rx_scheduled; /* being progressed */ - int ksnc_rx_state; /* what is being read */ - int ksnc_rx_nob_left; /* # bytes to next hdr/body */ - int ksnc_rx_nob_wanted; /* bytes actually wanted */ - int ksnc_rx_niov; /* # frags */ - struct iovec ksnc_rx_iov[1 + PTL_MD_MAX_IOV]; /* the frags */ - - void *ksnc_cookie; /* rx lib_finalize passthru arg */ - ptl_hdr_t ksnc_hdr; /* where I read headers into */ - - /* WRITER */ - struct list_head ksnc_tx_list; /* where I enq waiting for output space */ - struct list_head ksnc_tx_queue; /* packets waiting to be sent */ - unsigned long ksnc_tx_ready; /* write space */ - int ksnc_tx_scheduled; /* being progressed */ - -} ksock_conn_t; - -extern int ktoenal_add_sock (ptl_nid_t nid, int fd); -extern int ktoenal_close_sock(ptl_nid_t nid); -extern int ktoenal_set_mynid(ptl_nid_t nid); -extern int ktoenal_push_sock(ptl_nid_t nid); -extern ksock_conn_t *ktoenal_get_conn (ptl_nid_t nid); -extern void _ktoenal_put_conn (ksock_conn_t *conn); -extern void ktoenal_close_conn (ksock_conn_t *conn); - -static inline void -ktoenal_put_conn (ksock_conn_t *conn) -{ - CDEBUG (D_OTHER, "putting conn[%p] -> "LPX64" (%d)\n", - conn, conn->ksnc_peernid, atomic_read (&conn->ksnc_refcount)); - - if (atomic_dec_and_test (&conn->ksnc_refcount)) - _ktoenal_put_conn (conn); -} - -extern int ktoenal_thread_start (int (*fn)(void *arg), void *arg); -extern int ktoenal_new_packet (ksock_conn_t *conn, int skip); -extern void ktoenal_fwd_packet (void *arg, kpr_fwd_desc_t *fwd); -extern int ktoenal_scheduler (void *arg); -extern int ktoenal_reaper (void *arg); -extern int ktoenal_pollthread (void *arg); -extern void ktoenal_data_ready(ksock_conn_t *conn); -extern void ktoenal_write_space(ksock_conn_t *conn); - - -extern nal_cb_t ktoenal_lib; -extern ksock_nal_data_t ktoenal_data; diff --git a/lnet/klnds/toelnd/toenal_cb.c b/lnet/klnds/toelnd/toenal_cb.c deleted file mode 100644 index 3af9e33..0000000 --- a/lnet/klnds/toelnd/toenal_cb.c +++ /dev/null @@ -1,1202 +0,0 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * - * Copyright (C) 2001, 2002 Cluster File Systems, Inc. - * Author: Zach Brown - * Author: Peter J. Braam - * Author: Phil Schwan - * Author: Eric Barton - * Author: Kedar Sovani - * Author: Amey Inamdar - * - * This file is part of Portals, http://www.sf.net/projects/lustre/ - * - * Portals is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * Portals is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * 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 -#include "toenal.h" - -atomic_t ktoenal_packets_received; -long ktoenal_packets_launched; -long ktoenal_packets_transmitted; - -/* - * LIB functions follow - * - */ -int -ktoenal_read(nal_cb_t *nal, void *private, void *dst_addr, - user_ptr src_addr, size_t len) -{ - CDEBUG(D_NET, LPX64": reading %ld bytes from %p -> %p\n", - nal->ni.nid, (long)len, src_addr, dst_addr); - - memcpy( dst_addr, src_addr, len ); - return 0; -} - -int -ktoenal_write(nal_cb_t *nal, void *private, user_ptr dst_addr, - void *src_addr, size_t len) -{ - CDEBUG(D_NET, LPX64": writing %ld bytes from %p -> %p\n", - nal->ni.nid, (long)len, src_addr, dst_addr); - - memcpy( dst_addr, src_addr, len ); - return 0; -} - -int -ktoenal_callback (nal_cb_t * nal, void *private, lib_eq_t *eq, - ptl_event_t *ev) -{ - CDEBUG(D_NET, LPX64": callback eq %p ev %p\n", - nal->ni.nid, eq, ev); - - if (eq->event_callback != NULL) - eq->event_callback(ev); - - return 0; -} - -void * -ktoenal_malloc(nal_cb_t *nal, size_t len) -{ - void *buf; - - PORTAL_ALLOC(buf, len); - - if (buf != NULL) - memset(buf, 0, len); - - return (buf); -} - -void -ktoenal_free(nal_cb_t *nal, void *buf, size_t len) -{ - PORTAL_FREE(buf, len); -} - -void -ktoenal_printf(nal_cb_t *nal, const char *fmt, ...) -{ - va_list ap; - char msg[256]; - - va_start (ap, fmt); - vsnprintf (msg, sizeof (msg), fmt, ap); /* sprint safely */ - va_end (ap); - - msg[sizeof (msg) - 1] = 0; /* ensure terminated */ - - CDEBUG (D_NET, "%s", msg); -} - -void -ktoenal_cli(nal_cb_t *nal, unsigned long *flags) -{ - ksock_nal_data_t *data = nal->nal_data; - - spin_lock(&data->ksnd_nal_cb_lock); -} - -void -ktoenal_sti(nal_cb_t *nal, unsigned long *flags) -{ - ksock_nal_data_t *data; - data = nal->nal_data; - - spin_unlock(&data->ksnd_nal_cb_lock); -} - -int -ktoenal_dist(nal_cb_t *nal, ptl_nid_t nid, unsigned long *dist) -{ - /* I would guess that if ktoenal_get_conn(nid) == NULL, - and we're not routing, then 'nid' is very distant :) */ - if ( nal->ni.nid == nid ) { - *dist = 0; - } else { - *dist = 1; - } - - return 0; -} - -ksock_ltx_t * -ktoenal_get_ltx (int may_block) -{ - unsigned long flags; - ksock_ltx_t *ltx = NULL; - - for (;;) - { - spin_lock_irqsave (&ktoenal_data.ksnd_sched_lock, flags); - - if (!list_empty (&ktoenal_data.ksnd_idle_ltx_list)) - { - ltx = list_entry (ktoenal_data.ksnd_idle_ltx_list.next, ksock_ltx_t, ltx_tx.tx_list); - list_del (<x->ltx_tx.tx_list); - break; - } - - if (!may_block) - { - if (!list_empty (&ktoenal_data.ksnd_idle_nblk_ltx_list)) - { - ltx = list_entry (ktoenal_data.ksnd_idle_nblk_ltx_list.next, - ksock_ltx_t, ltx_tx.tx_list); - list_del (<x->ltx_tx.tx_list); - } - break; - } - - spin_unlock_irqrestore (&ktoenal_data.ksnd_sched_lock, flags); - - wait_event (ktoenal_data.ksnd_idle_ltx_waitq, - !list_empty (&ktoenal_data.ksnd_idle_ltx_list)); - } - - spin_unlock_irqrestore (&ktoenal_data.ksnd_sched_lock, flags); - - return (ltx); -} - -int -ktoenal_sendmsg (struct file *sock, struct iovec *iov, int niov, int nob, int flags) -{ - /* NB This procedure "consumes" iov (actually we do, tcp_sendmsg doesn't) - */ - mm_segment_t oldmm; - int rc; - - LASSERT (niov > 0); - LASSERT (nob > 0); - - oldmm = get_fs(); - set_fs (KERNEL_DS); - -#ifdef PORTAL_DEBUG - { - int total_nob; - int i; - - for (i = total_nob = 0; i < niov; i++) - total_nob += iov[i].iov_len; - - LASSERT (nob == total_nob); - } -#endif - LASSERT (!in_interrupt()); - - rc = sock->f_op->writev(sock, iov, niov, NULL); - - set_fs (oldmm); - - if (rc > 0) /* sent something? */ - { - nob = rc; /* consume iov */ - for (;;) - { - LASSERT (niov > 0); - - if (iov->iov_len >= nob) - { - iov->iov_len -= nob; - iov->iov_base = (void *)(((unsigned long)iov->iov_base) + nob); - break; - } - nob -= iov->iov_len; - iov->iov_len = 0; - iov++; - niov--; - } - } - - return (rc); -} - -int -ktoenal_recvmsg(struct file *sock, struct iovec *iov, int niov, int toread) -{ - /* NB This procedure "consumes" iov (actually tcp_recvmsg does) - */ - mm_segment_t oldmm; - int ret, i, len = 0, origlen = 0; - - PROF_START(our_recvmsg); - for(i = 0; i < niov; i++) { - len += iov[i].iov_len; - if(len >= toread) - break; - } - - if(len >= toread) { - origlen = iov[i].iov_len; - iov[i].iov_len -= (len - toread); - } - else { /* i == niov */ - i = niov - 1; - } - - oldmm = get_fs(); - set_fs(KERNEL_DS); - - ret = sock->f_op->readv(sock, iov, i + 1, NULL); - - set_fs(oldmm); - - if(origlen) - iov[i].iov_len = origlen; - - PROF_FINISH(our_recvmsg); - return ret; -} - -void -ktoenal_process_transmit (ksock_conn_t *conn, unsigned long *irq_flags) -{ - ksock_tx_t *tx = list_entry (conn->ksnc_tx_queue.next, ksock_tx_t, tx_list); - int rc; - - LASSERT (conn->ksnc_tx_scheduled); - LASSERT (conn->ksnc_tx_ready); - LASSERT (!list_empty (&conn->ksnc_tx_queue)); - - /* assume transmit will complete now, so dequeue while I've got the lock */ - list_del (&tx->tx_list); - - spin_unlock_irqrestore (&ktoenal_data.ksnd_sched_lock, *irq_flags); - - LASSERT (tx->tx_nob > 0); - - conn->ksnc_tx_ready = 0; /* write_space may race with me and set ready */ - mb(); /* => clear BEFORE trying to write */ - - rc = ktoenal_sendmsg (conn->ksnc_file, - tx->tx_iov, tx->tx_niov, tx->tx_nob, - list_empty (&conn->ksnc_tx_queue) ? - MSG_DONTWAIT : (MSG_DONTWAIT | MSG_MORE)); - - CDEBUG (D_NET, "send(%d) %d\n", tx->tx_nob, rc); - - if (rc < 0) /* error */ - { - if (rc == -EAGAIN) /* socket full => */ - rc = 0; /* nothing sent */ - else - { - //warning FIXME: handle socket errors properly - CERROR ("Error socknal send(%d) %p: %d\n", tx->tx_nob, conn, rc); - rc = tx->tx_nob; /* kid on for now whole packet went */ - } - } - - if (rc == tx->tx_nob) /* everything went */ - { - conn->ksnc_tx_ready = 1; /* assume more can go (ASAP) */ - ktoenal_put_conn (conn); /* release packet's ref */ - - if (tx->tx_isfwd) /* was a forwarded packet? */ - { - kpr_fwd_done (&ktoenal_data.ksnd_router, - KSOCK_TX_2_KPR_FWD_DESC (tx), 0); - - spin_lock_irqsave (&ktoenal_data.ksnd_sched_lock, *irq_flags); - } - else /* local send */ - { - ksock_ltx_t *ltx = KSOCK_TX_2_KSOCK_LTX (tx); - - lib_finalize (&ktoenal_lib, ltx->ltx_private, ltx->ltx_cookie); - - spin_lock_irqsave (&ktoenal_data.ksnd_sched_lock, *irq_flags); - - list_add (<x->ltx_tx.tx_list, ltx->ltx_idle); - - /* normal tx desc => wakeup anyone blocking for one */ - if (ltx->ltx_idle == &ktoenal_data.ksnd_idle_ltx_list && - waitqueue_active (&ktoenal_data.ksnd_idle_ltx_waitq)) - wake_up (&ktoenal_data.ksnd_idle_ltx_waitq); - } - ktoenal_packets_transmitted++; - } - else - { - tx->tx_nob -= rc; - - spin_lock_irqsave (&ktoenal_data.ksnd_sched_lock, *irq_flags); - - /* back onto HEAD of tx_queue */ - list_add (&tx->tx_list, &conn->ksnc_tx_queue); - } - - if (!conn->ksnc_tx_ready || /* no space to write now */ - list_empty (&conn->ksnc_tx_queue)) /* nothing to write */ - { - conn->ksnc_tx_scheduled = 0; /* not being scheduled */ - ktoenal_put_conn (conn); /* release scheduler's ref */ - } - else /* let scheduler call me again */ - list_add_tail (&conn->ksnc_tx_list, &ktoenal_data.ksnd_tx_conns); -} - -void -ktoenal_launch_packet (ksock_conn_t *conn, ksock_tx_t *tx) -{ - unsigned long flags; - int nob = tx->tx_nob; - struct iovec *iov = tx->tx_iov; - int niov = 1; - - LASSERT (nob >= sizeof (ptl_hdr_t)); - - /* Truncate iov to exactly match total packet length - * since socket sendmsg pays no attention to requested length. - */ - for (;;) - { - LASSERT (niov <= tx->tx_niov); - - if (iov->iov_len >= nob) - { - iov->iov_len = nob; - break; - } - nob -= iov->iov_len; - iov++; - niov++; - } - tx->tx_niov = niov; - - spin_lock_irqsave (&ktoenal_data.ksnd_sched_lock, flags); - list_add_tail (&tx->tx_list, &conn->ksnc_tx_queue); - - if (conn->ksnc_tx_ready && /* able to send */ - !conn->ksnc_tx_scheduled) /* not scheduled to send */ - { - list_add_tail (&conn->ksnc_tx_list, &ktoenal_data.ksnd_tx_conns); - conn->ksnc_tx_scheduled = 1; - atomic_inc (&conn->ksnc_refcount); /* extra ref for scheduler */ - if (waitqueue_active (&ktoenal_data.ksnd_sched_waitq)) - wake_up (&ktoenal_data.ksnd_sched_waitq); - } - - ktoenal_packets_launched++; - spin_unlock_irqrestore (&ktoenal_data.ksnd_sched_lock, flags); -} - -int -ktoenal_send(nal_cb_t *nal, void *private, lib_msg_t *cookie, - ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid, - unsigned int payload_niov, struct iovec *payload_iov, size_t payload_len) -{ - ptl_nid_t gatewaynid; - ksock_conn_t *conn; - ksock_ltx_t *ltx; - int rc; - int i; - - /* By this point, as it happens, we have absolutely no idea what - * 'private' is. It might be ksock_nal_data or it might be ksock_conn. - * Ha ha, isn't that a funny joke? - * - * FIXME: this is not the right way to fix this; the right way is to - * always pass in the same kind of structure. This is hard right now. - * To revisit this issue, set a breakpoint in here and watch for when - * it's called from lib_finalize. I think this occurs when we send a - * packet as a side-effect of another packet, such as when an ACK has - * been requested. -phil */ - - CDEBUG(D_NET, "sending %d bytes from [%d](%p,%d)... to nid: " - LPX64" pid %d\n", (int)payload_len, payload_niov, - payload_niov > 0 ? payload_iov[0].iov_base : NULL, - (int)(payload_niov > 0 ? payload_iov[0].iov_len : 0), nid, pid); - - if ((conn = ktoenal_get_conn (nid)) == NULL) - { - /* It's not a peer; try to find a gateway */ - rc = kpr_lookup (&ktoenal_data.ksnd_router, nid, payload_niov, - &gatewaynid); - if (rc != 0) - { - CERROR ("Can't route to "LPX64": router error %d\n", nid, rc); - return (-1); - } - - if ((conn = ktoenal_get_conn (gatewaynid)) == NULL) - { - CERROR ("Can't route to "LPX64": gateway "LPX64" is not a peer\n", - nid, gatewaynid); - return (-1); - } - } - - /* This transmit has now got a ref on conn */ - - /* I may not block for a transmit descriptor if I might block the - * receiver, or an interrupt handler. */ - ltx = ktoenal_get_ltx (!(type == PTL_MSG_ACK || - type == PTL_MSG_REPLY || - in_interrupt ())); - if (ltx == NULL) - { - CERROR ("Can't allocate tx desc\n"); - ktoenal_put_conn (conn); - return (-1); - } - - /* Init common (to sends and forwards) packet part */ - ltx->ltx_tx.tx_isfwd = 0; - ltx->ltx_tx.tx_nob = sizeof (*hdr) + payload_len; - ltx->ltx_tx.tx_niov = 1 + payload_niov; - ltx->ltx_tx.tx_iov = ltx->ltx_iov; - - /* Init local send packet (storage for hdr, finalize() args, iov) */ - ltx->ltx_hdr = *hdr; - ltx->ltx_private = private; - ltx->ltx_cookie = cookie; - - ltx->ltx_iov[0].iov_base = <x->ltx_hdr; - ltx->ltx_iov[0].iov_len = sizeof (ltx->ltx_hdr); - - LASSERT (payload_niov <= PTL_MD_MAX_IOV); - - for (i = 0; i < payload_niov; i++) - { - ltx->ltx_iov[1 + i].iov_base = payload_iov[i].iov_base; - ltx->ltx_iov[1 + i].iov_len = payload_iov[i].iov_len; - } - - ktoenal_launch_packet (conn, <x->ltx_tx); - return (0); -} - -void -ktoenal_fwd_packet (void *arg, kpr_fwd_desc_t *fwd) -{ - ksock_conn_t *conn; - ptl_nid_t nid = fwd->kprfd_gateway_nid; - ksock_tx_t *tx = (ksock_tx_t *)&fwd->kprfd_scratch; - - CDEBUG (D_NET, "Forwarding [%p] -> "LPX64" ("LPX64"))\n", fwd, - fwd->kprfd_gateway_nid, fwd->kprfd_target_nid); - - if (nid == ktoenal_lib.ni.nid) /* I'm the gateway; must be the last hop */ - nid = fwd->kprfd_target_nid; - - conn = ktoenal_get_conn (nid); - if (conn == NULL) - { - CERROR ("[%p] fwd to "LPX64" isn't a peer\n", fwd, nid); - kpr_fwd_done (&ktoenal_data.ksnd_router, fwd, -EHOSTUNREACH); - return; - } - - /* This forward has now got a ref on conn */ - - tx->tx_isfwd = 1; /* This is a forwarding packet */ - tx->tx_nob = fwd->kprfd_nob; - tx->tx_niov = fwd->kprfd_niov; - tx->tx_iov = fwd->kprfd_iov; - - ktoenal_launch_packet (conn, tx); -} - -int -ktoenal_thread_start (int (*fn)(void *arg), void *arg) -{ - long pid = kernel_thread (fn, arg, 0); - - if (pid < 0) - return ((int)pid); - - atomic_inc (&ktoenal_data.ksnd_nthreads); - return (0); -} - -void -ktoenal_thread_fini (void) -{ - atomic_dec (&ktoenal_data.ksnd_nthreads); -} - -void -ktoenal_fmb_callback (void *arg, int error) -{ - ksock_fmb_t *fmb = (ksock_fmb_t *)arg; - ptl_hdr_t *hdr = (ptl_hdr_t *) page_address(fmb->fmb_pages[0]); - ksock_conn_t *conn; - unsigned long flags; - - CDEBUG (D_NET, "routed packet from "LPX64" to "LPX64": %d\n", - hdr->src_nid, hdr->dest_nid, error); - - if (error != 0) - CERROR ("Failed to route packet from "LPX64" to "LPX64": %d\n", - hdr->src_nid, hdr->dest_nid, error); - - spin_lock_irqsave (&ktoenal_data.ksnd_sched_lock, flags); - - list_add (&fmb->fmb_list, &fmb->fmb_pool->fmp_idle_fmbs); - - if (!list_empty (&fmb->fmb_pool->fmp_blocked_conns)) - { - conn = list_entry (fmb->fmb_pool->fmp_blocked_conns.next, ksock_conn_t, ksnc_rx_list); - list_del (&conn->ksnc_rx_list); - - CDEBUG (D_NET, "Scheduling conn %p\n", conn); - LASSERT (conn->ksnc_rx_scheduled); - LASSERT (conn->ksnc_rx_state == SOCKNAL_RX_FMB_SLEEP); - - conn->ksnc_rx_state = SOCKNAL_RX_GET_FMB; - list_add_tail (&conn->ksnc_rx_list, &ktoenal_data.ksnd_rx_conns); - - if (waitqueue_active (&ktoenal_data.ksnd_sched_waitq)) - wake_up (&ktoenal_data.ksnd_sched_waitq); - } - - spin_unlock_irqrestore (&ktoenal_data.ksnd_sched_lock, flags); -} - -ksock_fmb_t * -ktoenal_get_idle_fmb (ksock_conn_t *conn) -{ - /* NB called with sched lock held */ - int payload_nob = conn->ksnc_rx_nob_left; - int packet_nob = sizeof (ptl_hdr_t) + payload_nob; - ksock_fmb_pool_t *pool; - ksock_fmb_t *fmb; - - LASSERT (conn->ksnc_rx_state == SOCKNAL_RX_GET_FMB); - - if (packet_nob <= SOCKNAL_SMALL_FWD_PAGES * PAGE_SIZE) - pool = &ktoenal_data.ksnd_small_fmp; - else - pool = &ktoenal_data.ksnd_large_fmp; - - if (!list_empty (&pool->fmp_idle_fmbs)) - { - fmb = list_entry (pool->fmp_idle_fmbs.next, ksock_fmb_t, fmb_list); - list_del (&fmb->fmb_list); - return (fmb); - } - - /* deschedule until fmb free */ - - conn->ksnc_rx_state = SOCKNAL_RX_FMB_SLEEP; - - list_add_tail (&conn->ksnc_rx_list, - &pool->fmp_blocked_conns); - return (NULL); -} - - -int -ktoenal_init_fmb (ksock_conn_t *conn, ksock_fmb_t *fmb) -{ - int payload_nob = conn->ksnc_rx_nob_left; - int packet_nob = sizeof (ptl_hdr_t) + payload_nob; - int niov; /* at least the header */ - int nob; - - LASSERT (conn->ksnc_rx_scheduled); - LASSERT (conn->ksnc_rx_state == SOCKNAL_RX_GET_FMB); - LASSERT (conn->ksnc_rx_nob_wanted == conn->ksnc_rx_nob_left); - LASSERT (payload_nob >= 0); - LASSERT (packet_nob <= fmb->fmb_npages * PAGE_SIZE); - LASSERT (sizeof (ptl_hdr_t) < PAGE_SIZE); - - /* Got a forwarding buffer; copy the header we just read into the - * forwarding buffer. If there's payload start reading reading it - * into the buffer, otherwise the forwarding buffer can be kicked - * off immediately. - * - * NB fmb->fmb_iov spans the WHOLE packet. - * conn->ksnc_rx_iov spans just the payload. - */ - - fmb->fmb_iov[0].iov_base = page_address (fmb->fmb_pages[0]); - - memcpy (fmb->fmb_iov[0].iov_base, &conn->ksnc_hdr, sizeof (ptl_hdr_t)); /* copy header */ - - if (payload_nob == 0) /* got complete packet already */ - { - atomic_inc (&ktoenal_packets_received); - - CDEBUG (D_NET, "%p "LPX64"->"LPX64" %d fwd_start (immediate)\n", conn, - conn->ksnc_hdr.src_nid, conn->ksnc_hdr.dest_nid, packet_nob); - - fmb->fmb_iov[0].iov_len = sizeof (ptl_hdr_t); - - kpr_fwd_init (&fmb->fmb_fwd, conn->ksnc_hdr.dest_nid, - packet_nob, 1, fmb->fmb_iov, - ktoenal_fmb_callback, fmb); - - kpr_fwd_start (&ktoenal_data.ksnd_router, &fmb->fmb_fwd); /* forward it now */ - - ktoenal_new_packet (conn, 0); /* on to next packet */ - return (1); - } - - niov = 1; - if (packet_nob <= PAGE_SIZE) /* whole packet fits in first page */ - fmb->fmb_iov[0].iov_len = packet_nob; - else - { - fmb->fmb_iov[0].iov_len = PAGE_SIZE; - nob = packet_nob - PAGE_SIZE; - - do - { - LASSERT (niov < fmb->fmb_npages); - fmb->fmb_iov[niov].iov_base = page_address (fmb->fmb_pages[niov]); - fmb->fmb_iov[niov].iov_len = MIN (PAGE_SIZE, nob); - nob -= PAGE_SIZE; - niov++; - } while (nob > 0); - } - - kpr_fwd_init (&fmb->fmb_fwd, conn->ksnc_hdr.dest_nid, - packet_nob, niov, fmb->fmb_iov, - ktoenal_fmb_callback, fmb); - - /* stash router's descriptor ready for call to kpr_fwd_start */ - conn->ksnc_cookie = &fmb->fmb_fwd; - - conn->ksnc_rx_state = SOCKNAL_RX_BODY_FWD; /* read in the payload */ - - /* payload is desc's iov-ed buffer, but skipping the hdr */ - LASSERT (niov <= sizeof (conn->ksnc_rx_iov) / sizeof (conn->ksnc_rx_iov[0])); - - conn->ksnc_rx_iov[0].iov_base = (void *)(((unsigned long)fmb->fmb_iov[0].iov_base) + sizeof (ptl_hdr_t)); - conn->ksnc_rx_iov[0].iov_len = fmb->fmb_iov[0].iov_len - sizeof (ptl_hdr_t); - - if (niov > 1) - memcpy (&conn->ksnc_rx_iov[1], &fmb->fmb_iov[1], (niov - 1) * sizeof (struct iovec)); - - conn->ksnc_rx_niov = niov; - - CDEBUG (D_NET, "%p "LPX64"->"LPX64" %d reading body\n", conn, - conn->ksnc_hdr.src_nid, conn->ksnc_hdr.dest_nid, payload_nob); - return (0); -} - -void -ktoenal_fwd_parse (ksock_conn_t *conn) -{ - ksock_conn_t *conn2; - int body_len; - - CDEBUG (D_NET, "%p "LPX64"->"LPX64" %d parsing header\n", conn, - conn->ksnc_hdr.src_nid, conn->ksnc_hdr.dest_nid, conn->ksnc_rx_nob_left); - - LASSERT (conn->ksnc_rx_state == SOCKNAL_RX_HEADER); - LASSERT (conn->ksnc_rx_scheduled); - - body_len = conn->ksnc_hdr.payload_length; - - if (body_len < 0) /* length corrupt */ - { - CERROR ("dropping packet from "LPX64" for "LPX64": packet size %d illegal\n", - conn->ksnc_hdr.src_nid, conn->ksnc_hdr.dest_nid, body_len); - ktoenal_new_packet (conn, 0); /* on to new packet */ - return; - } - - if (body_len > PTL_MTU) /* too big to forward */ - { - CERROR ("dropping packet from "LPX64" for "LPX64": packet size %d too big\n", - conn->ksnc_hdr.src_nid, conn->ksnc_hdr.dest_nid, body_len); - ktoenal_new_packet (conn, body_len); /* on to new packet (skip this one's body) */ - return; - } - - conn2 = ktoenal_get_conn (conn->ksnc_hdr.dest_nid); /* should have gone direct */ - if (conn2 != NULL) - { - CERROR ("dropping packet from "LPX64" for "LPX64": target is a peer\n", - conn->ksnc_hdr.src_nid, conn->ksnc_hdr.dest_nid); - ktoenal_put_conn (conn2); /* drop ref from get above */ - - ktoenal_new_packet (conn, body_len); /* on to next packet (skip this one's body) */ - return; - } - - conn->ksnc_rx_state = SOCKNAL_RX_GET_FMB; /* Getting FMB now */ - conn->ksnc_rx_nob_left = body_len; /* stash packet size */ - conn->ksnc_rx_nob_wanted = body_len; /* (no slop) */ -} - -int -ktoenal_new_packet (ksock_conn_t *conn, int nob_to_skip) -{ - static char ktoenal_slop_buffer[4096]; - - int nob; - int niov; - int skipped; - - if (nob_to_skip == 0) /* right at next packet boundary now */ - { - conn->ksnc_rx_state = SOCKNAL_RX_HEADER; - conn->ksnc_rx_nob_wanted = sizeof (ptl_hdr_t); - conn->ksnc_rx_nob_left = sizeof (ptl_hdr_t); - - conn->ksnc_rx_iov[0].iov_base = (char *)&conn->ksnc_hdr; - conn->ksnc_rx_iov[0].iov_len = sizeof (ptl_hdr_t); - conn->ksnc_rx_niov = 1; - return (1); - } - - /* set up to skip as much a possible now */ - /* if there's more left (ran out of iov entries) we'll get called again */ - - conn->ksnc_rx_state = SOCKNAL_RX_SLOP; - conn->ksnc_rx_nob_left = nob_to_skip; - skipped = 0; - niov = 0; - - do - { - nob = MIN (nob_to_skip, sizeof (ktoenal_slop_buffer)); - - conn->ksnc_rx_iov[niov].iov_base = ktoenal_slop_buffer; - conn->ksnc_rx_iov[niov].iov_len = nob; - niov++; - skipped += nob; - nob_to_skip -=nob; - - } while (nob_to_skip != 0 && /* mustn't overflow conn's rx iov */ - niov < sizeof (conn->ksnc_rx_iov)/sizeof (conn->ksnc_rx_iov[0])); - - conn->ksnc_rx_niov = niov; - conn->ksnc_rx_nob_wanted = skipped; - return (0); -} - -void -ktoenal_process_receive (ksock_conn_t *conn, unsigned long *irq_flags) -{ - ksock_fmb_t *fmb; - int len; - LASSERT (atomic_read (&conn->ksnc_refcount) > 0); - LASSERT (conn->ksnc_rx_scheduled); - LASSERT (conn->ksnc_rx_ready); - - /* NB: sched lock held */ - CDEBUG(D_NET, "conn %p\n", conn); - - if (conn->ksnc_rx_state != SOCKNAL_RX_GET_FMB) /* doesn't need a forwarding buffer */ - { - spin_unlock_irqrestore (&ktoenal_data.ksnd_sched_lock, *irq_flags); - goto try_read; - } - - get_fmb: - /* NB: sched lock held */ - fmb = ktoenal_get_idle_fmb (conn); - if (fmb == NULL) /* conn descheduled waiting for idle fmb */ - return; - - spin_unlock_irqrestore (&ktoenal_data.ksnd_sched_lock, *irq_flags); - - if (ktoenal_init_fmb (conn, fmb)) /* packet forwarded ? */ - goto out; /* come back later for next packet */ - - try_read: - /* NB: sched lock NOT held */ - LASSERT (conn->ksnc_rx_state == SOCKNAL_RX_HEADER || - conn->ksnc_rx_state == SOCKNAL_RX_BODY || - conn->ksnc_rx_state == SOCKNAL_RX_BODY_FWD || - conn->ksnc_rx_state == SOCKNAL_RX_SLOP); - - LASSERT (conn->ksnc_rx_niov > 0); - LASSERT (conn->ksnc_rx_nob_wanted > 0); - - conn->ksnc_rx_ready = 0; /* data ready may race with me and set ready */ - mb(); /* => clear BEFORE trying to read */ - - /* NB ktoenal_recvmsg "consumes" the iov passed to it */ - len = ktoenal_recvmsg(conn->ksnc_file, - conn->ksnc_rx_iov, conn->ksnc_rx_niov, - conn->ksnc_rx_nob_wanted); - CDEBUG (D_NET, "%p read(%d) %d\n", conn, conn->ksnc_rx_nob_wanted, len); - - if (len <= 0) /* nothing ready (EAGAIN) or EOF or error */ - { - if (len != -EAGAIN && /* ! nothing to read now */ - len != 0) /* ! nothing to read ever */ - { - // warning FIXME: handle socket errors properly - CERROR ("Error socknal read(%d) %p: %d\n", - conn->ksnc_rx_nob_wanted, conn, len); - } - goto out; /* come back when there's data ready */ - } - - LASSERT (len <= conn->ksnc_rx_nob_wanted); - conn->ksnc_rx_nob_wanted -= len; - conn->ksnc_rx_nob_left -= len; - - if (conn->ksnc_rx_nob_wanted != 0) /* short read */ - goto out; /* try again later */ - - conn->ksnc_rx_ready = 1; /* assume there's more to be had */ - - switch (conn->ksnc_rx_state) - { - case SOCKNAL_RX_HEADER: - if (conn->ksnc_hdr.dest_nid != ktoenal_lib.ni.nid) /* It's not for me */ - { - ktoenal_fwd_parse (conn); - switch (conn->ksnc_rx_state) - { - case SOCKNAL_RX_HEADER: /* skipped this packet (zero payload) */ - goto out; /* => come back later */ - case SOCKNAL_RX_SLOP: /* skipping this packet's body */ - goto try_read; /* => go read it */ - case SOCKNAL_RX_GET_FMB: /* forwarding */ - spin_lock_irqsave (&ktoenal_data.ksnd_sched_lock, *irq_flags); - goto get_fmb; /* => go get a fwd msg buffer */ - default: - break; - } - /* Not Reached */ - LBUG (); - } - - PROF_START(lib_parse); - lib_parse(&ktoenal_lib, &conn->ksnc_hdr, conn); /* sets wanted_len, iovs etc */ - PROF_FINISH(lib_parse); - - if (conn->ksnc_rx_nob_wanted != 0) /* need to get some payload? */ - { - conn->ksnc_rx_state = SOCKNAL_RX_BODY; - goto try_read; /* go read the payload */ - } - /* Fall through (completed packet for me) */ - - case SOCKNAL_RX_BODY: - atomic_inc (&ktoenal_packets_received); - lib_finalize(&ktoenal_lib, NULL, conn->ksnc_cookie); /* packet is done now */ - /* Fall through */ - - case SOCKNAL_RX_SLOP: - if (ktoenal_new_packet (conn, conn->ksnc_rx_nob_left)) /* starting new packet? */ - goto out; /* come back later */ - goto try_read; /* try to finish reading slop now */ - - case SOCKNAL_RX_BODY_FWD: - CDEBUG (D_NET, "%p "LPX64"->"LPX64" %d fwd_start (got body)\n", conn, - conn->ksnc_hdr.src_nid, conn->ksnc_hdr.dest_nid, conn->ksnc_rx_nob_left); - - atomic_inc (&ktoenal_packets_received); - - /* ktoenal_init_fmb() stashed router descriptor in conn->ksnc_cookie */ - kpr_fwd_start (&ktoenal_data.ksnd_router, (kpr_fwd_desc_t *)conn->ksnc_cookie); - - LASSERT (conn->ksnc_rx_nob_left == 0); /* no slop in forwarded packets */ - - ktoenal_new_packet (conn, 0); /* on to next packet */ - goto out; /* (later) */ - - default: - break; - } - - /* Not Reached */ - LBUG (); - - out: - spin_lock_irqsave (&ktoenal_data.ksnd_sched_lock, *irq_flags); - - if (!conn->ksnc_rx_ready) /* no data there to read? */ - { - conn->ksnc_rx_scheduled = 0; /* let socket callback schedule again */ - ktoenal_put_conn (conn); /* release scheduler's ref */ - } - else /* let scheduler call me again */ - list_add_tail (&conn->ksnc_rx_list, &ktoenal_data.ksnd_rx_conns); -} - -int -ktoenal_recv(nal_cb_t *nal, void *private, lib_msg_t *msg, - unsigned int niov, struct iovec *iov, size_t mlen, size_t rlen) -{ - ksock_conn_t *conn = (ksock_conn_t *)private; - int i; - - conn->ksnc_cookie = msg; - - LASSERT (niov <= PTL_MD_MAX_IOV); - for (i = 0; i < niov; i++) - { - conn->ksnc_rx_iov[i].iov_len = iov[i].iov_len; - conn->ksnc_rx_iov[i].iov_base = iov[i].iov_base; - } - - conn->ksnc_rx_niov = niov; - conn->ksnc_rx_nob_wanted = mlen; - conn->ksnc_rx_nob_left = rlen; - - return (rlen); -} - -int -ktoenal_scheduler (void *arg) -{ - unsigned long flags; - ksock_conn_t *conn; - int rc; - int nloops = 0; - - kportal_daemonize ("ktoenal_sched"); - kportal_blockallsigs (); - - spin_lock_irqsave (&ktoenal_data.ksnd_sched_lock, flags); - - while (!ktoenal_data.ksnd_shuttingdown) - { - int did_something = 0; - - /* Ensure I progress everything semi-fairly */ - - if (!list_empty (&ktoenal_data.ksnd_rx_conns)) - { - did_something = 1; - conn = list_entry (ktoenal_data.ksnd_rx_conns.next, - ksock_conn_t, ksnc_rx_list); - list_del (&conn->ksnc_rx_list); - - ktoenal_process_receive (conn, &flags); /* drops & regains ksnd_sched_lock */ - } - - if (!list_empty (&ktoenal_data.ksnd_tx_conns)) - { - did_something = 1; - conn = list_entry (ktoenal_data.ksnd_tx_conns.next, - ksock_conn_t, ksnc_tx_list); - - list_del (&conn->ksnc_tx_list); - ktoenal_process_transmit (conn, &flags); /* drops and regains ksnd_sched_lock */ - } - - if (!did_something || /* nothing to do */ - ++nloops == SOCKNAL_RESCHED) /* hogging CPU? */ - { - spin_unlock_irqrestore (&ktoenal_data.ksnd_sched_lock, flags); - - nloops = 0; - - if (!did_something) { /* wait for something to do */ - rc = wait_event_interruptible (ktoenal_data.ksnd_sched_waitq, - ktoenal_data.ksnd_shuttingdown || - !list_empty (&ktoenal_data.ksnd_rx_conns) || - !list_empty (&ktoenal_data.ksnd_tx_conns)); - LASSERT (rc == 0); - } else - our_cond_resched(); - - spin_lock_irqsave (&ktoenal_data.ksnd_sched_lock, flags); - } - } - - spin_unlock_irqrestore (&ktoenal_data.ksnd_sched_lock, flags); - ktoenal_thread_fini (); - return (0); -} - - -int -ktoenal_reaper (void *arg) -{ - unsigned long flags; - ksock_conn_t *conn; - int rc; - - kportal_daemonize ("ktoenal_reaper"); - kportal_blockallsigs (); - - while (!ktoenal_data.ksnd_shuttingdown) - { - spin_lock_irqsave (&ktoenal_data.ksnd_reaper_lock, flags); - - if (list_empty (&ktoenal_data.ksnd_reaper_list)) - conn = NULL; - else - { - conn = list_entry (ktoenal_data.ksnd_reaper_list.next, - ksock_conn_t, ksnc_list); - list_del (&conn->ksnc_list); - } - - spin_unlock_irqrestore (&ktoenal_data.ksnd_reaper_lock, flags); - - if (conn != NULL) - ktoenal_close_conn (conn); - else { - rc = wait_event_interruptible (ktoenal_data.ksnd_reaper_waitq, - ktoenal_data.ksnd_shuttingdown || - !list_empty(&ktoenal_data.ksnd_reaper_list)); - LASSERT (rc == 0); - } - } - - ktoenal_thread_fini (); - return (0); -} - -#define POLLREAD (POLLIN | POLLRDNORM | POLLRDBAND | POLLPRI) -#define POLLWRITE (POLLOUT | POLLWRNORM | POLLWRBAND) - -int -ktoenal_pollthread(void *arg) -{ - unsigned int mask; - struct list_head *tmp; - ksock_conn_t *conn; - - /* Save the task struct for waking it up */ - ktoenal_data.ksnd_pollthread_tsk = current; - - kportal_daemonize ("ktoenal_pollthread"); - kportal_blockallsigs (); - - poll_initwait(&ktoenal_data.ksnd_pwait); - - while(!ktoenal_data.ksnd_shuttingdown) { - - set_current_state(TASK_INTERRUPTIBLE); - - read_lock (&ktoenal_data.ksnd_socklist_lock); - list_for_each(tmp, &ktoenal_data.ksnd_socklist) { - - conn = list_entry(tmp, ksock_conn_t, ksnc_list); - atomic_inc(&conn->ksnc_refcount); - read_unlock (&ktoenal_data.ksnd_socklist_lock); - - mask = conn->ksnc_file->f_op->poll(conn->ksnc_file, - ktoenal_data.ksnd_slistchange ? - &ktoenal_data.ksnd_pwait : NULL); - - if(mask & POLLREAD) { - ktoenal_data_ready(conn); - - } - if (mask & POLLWRITE) { - ktoenal_write_space(conn); - - } - if (mask & (POLLERR | POLLHUP)) { - /* Do error processing */ - } - - read_lock (&ktoenal_data.ksnd_socklist_lock); - if(atomic_dec_and_test(&conn->ksnc_refcount)) - _ktoenal_put_conn(conn); - } - ktoenal_data.ksnd_slistchange = 0; - read_unlock (&ktoenal_data.ksnd_socklist_lock); - - schedule_timeout(MAX_SCHEDULE_TIMEOUT); - if(ktoenal_data.ksnd_slistchange) { - poll_freewait(&ktoenal_data.ksnd_pwait); - poll_initwait(&ktoenal_data.ksnd_pwait); - } - } - poll_freewait(&ktoenal_data.ksnd_pwait); - ktoenal_thread_fini(); - return (0); -} - -void -ktoenal_data_ready (ksock_conn_t *conn) -{ - unsigned long flags; - ENTRY; - - if (!test_and_set_bit (0, &conn->ksnc_rx_ready)) { - spin_lock_irqsave (&ktoenal_data.ksnd_sched_lock, flags); - - if (!conn->ksnc_rx_scheduled) { /* not being progressed */ - list_add_tail (&conn->ksnc_rx_list, - &ktoenal_data.ksnd_rx_conns); - conn->ksnc_rx_scheduled = 1; - /* extra ref for scheduler */ - atomic_inc (&conn->ksnc_refcount); - - /* This is done to avoid the effects of a sequence - * of events in which the rx_ready is lost - */ - conn->ksnc_rx_ready=1; - - if (waitqueue_active (&ktoenal_data.ksnd_sched_waitq)) - wake_up (&ktoenal_data.ksnd_sched_waitq); - } - - spin_unlock_irqrestore (&ktoenal_data.ksnd_sched_lock, flags); - } - - EXIT; -} - -void -ktoenal_write_space (ksock_conn_t *conn) -{ - unsigned long flags; - - CDEBUG (D_NET, "conn %p%s%s%s\n", - conn, - (conn == NULL) ? "" : (test_bit (0, &conn->ksnc_tx_ready) ? " ready" : " blocked"), - (conn == NULL) ? "" : (conn->ksnc_tx_scheduled ? " scheduled" : " idle"), - (conn == NULL) ? "" : (list_empty (&conn->ksnc_tx_queue) ? " empty" : " queued")); - - - if (!test_and_set_bit (0, &conn->ksnc_tx_ready)) { - spin_lock_irqsave (&ktoenal_data.ksnd_sched_lock, flags); - - if (!list_empty (&conn->ksnc_tx_queue) && /* packets to send */ - !conn->ksnc_tx_scheduled) { /* not being progressed */ - - list_add_tail (&conn->ksnc_tx_list, - &ktoenal_data.ksnd_tx_conns); - conn->ksnc_tx_scheduled = 1; - /* extra ref for scheduler */ - atomic_inc (&conn->ksnc_refcount); - - if (waitqueue_active (&ktoenal_data.ksnd_sched_waitq)) - wake_up (&ktoenal_data.ksnd_sched_waitq); - } - spin_unlock_irqrestore (&ktoenal_data.ksnd_sched_lock, flags); - } -} - -nal_cb_t ktoenal_lib = { - nal_data: &ktoenal_data, /* NAL private data */ - cb_send: ktoenal_send, - cb_recv: ktoenal_recv, - cb_read: ktoenal_read, - cb_write: ktoenal_write, - cb_callback: ktoenal_callback, - cb_malloc: ktoenal_malloc, - cb_free: ktoenal_free, - cb_printf: ktoenal_printf, - cb_cli: ktoenal_cli, - cb_sti: ktoenal_sti, - cb_dist: ktoenal_dist -}; diff --git a/lnet/libcfs/debug.c b/lnet/libcfs/debug.c index 8449511..1af687c 100644 --- a/lnet/libcfs/debug.c +++ b/lnet/libcfs/debug.c @@ -931,7 +931,6 @@ char *portals_nid2str(int nal, ptl_nid_t nid, char *str) case QSWNAL: case GMNAL: case IBNAL: - case TOENAL: case SCIMACNAL: sprintf(str, "%u:%u", (__u32)(nid >> 32), (__u32)nid); break; diff --git a/lnet/libcfs/module.c b/lnet/libcfs/module.c index 55e1935..2768c8d 100644 --- a/lnet/libcfs/module.c +++ b/lnet/libcfs/module.c @@ -414,8 +414,6 @@ kportal_get_ni (int nal) return (PORTAL_SYMBOL_GET(kqswnal_ni)); case SOCKNAL: return (PORTAL_SYMBOL_GET(ksocknal_ni)); - case TOENAL: - return (PORTAL_SYMBOL_GET(ktoenal_ni)); case GMNAL: return (PORTAL_SYMBOL_GET(kgmnal_ni)); case IBNAL: @@ -444,9 +442,6 @@ kportal_put_ni (int nal) case SOCKNAL: PORTAL_SYMBOL_PUT(ksocknal_ni); break; - case TOENAL: - PORTAL_SYMBOL_PUT(ktoenal_ni); - break; case GMNAL: PORTAL_SYMBOL_PUT(kgmnal_ni); break; diff --git a/lnet/tests/ping_srv.c b/lnet/tests/ping_srv.c index 2a96f55..1e40ed8 100644 --- a/lnet/tests/ping_srv.c +++ b/lnet/tests/ping_srv.c @@ -298,7 +298,7 @@ static void /*__exit*/ pingsrv_cleanup(void) MODULE_PARM(nal, "i"); MODULE_PARM_DESC(nal, "Use the specified NAL " - "(6-kscimacnal, 4-toenal, 2-ksocknal, 1-kqswnal)"); + "(6-kscimacnal, 2-ksocknal, 1-kqswnal)"); MODULE_AUTHOR("Brian Behlendorf (LLNL)"); MODULE_DESCRIPTION("A kernel space ping server for portals testing"); diff --git a/lnet/tests/sping_srv.c b/lnet/tests/sping_srv.c index 0d52e1f..b8bda29 100644 --- a/lnet/tests/sping_srv.c +++ b/lnet/tests/sping_srv.c @@ -285,7 +285,7 @@ static void /*__exit*/ pingsrv_cleanup(void) MODULE_PARM(nal, "i"); MODULE_PARM_DESC(nal, "Use the specified NAL " - "(6-kscimacnal, 4-toenal, 2-ksocknal, 1-kqswnal)"); + "(6-kscimacnal, 2-ksocknal, 1-kqswnal)"); MODULE_AUTHOR("Brian Behlendorf (LLNL)"); MODULE_DESCRIPTION("A kernel space ping server for portals testing"); diff --git a/lnet/tests/startclient.sh b/lnet/tests/startclient.sh index de01bc7..be60509 100644 --- a/lnet/tests/startclient.sh +++ b/lnet/tests/startclient.sh @@ -9,13 +9,6 @@ else fi case "$1" in - toe) - /sbin/insmod ../oslib/portals.o - /sbin/insmod ../toenal/ktoenal.o - /sbin/insmod ./$PING - echo ktoenal > /tmp/nal - ;; - tcp) /sbin/insmod ../oslib/portals.o /sbin/insmod ../socknal/ksocknal.o @@ -38,7 +31,7 @@ case "$1" in ;; *) - echo "Usage : ${0} < tcp | toe | elan | gm>" + echo "Usage : ${0} < tcp | elan | gm>" exit 1; esac exit 0; diff --git a/lnet/tests/startserver.sh b/lnet/tests/startserver.sh index 4f66eeb..9b5ccf6 100644 --- a/lnet/tests/startserver.sh +++ b/lnet/tests/startserver.sh @@ -9,13 +9,6 @@ else fi case "$1" in - toe) - /sbin/insmod ../oslib/portals.o - /sbin/insmod ../toenal/ktoenal.o - /sbin/insmod ./$PING nal=4 - echo ktoenal > /tmp/nal - ;; - tcp) /sbin/insmod ../oslib/portals.o /sbin/insmod ../socknal/ksocknal.o @@ -38,7 +31,7 @@ case "$1" in ;; *) - echo "Usage : ${0} < tcp | toe | elan | gm>" + echo "Usage : ${0} < tcp | elan | gm>" exit 1; esac ../utils/acceptor 9999& diff --git a/lnet/utils/portals.c b/lnet/utils/portals.c index b46ee16..3c7ec20 100644 --- a/lnet/utils/portals.c +++ b/lnet/utils/portals.c @@ -63,7 +63,6 @@ typedef struct static name2num_t nalnames[] = { {"any", 0}, {"tcp", SOCKNAL}, - {"toe", TOENAL}, {"elan", QSWNAL}, {"gm", GMNAL}, {"ib", IBNAL}, @@ -651,7 +650,7 @@ int jt_ptl_connect(int argc, char **argv) return 0; } - if (!g_nal_is_compatible (argv[0], SOCKNAL, TOENAL, 0)) + if (!g_nal_is_compatible (argv[0], SOCKNAL, 0)) return -1; rc = ptl_parse_ipaddr (&ipaddr, argv[1]); @@ -797,7 +796,7 @@ int jt_ptl_disconnect(int argc, char **argv) return 0; } - if (!g_nal_is_compatible (NULL, SOCKNAL, TOENAL, 0)) + if (!g_nal_is_compatible (NULL, SOCKNAL, 0)) return 0; if (argc >= 2 && @@ -838,7 +837,7 @@ int jt_ptl_push_connection (int argc, char **argv) return 0; } - if (!g_nal_is_compatible (argv[0], SOCKNAL, TOENAL, 0)) + if (!g_nal_is_compatible (argv[0], SOCKNAL, 0)) return -1; if (argc > 1 && diff --git a/lustre/configure.in b/lustre/configure.in index 3d2fd24..f4f6b5c 100644 --- a/lustre/configure.in +++ b/lustre/configure.in @@ -53,7 +53,7 @@ AC_OUTPUT([Makefile lvfs/Makefile portals/Makefile portals/Kernelenv \ portals/unals/Makefile portals/knals/Makefile \ portals/router/Makefile portals/knals/socknal/Makefile \ portals/knals/gmnal/Makefile portals/knals/qswnal/Makefile \ - portals/knals/scimacnal/Makefile portals/knals/toenal/Makefile \ + portals/knals/scimacnal/Makefile \ portals/knals/ibnal/Makefile \ portals/utils/Makefile portals/tests/Makefile portals/doc/Makefile \ obdecho/Makefile ptlrpc/Makefile liblustre/Makefile \ diff --git a/lustre/liblustre/libtest.c b/lustre/liblustre/libtest.c index 87dba3d..b956347 100644 --- a/lustre/liblustre/libtest.c +++ b/lustre/liblustre/libtest.c @@ -46,7 +46,6 @@ char *portals_nid2str(int nal, ptl_nid_t nid, char *str) case QSWNAL: case GMNAL: case IBNAL: - case TOENAL: case SCIMACNAL: sprintf(str, "%u:%u", (__u32)(nid >> 32), (__u32)nid); break; diff --git a/lustre/liblustre/llite_lib.c b/lustre/liblustre/llite_lib.c index ec0d06c..baf564a 100644 --- a/lustre/liblustre/llite_lib.c +++ b/lustre/liblustre/llite_lib.c @@ -98,7 +98,6 @@ char *portals_nid2str(int nal, ptl_nid_t nid, char *str) case QSWNAL: case GMNAL: case IBNAL: - case TOENAL: case SCIMACNAL: sprintf(str, "%u:%u", (__u32)(nid >> 32), (__u32)nid); break; diff --git a/lustre/portals/configure.in b/lustre/portals/configure.in index 44657e0..bacf532 100644 --- a/lustre/portals/configure.in +++ b/lustre/portals/configure.in @@ -29,6 +29,6 @@ AM_CONFIG_HEADER(include/config.h) AC_OUTPUT([Makefile Kernelenv libcfs/Makefile portals/Makefile \ unals/Makefile knals/Makefile router/Makefile \ knals/socknal/Makefile knals/gmnal/Makefile knals/qswnal/Makefile \ - knals/scimacnal/Makefile knals/toenal/Makefile knals/ibnal/Makefile\ + knals/scimacnal/Makefile knals/ibnal/Makefile\ utils/Makefile tests/Makefile doc/Makefile ]) diff --git a/lustre/portals/include/linux/kp30.h b/lustre/portals/include/linux/kp30.h index 3ea46d1..815375c 100644 --- a/lustre/portals/include/linux/kp30.h +++ b/lustre/portals/include/linux/kp30.h @@ -1026,21 +1026,20 @@ static inline int portal_ioctl_getdata(char *buf, char *end, void *arg) #define IOC_PORTAL_MAX_NR 42 enum { - QSWNAL = 1, - SOCKNAL, - GMNAL, - TOENAL, - TCPNAL, - SCIMACNAL, - ROUTER, - IBNAL, + QSWNAL = 1, + SOCKNAL = 2, + GMNAL = 3, + /* 4 unused */ + TCPNAL = 5, + SCIMACNAL = 6, + ROUTER = 7, + IBNAL = 8, NAL_ENUM_END_MARKER }; #ifdef __KERNEL__ extern ptl_handle_ni_t kqswnal_ni; extern ptl_handle_ni_t ksocknal_ni; -extern ptl_handle_ni_t ktoenal_ni; extern ptl_handle_ni_t kgmnal_ni; extern ptl_handle_ni_t kibnal_ni; extern ptl_handle_ni_t kscimacnal_ni; diff --git a/lustre/portals/knals/Makefile.am b/lustre/portals/knals/Makefile.am index 25aab9d..df6ee5c 100644 --- a/lustre/portals/knals/Makefile.am +++ b/lustre/portals/knals/Makefile.am @@ -3,5 +3,5 @@ # This code is issued under the GNU General Public License. # See the file COPYING in this distribution -DIST_SUBDIRS= socknal toenal qswnal gmnal scimacnal ibnal -SUBDIRS= socknal toenal @QSWNAL@ @GMNAL@ @SCIMACNAL@ @IBNAL@ +DIST_SUBDIRS= socknal qswnal gmnal scimacnal ibnal +SUBDIRS= socknal @QSWNAL@ @GMNAL@ @SCIMACNAL@ @IBNAL@ diff --git a/lustre/portals/knals/toenal/.cvsignore b/lustre/portals/knals/toenal/.cvsignore deleted file mode 100644 index e995588..0000000 --- a/lustre/portals/knals/toenal/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -.deps -Makefile -Makefile.in diff --git a/lustre/portals/knals/toenal/Makefile.am b/lustre/portals/knals/toenal/Makefile.am deleted file mode 100644 index 9bfff64..0000000 --- a/lustre/portals/knals/toenal/Makefile.am +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (C) 2001 Cluster File Systems, Inc. -# -# This code is issued under the GNU General Public License. -# See the file COPYING in this distribution - -include ../../Rules.linux - -MODULE = ktoenal -modulenet_DATA = ktoenal.o -EXTRA_PROGRAMS = ktoenal - -DEFS = -ktoenal_SOURCES = toenal.c toenal_cb.c toenal.h diff --git a/lustre/portals/knals/toenal/toenal.c b/lustre/portals/knals/toenal/toenal.c deleted file mode 100644 index 07b93cb..0000000 --- a/lustre/portals/knals/toenal/toenal.c +++ /dev/null @@ -1,629 +0,0 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * - * Copyright (C) 2001, 2002 Cluster File Systems, Inc. - * Author: Zach Brown - * Author: Peter J. Braam - * Author: Phil Schwan - * Author: Eric Barton - * Author: Kedar Sovani - * Author: Amey Inamdar - * - * This file is part of Portals, http://www.sf.net/projects/lustre/ - * - * Portals is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * Portals is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * 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 -#include "toenal.h" - -ptl_handle_ni_t ktoenal_ni; -static nal_t ktoenal_api; -static ksock_nal_data_t ktoenal_data; - -/* -ksocknal_interface_t ktoenal_interface = { - ksni_add_sock: ktoenal_add_sock, - ksni_close_sock: ktoenal_close_sock, - ksni_set_mynid: ktoenal_set_mynid, -}; -*/ - -kpr_nal_interface_t ktoenal_router_interface = { - kprni_nalid: TOENAL, - kprni_arg: &ktoenal_data, - kprni_fwd: ktoenal_fwd_packet, -}; - - -int -ktoenal_api_forward(nal_t *nal, int id, void *args, size_t args_len, - void *ret, size_t ret_len) -{ - ksock_nal_data_t *k; - nal_cb_t *nal_cb; - - k = nal->nal_data; - nal_cb = k->ksnd_nal_cb; - - lib_dispatch(nal_cb, k, id, args, ret); /* ktoenal_send needs k */ - return PTL_OK; -} - -int -ktoenal_api_shutdown(nal_t *nal, int ni) -{ - CDEBUG (D_NET, "closing all connections\n"); - - return ktoenal_close_sock(0); /* close all sockets */ -} - -void -ktoenal_api_yield(nal_t *nal) -{ - our_cond_resched(); - return; -} - -void -ktoenal_api_lock(nal_t *nal, unsigned long *flags) -{ - ksock_nal_data_t *k; - nal_cb_t *nal_cb; - - k = nal->nal_data; - nal_cb = k->ksnd_nal_cb; - nal_cb->cb_cli(nal_cb,flags); -} - -void -ktoenal_api_unlock(nal_t *nal, unsigned long *flags) -{ - ksock_nal_data_t *k; - nal_cb_t *nal_cb; - - k = nal->nal_data; - nal_cb = k->ksnd_nal_cb; - nal_cb->cb_sti(nal_cb,flags); -} - -nal_t * -ktoenal_init(int interface, ptl_pt_index_t ptl_size, - ptl_ac_index_t ac_size, ptl_pid_t requested_pid) -{ - CDEBUG(D_NET, "calling lib_init with nid "LPX64"\n", - ktoenal_data.ksnd_mynid); - lib_init(&ktoenal_lib, ktoenal_data.ksnd_mynid, 0, 10, ptl_size, - ac_size); - return (&ktoenal_api); -} - -/* - * EXTRA functions follow - */ -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) -#define SOCKET_I(inode) (&(inode)->u.socket_i) -#endif -static __inline__ struct socket * -socki_lookup(struct inode *inode) -{ - return SOCKET_I(inode); -} - -int -ktoenal_set_mynid(ptl_nid_t nid) -{ - lib_ni_t *ni = &ktoenal_lib.ni; - - /* FIXME: we have to do this because we call lib_init() at module - * insertion time, which is before we have 'mynid' available. lib_init - * sets the NAL's nid, which it uses to tell other nodes where packets - * are coming from. This is not a very graceful solution to this - * problem. */ - - CDEBUG(D_IOCTL, "setting mynid to "LPX64" (old nid="LPX64")\n", nid, ni->nid); - - ktoenal_data.ksnd_mynid = nid; - ni->nid = nid; - return (0); -} - -int -ktoenal_add_sock (ptl_nid_t nid, int fd) -{ - unsigned long flags; - ksock_conn_t *conn; - struct file *file = NULL; - struct socket *sock = NULL; - int ret; - ENTRY; - - file = fget(fd); - if (file == NULL) - RETURN(-EINVAL); - - ret = -EINVAL; - sock = socki_lookup(file->f_dentry->d_inode); - if (sock == NULL) - GOTO(error, ret); - - ret = -ENOMEM; - PORTAL_ALLOC(conn, sizeof(*conn)); - if (!conn) - GOTO(error, ret); - - memset (conn, 0, sizeof (conn)); /* zero for consistency */ - file->f_flags |= O_NONBLOCK; /* Does this have any conflicts */ - conn->ksnc_file = file; - conn->ksnc_sock = sock; - conn->ksnc_peernid = nid; - atomic_set (&conn->ksnc_refcount, 1); /* 1 ref for socklist */ - - conn->ksnc_rx_ready = 0; - conn->ksnc_rx_scheduled = 0; - ktoenal_new_packet (conn, 0); - - INIT_LIST_HEAD (&conn->ksnc_tx_queue); - conn->ksnc_tx_ready = 0; - conn->ksnc_tx_scheduled = 0; - - LASSERT (!in_interrupt()); - write_lock_irqsave (&ktoenal_data.ksnd_socklist_lock, flags); - - list_add(&conn->ksnc_list, &ktoenal_data.ksnd_socklist); - write_unlock_irqrestore (&ktoenal_data.ksnd_socklist_lock, flags); - - ktoenal_data_ready(conn); - ktoenal_write_space(conn); - - ktoenal_data.ksnd_slistchange = 1; - wake_up_process(ktoenal_data.ksnd_pollthread_tsk); - /* Schedule pollthread so that it will poll - * for newly created socket - */ - - - CDEBUG(D_IOCTL, "conn [%p] registered for nid "LPX64"\n", - conn, conn->ksnc_peernid); - - /* Can't unload while connection active */ - PORTAL_MODULE_USE; - RETURN(0); - -error: - fput(file); - return (ret); -} - -/* Passing in a zero nid will close all connections */ -int -ktoenal_close_sock(ptl_nid_t nid) -{ - unsigned long flags; - ksock_conn_t *conn; - LIST_HEAD (death_row); - struct list_head *tmp; - - LASSERT (!in_interrupt()); - write_lock_irqsave (&ktoenal_data.ksnd_socklist_lock, flags); - - if (nid == 0) /* close ALL connections */ - { - /* insert 'death row' into the socket list... */ - list_add (&death_row, &ktoenal_data.ksnd_socklist); - /* ...extract and reinitialise the socket list itself... */ - list_del_init (&ktoenal_data.ksnd_socklist); - /* ...and voila, death row is the proud owner of all conns */ - } else list_for_each (tmp, &ktoenal_data.ksnd_socklist) { - - conn = list_entry (tmp, ksock_conn_t, ksnc_list); - - if (conn->ksnc_peernid == nid) - { - list_del (&conn->ksnc_list); - list_add (&conn->ksnc_list, &death_row); - break; - } - } - - - write_unlock_irqrestore (&ktoenal_data.ksnd_socklist_lock, flags); - - if (list_empty (&death_row)) - return (-ENOENT); - - do { - conn = list_entry (death_row.next, ksock_conn_t, ksnc_list); - list_del (&conn->ksnc_list); - ktoenal_put_conn (conn); /* drop ref for ksnd_socklist */ - } while (!list_empty (&death_row)); - - ktoenal_data.ksnd_slistchange = 1; - wake_up_process(ktoenal_data.ksnd_pollthread_tsk); - - return (0); -} - - -ksock_conn_t * -ktoenal_get_conn (ptl_nid_t nid) -{ - struct list_head *tmp; - ksock_conn_t *conn; - - PROF_START(conn_list_walk); - - read_lock (&ktoenal_data.ksnd_socklist_lock); - - list_for_each(tmp, &ktoenal_data.ksnd_socklist) { - - conn = list_entry(tmp, ksock_conn_t, ksnc_list); - - if (conn->ksnc_peernid == nid) - { - /* caller is referencing */ - atomic_inc (&conn->ksnc_refcount); - - read_unlock (&ktoenal_data.ksnd_socklist_lock); - - CDEBUG(D_NET, "got conn [%p] -> "LPX64" (%d)\n", - conn, nid, atomic_read (&conn->ksnc_refcount)); - - PROF_FINISH(conn_list_walk); - return (conn); - } - } - - read_unlock (&ktoenal_data.ksnd_socklist_lock); - - CDEBUG(D_NET, "No connection found when looking for nid "LPX64"\n", nid); - PROF_FINISH(conn_list_walk); - return (NULL); -} - -void -ktoenal_close_conn (ksock_conn_t *conn) -{ - CDEBUG (D_NET, "connection [%p] closed \n", conn); - - fput (conn->ksnc_file); - PORTAL_FREE (conn, sizeof (*conn)); - /* One less connection keeping us hanging on */ - PORTAL_MODULE_UNUSE; -} - -void -_ktoenal_put_conn (ksock_conn_t *conn) -{ - unsigned long flags; - - CDEBUG (D_NET, "connection [%p] handed the black spot\n", conn); - - /* "But what is the black spot, captain?" I asked. - * "That's a summons, mate..." */ - - LASSERT (atomic_read (&conn->ksnc_refcount) == 0); - LASSERT (!conn->ksnc_rx_scheduled); - - if (!in_interrupt()) - { - ktoenal_close_conn (conn); - return; - } - - spin_lock_irqsave (&ktoenal_data.ksnd_reaper_lock, flags); - - list_add (&conn->ksnc_list, &ktoenal_data.ksnd_reaper_list); - wake_up (&ktoenal_data.ksnd_reaper_waitq); - - spin_unlock_irqrestore (&ktoenal_data.ksnd_reaper_lock, flags); -} - -void -ktoenal_free_buffers (void) -{ - if (ktoenal_data.ksnd_fmbs != NULL) - { - ksock_fmb_t *fmb = (ksock_fmb_t *)ktoenal_data.ksnd_fmbs; - int i; - int j; - - for (i = 0; i < (SOCKNAL_SMALL_FWD_NMSGS + SOCKNAL_LARGE_FWD_NMSGS); i++, fmb++) - for (j = 0; j < fmb->fmb_npages; j++) - if (fmb->fmb_pages[j] != NULL) - __free_page (fmb->fmb_pages[j]); - - PORTAL_FREE (ktoenal_data.ksnd_fmbs, - sizeof (ksock_fmb_t) * (SOCKNAL_SMALL_FWD_NMSGS + SOCKNAL_LARGE_FWD_NMSGS)); - } - - if (ktoenal_data.ksnd_ltxs != NULL) - PORTAL_FREE (ktoenal_data.ksnd_ltxs, - sizeof (ksock_ltx_t) * (SOCKNAL_NLTXS + SOCKNAL_NNBLK_LTXS)); -} - -int -ktoenal_cmd(struct portals_cfg *pcfg, void * private) -{ - int rc = -EINVAL; - - LASSERT (pcfg != NULL); - - switch(pcfg->pcfg_command) { - case NAL_CMD_REGISTER_PEER_FD: { - rc = ktoenal_add_sock(pcfg->pcfg_nid, pcfg->pcfg_fd); - break; - } - case NAL_CMD_CLOSE_CONNECTION: { - rc = ktoenal_close_sock(pcfg->pcfg_nid); - break; - } - case NAL_CMD_REGISTER_MYNID: { - rc = ktoenal_set_mynid (pcfg->pcfg_nid); - break; - } - } - - return rc; -} - - -void /*__exit*/ -ktoenal_module_fini (void) -{ - CDEBUG(D_MALLOC, "before NAL cleanup: kmem %d\n", - atomic_read (&portal_kmemory)); - - switch (ktoenal_data.ksnd_init) - { - default: - LASSERT (0); - - case SOCKNAL_INIT_ALL: - kportal_nal_unregister(TOENAL); - PORTAL_SYMBOL_UNREGISTER (ktoenal_ni); - /* fall through */ - - case SOCKNAL_INIT_PTL: - PtlNIFini(ktoenal_ni); - lib_fini(&ktoenal_lib); - /* fall through */ - - case SOCKNAL_INIT_DATA: - /* Module refcount only gets to zero when all connections - * have been closed so all lists must be empty */ - LASSERT (list_empty (&ktoenal_data.ksnd_socklist)); - LASSERT (list_empty (&ktoenal_data.ksnd_reaper_list)); - LASSERT (list_empty (&ktoenal_data.ksnd_rx_conns)); - LASSERT (list_empty (&ktoenal_data.ksnd_tx_conns)); - LASSERT (list_empty (&ktoenal_data.ksnd_small_fmp.fmp_blocked_conns)); - LASSERT (list_empty (&ktoenal_data.ksnd_large_fmp.fmp_blocked_conns)); - - kpr_shutdown (&ktoenal_data.ksnd_router); /* stop router calling me */ - - /* flag threads to terminate; wake and wait for them to die */ - ktoenal_data.ksnd_shuttingdown = 1; - wake_up_all (&ktoenal_data.ksnd_reaper_waitq); - wake_up_all (&ktoenal_data.ksnd_sched_waitq); - wake_up_process(ktoenal_data.ksnd_pollthread_tsk); - - while (atomic_read (&ktoenal_data.ksnd_nthreads) != 0) - { - CDEBUG (D_NET, "waitinf for %d threads to terminate\n", - atomic_read (&ktoenal_data.ksnd_nthreads)); - set_current_state (TASK_UNINTERRUPTIBLE); - schedule_timeout (HZ); - } - - kpr_deregister (&ktoenal_data.ksnd_router); - - ktoenal_free_buffers(); - /* fall through */ - - case SOCKNAL_INIT_NOTHING: - break; - } - - CDEBUG(D_MALLOC, "after NAL cleanup: kmem %d\n", - atomic_read (&portal_kmemory)); - - printk(KERN_INFO "Lustre: Routing socket NAL unloaded (final mem %d)\n", - atomic_read(&portal_kmemory)); -} - -int __init -ktoenal_module_init (void) -{ - int pkmem = atomic_read(&portal_kmemory); - int rc; - int i; - int j; - - /* packet descriptor must fit in a router descriptor's scratchpad */ - LASSERT(sizeof (ksock_tx_t) <= sizeof (kprfd_scratch_t)); - - LASSERT (ktoenal_data.ksnd_init == SOCKNAL_INIT_NOTHING); - - ktoenal_api.forward = ktoenal_api_forward; - ktoenal_api.shutdown = ktoenal_api_shutdown; - ktoenal_api.yield = ktoenal_api_yield; - ktoenal_api.validate = NULL; /* our api validate is a NOOP */ - ktoenal_api.lock = ktoenal_api_lock; - ktoenal_api.unlock = ktoenal_api_unlock; - ktoenal_api.nal_data = &ktoenal_data; - - ktoenal_lib.nal_data = &ktoenal_data; - - memset (&ktoenal_data, 0, sizeof (ktoenal_data)); /* zero pointers */ - - INIT_LIST_HEAD(&ktoenal_data.ksnd_socklist); - rwlock_init(&ktoenal_data.ksnd_socklist_lock); - - ktoenal_data.ksnd_nal_cb = &ktoenal_lib; - spin_lock_init (&ktoenal_data.ksnd_nal_cb_lock); - - spin_lock_init (&ktoenal_data.ksnd_sched_lock); - - init_waitqueue_head (&ktoenal_data.ksnd_sched_waitq); - - INIT_LIST_HEAD (&ktoenal_data.ksnd_rx_conns); - INIT_LIST_HEAD (&ktoenal_data.ksnd_tx_conns); - - INIT_LIST_HEAD(&ktoenal_data.ksnd_small_fmp.fmp_idle_fmbs); - INIT_LIST_HEAD(&ktoenal_data.ksnd_small_fmp.fmp_blocked_conns); - INIT_LIST_HEAD(&ktoenal_data.ksnd_large_fmp.fmp_idle_fmbs); - INIT_LIST_HEAD(&ktoenal_data.ksnd_large_fmp.fmp_blocked_conns); - - INIT_LIST_HEAD(&ktoenal_data.ksnd_idle_nblk_ltx_list); - INIT_LIST_HEAD(&ktoenal_data.ksnd_idle_ltx_list); - init_waitqueue_head(&ktoenal_data.ksnd_idle_ltx_waitq); - - INIT_LIST_HEAD (&ktoenal_data.ksnd_reaper_list); - init_waitqueue_head(&ktoenal_data.ksnd_reaper_waitq); - spin_lock_init (&ktoenal_data.ksnd_reaper_lock); - - ktoenal_data.ksnd_init = SOCKNAL_INIT_DATA; /* flag lists/ptrs/locks initialised */ - - PORTAL_ALLOC(ktoenal_data.ksnd_fmbs, - sizeof(ksock_fmb_t) * (SOCKNAL_SMALL_FWD_NMSGS + SOCKNAL_LARGE_FWD_NMSGS)); - if (ktoenal_data.ksnd_fmbs == NULL) - RETURN(-ENOMEM); - - /* NULL out buffer pointers etc */ - memset(ktoenal_data.ksnd_fmbs, 0, - sizeof(ksock_fmb_t) * (SOCKNAL_SMALL_FWD_NMSGS + SOCKNAL_LARGE_FWD_NMSGS)); - - for (i = 0; i < (SOCKNAL_SMALL_FWD_NMSGS + SOCKNAL_LARGE_FWD_NMSGS); i++) - { - ksock_fmb_t *fmb = &((ksock_fmb_t *)ktoenal_data.ksnd_fmbs)[i]; - - if (i < SOCKNAL_SMALL_FWD_NMSGS) - { - fmb->fmb_npages = SOCKNAL_SMALL_FWD_PAGES; - fmb->fmb_pool = &ktoenal_data.ksnd_small_fmp; - } - else - { - fmb->fmb_npages = SOCKNAL_LARGE_FWD_PAGES; - fmb->fmb_pool = &ktoenal_data.ksnd_large_fmp; - } - - LASSERT (fmb->fmb_npages > 0); - for (j = 0; j < fmb->fmb_npages; j++) - { - fmb->fmb_pages[j] = alloc_page(GFP_KERNEL); - - if (fmb->fmb_pages[j] == NULL) - { - ktoenal_module_fini (); - return (-ENOMEM); - } - - LASSERT (page_address (fmb->fmb_pages[j]) != NULL); - } - - list_add (&fmb->fmb_list, &fmb->fmb_pool->fmp_idle_fmbs); - } - - PORTAL_ALLOC(ktoenal_data.ksnd_ltxs, - sizeof (ksock_ltx_t) * (SOCKNAL_NLTXS + SOCKNAL_NNBLK_LTXS)); - if (ktoenal_data.ksnd_ltxs == NULL) - { - ktoenal_module_fini (); - return (-ENOMEM); - } - - /* Deterministic bugs please */ - memset (ktoenal_data.ksnd_ltxs, 0xeb, - sizeof (ksock_ltx_t) * (SOCKNAL_NLTXS + SOCKNAL_NNBLK_LTXS)); - - for (i = 0; i < SOCKNAL_NLTXS + SOCKNAL_NNBLK_LTXS; i++) - { - ksock_ltx_t *ltx = &((ksock_ltx_t *)ktoenal_data.ksnd_ltxs)[i]; - - ltx->ltx_idle = i < SOCKNAL_NLTXS ? - &ktoenal_data.ksnd_idle_ltx_list : - &ktoenal_data.ksnd_idle_nblk_ltx_list; - list_add (<x->ltx_tx.tx_list, ltx->ltx_idle); - } - - rc = PtlNIInit(ktoenal_init, 32, 4, 0, &ktoenal_ni); - if (rc != 0) - { - CERROR("ktoenal: PtlNIInit failed: error %d\n", rc); - ktoenal_module_fini (); - RETURN (rc); - } - PtlNIDebug(ktoenal_ni, ~0); - - ktoenal_data.ksnd_init = SOCKNAL_INIT_PTL; /* flag PtlNIInit() called */ - - ktoenal_data.ksnd_slistchange = 1; - for (i = 0; i < TOENAL_N_SCHED; i++) - { - rc = ktoenal_thread_start (ktoenal_scheduler, NULL); - if (rc != 0) - { - CERROR("Can't spawn socknal scheduler[%d]: %d\n", i, rc); - ktoenal_module_fini (); - RETURN (rc); - } - } - - rc = ktoenal_thread_start (ktoenal_reaper, NULL); - if (rc != 0) - { - CERROR("Can't spawn socknal reaper: %d\n", rc); - ktoenal_module_fini (); - RETURN (rc); - } - - rc = ktoenal_thread_start (ktoenal_pollthread, NULL); - if (rc != 0) - { - CERROR("Can't spawn socknal pollthread: %d\n", rc); - ktoenal_module_fini (); - RETURN (rc); - } - - rc = kpr_register(&ktoenal_data.ksnd_router, - &ktoenal_router_interface); - if (rc != 0) - CDEBUG (D_NET, "Can't initialise routing interface (rc = %d): not routing\n", rc); - - rc = kportal_nal_register(TOENAL, &ktoenal_cmd, NULL); - if (rc != 0) - CDEBUG(D_NET, "Can't initialise command interface (rc = %d)\n", - rc); - - PORTAL_SYMBOL_REGISTER(ktoenal_ni); - - /* flag everything initialised */ - ktoenal_data.ksnd_init = SOCKNAL_INIT_ALL; - - printk(KERN_INFO "Lustre: Routing TOE NAL loaded (Routing %s, initial mem %d)\n", - kpr_routing(&ktoenal_data.ksnd_router) ? "enabled" : "disabled", - pkmem); - - return (0); -} - -MODULE_AUTHOR("Cluster File Systems, Inc. "); -MODULE_DESCRIPTION("Kernel TCP Socket NAL v0.01"); -MODULE_LICENSE("GPL"); - -module_init(ktoenal_module_init); -module_exit(ktoenal_module_fini); - -EXPORT_SYMBOL (ktoenal_ni); diff --git a/lustre/portals/knals/toenal/toenal.h b/lustre/portals/knals/toenal/toenal.h deleted file mode 100644 index b211d6c..0000000 --- a/lustre/portals/knals/toenal/toenal.h +++ /dev/null @@ -1,236 +0,0 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * - * Copyright (C) 2001, 2002 Cluster File Systems, Inc. - * Author: Zach Brown - * Author: Peter J. Braam - * Author: Phil Schwan - * Author: Eric Barton - * Author: Kedar Sovani - * Author: Amey Inamdar - * - * This file is part of Portals, http://www.sf.net/projects/lustre/ - * - * Portals is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * Portals is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * 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. - * - */ - -#define DEBUG_PORTAL_ALLOC -#ifndef EXPORT_SYMTAB -# define EXPORT_SYMTAB -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include - -#define DEBUG_SUBSYSTEM S_SOCKNAL - -#include -#include -#include - -#define SOCKNAL_NLTXS 128 /* # normal transmit messages */ -#define SOCKNAL_NNBLK_LTXS 128 /* # transmit messages reserved if can't block */ - -#define SOCKNAL_SMALL_FWD_NMSGS 128 /* # small messages I can be forwarding at any time */ -#define SOCKNAL_LARGE_FWD_NMSGS 32 /* # large messages I can be forwarding at any time */ - -#define SOCKNAL_SMALL_FWD_PAGES 1 /* # pages in a small message fwd buffer */ - -#define SOCKNAL_LARGE_FWD_PAGES (PAGE_ALIGN (sizeof (ptl_hdr_t) + PTL_MTU) >> PAGE_SHIFT) - /* # pages in a large message fwd buffer */ - -#define SOCKNAL_RESCHED 100 /* # scheduler loops before reschedule */ - -#define SOCKNAL_TX_LOW_WATER(sk) (((sk)->sndbuf*8)/10) - -#define TOENAL_N_SCHED 1 - -typedef struct /* pool of forwarding buffers */ -{ - struct list_head fmp_idle_fmbs; /* buffers waiting for a connection */ - struct list_head fmp_blocked_conns; /* connections waiting for a buffer */ -} ksock_fmb_pool_t; - -typedef struct { - int ksnd_init; /* initialisation state */ - - struct list_head ksnd_socklist; /* all my connections */ - rwlock_t ksnd_socklist_lock; /* stabilise add/find/remove */ - - - ptl_nid_t ksnd_mynid; - nal_cb_t *ksnd_nal_cb; - spinlock_t ksnd_nal_cb_lock; /* lib cli/sti lock */ - - atomic_t ksnd_nthreads; /* # live threads */ - int ksnd_shuttingdown; /* tell threads to exit */ - - kpr_router_t ksnd_router; /* THE router */ - - spinlock_t ksnd_sched_lock; /* serialise packet scheduling */ - wait_queue_head_t ksnd_sched_waitq; /* where scheduler(s) wait */ - - struct list_head ksnd_rx_conns; /* conn waiting to be read */ - struct list_head ksnd_tx_conns; /* conn waiting to be written */ - - void *ksnd_fmbs; /* all the pre-allocated FMBs */ - ksock_fmb_pool_t ksnd_small_fmp; /* small message forwarding buffers */ - ksock_fmb_pool_t ksnd_large_fmp; /* large message forwarding buffers */ - - void *ksnd_ltxs; /* all the pre-allocated LTXs */ - struct list_head ksnd_idle_ltx_list; /* where to get an idle LTX */ - struct list_head ksnd_idle_nblk_ltx_list; /* where to get an idle LTX if you can't block */ - wait_queue_head_t ksnd_idle_ltx_waitq; /* where to block for an idle LTX */ - - struct list_head ksnd_reaper_list; /* conn waiting to be reaped */ - wait_queue_head_t ksnd_reaper_waitq; /* reaper sleeps here */ - spinlock_t ksnd_reaper_lock; /* serialise */ - - struct task_struct *ksnd_pollthread_tsk;/* task_struct for the poll thread */ - poll_table ksnd_pwait; /* poll wait table for the socket */ - int ksnd_slistchange; /* informs the pollthread that - * the socklist has changed */ -} ksock_nal_data_t; - -#define SOCKNAL_INIT_NOTHING 0 -#define SOCKNAL_INIT_DATA 1 -#define SOCKNAL_INIT_PTL 2 -#define SOCKNAL_INIT_ALL 3 - -typedef struct /* transmit packet */ -{ - struct list_head tx_list; /* queue on conn for transmission etc */ - char tx_isfwd; /* forwarding / sourced here */ - int tx_nob; /* # packet bytes */ - int tx_niov; /* # packet frags */ - struct iovec *tx_iov; /* packet frags */ -} ksock_tx_t; - -typedef struct /* locally transmitted packet */ -{ - ksock_tx_t ltx_tx; /* send info */ - struct list_head *ltx_idle; /* where to put when idle */ - void *ltx_private; /* lib_finalize() callback arg */ - void *ltx_cookie; /* lib_finalize() callback arg */ - struct iovec ltx_iov[1 + PTL_MD_MAX_IOV]; /* msg frags */ - ptl_hdr_t ltx_hdr; /* buffer for packet header */ -} ksock_ltx_t; - -#define KSOCK_TX_2_KPR_FWD_DESC(ptr) list_entry (ptr, kpr_fwd_desc_t, kprfd_scratch) -/* forwarded packets (router->socknal) embedded in kpr_fwd_desc_t::kprfd_scratch */ - -#define KSOCK_TX_2_KSOCK_LTX(ptr) list_entry (ptr, ksock_ltx_t, ltx_tx) -/* local packets (lib->socknal) embedded in ksock_ltx_t::ltx_tx */ - -/* NB list_entry() is used here as convenient macro for calculating a - * pointer to a struct from the addres of a member. - */ - -typedef struct /* Kernel portals Socket Forwarding message buffer */ -{ /* (socknal->router) */ - struct list_head fmb_list; /* queue idle */ - kpr_fwd_desc_t fmb_fwd; /* router's descriptor */ - int fmb_npages; /* # pages allocated */ - ksock_fmb_pool_t *fmb_pool; /* owning pool */ - struct page *fmb_pages[SOCKNAL_LARGE_FWD_PAGES]; - struct iovec fmb_iov[SOCKNAL_LARGE_FWD_PAGES]; -} ksock_fmb_t; - -#define SOCKNAL_RX_HEADER 1 /* reading header */ -#define SOCKNAL_RX_BODY 2 /* reading body (to deliver here) */ -#define SOCKNAL_RX_BODY_FWD 3 /* reading body (to forward) */ -#define SOCKNAL_RX_SLOP 4 /* skipping body */ -#define SOCKNAL_RX_GET_FMB 5 /* scheduled for forwarding */ -#define SOCKNAL_RX_FMB_SLEEP 6 /* blocked waiting for a fwd desc */ - -typedef struct -{ - struct list_head ksnc_list; /* stash on global socket list */ - struct file *ksnc_file; /* socket filp */ - struct socket *ksnc_sock; /* socket */ - ptl_nid_t ksnc_peernid; /* who's on the other end */ - atomic_t ksnc_refcount; /* # users */ - - /* READER */ - struct list_head ksnc_rx_list; /* where I enq waiting input or a forwarding descriptor */ - unsigned long ksnc_rx_ready; /* data ready to read */ - int ksnc_rx_scheduled; /* being progressed */ - int ksnc_rx_state; /* what is being read */ - int ksnc_rx_nob_left; /* # bytes to next hdr/body */ - int ksnc_rx_nob_wanted; /* bytes actually wanted */ - int ksnc_rx_niov; /* # frags */ - struct iovec ksnc_rx_iov[1 + PTL_MD_MAX_IOV]; /* the frags */ - - void *ksnc_cookie; /* rx lib_finalize passthru arg */ - ptl_hdr_t ksnc_hdr; /* where I read headers into */ - - /* WRITER */ - struct list_head ksnc_tx_list; /* where I enq waiting for output space */ - struct list_head ksnc_tx_queue; /* packets waiting to be sent */ - unsigned long ksnc_tx_ready; /* write space */ - int ksnc_tx_scheduled; /* being progressed */ - -} ksock_conn_t; - -extern int ktoenal_add_sock (ptl_nid_t nid, int fd); -extern int ktoenal_close_sock(ptl_nid_t nid); -extern int ktoenal_set_mynid(ptl_nid_t nid); -extern int ktoenal_push_sock(ptl_nid_t nid); -extern ksock_conn_t *ktoenal_get_conn (ptl_nid_t nid); -extern void _ktoenal_put_conn (ksock_conn_t *conn); -extern void ktoenal_close_conn (ksock_conn_t *conn); - -static inline void -ktoenal_put_conn (ksock_conn_t *conn) -{ - CDEBUG (D_OTHER, "putting conn[%p] -> "LPX64" (%d)\n", - conn, conn->ksnc_peernid, atomic_read (&conn->ksnc_refcount)); - - if (atomic_dec_and_test (&conn->ksnc_refcount)) - _ktoenal_put_conn (conn); -} - -extern int ktoenal_thread_start (int (*fn)(void *arg), void *arg); -extern int ktoenal_new_packet (ksock_conn_t *conn, int skip); -extern void ktoenal_fwd_packet (void *arg, kpr_fwd_desc_t *fwd); -extern int ktoenal_scheduler (void *arg); -extern int ktoenal_reaper (void *arg); -extern int ktoenal_pollthread (void *arg); -extern void ktoenal_data_ready(ksock_conn_t *conn); -extern void ktoenal_write_space(ksock_conn_t *conn); - - -extern nal_cb_t ktoenal_lib; -extern ksock_nal_data_t ktoenal_data; diff --git a/lustre/portals/knals/toenal/toenal_cb.c b/lustre/portals/knals/toenal/toenal_cb.c deleted file mode 100644 index 3af9e33..0000000 --- a/lustre/portals/knals/toenal/toenal_cb.c +++ /dev/null @@ -1,1202 +0,0 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * - * Copyright (C) 2001, 2002 Cluster File Systems, Inc. - * Author: Zach Brown - * Author: Peter J. Braam - * Author: Phil Schwan - * Author: Eric Barton - * Author: Kedar Sovani - * Author: Amey Inamdar - * - * This file is part of Portals, http://www.sf.net/projects/lustre/ - * - * Portals is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * Portals is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * 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 -#include "toenal.h" - -atomic_t ktoenal_packets_received; -long ktoenal_packets_launched; -long ktoenal_packets_transmitted; - -/* - * LIB functions follow - * - */ -int -ktoenal_read(nal_cb_t *nal, void *private, void *dst_addr, - user_ptr src_addr, size_t len) -{ - CDEBUG(D_NET, LPX64": reading %ld bytes from %p -> %p\n", - nal->ni.nid, (long)len, src_addr, dst_addr); - - memcpy( dst_addr, src_addr, len ); - return 0; -} - -int -ktoenal_write(nal_cb_t *nal, void *private, user_ptr dst_addr, - void *src_addr, size_t len) -{ - CDEBUG(D_NET, LPX64": writing %ld bytes from %p -> %p\n", - nal->ni.nid, (long)len, src_addr, dst_addr); - - memcpy( dst_addr, src_addr, len ); - return 0; -} - -int -ktoenal_callback (nal_cb_t * nal, void *private, lib_eq_t *eq, - ptl_event_t *ev) -{ - CDEBUG(D_NET, LPX64": callback eq %p ev %p\n", - nal->ni.nid, eq, ev); - - if (eq->event_callback != NULL) - eq->event_callback(ev); - - return 0; -} - -void * -ktoenal_malloc(nal_cb_t *nal, size_t len) -{ - void *buf; - - PORTAL_ALLOC(buf, len); - - if (buf != NULL) - memset(buf, 0, len); - - return (buf); -} - -void -ktoenal_free(nal_cb_t *nal, void *buf, size_t len) -{ - PORTAL_FREE(buf, len); -} - -void -ktoenal_printf(nal_cb_t *nal, const char *fmt, ...) -{ - va_list ap; - char msg[256]; - - va_start (ap, fmt); - vsnprintf (msg, sizeof (msg), fmt, ap); /* sprint safely */ - va_end (ap); - - msg[sizeof (msg) - 1] = 0; /* ensure terminated */ - - CDEBUG (D_NET, "%s", msg); -} - -void -ktoenal_cli(nal_cb_t *nal, unsigned long *flags) -{ - ksock_nal_data_t *data = nal->nal_data; - - spin_lock(&data->ksnd_nal_cb_lock); -} - -void -ktoenal_sti(nal_cb_t *nal, unsigned long *flags) -{ - ksock_nal_data_t *data; - data = nal->nal_data; - - spin_unlock(&data->ksnd_nal_cb_lock); -} - -int -ktoenal_dist(nal_cb_t *nal, ptl_nid_t nid, unsigned long *dist) -{ - /* I would guess that if ktoenal_get_conn(nid) == NULL, - and we're not routing, then 'nid' is very distant :) */ - if ( nal->ni.nid == nid ) { - *dist = 0; - } else { - *dist = 1; - } - - return 0; -} - -ksock_ltx_t * -ktoenal_get_ltx (int may_block) -{ - unsigned long flags; - ksock_ltx_t *ltx = NULL; - - for (;;) - { - spin_lock_irqsave (&ktoenal_data.ksnd_sched_lock, flags); - - if (!list_empty (&ktoenal_data.ksnd_idle_ltx_list)) - { - ltx = list_entry (ktoenal_data.ksnd_idle_ltx_list.next, ksock_ltx_t, ltx_tx.tx_list); - list_del (<x->ltx_tx.tx_list); - break; - } - - if (!may_block) - { - if (!list_empty (&ktoenal_data.ksnd_idle_nblk_ltx_list)) - { - ltx = list_entry (ktoenal_data.ksnd_idle_nblk_ltx_list.next, - ksock_ltx_t, ltx_tx.tx_list); - list_del (<x->ltx_tx.tx_list); - } - break; - } - - spin_unlock_irqrestore (&ktoenal_data.ksnd_sched_lock, flags); - - wait_event (ktoenal_data.ksnd_idle_ltx_waitq, - !list_empty (&ktoenal_data.ksnd_idle_ltx_list)); - } - - spin_unlock_irqrestore (&ktoenal_data.ksnd_sched_lock, flags); - - return (ltx); -} - -int -ktoenal_sendmsg (struct file *sock, struct iovec *iov, int niov, int nob, int flags) -{ - /* NB This procedure "consumes" iov (actually we do, tcp_sendmsg doesn't) - */ - mm_segment_t oldmm; - int rc; - - LASSERT (niov > 0); - LASSERT (nob > 0); - - oldmm = get_fs(); - set_fs (KERNEL_DS); - -#ifdef PORTAL_DEBUG - { - int total_nob; - int i; - - for (i = total_nob = 0; i < niov; i++) - total_nob += iov[i].iov_len; - - LASSERT (nob == total_nob); - } -#endif - LASSERT (!in_interrupt()); - - rc = sock->f_op->writev(sock, iov, niov, NULL); - - set_fs (oldmm); - - if (rc > 0) /* sent something? */ - { - nob = rc; /* consume iov */ - for (;;) - { - LASSERT (niov > 0); - - if (iov->iov_len >= nob) - { - iov->iov_len -= nob; - iov->iov_base = (void *)(((unsigned long)iov->iov_base) + nob); - break; - } - nob -= iov->iov_len; - iov->iov_len = 0; - iov++; - niov--; - } - } - - return (rc); -} - -int -ktoenal_recvmsg(struct file *sock, struct iovec *iov, int niov, int toread) -{ - /* NB This procedure "consumes" iov (actually tcp_recvmsg does) - */ - mm_segment_t oldmm; - int ret, i, len = 0, origlen = 0; - - PROF_START(our_recvmsg); - for(i = 0; i < niov; i++) { - len += iov[i].iov_len; - if(len >= toread) - break; - } - - if(len >= toread) { - origlen = iov[i].iov_len; - iov[i].iov_len -= (len - toread); - } - else { /* i == niov */ - i = niov - 1; - } - - oldmm = get_fs(); - set_fs(KERNEL_DS); - - ret = sock->f_op->readv(sock, iov, i + 1, NULL); - - set_fs(oldmm); - - if(origlen) - iov[i].iov_len = origlen; - - PROF_FINISH(our_recvmsg); - return ret; -} - -void -ktoenal_process_transmit (ksock_conn_t *conn, unsigned long *irq_flags) -{ - ksock_tx_t *tx = list_entry (conn->ksnc_tx_queue.next, ksock_tx_t, tx_list); - int rc; - - LASSERT (conn->ksnc_tx_scheduled); - LASSERT (conn->ksnc_tx_ready); - LASSERT (!list_empty (&conn->ksnc_tx_queue)); - - /* assume transmit will complete now, so dequeue while I've got the lock */ - list_del (&tx->tx_list); - - spin_unlock_irqrestore (&ktoenal_data.ksnd_sched_lock, *irq_flags); - - LASSERT (tx->tx_nob > 0); - - conn->ksnc_tx_ready = 0; /* write_space may race with me and set ready */ - mb(); /* => clear BEFORE trying to write */ - - rc = ktoenal_sendmsg (conn->ksnc_file, - tx->tx_iov, tx->tx_niov, tx->tx_nob, - list_empty (&conn->ksnc_tx_queue) ? - MSG_DONTWAIT : (MSG_DONTWAIT | MSG_MORE)); - - CDEBUG (D_NET, "send(%d) %d\n", tx->tx_nob, rc); - - if (rc < 0) /* error */ - { - if (rc == -EAGAIN) /* socket full => */ - rc = 0; /* nothing sent */ - else - { - //warning FIXME: handle socket errors properly - CERROR ("Error socknal send(%d) %p: %d\n", tx->tx_nob, conn, rc); - rc = tx->tx_nob; /* kid on for now whole packet went */ - } - } - - if (rc == tx->tx_nob) /* everything went */ - { - conn->ksnc_tx_ready = 1; /* assume more can go (ASAP) */ - ktoenal_put_conn (conn); /* release packet's ref */ - - if (tx->tx_isfwd) /* was a forwarded packet? */ - { - kpr_fwd_done (&ktoenal_data.ksnd_router, - KSOCK_TX_2_KPR_FWD_DESC (tx), 0); - - spin_lock_irqsave (&ktoenal_data.ksnd_sched_lock, *irq_flags); - } - else /* local send */ - { - ksock_ltx_t *ltx = KSOCK_TX_2_KSOCK_LTX (tx); - - lib_finalize (&ktoenal_lib, ltx->ltx_private, ltx->ltx_cookie); - - spin_lock_irqsave (&ktoenal_data.ksnd_sched_lock, *irq_flags); - - list_add (<x->ltx_tx.tx_list, ltx->ltx_idle); - - /* normal tx desc => wakeup anyone blocking for one */ - if (ltx->ltx_idle == &ktoenal_data.ksnd_idle_ltx_list && - waitqueue_active (&ktoenal_data.ksnd_idle_ltx_waitq)) - wake_up (&ktoenal_data.ksnd_idle_ltx_waitq); - } - ktoenal_packets_transmitted++; - } - else - { - tx->tx_nob -= rc; - - spin_lock_irqsave (&ktoenal_data.ksnd_sched_lock, *irq_flags); - - /* back onto HEAD of tx_queue */ - list_add (&tx->tx_list, &conn->ksnc_tx_queue); - } - - if (!conn->ksnc_tx_ready || /* no space to write now */ - list_empty (&conn->ksnc_tx_queue)) /* nothing to write */ - { - conn->ksnc_tx_scheduled = 0; /* not being scheduled */ - ktoenal_put_conn (conn); /* release scheduler's ref */ - } - else /* let scheduler call me again */ - list_add_tail (&conn->ksnc_tx_list, &ktoenal_data.ksnd_tx_conns); -} - -void -ktoenal_launch_packet (ksock_conn_t *conn, ksock_tx_t *tx) -{ - unsigned long flags; - int nob = tx->tx_nob; - struct iovec *iov = tx->tx_iov; - int niov = 1; - - LASSERT (nob >= sizeof (ptl_hdr_t)); - - /* Truncate iov to exactly match total packet length - * since socket sendmsg pays no attention to requested length. - */ - for (;;) - { - LASSERT (niov <= tx->tx_niov); - - if (iov->iov_len >= nob) - { - iov->iov_len = nob; - break; - } - nob -= iov->iov_len; - iov++; - niov++; - } - tx->tx_niov = niov; - - spin_lock_irqsave (&ktoenal_data.ksnd_sched_lock, flags); - list_add_tail (&tx->tx_list, &conn->ksnc_tx_queue); - - if (conn->ksnc_tx_ready && /* able to send */ - !conn->ksnc_tx_scheduled) /* not scheduled to send */ - { - list_add_tail (&conn->ksnc_tx_list, &ktoenal_data.ksnd_tx_conns); - conn->ksnc_tx_scheduled = 1; - atomic_inc (&conn->ksnc_refcount); /* extra ref for scheduler */ - if (waitqueue_active (&ktoenal_data.ksnd_sched_waitq)) - wake_up (&ktoenal_data.ksnd_sched_waitq); - } - - ktoenal_packets_launched++; - spin_unlock_irqrestore (&ktoenal_data.ksnd_sched_lock, flags); -} - -int -ktoenal_send(nal_cb_t *nal, void *private, lib_msg_t *cookie, - ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid, - unsigned int payload_niov, struct iovec *payload_iov, size_t payload_len) -{ - ptl_nid_t gatewaynid; - ksock_conn_t *conn; - ksock_ltx_t *ltx; - int rc; - int i; - - /* By this point, as it happens, we have absolutely no idea what - * 'private' is. It might be ksock_nal_data or it might be ksock_conn. - * Ha ha, isn't that a funny joke? - * - * FIXME: this is not the right way to fix this; the right way is to - * always pass in the same kind of structure. This is hard right now. - * To revisit this issue, set a breakpoint in here and watch for when - * it's called from lib_finalize. I think this occurs when we send a - * packet as a side-effect of another packet, such as when an ACK has - * been requested. -phil */ - - CDEBUG(D_NET, "sending %d bytes from [%d](%p,%d)... to nid: " - LPX64" pid %d\n", (int)payload_len, payload_niov, - payload_niov > 0 ? payload_iov[0].iov_base : NULL, - (int)(payload_niov > 0 ? payload_iov[0].iov_len : 0), nid, pid); - - if ((conn = ktoenal_get_conn (nid)) == NULL) - { - /* It's not a peer; try to find a gateway */ - rc = kpr_lookup (&ktoenal_data.ksnd_router, nid, payload_niov, - &gatewaynid); - if (rc != 0) - { - CERROR ("Can't route to "LPX64": router error %d\n", nid, rc); - return (-1); - } - - if ((conn = ktoenal_get_conn (gatewaynid)) == NULL) - { - CERROR ("Can't route to "LPX64": gateway "LPX64" is not a peer\n", - nid, gatewaynid); - return (-1); - } - } - - /* This transmit has now got a ref on conn */ - - /* I may not block for a transmit descriptor if I might block the - * receiver, or an interrupt handler. */ - ltx = ktoenal_get_ltx (!(type == PTL_MSG_ACK || - type == PTL_MSG_REPLY || - in_interrupt ())); - if (ltx == NULL) - { - CERROR ("Can't allocate tx desc\n"); - ktoenal_put_conn (conn); - return (-1); - } - - /* Init common (to sends and forwards) packet part */ - ltx->ltx_tx.tx_isfwd = 0; - ltx->ltx_tx.tx_nob = sizeof (*hdr) + payload_len; - ltx->ltx_tx.tx_niov = 1 + payload_niov; - ltx->ltx_tx.tx_iov = ltx->ltx_iov; - - /* Init local send packet (storage for hdr, finalize() args, iov) */ - ltx->ltx_hdr = *hdr; - ltx->ltx_private = private; - ltx->ltx_cookie = cookie; - - ltx->ltx_iov[0].iov_base = <x->ltx_hdr; - ltx->ltx_iov[0].iov_len = sizeof (ltx->ltx_hdr); - - LASSERT (payload_niov <= PTL_MD_MAX_IOV); - - for (i = 0; i < payload_niov; i++) - { - ltx->ltx_iov[1 + i].iov_base = payload_iov[i].iov_base; - ltx->ltx_iov[1 + i].iov_len = payload_iov[i].iov_len; - } - - ktoenal_launch_packet (conn, <x->ltx_tx); - return (0); -} - -void -ktoenal_fwd_packet (void *arg, kpr_fwd_desc_t *fwd) -{ - ksock_conn_t *conn; - ptl_nid_t nid = fwd->kprfd_gateway_nid; - ksock_tx_t *tx = (ksock_tx_t *)&fwd->kprfd_scratch; - - CDEBUG (D_NET, "Forwarding [%p] -> "LPX64" ("LPX64"))\n", fwd, - fwd->kprfd_gateway_nid, fwd->kprfd_target_nid); - - if (nid == ktoenal_lib.ni.nid) /* I'm the gateway; must be the last hop */ - nid = fwd->kprfd_target_nid; - - conn = ktoenal_get_conn (nid); - if (conn == NULL) - { - CERROR ("[%p] fwd to "LPX64" isn't a peer\n", fwd, nid); - kpr_fwd_done (&ktoenal_data.ksnd_router, fwd, -EHOSTUNREACH); - return; - } - - /* This forward has now got a ref on conn */ - - tx->tx_isfwd = 1; /* This is a forwarding packet */ - tx->tx_nob = fwd->kprfd_nob; - tx->tx_niov = fwd->kprfd_niov; - tx->tx_iov = fwd->kprfd_iov; - - ktoenal_launch_packet (conn, tx); -} - -int -ktoenal_thread_start (int (*fn)(void *arg), void *arg) -{ - long pid = kernel_thread (fn, arg, 0); - - if (pid < 0) - return ((int)pid); - - atomic_inc (&ktoenal_data.ksnd_nthreads); - return (0); -} - -void -ktoenal_thread_fini (void) -{ - atomic_dec (&ktoenal_data.ksnd_nthreads); -} - -void -ktoenal_fmb_callback (void *arg, int error) -{ - ksock_fmb_t *fmb = (ksock_fmb_t *)arg; - ptl_hdr_t *hdr = (ptl_hdr_t *) page_address(fmb->fmb_pages[0]); - ksock_conn_t *conn; - unsigned long flags; - - CDEBUG (D_NET, "routed packet from "LPX64" to "LPX64": %d\n", - hdr->src_nid, hdr->dest_nid, error); - - if (error != 0) - CERROR ("Failed to route packet from "LPX64" to "LPX64": %d\n", - hdr->src_nid, hdr->dest_nid, error); - - spin_lock_irqsave (&ktoenal_data.ksnd_sched_lock, flags); - - list_add (&fmb->fmb_list, &fmb->fmb_pool->fmp_idle_fmbs); - - if (!list_empty (&fmb->fmb_pool->fmp_blocked_conns)) - { - conn = list_entry (fmb->fmb_pool->fmp_blocked_conns.next, ksock_conn_t, ksnc_rx_list); - list_del (&conn->ksnc_rx_list); - - CDEBUG (D_NET, "Scheduling conn %p\n", conn); - LASSERT (conn->ksnc_rx_scheduled); - LASSERT (conn->ksnc_rx_state == SOCKNAL_RX_FMB_SLEEP); - - conn->ksnc_rx_state = SOCKNAL_RX_GET_FMB; - list_add_tail (&conn->ksnc_rx_list, &ktoenal_data.ksnd_rx_conns); - - if (waitqueue_active (&ktoenal_data.ksnd_sched_waitq)) - wake_up (&ktoenal_data.ksnd_sched_waitq); - } - - spin_unlock_irqrestore (&ktoenal_data.ksnd_sched_lock, flags); -} - -ksock_fmb_t * -ktoenal_get_idle_fmb (ksock_conn_t *conn) -{ - /* NB called with sched lock held */ - int payload_nob = conn->ksnc_rx_nob_left; - int packet_nob = sizeof (ptl_hdr_t) + payload_nob; - ksock_fmb_pool_t *pool; - ksock_fmb_t *fmb; - - LASSERT (conn->ksnc_rx_state == SOCKNAL_RX_GET_FMB); - - if (packet_nob <= SOCKNAL_SMALL_FWD_PAGES * PAGE_SIZE) - pool = &ktoenal_data.ksnd_small_fmp; - else - pool = &ktoenal_data.ksnd_large_fmp; - - if (!list_empty (&pool->fmp_idle_fmbs)) - { - fmb = list_entry (pool->fmp_idle_fmbs.next, ksock_fmb_t, fmb_list); - list_del (&fmb->fmb_list); - return (fmb); - } - - /* deschedule until fmb free */ - - conn->ksnc_rx_state = SOCKNAL_RX_FMB_SLEEP; - - list_add_tail (&conn->ksnc_rx_list, - &pool->fmp_blocked_conns); - return (NULL); -} - - -int -ktoenal_init_fmb (ksock_conn_t *conn, ksock_fmb_t *fmb) -{ - int payload_nob = conn->ksnc_rx_nob_left; - int packet_nob = sizeof (ptl_hdr_t) + payload_nob; - int niov; /* at least the header */ - int nob; - - LASSERT (conn->ksnc_rx_scheduled); - LASSERT (conn->ksnc_rx_state == SOCKNAL_RX_GET_FMB); - LASSERT (conn->ksnc_rx_nob_wanted == conn->ksnc_rx_nob_left); - LASSERT (payload_nob >= 0); - LASSERT (packet_nob <= fmb->fmb_npages * PAGE_SIZE); - LASSERT (sizeof (ptl_hdr_t) < PAGE_SIZE); - - /* Got a forwarding buffer; copy the header we just read into the - * forwarding buffer. If there's payload start reading reading it - * into the buffer, otherwise the forwarding buffer can be kicked - * off immediately. - * - * NB fmb->fmb_iov spans the WHOLE packet. - * conn->ksnc_rx_iov spans just the payload. - */ - - fmb->fmb_iov[0].iov_base = page_address (fmb->fmb_pages[0]); - - memcpy (fmb->fmb_iov[0].iov_base, &conn->ksnc_hdr, sizeof (ptl_hdr_t)); /* copy header */ - - if (payload_nob == 0) /* got complete packet already */ - { - atomic_inc (&ktoenal_packets_received); - - CDEBUG (D_NET, "%p "LPX64"->"LPX64" %d fwd_start (immediate)\n", conn, - conn->ksnc_hdr.src_nid, conn->ksnc_hdr.dest_nid, packet_nob); - - fmb->fmb_iov[0].iov_len = sizeof (ptl_hdr_t); - - kpr_fwd_init (&fmb->fmb_fwd, conn->ksnc_hdr.dest_nid, - packet_nob, 1, fmb->fmb_iov, - ktoenal_fmb_callback, fmb); - - kpr_fwd_start (&ktoenal_data.ksnd_router, &fmb->fmb_fwd); /* forward it now */ - - ktoenal_new_packet (conn, 0); /* on to next packet */ - return (1); - } - - niov = 1; - if (packet_nob <= PAGE_SIZE) /* whole packet fits in first page */ - fmb->fmb_iov[0].iov_len = packet_nob; - else - { - fmb->fmb_iov[0].iov_len = PAGE_SIZE; - nob = packet_nob - PAGE_SIZE; - - do - { - LASSERT (niov < fmb->fmb_npages); - fmb->fmb_iov[niov].iov_base = page_address (fmb->fmb_pages[niov]); - fmb->fmb_iov[niov].iov_len = MIN (PAGE_SIZE, nob); - nob -= PAGE_SIZE; - niov++; - } while (nob > 0); - } - - kpr_fwd_init (&fmb->fmb_fwd, conn->ksnc_hdr.dest_nid, - packet_nob, niov, fmb->fmb_iov, - ktoenal_fmb_callback, fmb); - - /* stash router's descriptor ready for call to kpr_fwd_start */ - conn->ksnc_cookie = &fmb->fmb_fwd; - - conn->ksnc_rx_state = SOCKNAL_RX_BODY_FWD; /* read in the payload */ - - /* payload is desc's iov-ed buffer, but skipping the hdr */ - LASSERT (niov <= sizeof (conn->ksnc_rx_iov) / sizeof (conn->ksnc_rx_iov[0])); - - conn->ksnc_rx_iov[0].iov_base = (void *)(((unsigned long)fmb->fmb_iov[0].iov_base) + sizeof (ptl_hdr_t)); - conn->ksnc_rx_iov[0].iov_len = fmb->fmb_iov[0].iov_len - sizeof (ptl_hdr_t); - - if (niov > 1) - memcpy (&conn->ksnc_rx_iov[1], &fmb->fmb_iov[1], (niov - 1) * sizeof (struct iovec)); - - conn->ksnc_rx_niov = niov; - - CDEBUG (D_NET, "%p "LPX64"->"LPX64" %d reading body\n", conn, - conn->ksnc_hdr.src_nid, conn->ksnc_hdr.dest_nid, payload_nob); - return (0); -} - -void -ktoenal_fwd_parse (ksock_conn_t *conn) -{ - ksock_conn_t *conn2; - int body_len; - - CDEBUG (D_NET, "%p "LPX64"->"LPX64" %d parsing header\n", conn, - conn->ksnc_hdr.src_nid, conn->ksnc_hdr.dest_nid, conn->ksnc_rx_nob_left); - - LASSERT (conn->ksnc_rx_state == SOCKNAL_RX_HEADER); - LASSERT (conn->ksnc_rx_scheduled); - - body_len = conn->ksnc_hdr.payload_length; - - if (body_len < 0) /* length corrupt */ - { - CERROR ("dropping packet from "LPX64" for "LPX64": packet size %d illegal\n", - conn->ksnc_hdr.src_nid, conn->ksnc_hdr.dest_nid, body_len); - ktoenal_new_packet (conn, 0); /* on to new packet */ - return; - } - - if (body_len > PTL_MTU) /* too big to forward */ - { - CERROR ("dropping packet from "LPX64" for "LPX64": packet size %d too big\n", - conn->ksnc_hdr.src_nid, conn->ksnc_hdr.dest_nid, body_len); - ktoenal_new_packet (conn, body_len); /* on to new packet (skip this one's body) */ - return; - } - - conn2 = ktoenal_get_conn (conn->ksnc_hdr.dest_nid); /* should have gone direct */ - if (conn2 != NULL) - { - CERROR ("dropping packet from "LPX64" for "LPX64": target is a peer\n", - conn->ksnc_hdr.src_nid, conn->ksnc_hdr.dest_nid); - ktoenal_put_conn (conn2); /* drop ref from get above */ - - ktoenal_new_packet (conn, body_len); /* on to next packet (skip this one's body) */ - return; - } - - conn->ksnc_rx_state = SOCKNAL_RX_GET_FMB; /* Getting FMB now */ - conn->ksnc_rx_nob_left = body_len; /* stash packet size */ - conn->ksnc_rx_nob_wanted = body_len; /* (no slop) */ -} - -int -ktoenal_new_packet (ksock_conn_t *conn, int nob_to_skip) -{ - static char ktoenal_slop_buffer[4096]; - - int nob; - int niov; - int skipped; - - if (nob_to_skip == 0) /* right at next packet boundary now */ - { - conn->ksnc_rx_state = SOCKNAL_RX_HEADER; - conn->ksnc_rx_nob_wanted = sizeof (ptl_hdr_t); - conn->ksnc_rx_nob_left = sizeof (ptl_hdr_t); - - conn->ksnc_rx_iov[0].iov_base = (char *)&conn->ksnc_hdr; - conn->ksnc_rx_iov[0].iov_len = sizeof (ptl_hdr_t); - conn->ksnc_rx_niov = 1; - return (1); - } - - /* set up to skip as much a possible now */ - /* if there's more left (ran out of iov entries) we'll get called again */ - - conn->ksnc_rx_state = SOCKNAL_RX_SLOP; - conn->ksnc_rx_nob_left = nob_to_skip; - skipped = 0; - niov = 0; - - do - { - nob = MIN (nob_to_skip, sizeof (ktoenal_slop_buffer)); - - conn->ksnc_rx_iov[niov].iov_base = ktoenal_slop_buffer; - conn->ksnc_rx_iov[niov].iov_len = nob; - niov++; - skipped += nob; - nob_to_skip -=nob; - - } while (nob_to_skip != 0 && /* mustn't overflow conn's rx iov */ - niov < sizeof (conn->ksnc_rx_iov)/sizeof (conn->ksnc_rx_iov[0])); - - conn->ksnc_rx_niov = niov; - conn->ksnc_rx_nob_wanted = skipped; - return (0); -} - -void -ktoenal_process_receive (ksock_conn_t *conn, unsigned long *irq_flags) -{ - ksock_fmb_t *fmb; - int len; - LASSERT (atomic_read (&conn->ksnc_refcount) > 0); - LASSERT (conn->ksnc_rx_scheduled); - LASSERT (conn->ksnc_rx_ready); - - /* NB: sched lock held */ - CDEBUG(D_NET, "conn %p\n", conn); - - if (conn->ksnc_rx_state != SOCKNAL_RX_GET_FMB) /* doesn't need a forwarding buffer */ - { - spin_unlock_irqrestore (&ktoenal_data.ksnd_sched_lock, *irq_flags); - goto try_read; - } - - get_fmb: - /* NB: sched lock held */ - fmb = ktoenal_get_idle_fmb (conn); - if (fmb == NULL) /* conn descheduled waiting for idle fmb */ - return; - - spin_unlock_irqrestore (&ktoenal_data.ksnd_sched_lock, *irq_flags); - - if (ktoenal_init_fmb (conn, fmb)) /* packet forwarded ? */ - goto out; /* come back later for next packet */ - - try_read: - /* NB: sched lock NOT held */ - LASSERT (conn->ksnc_rx_state == SOCKNAL_RX_HEADER || - conn->ksnc_rx_state == SOCKNAL_RX_BODY || - conn->ksnc_rx_state == SOCKNAL_RX_BODY_FWD || - conn->ksnc_rx_state == SOCKNAL_RX_SLOP); - - LASSERT (conn->ksnc_rx_niov > 0); - LASSERT (conn->ksnc_rx_nob_wanted > 0); - - conn->ksnc_rx_ready = 0; /* data ready may race with me and set ready */ - mb(); /* => clear BEFORE trying to read */ - - /* NB ktoenal_recvmsg "consumes" the iov passed to it */ - len = ktoenal_recvmsg(conn->ksnc_file, - conn->ksnc_rx_iov, conn->ksnc_rx_niov, - conn->ksnc_rx_nob_wanted); - CDEBUG (D_NET, "%p read(%d) %d\n", conn, conn->ksnc_rx_nob_wanted, len); - - if (len <= 0) /* nothing ready (EAGAIN) or EOF or error */ - { - if (len != -EAGAIN && /* ! nothing to read now */ - len != 0) /* ! nothing to read ever */ - { - // warning FIXME: handle socket errors properly - CERROR ("Error socknal read(%d) %p: %d\n", - conn->ksnc_rx_nob_wanted, conn, len); - } - goto out; /* come back when there's data ready */ - } - - LASSERT (len <= conn->ksnc_rx_nob_wanted); - conn->ksnc_rx_nob_wanted -= len; - conn->ksnc_rx_nob_left -= len; - - if (conn->ksnc_rx_nob_wanted != 0) /* short read */ - goto out; /* try again later */ - - conn->ksnc_rx_ready = 1; /* assume there's more to be had */ - - switch (conn->ksnc_rx_state) - { - case SOCKNAL_RX_HEADER: - if (conn->ksnc_hdr.dest_nid != ktoenal_lib.ni.nid) /* It's not for me */ - { - ktoenal_fwd_parse (conn); - switch (conn->ksnc_rx_state) - { - case SOCKNAL_RX_HEADER: /* skipped this packet (zero payload) */ - goto out; /* => come back later */ - case SOCKNAL_RX_SLOP: /* skipping this packet's body */ - goto try_read; /* => go read it */ - case SOCKNAL_RX_GET_FMB: /* forwarding */ - spin_lock_irqsave (&ktoenal_data.ksnd_sched_lock, *irq_flags); - goto get_fmb; /* => go get a fwd msg buffer */ - default: - break; - } - /* Not Reached */ - LBUG (); - } - - PROF_START(lib_parse); - lib_parse(&ktoenal_lib, &conn->ksnc_hdr, conn); /* sets wanted_len, iovs etc */ - PROF_FINISH(lib_parse); - - if (conn->ksnc_rx_nob_wanted != 0) /* need to get some payload? */ - { - conn->ksnc_rx_state = SOCKNAL_RX_BODY; - goto try_read; /* go read the payload */ - } - /* Fall through (completed packet for me) */ - - case SOCKNAL_RX_BODY: - atomic_inc (&ktoenal_packets_received); - lib_finalize(&ktoenal_lib, NULL, conn->ksnc_cookie); /* packet is done now */ - /* Fall through */ - - case SOCKNAL_RX_SLOP: - if (ktoenal_new_packet (conn, conn->ksnc_rx_nob_left)) /* starting new packet? */ - goto out; /* come back later */ - goto try_read; /* try to finish reading slop now */ - - case SOCKNAL_RX_BODY_FWD: - CDEBUG (D_NET, "%p "LPX64"->"LPX64" %d fwd_start (got body)\n", conn, - conn->ksnc_hdr.src_nid, conn->ksnc_hdr.dest_nid, conn->ksnc_rx_nob_left); - - atomic_inc (&ktoenal_packets_received); - - /* ktoenal_init_fmb() stashed router descriptor in conn->ksnc_cookie */ - kpr_fwd_start (&ktoenal_data.ksnd_router, (kpr_fwd_desc_t *)conn->ksnc_cookie); - - LASSERT (conn->ksnc_rx_nob_left == 0); /* no slop in forwarded packets */ - - ktoenal_new_packet (conn, 0); /* on to next packet */ - goto out; /* (later) */ - - default: - break; - } - - /* Not Reached */ - LBUG (); - - out: - spin_lock_irqsave (&ktoenal_data.ksnd_sched_lock, *irq_flags); - - if (!conn->ksnc_rx_ready) /* no data there to read? */ - { - conn->ksnc_rx_scheduled = 0; /* let socket callback schedule again */ - ktoenal_put_conn (conn); /* release scheduler's ref */ - } - else /* let scheduler call me again */ - list_add_tail (&conn->ksnc_rx_list, &ktoenal_data.ksnd_rx_conns); -} - -int -ktoenal_recv(nal_cb_t *nal, void *private, lib_msg_t *msg, - unsigned int niov, struct iovec *iov, size_t mlen, size_t rlen) -{ - ksock_conn_t *conn = (ksock_conn_t *)private; - int i; - - conn->ksnc_cookie = msg; - - LASSERT (niov <= PTL_MD_MAX_IOV); - for (i = 0; i < niov; i++) - { - conn->ksnc_rx_iov[i].iov_len = iov[i].iov_len; - conn->ksnc_rx_iov[i].iov_base = iov[i].iov_base; - } - - conn->ksnc_rx_niov = niov; - conn->ksnc_rx_nob_wanted = mlen; - conn->ksnc_rx_nob_left = rlen; - - return (rlen); -} - -int -ktoenal_scheduler (void *arg) -{ - unsigned long flags; - ksock_conn_t *conn; - int rc; - int nloops = 0; - - kportal_daemonize ("ktoenal_sched"); - kportal_blockallsigs (); - - spin_lock_irqsave (&ktoenal_data.ksnd_sched_lock, flags); - - while (!ktoenal_data.ksnd_shuttingdown) - { - int did_something = 0; - - /* Ensure I progress everything semi-fairly */ - - if (!list_empty (&ktoenal_data.ksnd_rx_conns)) - { - did_something = 1; - conn = list_entry (ktoenal_data.ksnd_rx_conns.next, - ksock_conn_t, ksnc_rx_list); - list_del (&conn->ksnc_rx_list); - - ktoenal_process_receive (conn, &flags); /* drops & regains ksnd_sched_lock */ - } - - if (!list_empty (&ktoenal_data.ksnd_tx_conns)) - { - did_something = 1; - conn = list_entry (ktoenal_data.ksnd_tx_conns.next, - ksock_conn_t, ksnc_tx_list); - - list_del (&conn->ksnc_tx_list); - ktoenal_process_transmit (conn, &flags); /* drops and regains ksnd_sched_lock */ - } - - if (!did_something || /* nothing to do */ - ++nloops == SOCKNAL_RESCHED) /* hogging CPU? */ - { - spin_unlock_irqrestore (&ktoenal_data.ksnd_sched_lock, flags); - - nloops = 0; - - if (!did_something) { /* wait for something to do */ - rc = wait_event_interruptible (ktoenal_data.ksnd_sched_waitq, - ktoenal_data.ksnd_shuttingdown || - !list_empty (&ktoenal_data.ksnd_rx_conns) || - !list_empty (&ktoenal_data.ksnd_tx_conns)); - LASSERT (rc == 0); - } else - our_cond_resched(); - - spin_lock_irqsave (&ktoenal_data.ksnd_sched_lock, flags); - } - } - - spin_unlock_irqrestore (&ktoenal_data.ksnd_sched_lock, flags); - ktoenal_thread_fini (); - return (0); -} - - -int -ktoenal_reaper (void *arg) -{ - unsigned long flags; - ksock_conn_t *conn; - int rc; - - kportal_daemonize ("ktoenal_reaper"); - kportal_blockallsigs (); - - while (!ktoenal_data.ksnd_shuttingdown) - { - spin_lock_irqsave (&ktoenal_data.ksnd_reaper_lock, flags); - - if (list_empty (&ktoenal_data.ksnd_reaper_list)) - conn = NULL; - else - { - conn = list_entry (ktoenal_data.ksnd_reaper_list.next, - ksock_conn_t, ksnc_list); - list_del (&conn->ksnc_list); - } - - spin_unlock_irqrestore (&ktoenal_data.ksnd_reaper_lock, flags); - - if (conn != NULL) - ktoenal_close_conn (conn); - else { - rc = wait_event_interruptible (ktoenal_data.ksnd_reaper_waitq, - ktoenal_data.ksnd_shuttingdown || - !list_empty(&ktoenal_data.ksnd_reaper_list)); - LASSERT (rc == 0); - } - } - - ktoenal_thread_fini (); - return (0); -} - -#define POLLREAD (POLLIN | POLLRDNORM | POLLRDBAND | POLLPRI) -#define POLLWRITE (POLLOUT | POLLWRNORM | POLLWRBAND) - -int -ktoenal_pollthread(void *arg) -{ - unsigned int mask; - struct list_head *tmp; - ksock_conn_t *conn; - - /* Save the task struct for waking it up */ - ktoenal_data.ksnd_pollthread_tsk = current; - - kportal_daemonize ("ktoenal_pollthread"); - kportal_blockallsigs (); - - poll_initwait(&ktoenal_data.ksnd_pwait); - - while(!ktoenal_data.ksnd_shuttingdown) { - - set_current_state(TASK_INTERRUPTIBLE); - - read_lock (&ktoenal_data.ksnd_socklist_lock); - list_for_each(tmp, &ktoenal_data.ksnd_socklist) { - - conn = list_entry(tmp, ksock_conn_t, ksnc_list); - atomic_inc(&conn->ksnc_refcount); - read_unlock (&ktoenal_data.ksnd_socklist_lock); - - mask = conn->ksnc_file->f_op->poll(conn->ksnc_file, - ktoenal_data.ksnd_slistchange ? - &ktoenal_data.ksnd_pwait : NULL); - - if(mask & POLLREAD) { - ktoenal_data_ready(conn); - - } - if (mask & POLLWRITE) { - ktoenal_write_space(conn); - - } - if (mask & (POLLERR | POLLHUP)) { - /* Do error processing */ - } - - read_lock (&ktoenal_data.ksnd_socklist_lock); - if(atomic_dec_and_test(&conn->ksnc_refcount)) - _ktoenal_put_conn(conn); - } - ktoenal_data.ksnd_slistchange = 0; - read_unlock (&ktoenal_data.ksnd_socklist_lock); - - schedule_timeout(MAX_SCHEDULE_TIMEOUT); - if(ktoenal_data.ksnd_slistchange) { - poll_freewait(&ktoenal_data.ksnd_pwait); - poll_initwait(&ktoenal_data.ksnd_pwait); - } - } - poll_freewait(&ktoenal_data.ksnd_pwait); - ktoenal_thread_fini(); - return (0); -} - -void -ktoenal_data_ready (ksock_conn_t *conn) -{ - unsigned long flags; - ENTRY; - - if (!test_and_set_bit (0, &conn->ksnc_rx_ready)) { - spin_lock_irqsave (&ktoenal_data.ksnd_sched_lock, flags); - - if (!conn->ksnc_rx_scheduled) { /* not being progressed */ - list_add_tail (&conn->ksnc_rx_list, - &ktoenal_data.ksnd_rx_conns); - conn->ksnc_rx_scheduled = 1; - /* extra ref for scheduler */ - atomic_inc (&conn->ksnc_refcount); - - /* This is done to avoid the effects of a sequence - * of events in which the rx_ready is lost - */ - conn->ksnc_rx_ready=1; - - if (waitqueue_active (&ktoenal_data.ksnd_sched_waitq)) - wake_up (&ktoenal_data.ksnd_sched_waitq); - } - - spin_unlock_irqrestore (&ktoenal_data.ksnd_sched_lock, flags); - } - - EXIT; -} - -void -ktoenal_write_space (ksock_conn_t *conn) -{ - unsigned long flags; - - CDEBUG (D_NET, "conn %p%s%s%s\n", - conn, - (conn == NULL) ? "" : (test_bit (0, &conn->ksnc_tx_ready) ? " ready" : " blocked"), - (conn == NULL) ? "" : (conn->ksnc_tx_scheduled ? " scheduled" : " idle"), - (conn == NULL) ? "" : (list_empty (&conn->ksnc_tx_queue) ? " empty" : " queued")); - - - if (!test_and_set_bit (0, &conn->ksnc_tx_ready)) { - spin_lock_irqsave (&ktoenal_data.ksnd_sched_lock, flags); - - if (!list_empty (&conn->ksnc_tx_queue) && /* packets to send */ - !conn->ksnc_tx_scheduled) { /* not being progressed */ - - list_add_tail (&conn->ksnc_tx_list, - &ktoenal_data.ksnd_tx_conns); - conn->ksnc_tx_scheduled = 1; - /* extra ref for scheduler */ - atomic_inc (&conn->ksnc_refcount); - - if (waitqueue_active (&ktoenal_data.ksnd_sched_waitq)) - wake_up (&ktoenal_data.ksnd_sched_waitq); - } - spin_unlock_irqrestore (&ktoenal_data.ksnd_sched_lock, flags); - } -} - -nal_cb_t ktoenal_lib = { - nal_data: &ktoenal_data, /* NAL private data */ - cb_send: ktoenal_send, - cb_recv: ktoenal_recv, - cb_read: ktoenal_read, - cb_write: ktoenal_write, - cb_callback: ktoenal_callback, - cb_malloc: ktoenal_malloc, - cb_free: ktoenal_free, - cb_printf: ktoenal_printf, - cb_cli: ktoenal_cli, - cb_sti: ktoenal_sti, - cb_dist: ktoenal_dist -}; diff --git a/lustre/portals/libcfs/debug.c b/lustre/portals/libcfs/debug.c index 8449511..1af687c 100644 --- a/lustre/portals/libcfs/debug.c +++ b/lustre/portals/libcfs/debug.c @@ -931,7 +931,6 @@ char *portals_nid2str(int nal, ptl_nid_t nid, char *str) case QSWNAL: case GMNAL: case IBNAL: - case TOENAL: case SCIMACNAL: sprintf(str, "%u:%u", (__u32)(nid >> 32), (__u32)nid); break; diff --git a/lustre/portals/libcfs/module.c b/lustre/portals/libcfs/module.c index 55e1935..2768c8d 100644 --- a/lustre/portals/libcfs/module.c +++ b/lustre/portals/libcfs/module.c @@ -414,8 +414,6 @@ kportal_get_ni (int nal) return (PORTAL_SYMBOL_GET(kqswnal_ni)); case SOCKNAL: return (PORTAL_SYMBOL_GET(ksocknal_ni)); - case TOENAL: - return (PORTAL_SYMBOL_GET(ktoenal_ni)); case GMNAL: return (PORTAL_SYMBOL_GET(kgmnal_ni)); case IBNAL: @@ -444,9 +442,6 @@ kportal_put_ni (int nal) case SOCKNAL: PORTAL_SYMBOL_PUT(ksocknal_ni); break; - case TOENAL: - PORTAL_SYMBOL_PUT(ktoenal_ni); - break; case GMNAL: PORTAL_SYMBOL_PUT(kgmnal_ni); break; diff --git a/lustre/portals/tests/ping_srv.c b/lustre/portals/tests/ping_srv.c index 2a96f55..1e40ed8 100644 --- a/lustre/portals/tests/ping_srv.c +++ b/lustre/portals/tests/ping_srv.c @@ -298,7 +298,7 @@ static void /*__exit*/ pingsrv_cleanup(void) MODULE_PARM(nal, "i"); MODULE_PARM_DESC(nal, "Use the specified NAL " - "(6-kscimacnal, 4-toenal, 2-ksocknal, 1-kqswnal)"); + "(6-kscimacnal, 2-ksocknal, 1-kqswnal)"); MODULE_AUTHOR("Brian Behlendorf (LLNL)"); MODULE_DESCRIPTION("A kernel space ping server for portals testing"); diff --git a/lustre/portals/tests/sping_srv.c b/lustre/portals/tests/sping_srv.c index 0d52e1f..b8bda29 100644 --- a/lustre/portals/tests/sping_srv.c +++ b/lustre/portals/tests/sping_srv.c @@ -285,7 +285,7 @@ static void /*__exit*/ pingsrv_cleanup(void) MODULE_PARM(nal, "i"); MODULE_PARM_DESC(nal, "Use the specified NAL " - "(6-kscimacnal, 4-toenal, 2-ksocknal, 1-kqswnal)"); + "(6-kscimacnal, 2-ksocknal, 1-kqswnal)"); MODULE_AUTHOR("Brian Behlendorf (LLNL)"); MODULE_DESCRIPTION("A kernel space ping server for portals testing"); diff --git a/lustre/portals/tests/startclient.sh b/lustre/portals/tests/startclient.sh index de01bc7..be60509 100755 --- a/lustre/portals/tests/startclient.sh +++ b/lustre/portals/tests/startclient.sh @@ -9,13 +9,6 @@ else fi case "$1" in - toe) - /sbin/insmod ../oslib/portals.o - /sbin/insmod ../toenal/ktoenal.o - /sbin/insmod ./$PING - echo ktoenal > /tmp/nal - ;; - tcp) /sbin/insmod ../oslib/portals.o /sbin/insmod ../socknal/ksocknal.o @@ -38,7 +31,7 @@ case "$1" in ;; *) - echo "Usage : ${0} < tcp | toe | elan | gm>" + echo "Usage : ${0} < tcp | elan | gm>" exit 1; esac exit 0; diff --git a/lustre/portals/tests/startserver.sh b/lustre/portals/tests/startserver.sh index 4f66eeb..9b5ccf6 100755 --- a/lustre/portals/tests/startserver.sh +++ b/lustre/portals/tests/startserver.sh @@ -9,13 +9,6 @@ else fi case "$1" in - toe) - /sbin/insmod ../oslib/portals.o - /sbin/insmod ../toenal/ktoenal.o - /sbin/insmod ./$PING nal=4 - echo ktoenal > /tmp/nal - ;; - tcp) /sbin/insmod ../oslib/portals.o /sbin/insmod ../socknal/ksocknal.o @@ -38,7 +31,7 @@ case "$1" in ;; *) - echo "Usage : ${0} < tcp | toe | elan | gm>" + echo "Usage : ${0} < tcp | elan | gm>" exit 1; esac ../utils/acceptor 9999& diff --git a/lustre/portals/utils/portals.c b/lustre/portals/utils/portals.c index b46ee16..3c7ec20 100644 --- a/lustre/portals/utils/portals.c +++ b/lustre/portals/utils/portals.c @@ -63,7 +63,6 @@ typedef struct static name2num_t nalnames[] = { {"any", 0}, {"tcp", SOCKNAL}, - {"toe", TOENAL}, {"elan", QSWNAL}, {"gm", GMNAL}, {"ib", IBNAL}, @@ -651,7 +650,7 @@ int jt_ptl_connect(int argc, char **argv) return 0; } - if (!g_nal_is_compatible (argv[0], SOCKNAL, TOENAL, 0)) + if (!g_nal_is_compatible (argv[0], SOCKNAL, 0)) return -1; rc = ptl_parse_ipaddr (&ipaddr, argv[1]); @@ -797,7 +796,7 @@ int jt_ptl_disconnect(int argc, char **argv) return 0; } - if (!g_nal_is_compatible (NULL, SOCKNAL, TOENAL, 0)) + if (!g_nal_is_compatible (NULL, SOCKNAL, 0)) return 0; if (argc >= 2 && @@ -838,7 +837,7 @@ int jt_ptl_push_connection (int argc, char **argv) return 0; } - if (!g_nal_is_compatible (argv[0], SOCKNAL, TOENAL, 0)) + if (!g_nal_is_compatible (argv[0], SOCKNAL, 0)) return -1; if (argc > 1 && diff --git a/lustre/ptlrpc/events.c b/lustre/ptlrpc/events.c index 01cbce0..e91d7a3 100644 --- a/lustre/ptlrpc/events.c +++ b/lustre/ptlrpc/events.c @@ -519,7 +519,6 @@ int ptlrpc_init_portals(void) {SOCKNAL, "socknal"}, {GMNAL, "gmnal"}, {IBNAL, "ibnal"}, - {TOENAL, "toenal"}, {TCPNAL, "tcpnal"}, {SCIMACNAL, "scimacnal"}}; int rc; diff --git a/lustre/scripts/system-profile.sh b/lustre/scripts/system-profile.sh index a669339..2914d4c 100755 --- a/lustre/scripts/system-profile.sh +++ b/lustre/scripts/system-profile.sh @@ -9,7 +9,7 @@ export OUTPUTDIR=/home/op export KERNELDIR=/usr/src/linux export LUSTREDIR=/usr/src/lustre export PORTALSDIR=/usr/src/portals -NAL=toenal +NAL=socknal # Params for OPROFILE #CTR0_EVENT=CPU_CLK_UNHALTED diff --git a/lustre/utils/lconf b/lustre/utils/lconf index 9f57bb0..55720f4 100755 --- a/lustre/utils/lconf +++ b/lustre/utils/lconf @@ -256,8 +256,6 @@ class AcceptorHandler(DaemonHandler): self.send_mem = send_mem self.recv_mem = recv_mem - if net_type == 'toe': - self.flags = self.flags + ' -N 4' if irq_aff: self.flags = self.flags + ' -i' @@ -417,7 +415,7 @@ class LCTLInterface: def add_autoconn(self, net_type, send_mem, recv_mem, nid, hostaddr, port, flags): - if net_type in ('tcp', 'toe') and not config.lctl_dump: + if net_type in ('tcp',) and not config.lctl_dump: cmds = """ network %s send_mem %d @@ -431,7 +429,7 @@ class LCTLInterface: def connect(self, srv): self.add_uuid(srv.net_type, srv.nid_uuid, srv.nid) - if srv.net_type in ('tcp', 'toe') and not config.lctl_dump: + if srv.net_type in ('tcp',) and not config.lctl_dump: flags = 's' if srv.irq_affinity: flags = flags + 'i' @@ -492,7 +490,7 @@ class LCTLInterface: def del_autoconn(self, net_type, nid, hostaddr): - if net_type in ('tcp', 'toe') and not config.lctl_dump: + if net_type in ('tcp',) and not config.lctl_dump: cmds = """ ignore_errors network %s @@ -504,7 +502,7 @@ class LCTLInterface: # disconnect one connection def disconnect(self, srv): self.del_uuid(srv.nid_uuid) - if srv.net_type in ('tcp', 'toe') and not config.lctl_dump: + if srv.net_type in ('tcp',) and not config.lctl_dump: self.del_autoconn(srv.net_type, srv.nid, srv.hostaddr) def del_uuid(self, uuid): @@ -856,7 +854,7 @@ def sys_get_local_nid(net_type, wildcard, cluster_id): def sys_get_local_address(net_type, wildcard, cluster_id): """Return the local address for the network type.""" local = "" - if net_type in ('tcp', 'toe'): + if net_type in ('tcp',): if ':' in wildcard: iface, star = string.split(wildcard, ':') local = if2addr(iface) @@ -1085,8 +1083,6 @@ class Network(Module): self.add_portals_module("router", 'kptlrouter') if self.net_type == 'tcp': self.add_portals_module("knals/socknal", 'ksocknal') - if self.net_type == 'toe': - self.add_portals_module("knals/toenal", 'ktoenal') if self.net_type == 'elan': self.add_portals_module("knals/qswnal", 'kqswnal') if self.net_type == 'gm': @@ -1156,7 +1152,7 @@ class RouteTable(Module): lo, hi): # only setup connections for tcp NALs srvdb = None - if not net_type in ('tcp', 'toe'): + if not net_type in ('tcp',): return None # connect to target if route is to single node and this node is the gw diff --git a/lustre/utils/lmc b/lustre/utils/lmc index 47076a3..62afbbc 100755 --- a/lustre/utils/lmc +++ b/lustre/utils/lmc @@ -60,7 +60,7 @@ Object creation command summary: --node node_name --nid nid --cluster_id - --nettype tcp|elan|toe|gm|scimac + --nettype tcp|elan|gm|scimac --hostaddr addr --port port --tcpbuf size @@ -596,7 +596,7 @@ def add_net(gen, lustre, options): hostaddr = get_option(options, 'hostaddr') net_type = get_option(options, 'nettype') - if net_type in ('tcp', 'toe'): + if net_type in ('tcp',): port = get_option_int(options, 'port') tcpbuf = get_option_int(options, 'tcpbuf') irq_aff = get_option_int(options, 'irq_affinity')