static int proc_trigger_stack_reset(struct ctl_table *table, int write, void __user *buffer, size_t *lenp, loff_t *ppos) { int rc = 0; int i = 1; kgn_device_t *dev; ENTRY; if (!write) { /* read */ rc = proc_dointvec(table, write, buffer, lenp, ppos); RETURN(rc); } /* only device 0 gets the handle, see kgnilnd_dev_init */ dev = &kgnilnd_data.kgn_devices[0]; LASSERTF(dev != NULL, "dev 0 is NULL\n"); kgnilnd_critical_error(dev->gnd_err_handle); /* Wait for the reset to complete. This prevents any races in testing * where we'd immediately try to send traffic again */ while (kgnilnd_data.kgn_needs_reset != 0) { i++; LCONSOLE((((i) & (-i)) == i) ? D_WARNING : D_NET, "Waiting for stack reset request to clear\n"); cfs_pause(cfs_time_seconds(1 * i)); } RETURN(rc); }
void cfs_wi_shutdown (void) { int i; if (cfs_wi_data.wi_scheds == NULL) return; for (i = 0; i < cfs_wi_data.wi_nsched; i++) cfs_wi_sched_shutdown(&cfs_wi_data.wi_scheds[i]); #ifdef __KERNEL__ cfs_spin_lock(&cfs_wi_data.wi_glock); i = 2; while (cfs_wi_data.wi_nthreads != 0) { CDEBUG(IS_PO2(++i) ? D_WARNING : D_NET, "waiting for %d threads to terminate\n", cfs_wi_data.wi_nthreads); cfs_spin_unlock(&cfs_wi_data.wi_glock); cfs_pause(cfs_time_seconds(1)); cfs_spin_lock(&cfs_wi_data.wi_glock); } cfs_spin_unlock(&cfs_wi_data.wi_glock); #endif LIBCFS_FREE(cfs_wi_data.wi_scheds, cfs_wi_data.wi_nsched * sizeof(cfs_wi_sched_t)); return; }
int lnet_acceptor(void *arg) { socket_t *newsock; int rc; __u32 magic; __u32 peer_ip; int peer_port; int secure = (int)((long_ptr_t)arg); LASSERT(lnet_acceptor_state.pta_sock == NULL); cfs_block_allsigs(); rc = libcfs_sock_listen(&lnet_acceptor_state.pta_sock, 0, accept_port, accept_backlog); if (rc != 0) { if (rc == -EADDRINUSE) LCONSOLE_ERROR_MSG(0x122, "Can't start acceptor on port %d: port already in use\n", accept_port); else LCONSOLE_ERROR_MSG(0x123, "Can't start acceptor on port %d: unexpected error %d\n", accept_port, rc); lnet_acceptor_state.pta_sock = NULL; } else { LCONSOLE(0, "Accept %s, port %d\n", accept_type, accept_port); } /* set init status and unblock parent */ lnet_acceptor_state.pta_shutdown = rc; complete(&lnet_acceptor_state.pta_signal); if (rc != 0) return rc; while (!lnet_acceptor_state.pta_shutdown) { rc = libcfs_sock_accept(&newsock, lnet_acceptor_state.pta_sock); if (rc != 0) { if (rc != -EAGAIN) { CWARN("Accept error %d: pausing...\n", rc); cfs_pause(cfs_time_seconds(1)); } continue; } /* maybe we're waken up with libcfs_sock_abort_accept() */ if (lnet_acceptor_state.pta_shutdown) { libcfs_sock_release(newsock); break; } rc = libcfs_sock_getaddr(newsock, 1, &peer_ip, &peer_port); if (rc != 0) { CERROR("Can't determine new connection's address\n"); goto failed; } if (secure && peer_port > LNET_ACCEPTOR_MAX_RESERVED_PORT) { CERROR("Refusing connection from %pI4h: insecure port %d\n", &peer_ip, peer_port); goto failed; } rc = libcfs_sock_read(newsock, &magic, sizeof(magic), accept_timeout); if (rc != 0) { CERROR("Error %d reading connection request from %pI4h\n", rc, &peer_ip); goto failed; } rc = lnet_accept(newsock, magic); if (rc != 0) goto failed; continue; failed: libcfs_sock_release(newsock); } libcfs_sock_release(lnet_acceptor_state.pta_sock); lnet_acceptor_state.pta_sock = NULL; CDEBUG(D_NET, "Acceptor stopping\n"); /* unblock lnet_acceptor_stop() */ complete(&lnet_acceptor_state.pta_signal); return 0; }