1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2 * vim:expandtab:shiftwidth=8:tabstop=8:
4 * Copyright (C) 2001, 2002 Cluster File Systems, Inc.
5 * Author: Zach Brown <zab@zabbo.net>
6 * Author: Peter J. Braam <braam@clusterfs.com>
7 * Author: Phil Schwan <phil@clusterfs.com>
8 * Author: Eric Barton <eric@bartonsoftware.com>
10 * This file is part of Portals, http://www.sf.net/projects/sandiaportals/
12 * Portals is free software; you can redistribute it and/or
13 * modify it under the terms of version 2 of the GNU General Public
14 * License as published by the Free Software Foundation.
16 * Portals is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with Portals; if not, write to the Free Software
23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 ptl_handle_ni_t ksocknal_ni;
29 static nal_t ksocknal_api;
30 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
31 ksock_nal_data_t ksocknal_data;
33 static ksock_nal_data_t ksocknal_data;
36 kpr_nal_interface_t ksocknal_router_interface = {
38 kprni_arg: &ksocknal_data,
39 kprni_fwd: ksocknal_fwd_packet,
40 kprni_notify: ksocknal_notify,
43 #define SOCKNAL_SYSCTL 200
45 #define SOCKNAL_SYSCTL_TIMEOUT 1
46 #define SOCKNAL_SYSCTL_EAGER_ACK 2
47 #define SOCKNAL_SYSCTL_ZERO_COPY 3
49 static ctl_table ksocknal_ctl_table[] = {
50 {SOCKNAL_SYSCTL_TIMEOUT, "timeout",
51 &ksocknal_data.ksnd_io_timeout, sizeof (int),
52 0644, NULL, &proc_dointvec},
53 {SOCKNAL_SYSCTL_EAGER_ACK, "eager_ack",
54 &ksocknal_data.ksnd_eager_ack, sizeof (int),
55 0644, NULL, &proc_dointvec},
57 {SOCKNAL_SYSCTL_EAGER_ACK, "zero_copy",
58 &ksocknal_data.ksnd_zc_min_frag, sizeof (int),
59 0644, NULL, &proc_dointvec},
64 static ctl_table ksocknal_top_ctl_table[] = {
65 {SOCKNAL_SYSCTL, "socknal", NULL, 0, 0555, ksocknal_ctl_table},
70 ksocknal_api_forward(nal_t *nal, int id, void *args, size_t args_len,
71 void *ret, size_t ret_len)
77 nal_cb = k->ksnd_nal_cb;
79 lib_dispatch(nal_cb, k, id, args, ret); /* ksocknal_send needs k */
84 ksocknal_api_shutdown(nal_t *nal, int ni)
86 CDEBUG (D_NET, "closing all connections\n");
88 ksocknal_del_route (PTL_NID_ANY, 0, 0, 0);
89 ksocknal_close_conn (PTL_NID_ANY, 0);
94 ksocknal_api_yield(nal_t *nal)
101 ksocknal_api_lock(nal_t *nal, unsigned long *flags)
107 nal_cb = k->ksnd_nal_cb;
108 nal_cb->cb_cli(nal_cb,flags);
112 ksocknal_api_unlock(nal_t *nal, unsigned long *flags)
118 nal_cb = k->ksnd_nal_cb;
119 nal_cb->cb_sti(nal_cb,flags);
123 ksocknal_init(int interface, ptl_pt_index_t ptl_size,
124 ptl_ac_index_t ac_size, ptl_pid_t requested_pid)
126 CDEBUG(D_NET, "calling lib_init with nid "LPX64"\n", (ptl_nid_t)0);
127 lib_init(&ksocknal_lib, (ptl_nid_t)0, 0, 10, ptl_size, ac_size);
128 return (&ksocknal_api);
132 * EXTRA functions follow
136 ksocknal_set_mynid(ptl_nid_t nid)
138 lib_ni_t *ni = &ksocknal_lib.ni;
140 /* FIXME: we have to do this because we call lib_init() at module
141 * insertion time, which is before we have 'mynid' available. lib_init
142 * sets the NAL's nid, which it uses to tell other nodes where packets
143 * are coming from. This is not a very graceful solution to this
146 CDEBUG(D_IOCTL, "setting mynid to "LPX64" (old nid="LPX64")\n",
154 ksocknal_bind_irq (unsigned int irq)
156 #if (defined(CONFIG_SMP) && CPU_AFFINITY)
160 ksock_irqinfo_t *info;
161 char *argv[] = {"/bin/sh",
165 char *envp[] = {"HOME=/",
166 "PATH=/sbin:/bin:/usr/sbin:/usr/bin",
169 LASSERT (irq < NR_IRQS);
170 if (irq == 0) /* software NIC */
173 info = &ksocknal_data.ksnd_irqinfo[irq];
175 write_lock_irqsave (&ksocknal_data.ksnd_global_lock, flags);
177 LASSERT (info->ksni_valid);
178 bind = !info->ksni_bound;
179 info->ksni_bound = 1;
181 write_unlock_irqrestore (&ksocknal_data.ksnd_global_lock, flags);
183 if (!bind) /* bound already */
186 snprintf (cmdline, sizeof (cmdline),
187 "echo %d > /proc/irq/%u/smp_affinity", 1 << info->ksni_sched, irq);
189 printk (KERN_INFO "Binding irq %u to CPU %d with cmd: %s\n",
190 irq, info->ksni_sched, cmdline);
192 /* FIXME: Find a better method of setting IRQ affinity...
195 call_usermodehelper (argv[0], argv, envp);
200 ksocknal_create_route (__u32 ipaddr, int port, int buffer_size,
201 int nonagel, int xchange_nids, int irq_affinity, int eager)
203 ksock_route_t *route;
205 PORTAL_ALLOC (route, sizeof (*route));
209 atomic_set (&route->ksnr_refcount, 1);
210 route->ksnr_sharecount = 0;
211 route->ksnr_peer = NULL;
212 route->ksnr_timeout = jiffies;
213 route->ksnr_retry_interval = SOCKNAL_MIN_RECONNECT_INTERVAL;
214 route->ksnr_ipaddr = ipaddr;
215 route->ksnr_port = port;
216 route->ksnr_buffer_size = buffer_size;
217 route->ksnr_irq_affinity = irq_affinity;
218 route->ksnr_xchange_nids = xchange_nids;
219 route->ksnr_nonagel = nonagel;
220 route->ksnr_eager = eager;
221 route->ksnr_connecting = 0;
222 route->ksnr_deleted = 0;
223 route->ksnr_generation = 0;
224 route->ksnr_conn = NULL;
230 ksocknal_destroy_route (ksock_route_t *route)
232 LASSERT (route->ksnr_sharecount == 0);
233 LASSERT (route->ksnr_conn == NULL);
235 if (route->ksnr_peer != NULL)
236 ksocknal_put_peer (route->ksnr_peer);
238 PORTAL_FREE (route, sizeof (*route));
242 ksocknal_put_route (ksock_route_t *route)
244 CDEBUG (D_OTHER, "putting route[%p] -> "LPX64" (%d)\n",
245 route, route->ksnr_peer->ksnp_nid,
246 atomic_read (&route->ksnr_refcount));
248 LASSERT (atomic_read (&route->ksnr_refcount) > 0);
249 if (!atomic_dec_and_test (&route->ksnr_refcount))
252 ksocknal_destroy_route (route);
256 ksocknal_create_peer (ptl_nid_t nid)
260 LASSERT (nid != PTL_NID_ANY);
262 PORTAL_ALLOC (peer, sizeof (*peer));
266 memset (peer, 0, sizeof (*peer));
268 peer->ksnp_nid = nid;
269 atomic_set (&peer->ksnp_refcount, 1); /* 1 ref for caller */
270 peer->ksnp_closing = 0;
271 INIT_LIST_HEAD (&peer->ksnp_conns);
272 INIT_LIST_HEAD (&peer->ksnp_routes);
273 INIT_LIST_HEAD (&peer->ksnp_tx_queue);
275 /* Can't unload while peers exist; ensures all I/O has terminated
276 * before unload attempts */
278 atomic_inc (&ksocknal_data.ksnd_npeers);
283 ksocknal_destroy_peer (ksock_peer_t *peer)
285 CDEBUG (D_NET, "peer "LPX64" %p deleted\n", peer->ksnp_nid, peer);
287 LASSERT (atomic_read (&peer->ksnp_refcount) == 0);
288 LASSERT (list_empty (&peer->ksnp_conns));
289 LASSERT (list_empty (&peer->ksnp_routes));
290 LASSERT (list_empty (&peer->ksnp_tx_queue));
292 PORTAL_FREE (peer, sizeof (*peer));
294 /* NB a peer's connections and autoconnect routes keep a reference
295 * on their peer until they are destroyed, so we can be assured
296 * that _all_ state to do with this peer has been cleaned up when
297 * its refcount drops to zero. */
298 atomic_dec (&ksocknal_data.ksnd_npeers);
303 ksocknal_put_peer (ksock_peer_t *peer)
305 CDEBUG (D_OTHER, "putting peer[%p] -> "LPX64" (%d)\n",
306 peer, peer->ksnp_nid,
307 atomic_read (&peer->ksnp_refcount));
309 LASSERT (atomic_read (&peer->ksnp_refcount) > 0);
310 if (!atomic_dec_and_test (&peer->ksnp_refcount))
313 ksocknal_destroy_peer (peer);
317 ksocknal_find_peer_locked (ptl_nid_t nid)
319 struct list_head *peer_list = ksocknal_nid2peerlist (nid);
320 struct list_head *tmp;
323 list_for_each (tmp, peer_list) {
325 peer = list_entry (tmp, ksock_peer_t, ksnp_list);
327 LASSERT (!peer->ksnp_closing);
328 LASSERT (!(list_empty (&peer->ksnp_routes) &&
329 list_empty (&peer->ksnp_conns)));
331 if (peer->ksnp_nid != nid)
334 CDEBUG(D_NET, "got peer [%p] -> "LPX64" (%d)\n",
335 peer, nid, atomic_read (&peer->ksnp_refcount));
342 ksocknal_get_peer (ptl_nid_t nid)
346 read_lock (&ksocknal_data.ksnd_global_lock);
347 peer = ksocknal_find_peer_locked (nid);
348 if (peer != NULL) /* +1 ref for caller? */
349 atomic_inc (&peer->ksnp_refcount);
350 read_unlock (&ksocknal_data.ksnd_global_lock);
356 ksocknal_unlink_peer_locked (ksock_peer_t *peer)
358 LASSERT (!peer->ksnp_closing);
359 peer->ksnp_closing = 1;
360 list_del (&peer->ksnp_list);
361 /* lose peerlist's ref */
362 ksocknal_put_peer (peer);
366 ksocknal_get_route_by_idx (int index)
369 struct list_head *ptmp;
370 ksock_route_t *route;
371 struct list_head *rtmp;
374 read_lock (&ksocknal_data.ksnd_global_lock);
376 for (i = 0; i < ksocknal_data.ksnd_peer_hash_size; i++) {
377 list_for_each (ptmp, &ksocknal_data.ksnd_peers[i]) {
378 peer = list_entry (ptmp, ksock_peer_t, ksnp_list);
380 LASSERT (!(list_empty (&peer->ksnp_routes) &&
381 list_empty (&peer->ksnp_conns)));
383 list_for_each (rtmp, &peer->ksnp_routes) {
387 route = list_entry (rtmp, ksock_route_t, ksnr_list);
388 atomic_inc (&route->ksnr_refcount);
389 read_unlock (&ksocknal_data.ksnd_global_lock);
395 read_unlock (&ksocknal_data.ksnd_global_lock);
400 ksocknal_add_route (ptl_nid_t nid, __u32 ipaddr, int port, int bufnob,
401 int nonagle, int xchange_nids, int bind_irq,
402 int share, int eager)
407 ksock_route_t *route;
408 struct list_head *rtmp;
409 ksock_route_t *route2;
411 if (nid == PTL_NID_ANY)
414 /* Have a brand new peer ready... */
415 peer = ksocknal_create_peer (nid);
419 route = ksocknal_create_route (ipaddr, port, bufnob, nonagle,
420 xchange_nids, bind_irq, eager);
422 ksocknal_put_peer (peer);
426 write_lock_irqsave (&ksocknal_data.ksnd_global_lock, flags);
428 peer2 = ksocknal_find_peer_locked (nid);
430 ksocknal_put_peer (peer);
433 /* peer table takes existing ref on peer */
434 list_add (&peer->ksnp_list,
435 ksocknal_nid2peerlist (nid));
440 /* check for existing route to this NID via this ipaddr */
441 list_for_each (rtmp, &peer->ksnp_routes) {
442 route2 = list_entry (rtmp, ksock_route_t, ksnr_list);
444 if (route2->ksnr_ipaddr == ipaddr)
451 if (route2 != NULL) {
452 ksocknal_put_route (route);
455 /* route takes a ref on peer */
456 route->ksnr_peer = peer;
457 atomic_inc (&peer->ksnp_refcount);
458 /* peer's route list takes existing ref on route */
459 list_add (&route->ksnr_list, &peer->ksnp_routes);
462 route->ksnr_sharecount++;
464 write_unlock_irqrestore (&ksocknal_data.ksnd_global_lock, flags);
470 ksocknal_del_route_locked (ksock_route_t *route, int share, int keep_conn)
472 ksock_peer_t *peer = route->ksnr_peer;
473 ksock_conn_t *conn = route->ksnr_conn;
476 route->ksnr_sharecount = 0;
478 route->ksnr_sharecount--;
479 if (route->ksnr_sharecount != 0)
485 ksocknal_close_conn_locked (conn, 0);
487 /* keeping the conn; just dissociate it and route... */
488 conn->ksnc_route = NULL;
489 route->ksnr_conn = NULL;
490 ksocknal_put_route (route); /* drop conn's ref on route */
491 ksocknal_put_conn (conn); /* drop route's ref on conn */
495 route->ksnr_deleted = 1;
496 list_del (&route->ksnr_list);
497 ksocknal_put_route (route); /* drop peer's ref */
499 if (list_empty (&peer->ksnp_routes) &&
500 list_empty (&peer->ksnp_conns)) {
501 /* I've just removed the last autoconnect route of a peer
502 * with no active connections */
503 ksocknal_unlink_peer_locked (peer);
508 ksocknal_del_route (ptl_nid_t nid, __u32 ipaddr, int share, int keep_conn)
511 struct list_head *ptmp;
512 struct list_head *pnxt;
514 struct list_head *rtmp;
515 struct list_head *rnxt;
516 ksock_route_t *route;
522 write_lock_irqsave (&ksocknal_data.ksnd_global_lock, flags);
524 if (nid != PTL_NID_ANY)
525 lo = hi = ksocknal_nid2peerlist(nid) - ksocknal_data.ksnd_peers;
528 hi = ksocknal_data.ksnd_peer_hash_size - 1;
531 for (i = lo; i <= hi; i++) {
532 list_for_each_safe (ptmp, pnxt, &ksocknal_data.ksnd_peers[i]) {
533 peer = list_entry (ptmp, ksock_peer_t, ksnp_list);
535 if (!(nid == PTL_NID_ANY || peer->ksnp_nid == nid))
538 list_for_each_safe (rtmp, rnxt, &peer->ksnp_routes) {
539 route = list_entry (rtmp, ksock_route_t,
543 route->ksnr_ipaddr == ipaddr))
546 ksocknal_del_route_locked (route, share, keep_conn);
547 rc = 0; /* matched something */
554 write_unlock_irqrestore (&ksocknal_data.ksnd_global_lock, flags);
560 ksocknal_get_conn_by_idx (int index)
563 struct list_head *ptmp;
565 struct list_head *ctmp;
568 read_lock (&ksocknal_data.ksnd_global_lock);
570 for (i = 0; i < ksocknal_data.ksnd_peer_hash_size; i++) {
571 list_for_each (ptmp, &ksocknal_data.ksnd_peers[i]) {
572 peer = list_entry (ptmp, ksock_peer_t, ksnp_list);
574 LASSERT (!(list_empty (&peer->ksnp_routes) &&
575 list_empty (&peer->ksnp_conns)));
577 list_for_each (ctmp, &peer->ksnp_conns) {
581 conn = list_entry (ctmp, ksock_conn_t, ksnc_list);
582 atomic_inc (&conn->ksnc_refcount);
583 read_unlock (&ksocknal_data.ksnd_global_lock);
589 read_unlock (&ksocknal_data.ksnd_global_lock);
594 ksocknal_get_peer_addr (ksock_conn_t *conn)
596 struct sockaddr_in sin;
597 int len = sizeof (sin);
600 rc = conn->ksnc_sock->ops->getname (conn->ksnc_sock,
601 (struct sockaddr *)&sin, &len, 2);
602 /* Didn't need the {get,put}connsock dance to deref ksnc_sock... */
603 LASSERT (!conn->ksnc_closing);
604 LASSERT (len <= sizeof (sin));
607 CERROR ("Error %d getting sock peer IP\n", rc);
611 conn->ksnc_ipaddr = ntohl (sin.sin_addr.s_addr);
612 conn->ksnc_port = ntohs (sin.sin_port);
616 ksocknal_conn_irq (ksock_conn_t *conn)
619 struct dst_entry *dst;
621 dst = sk_dst_get (conn->ksnc_sock->sk);
623 if (dst->dev != NULL) {
625 if (irq >= NR_IRQS) {
626 CERROR ("Unexpected IRQ %x\n", irq);
633 /* Didn't need the {get,put}connsock dance to deref ksnc_sock... */
634 LASSERT (!conn->ksnc_closing);
639 ksocknal_choose_scheduler_locked (unsigned int irq)
641 ksock_sched_t *sched;
642 ksock_irqinfo_t *info;
645 LASSERT (irq < NR_IRQS);
646 info = &ksocknal_data.ksnd_irqinfo[irq];
648 if (irq != 0 && /* hardware NIC */
649 info->ksni_valid) { /* already set up */
650 return (&ksocknal_data.ksnd_schedulers[info->ksni_sched]);
653 /* software NIC (irq == 0) || not associated with a scheduler yet.
654 * Choose the CPU with the fewest connections... */
655 sched = &ksocknal_data.ksnd_schedulers[0];
656 for (i = 1; i < SOCKNAL_N_SCHED; i++)
657 if (sched->kss_nconns >
658 ksocknal_data.ksnd_schedulers[i].kss_nconns)
659 sched = &ksocknal_data.ksnd_schedulers[i];
661 if (irq != 0) { /* Hardware NIC */
662 info->ksni_valid = 1;
663 info->ksni_sched = sched - ksocknal_data.ksnd_schedulers;
666 LASSERT (info->ksni_sched == sched - ksocknal_data.ksnd_schedulers);
673 ksocknal_create_conn (ptl_nid_t nid, ksock_route_t *route,
674 struct socket *sock, int bind_irq)
680 ksock_sched_t *sched;
685 /* NB, sock has an associated file since (a) this connection might
686 * have been created in userland and (b) we need to refcount the
687 * socket so that we don't close it while I/O is being done on
688 * it, and sock->file has that pre-cooked... */
689 LASSERT (sock->file != NULL);
690 LASSERT (file_count(sock->file) > 0);
692 rc = ksocknal_setup_sock (sock);
697 if (route == NULL) { /* not autoconnect */
698 /* Assume this socket connects to a brand new peer */
699 peer = ksocknal_create_peer (nid);
704 PORTAL_ALLOC(conn, sizeof(*conn));
707 ksocknal_put_peer (peer);
711 memset (conn, 0, sizeof (*conn));
712 conn->ksnc_peer = NULL;
713 conn->ksnc_route = NULL;
714 conn->ksnc_sock = sock;
715 conn->ksnc_saved_data_ready = sock->sk->sk_data_ready;
716 conn->ksnc_saved_write_space = sock->sk->sk_write_space;
717 atomic_set (&conn->ksnc_refcount, 1); /* 1 ref for me */
719 conn->ksnc_rx_ready = 0;
720 conn->ksnc_rx_scheduled = 0;
721 ksocknal_new_packet (conn, 0);
723 INIT_LIST_HEAD (&conn->ksnc_tx_queue);
724 conn->ksnc_tx_ready = 0;
725 conn->ksnc_tx_scheduled = 0;
726 atomic_set (&conn->ksnc_tx_nob, 0);
728 ksocknal_get_peer_addr (conn);
730 irq = ksocknal_conn_irq (conn);
732 write_lock_irqsave (&ksocknal_data.ksnd_global_lock, flags);
736 LASSERT (route->ksnr_conn == NULL && route->ksnr_connecting);
738 if (route->ksnr_deleted) {
739 /* This conn was autoconnected, but the autoconnect
740 * route got deleted while it was being
742 write_unlock_irqrestore (&ksocknal_data.ksnd_global_lock,
744 PORTAL_FREE (conn, sizeof (*conn));
749 /* associate conn/route for auto-reconnect */
750 route->ksnr_conn = conn;
751 atomic_inc (&conn->ksnc_refcount);
752 conn->ksnc_route = route;
753 atomic_inc (&route->ksnr_refcount);
754 route->ksnr_connecting = 0;
756 route->ksnr_generation++;
757 route->ksnr_retry_interval = SOCKNAL_MIN_RECONNECT_INTERVAL;
759 peer = route->ksnr_peer;
761 /* Not an autoconnected connection; see if there is an
762 * existing peer for this NID */
763 peer2 = ksocknal_find_peer_locked (nid);
765 ksocknal_put_peer (peer);
768 list_add (&peer->ksnp_list,
769 ksocknal_nid2peerlist (nid));
770 /* peer list takes over existing ref */
774 LASSERT (!peer->ksnp_closing);
776 conn->ksnc_peer = peer;
777 atomic_inc (&peer->ksnp_refcount);
778 peer->ksnp_last_alive = jiffies;
779 peer->ksnp_error = 0;
781 list_add (&conn->ksnc_list, &peer->ksnp_conns);
782 atomic_inc (&conn->ksnc_refcount);
784 sched = ksocknal_choose_scheduler_locked (irq);
786 conn->ksnc_scheduler = sched;
788 /* NB my callbacks block while I hold ksnd_global_lock */
789 sock->sk->sk_user_data = conn;
790 sock->sk->sk_data_ready = ksocknal_data_ready;
791 sock->sk->sk_write_space = ksocknal_write_space;
793 /* Take all the packets blocking for a connection.
794 * NB, it might be nicer to share these blocked packets among any
795 * other connections that are becoming established, however that
796 * confuses the normal packet launching operation, which selects a
797 * connection and queues the packet on it without needing an
798 * exclusive lock on ksnd_global_lock. */
799 while (!list_empty (&peer->ksnp_tx_queue)) {
800 tx = list_entry (peer->ksnp_tx_queue.next,
801 ksock_tx_t, tx_list);
803 list_del (&tx->tx_list);
804 ksocknal_queue_tx_locked (tx, conn);
807 write_unlock_irqrestore (&ksocknal_data.ksnd_global_lock, flags);
809 if (bind_irq) /* irq binding required */
810 ksocknal_bind_irq (irq);
812 /* Call the callbacks right now to get things going. */
813 ksocknal_data_ready (sock->sk, 0);
814 ksocknal_write_space (sock->sk);
816 CDEBUG(D_IOCTL, "conn [%p] registered for nid "LPX64"\n",
817 conn, conn->ksnc_peer->ksnp_nid);
819 ksocknal_put_conn (conn);
824 ksocknal_close_conn_locked (ksock_conn_t *conn, int error)
826 /* This just does the immmediate housekeeping, and queues the
827 * connection for the reaper to terminate.
828 * Caller holds ksnd_global_lock exclusively in irq context */
829 ksock_peer_t *peer = conn->ksnc_peer;
830 ksock_route_t *route;
832 LASSERT (peer->ksnp_error == 0);
833 LASSERT (!conn->ksnc_closing);
834 conn->ksnc_closing = 1;
835 atomic_inc (&ksocknal_data.ksnd_nclosing_conns);
837 route = conn->ksnc_route;
839 /* dissociate conn from route... */
840 LASSERT (!route->ksnr_connecting &&
841 !route->ksnr_deleted);
843 route->ksnr_conn = NULL;
844 conn->ksnc_route = NULL;
846 ksocknal_put_route (route); /* drop conn's ref on route */
847 ksocknal_put_conn (conn); /* drop route's ref on conn */
850 /* ksnd_deathrow_conns takes over peer's ref */
851 list_del (&conn->ksnc_list);
853 if (list_empty (&peer->ksnp_conns)) {
854 /* No more connections to this peer */
856 peer->ksnp_error = error; /* stash last conn close reason */
858 if (list_empty (&peer->ksnp_routes)) {
859 /* I've just closed last conn belonging to a
860 * non-autoconnecting peer */
861 ksocknal_unlink_peer_locked (peer);
865 spin_lock (&ksocknal_data.ksnd_reaper_lock);
867 list_add_tail (&conn->ksnc_list, &ksocknal_data.ksnd_deathrow_conns);
868 if (waitqueue_active (&ksocknal_data.ksnd_reaper_waitq))
869 wake_up (&ksocknal_data.ksnd_reaper_waitq);
871 spin_unlock (&ksocknal_data.ksnd_reaper_lock);
875 ksocknal_close_conn_unlocked (ksock_conn_t *conn, int why)
880 write_lock_irqsave (&ksocknal_data.ksnd_global_lock, flags);
882 if (!conn->ksnc_closing) {
884 ksocknal_close_conn_locked (conn, why);
887 write_unlock_irqrestore (&ksocknal_data.ksnd_global_lock, flags);
893 ksocknal_terminate_conn (ksock_conn_t *conn)
895 /* This gets called by the reaper (guaranteed thread context) to
896 * disengage the socket from its callbacks and close it.
897 * ksnc_refcount will eventually hit zero, and then the reaper will
900 ksock_peer_t *peer = conn->ksnc_peer;
905 /* serialise with callbacks */
906 write_lock_irqsave (&ksocknal_data.ksnd_global_lock, flags);
908 LASSERT (conn->ksnc_closing);
910 /* Remove conn's network callbacks.
911 * NB I _have_ to restore the callback, rather than storing a noop,
912 * since the socket could survive past this module being unloaded!! */
913 conn->ksnc_sock->sk->sk_data_ready = conn->ksnc_saved_data_ready;
914 conn->ksnc_sock->sk->sk_write_space = conn->ksnc_saved_write_space;
916 /* A callback could be in progress already; they hold a read lock
917 * on ksnd_global_lock (to serialise with me) and NOOP if
918 * sk_user_data is NULL. */
919 conn->ksnc_sock->sk->sk_user_data = NULL;
921 conn->ksnc_scheduler->kss_nconns--;
923 if (peer->ksnp_error != 0) {
924 /* peer's last conn closed in error */
925 LASSERT (list_empty (&peer->ksnp_conns));
927 /* convert peer's last-known-alive timestamp from jiffies */
928 do_gettimeofday (&now);
929 then = now.tv_sec - (jiffies - peer->ksnp_last_alive)/HZ;
933 write_unlock_irqrestore (&ksocknal_data.ksnd_global_lock, flags);
935 /* The socket is closed on the final put; either here, or in
936 * ksocknal_{send,recv}msg(). Since we set up the linger2 option
937 * when the connection was established, this will close the socket
938 * immediately, aborting anything buffered in it. Any hung
939 * zero-copy transmits will therefore complete in finite time. */
940 ksocknal_putconnsock (conn);
943 kpr_notify (&ksocknal_data.ksnd_router, peer->ksnp_nid,
948 ksocknal_destroy_conn (ksock_conn_t *conn)
950 /* Final coup-de-grace of the reaper */
951 CDEBUG (D_NET, "connection %p\n", conn);
953 LASSERT (atomic_read (&conn->ksnc_refcount) == 0);
954 LASSERT (conn->ksnc_route == NULL);
955 LASSERT (!conn->ksnc_tx_scheduled);
956 LASSERT (!conn->ksnc_rx_scheduled);
958 /* complete queued packets */
959 while (!list_empty (&conn->ksnc_tx_queue)) {
960 ksock_tx_t *tx = list_entry (conn->ksnc_tx_queue.next,
961 ksock_tx_t, tx_list);
963 CERROR ("Deleting packet type %d len %d ("LPX64"->"LPX64")\n",
964 NTOH__u32 (tx->tx_hdr->type),
965 NTOH__u32 (PTL_HDR_LENGTH(tx->tx_hdr)),
966 NTOH__u64 (tx->tx_hdr->src_nid),
967 NTOH__u64 (tx->tx_hdr->dest_nid));
969 list_del (&tx->tx_list);
970 ksocknal_tx_done (tx, 0);
973 /* complete current receive if any */
974 switch (conn->ksnc_rx_state) {
975 case SOCKNAL_RX_BODY:
976 lib_finalize (&ksocknal_lib, NULL, conn->ksnc_cookie);
978 case SOCKNAL_RX_BODY_FWD:
979 ksocknal_fmb_callback (conn->ksnc_cookie, -ECONNABORTED);
981 case SOCKNAL_RX_HEADER:
982 case SOCKNAL_RX_SLOP:
989 ksocknal_put_peer (conn->ksnc_peer);
991 PORTAL_FREE (conn, sizeof (*conn));
992 atomic_dec (&ksocknal_data.ksnd_nclosing_conns);
996 ksocknal_put_conn (ksock_conn_t *conn)
1000 CDEBUG (D_OTHER, "putting conn[%p] -> "LPX64" (%d)\n",
1001 conn, conn->ksnc_peer->ksnp_nid,
1002 atomic_read (&conn->ksnc_refcount));
1004 LASSERT (atomic_read (&conn->ksnc_refcount) > 0);
1005 if (!atomic_dec_and_test (&conn->ksnc_refcount))
1008 spin_lock_irqsave (&ksocknal_data.ksnd_reaper_lock, flags);
1010 list_add (&conn->ksnc_list, &ksocknal_data.ksnd_zombie_conns);
1011 if (waitqueue_active (&ksocknal_data.ksnd_reaper_waitq))
1012 wake_up (&ksocknal_data.ksnd_reaper_waitq);
1014 spin_unlock_irqrestore (&ksocknal_data.ksnd_reaper_lock, flags);
1018 ksocknal_close_conn (ptl_nid_t nid, __u32 ipaddr)
1020 unsigned long flags;
1022 struct list_head *ctmp;
1023 struct list_head *cnxt;
1025 struct list_head *ptmp;
1026 struct list_head *pnxt;
1032 write_lock_irqsave (&ksocknal_data.ksnd_global_lock, flags);
1034 if (nid != PTL_NID_ANY)
1035 lo = hi = ksocknal_nid2peerlist(nid) - ksocknal_data.ksnd_peers;
1038 hi = ksocknal_data.ksnd_peer_hash_size - 1;
1041 for (i = lo; i <= hi; i++) {
1042 list_for_each_safe (ptmp, pnxt, &ksocknal_data.ksnd_peers[i]) {
1044 peer = list_entry (ptmp, ksock_peer_t, ksnp_list);
1046 if (!(nid == PTL_NID_ANY || nid == peer->ksnp_nid))
1049 list_for_each_safe (ctmp, cnxt, &peer->ksnp_conns) {
1051 conn = list_entry (ctmp, ksock_conn_t,
1054 if (!(ipaddr == 0 ||
1055 conn->ksnc_ipaddr == ipaddr))
1059 ksocknal_close_conn_locked (conn, 0);
1064 write_unlock_irqrestore (&ksocknal_data.ksnd_global_lock, flags);
1070 ksocknal_notify (void *arg, ptl_nid_t gw_nid, int alive)
1072 /* The router is telling me she's been notified of a change in
1073 * gateway state.... */
1075 CDEBUG (D_NET, "gw "LPX64" %s\n", gw_nid, alive ? "up" : "down");
1078 /* If the gateway crashed, close all open connections... */
1079 ksocknal_close_conn (gw_nid, 0);
1083 /* ...otherwise do nothing. We can only establish new connections
1084 * if we have autroutes, and these connect on demand. */
1087 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
1088 struct tcp_opt *sock2tcp_opt(struct sock *sk)
1090 return &(sk->tp_pinfo.af_tcp);
1093 struct tcp_opt *sock2tcp_opt(struct sock *sk)
1095 struct tcp_sock *s = (struct tcp_sock *)sk;
1101 ksocknal_push_conn (ksock_conn_t *conn)
1110 rc = ksocknal_getconnsock (conn);
1111 if (rc != 0) /* being shut down */
1114 sk = conn->ksnc_sock->sk;
1115 tp = sock2tcp_opt(sk);
1118 nonagle = tp->nonagle;
1125 rc = sk->sk_prot->setsockopt (sk, SOL_TCP, TCP_NODELAY,
1126 (char *)&val, sizeof (val));
1132 tp->nonagle = nonagle;
1135 ksocknal_putconnsock (conn);
1139 ksocknal_push_peer (ksock_peer_t *peer)
1143 struct list_head *tmp;
1146 for (index = 0; ; index++) {
1147 read_lock (&ksocknal_data.ksnd_global_lock);
1152 list_for_each (tmp, &peer->ksnp_conns) {
1154 conn = list_entry (tmp, ksock_conn_t, ksnc_list);
1155 atomic_inc (&conn->ksnc_refcount);
1160 read_unlock (&ksocknal_data.ksnd_global_lock);
1165 ksocknal_push_conn (conn);
1166 ksocknal_put_conn (conn);
1171 ksocknal_push (ptl_nid_t nid)
1174 struct list_head *tmp;
1180 if (nid != PTL_NID_ANY) {
1181 peer = ksocknal_get_peer (nid);
1185 ksocknal_push_peer (peer);
1186 ksocknal_put_peer (peer);
1191 for (i = 0; i < ksocknal_data.ksnd_peer_hash_size; i++) {
1192 for (j = 0; ; j++) {
1193 read_lock (&ksocknal_data.ksnd_global_lock);
1198 list_for_each (tmp, &ksocknal_data.ksnd_peers[i]) {
1200 peer = list_entry(tmp, ksock_peer_t,
1202 atomic_inc (&peer->ksnp_refcount);
1207 read_unlock (&ksocknal_data.ksnd_global_lock);
1211 ksocknal_push_peer (peer);
1212 ksocknal_put_peer (peer);
1222 ksocknal_cmd(struct portal_ioctl_data * data, void * private)
1226 LASSERT (data != NULL);
1228 switch(data->ioc_nal_cmd) {
1229 case NAL_CMD_GET_AUTOCONN: {
1230 ksock_route_t *route = ksocknal_get_route_by_idx (data->ioc_count);
1236 data->ioc_nid = route->ksnr_peer->ksnp_nid;
1237 data->ioc_id = route->ksnr_ipaddr;
1238 data->ioc_misc = route->ksnr_port;
1239 data->ioc_count = route->ksnr_generation;
1240 data->ioc_size = route->ksnr_buffer_size;
1241 data->ioc_wait = route->ksnr_sharecount;
1242 data->ioc_flags = (route->ksnr_nonagel ? 1 : 0) |
1243 (route->ksnr_xchange_nids ? 2 : 0) |
1244 (route->ksnr_irq_affinity ? 4 : 0) |
1245 (route->ksnr_eager ? 8 : 0);
1246 ksocknal_put_route (route);
1250 case NAL_CMD_ADD_AUTOCONN: {
1251 rc = ksocknal_add_route (data->ioc_nid, data->ioc_id,
1252 data->ioc_misc, data->ioc_size,
1253 (data->ioc_flags & 0x01) != 0,
1254 (data->ioc_flags & 0x02) != 0,
1255 (data->ioc_flags & 0x04) != 0,
1256 (data->ioc_flags & 0x08) != 0,
1257 (data->ioc_flags & 0x10) != 0);
1260 case NAL_CMD_DEL_AUTOCONN: {
1261 rc = ksocknal_del_route (data->ioc_nid, data->ioc_id,
1262 (data->ioc_flags & 1) != 0,
1263 (data->ioc_flags & 2) != 0);
1266 case NAL_CMD_GET_CONN: {
1267 ksock_conn_t *conn = ksocknal_get_conn_by_idx (data->ioc_count);
1273 data->ioc_nid = conn->ksnc_peer->ksnp_nid;
1274 data->ioc_id = conn->ksnc_ipaddr;
1275 data->ioc_misc = conn->ksnc_port;
1276 ksocknal_put_conn (conn);
1280 case NAL_CMD_REGISTER_PEER_FD: {
1281 struct socket *sock = sockfd_lookup (data->ioc_fd, &rc);
1284 rc = ksocknal_create_conn (data->ioc_nid, NULL,
1285 sock, data->ioc_flags);
1291 case NAL_CMD_CLOSE_CONNECTION: {
1292 rc = ksocknal_close_conn (data->ioc_nid, data->ioc_id);
1295 case NAL_CMD_REGISTER_MYNID: {
1296 rc = ksocknal_set_mynid (data->ioc_nid);
1299 case NAL_CMD_PUSH_CONNECTION: {
1300 rc = ksocknal_push (data->ioc_nid);
1309 ksocknal_free_buffers (void)
1311 if (ksocknal_data.ksnd_fmbs != NULL) {
1312 ksock_fmb_t *fmb = (ksock_fmb_t *)ksocknal_data.ksnd_fmbs;
1317 i < (SOCKNAL_SMALL_FWD_NMSGS + SOCKNAL_LARGE_FWD_NMSGS);
1319 for (j = 0; j < fmb->fmb_npages; j++)
1320 if (fmb->fmb_pages[j] != NULL)
1321 __free_page (fmb->fmb_pages[j]);
1323 PORTAL_FREE (ksocknal_data.ksnd_fmbs,
1324 sizeof (ksock_fmb_t) * (SOCKNAL_SMALL_FWD_NMSGS +
1325 SOCKNAL_LARGE_FWD_NMSGS));
1328 LASSERT (ksocknal_data.ksnd_active_ltxs == 0);
1329 if (ksocknal_data.ksnd_ltxs != NULL)
1330 PORTAL_FREE (ksocknal_data.ksnd_ltxs,
1331 sizeof (ksock_ltx_t) * (SOCKNAL_NLTXS +
1332 SOCKNAL_NNBLK_LTXS));
1334 if (ksocknal_data.ksnd_schedulers != NULL)
1335 PORTAL_FREE (ksocknal_data.ksnd_schedulers,
1336 sizeof (ksock_sched_t) * SOCKNAL_N_SCHED);
1338 PORTAL_FREE (ksocknal_data.ksnd_peers,
1339 sizeof (struct list_head) *
1340 ksocknal_data.ksnd_peer_hash_size);
1344 ksocknal_module_fini (void)
1348 CDEBUG(D_MALLOC, "before NAL cleanup: kmem %d\n",
1349 atomic_read (&portal_kmemory));
1351 switch (ksocknal_data.ksnd_init) {
1355 case SOCKNAL_INIT_ALL:
1357 if (ksocknal_data.ksnd_sysctl != NULL)
1358 unregister_sysctl_table (ksocknal_data.ksnd_sysctl);
1360 kportal_nal_unregister(SOCKNAL);
1361 PORTAL_SYMBOL_UNREGISTER (ksocknal_ni);
1364 case SOCKNAL_INIT_PTL:
1365 PtlNIFini(ksocknal_ni);
1366 lib_fini(&ksocknal_lib);
1369 case SOCKNAL_INIT_DATA:
1370 /* Module refcount only gets to zero when all peers
1371 * have been closed so all lists must be empty */
1372 LASSERT (atomic_read (&ksocknal_data.ksnd_npeers) == 0);
1373 LASSERT (ksocknal_data.ksnd_peers != NULL);
1374 for (i = 0; i < ksocknal_data.ksnd_peer_hash_size; i++) {
1375 LASSERT (list_empty (&ksocknal_data.ksnd_peers[i]));
1377 LASSERT (list_empty (&ksocknal_data.ksnd_zombie_conns));
1378 LASSERT (list_empty (&ksocknal_data.ksnd_autoconnectd_routes));
1379 LASSERT (list_empty (&ksocknal_data.ksnd_small_fmp.fmp_blocked_conns));
1380 LASSERT (list_empty (&ksocknal_data.ksnd_large_fmp.fmp_blocked_conns));
1382 if (ksocknal_data.ksnd_schedulers != NULL)
1383 for (i = 0; i < SOCKNAL_N_SCHED; i++) {
1384 ksock_sched_t *kss =
1385 &ksocknal_data.ksnd_schedulers[i];
1387 LASSERT (list_empty (&kss->kss_tx_conns));
1388 LASSERT (list_empty (&kss->kss_rx_conns));
1389 LASSERT (kss->kss_nconns == 0);
1392 /* stop router calling me */
1393 kpr_shutdown (&ksocknal_data.ksnd_router);
1395 /* flag threads to terminate; wake and wait for them to die */
1396 ksocknal_data.ksnd_shuttingdown = 1;
1397 wake_up_all (&ksocknal_data.ksnd_autoconnectd_waitq);
1398 wake_up_all (&ksocknal_data.ksnd_reaper_waitq);
1400 for (i = 0; i < SOCKNAL_N_SCHED; i++)
1401 wake_up_all(&ksocknal_data.ksnd_schedulers[i].kss_waitq);
1403 while (atomic_read (&ksocknal_data.ksnd_nthreads) != 0) {
1404 CDEBUG (D_NET, "waitinf for %d threads to terminate\n",
1405 atomic_read (&ksocknal_data.ksnd_nthreads));
1406 set_current_state (TASK_UNINTERRUPTIBLE);
1407 schedule_timeout (HZ);
1410 kpr_deregister (&ksocknal_data.ksnd_router);
1412 ksocknal_free_buffers();
1415 case SOCKNAL_INIT_NOTHING:
1419 CDEBUG(D_MALLOC, "after NAL cleanup: kmem %d\n",
1420 atomic_read (&portal_kmemory));
1422 printk(KERN_INFO "Routing socket NAL unloaded (final mem %d)\n",
1423 atomic_read(&portal_kmemory));
1428 ksocknal_module_init (void)
1430 int pkmem = atomic_read(&portal_kmemory);
1435 /* packet descriptor must fit in a router descriptor's scratchpad */
1436 LASSERT(sizeof (ksock_tx_t) <= sizeof (kprfd_scratch_t));
1437 /* the following must be sizeof(int) for proc_dointvec() */
1438 LASSERT(sizeof (ksocknal_data.ksnd_io_timeout) == sizeof (int));
1439 LASSERT(sizeof (ksocknal_data.ksnd_eager_ack) == sizeof (int));
1441 LASSERT (ksocknal_data.ksnd_init == SOCKNAL_INIT_NOTHING);
1443 ksocknal_api.forward = ksocknal_api_forward;
1444 ksocknal_api.shutdown = ksocknal_api_shutdown;
1445 ksocknal_api.yield = ksocknal_api_yield;
1446 ksocknal_api.validate = NULL; /* our api validate is a NOOP */
1447 ksocknal_api.lock = ksocknal_api_lock;
1448 ksocknal_api.unlock = ksocknal_api_unlock;
1449 ksocknal_api.nal_data = &ksocknal_data;
1451 ksocknal_lib.nal_data = &ksocknal_data;
1453 memset (&ksocknal_data, 0, sizeof (ksocknal_data)); /* zero pointers */
1455 ksocknal_data.ksnd_io_timeout = SOCKNAL_IO_TIMEOUT;
1456 ksocknal_data.ksnd_eager_ack = SOCKNAL_EAGER_ACK;
1458 ksocknal_data.ksnd_zc_min_frag = SOCKNAL_ZC_MIN_FRAG;
1461 ksocknal_data.ksnd_peer_hash_size = SOCKNAL_PEER_HASH_SIZE;
1462 PORTAL_ALLOC (ksocknal_data.ksnd_peers,
1463 sizeof (struct list_head) * ksocknal_data.ksnd_peer_hash_size);
1464 if (ksocknal_data.ksnd_peers == NULL)
1467 for (i = 0; i < ksocknal_data.ksnd_peer_hash_size; i++)
1468 INIT_LIST_HEAD(&ksocknal_data.ksnd_peers[i]);
1470 rwlock_init(&ksocknal_data.ksnd_global_lock);
1472 ksocknal_data.ksnd_nal_cb = &ksocknal_lib;
1473 spin_lock_init (&ksocknal_data.ksnd_nal_cb_lock);
1475 spin_lock_init(&ksocknal_data.ksnd_small_fmp.fmp_lock);
1476 INIT_LIST_HEAD(&ksocknal_data.ksnd_small_fmp.fmp_idle_fmbs);
1477 INIT_LIST_HEAD(&ksocknal_data.ksnd_small_fmp.fmp_blocked_conns);
1479 spin_lock_init(&ksocknal_data.ksnd_large_fmp.fmp_lock);
1480 INIT_LIST_HEAD(&ksocknal_data.ksnd_large_fmp.fmp_idle_fmbs);
1481 INIT_LIST_HEAD(&ksocknal_data.ksnd_large_fmp.fmp_blocked_conns);
1483 spin_lock_init(&ksocknal_data.ksnd_idle_ltx_lock);
1484 INIT_LIST_HEAD(&ksocknal_data.ksnd_idle_nblk_ltx_list);
1485 INIT_LIST_HEAD(&ksocknal_data.ksnd_idle_ltx_list);
1486 init_waitqueue_head(&ksocknal_data.ksnd_idle_ltx_waitq);
1488 spin_lock_init (&ksocknal_data.ksnd_reaper_lock);
1489 INIT_LIST_HEAD (&ksocknal_data.ksnd_zombie_conns);
1490 INIT_LIST_HEAD (&ksocknal_data.ksnd_deathrow_conns);
1491 init_waitqueue_head(&ksocknal_data.ksnd_reaper_waitq);
1493 spin_lock_init (&ksocknal_data.ksnd_autoconnectd_lock);
1494 INIT_LIST_HEAD (&ksocknal_data.ksnd_autoconnectd_routes);
1495 init_waitqueue_head(&ksocknal_data.ksnd_autoconnectd_waitq);
1497 /* NB memset above zeros whole of ksocknal_data, including
1498 * ksocknal_data.ksnd_irqinfo[all].ksni_valid */
1500 /* flag lists/ptrs/locks initialised */
1501 ksocknal_data.ksnd_init = SOCKNAL_INIT_DATA;
1503 PORTAL_ALLOC(ksocknal_data.ksnd_schedulers,
1504 sizeof(ksock_sched_t) * SOCKNAL_N_SCHED);
1505 if (ksocknal_data.ksnd_schedulers == NULL) {
1506 ksocknal_module_fini ();
1510 for (i = 0; i < SOCKNAL_N_SCHED; i++) {
1511 ksock_sched_t *kss = &ksocknal_data.ksnd_schedulers[i];
1513 spin_lock_init (&kss->kss_lock);
1514 INIT_LIST_HEAD (&kss->kss_rx_conns);
1515 INIT_LIST_HEAD (&kss->kss_tx_conns);
1517 INIT_LIST_HEAD (&kss->kss_zctxdone_list);
1519 init_waitqueue_head (&kss->kss_waitq);
1522 CDEBUG (D_MALLOC, "ltx "LPSZ", total "LPSZ"\n", sizeof (ksock_ltx_t),
1523 sizeof (ksock_ltx_t) * (SOCKNAL_NLTXS + SOCKNAL_NNBLK_LTXS));
1525 PORTAL_ALLOC(ksocknal_data.ksnd_ltxs,
1526 sizeof(ksock_ltx_t) * (SOCKNAL_NLTXS +SOCKNAL_NNBLK_LTXS));
1527 if (ksocknal_data.ksnd_ltxs == NULL) {
1528 ksocknal_module_fini ();
1532 /* Deterministic bugs please */
1533 memset (ksocknal_data.ksnd_ltxs, 0xeb,
1534 sizeof (ksock_ltx_t) * (SOCKNAL_NLTXS + SOCKNAL_NNBLK_LTXS));
1536 for (i = 0; i < SOCKNAL_NLTXS + SOCKNAL_NNBLK_LTXS; i++) {
1537 ksock_ltx_t *ltx = &((ksock_ltx_t *)ksocknal_data.ksnd_ltxs)[i];
1539 ltx->ltx_tx.tx_hdr = <x->ltx_hdr;
1540 ltx->ltx_idle = i < SOCKNAL_NLTXS ?
1541 &ksocknal_data.ksnd_idle_ltx_list :
1542 &ksocknal_data.ksnd_idle_nblk_ltx_list;
1543 list_add (<x->ltx_tx.tx_list, ltx->ltx_idle);
1546 rc = PtlNIInit(ksocknal_init, 32, 4, 0, &ksocknal_ni);
1548 CERROR("ksocknal: PtlNIInit failed: error %d\n", rc);
1549 ksocknal_module_fini ();
1552 PtlNIDebug(ksocknal_ni, ~0);
1554 ksocknal_data.ksnd_init = SOCKNAL_INIT_PTL; // flag PtlNIInit() called
1556 for (i = 0; i < SOCKNAL_N_SCHED; i++) {
1557 rc = ksocknal_thread_start (ksocknal_scheduler,
1558 &ksocknal_data.ksnd_schedulers[i]);
1560 CERROR("Can't spawn socknal scheduler[%d]: %d\n",
1562 ksocknal_module_fini ();
1567 for (i = 0; i < SOCKNAL_N_AUTOCONNECTD; i++) {
1568 rc = ksocknal_thread_start (ksocknal_autoconnectd, (void *)((long)i));
1570 CERROR("Can't spawn socknal autoconnectd: %d\n", rc);
1571 ksocknal_module_fini ();
1576 rc = ksocknal_thread_start (ksocknal_reaper, NULL);
1578 CERROR ("Can't spawn socknal reaper: %d\n", rc);
1579 ksocknal_module_fini ();
1583 rc = kpr_register(&ksocknal_data.ksnd_router,
1584 &ksocknal_router_interface);
1586 CDEBUG(D_NET, "Can't initialise routing interface "
1587 "(rc = %d): not routing\n", rc);
1589 /* Only allocate forwarding buffers if I'm on a gateway */
1591 PORTAL_ALLOC(ksocknal_data.ksnd_fmbs,
1592 sizeof(ksock_fmb_t) * (SOCKNAL_SMALL_FWD_NMSGS +
1593 SOCKNAL_LARGE_FWD_NMSGS));
1594 if (ksocknal_data.ksnd_fmbs == NULL) {
1595 ksocknal_module_fini ();
1599 /* NULL out buffer pointers etc */
1600 memset(ksocknal_data.ksnd_fmbs, 0,
1601 sizeof(ksock_fmb_t) * (SOCKNAL_SMALL_FWD_NMSGS +
1602 SOCKNAL_LARGE_FWD_NMSGS));
1604 for (i = 0; i < (SOCKNAL_SMALL_FWD_NMSGS +
1605 SOCKNAL_LARGE_FWD_NMSGS); i++) {
1607 &((ksock_fmb_t *)ksocknal_data.ksnd_fmbs)[i];
1609 if (i < SOCKNAL_SMALL_FWD_NMSGS) {
1610 fmb->fmb_npages = SOCKNAL_SMALL_FWD_PAGES;
1611 fmb->fmb_pool = &ksocknal_data.ksnd_small_fmp;
1613 fmb->fmb_npages = SOCKNAL_LARGE_FWD_PAGES;
1614 fmb->fmb_pool = &ksocknal_data.ksnd_large_fmp;
1617 LASSERT (fmb->fmb_npages > 0);
1618 for (j = 0; j < fmb->fmb_npages; j++) {
1619 fmb->fmb_pages[j] = alloc_page(GFP_KERNEL);
1621 if (fmb->fmb_pages[j] == NULL) {
1622 ksocknal_module_fini ();
1626 LASSERT(page_address (fmb->fmb_pages[j]) !=
1630 list_add(&fmb->fmb_list, &fmb->fmb_pool->fmp_idle_fmbs);
1634 rc = kportal_nal_register(SOCKNAL, &ksocknal_cmd, NULL);
1636 CERROR ("Can't initialise command interface (rc = %d)\n", rc);
1637 ksocknal_module_fini ();
1641 PORTAL_SYMBOL_REGISTER(ksocknal_ni);
1643 #ifdef CONFIG_SYSCTL
1644 /* Press on regardless even if registering sysctl doesn't work */
1645 ksocknal_data.ksnd_sysctl = register_sysctl_table (ksocknal_top_ctl_table, 0);
1647 /* flag everything initialised */
1648 ksocknal_data.ksnd_init = SOCKNAL_INIT_ALL;
1650 printk(KERN_INFO "Routing socket NAL loaded (Routing %s, initial "
1652 kpr_routing (&ksocknal_data.ksnd_router) ?
1653 "enabled" : "disabled", pkmem);
1658 MODULE_AUTHOR("Cluster File Systems, Inc. <info@clusterfs.com>");
1659 MODULE_DESCRIPTION("Kernel TCP Socket NAL v0.01");
1660 MODULE_LICENSE("GPL");
1662 module_init(ksocknal_module_init);
1663 module_exit(ksocknal_module_fini);
1665 EXPORT_SYMBOL (ksocknal_ni);