-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
* GPL HEADER START
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU General Public License
- * version 2 along with this program; If not, see [sun.com URL with a
- * copy of GPLv2].
+ * version 2 along with this program; If not, see
+ * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* GPL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright (c) 2012, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
usock_tuns.ut_timeout);
return -1;
}
-
+
if (usock_tuns.ut_poll_timeout <= 0 ||
usock_tuns.ut_poll_timeout > MAX_REASONABLE_TIMEOUT) {
CERROR("USOCK_POLL_TIMEOUT: %d is out of reasonable limits\n",
usock_tuns.ut_fair_limit);
return -1;
}
-
+
if (usock_tuns.ut_npollthreads < 0 ||
usock_tuns.ut_npollthreads > MAX_REASONABLE_NPT) {
CERROR("USOCK_NPOLLTHREADS: %d is out of reasonable limits\n",
usock_tuns.ut_txcredits);
return -1;
}
-
+
if (usock_tuns.ut_peertxcredits <= 0) {
CERROR("USOCK_PEERTXCREDITS: %d should be positive\n",
usock_tuns.ut_peertxcredits);
usock_tuns.ut_socknagle);
return -1;
}
-
+
if (usock_tuns.ut_sockbufsiz < 0) {
CERROR("USOCK_SOCKBUFSIZ: %d should be 0 or positive\n",
usock_tuns.ut_sockbufsiz);
usocklnd_release_poll_states(int n)
{
int i;
-
+
for (i = 0; i < n; i++) {
usock_pollthread_t *pt = &usock_data.ud_pollthreads[i];
-
- close(pt->upt_notifier_fd);
- close(pt->upt_pollfd[0].fd);
+
+ libcfs_sock_release(pt->upt_notifier[0]);
+ libcfs_sock_release(pt->upt_notifier[1]);
pthread_mutex_destroy(&pt->upt_pollrequests_lock);
- cfs_fini_completion(&pt->upt_completion);
-
+ fini_completion(&pt->upt_completion);
+
LIBCFS_FREE (pt->upt_pollfd,
sizeof(struct pollfd) * pt->upt_npollfd);
LIBCFS_FREE (pt->upt_idx2conn,
sizeof(usock_conn_t *) * pt->upt_npollfd);
LIBCFS_FREE (pt->upt_fd2idx,
- sizeof(int) * pt->upt_nfd2idx);
+ sizeof(int) * pt->upt_nfd2idx);
}
}
usocklnd_update_tunables()
{
int rc;
-
- rc = cfs_parse_int_tunable(&usock_tuns.ut_timeout,
+
+ rc = lnet_parse_int_tunable(&usock_tuns.ut_timeout,
"USOCK_TIMEOUT");
if (rc)
return rc;
- rc = cfs_parse_int_tunable(&usock_tuns.ut_poll_timeout,
+ rc = lnet_parse_int_tunable(&usock_tuns.ut_poll_timeout,
"USOCK_POLL_TIMEOUT");
if (rc)
return rc;
- rc = cfs_parse_int_tunable(&usock_tuns.ut_npollthreads,
+ rc = lnet_parse_int_tunable(&usock_tuns.ut_npollthreads,
"USOCK_NPOLLTHREADS");
if (rc)
return rc;
- rc = cfs_parse_int_tunable(&usock_tuns.ut_fair_limit,
+ rc = lnet_parse_int_tunable(&usock_tuns.ut_fair_limit,
"USOCK_FAIR_LIMIT");
if (rc)
return rc;
- rc = cfs_parse_int_tunable(&usock_tuns.ut_min_bulk,
+ rc = lnet_parse_int_tunable(&usock_tuns.ut_min_bulk,
"USOCK_MIN_BULK");
if (rc)
return rc;
- rc = cfs_parse_int_tunable(&usock_tuns.ut_txcredits,
+ rc = lnet_parse_int_tunable(&usock_tuns.ut_txcredits,
"USOCK_TXCREDITS");
if (rc)
return rc;
- rc = cfs_parse_int_tunable(&usock_tuns.ut_peertxcredits,
+ rc = lnet_parse_int_tunable(&usock_tuns.ut_peertxcredits,
"USOCK_PEERTXCREDITS");
if (rc)
return rc;
- rc = cfs_parse_int_tunable(&usock_tuns.ut_socknagle,
+ rc = lnet_parse_int_tunable(&usock_tuns.ut_socknagle,
"USOCK_SOCKNAGLE");
if (rc)
return rc;
- rc = cfs_parse_int_tunable(&usock_tuns.ut_sockbufsiz,
+ rc = lnet_parse_int_tunable(&usock_tuns.ut_sockbufsiz,
"USOCK_SOCKBUFSIZ");
if (rc)
return rc;
if (usocklnd_validate_tunables())
return -EINVAL;
-
+
if (usock_tuns.ut_npollthreads == 0) {
usock_tuns.ut_npollthreads = cfs_online_cpus();
return -EINVAL;
}
}
-
+
return 0;
}
usock_pollthread_t *pt;
int i;
int rc;
-
+
rc = usocklnd_update_tunables();
if (rc)
return rc;
-
+
usock_data.ud_npollthreads = usock_tuns.ut_npollthreads;
LIBCFS_ALLOC (usock_data.ud_pollthreads,
/* Initialize poll thread state structures */
for (i = 0; i < usock_data.ud_npollthreads; i++) {
- int notifier[2];
pt = &usock_data.ud_pollthreads[i];
rc = -ENOMEM;
-
+
LIBCFS_ALLOC (pt->upt_pollfd,
sizeof(struct pollfd) * UPT_START_SIZ);
if (pt->upt_pollfd == NULL)
goto base_startup_failed_0;
-
+
LIBCFS_ALLOC (pt->upt_idx2conn,
sizeof(usock_conn_t *) * UPT_START_SIZ);
if (pt->upt_idx2conn == NULL)
LIBCFS_ALLOC (pt->upt_fd2idx,
sizeof(int) * UPT_START_SIZ);
if (pt->upt_fd2idx == NULL)
- goto base_startup_failed_2;
-
+ goto base_startup_failed_2;
+
memset(pt->upt_fd2idx, 0,
- sizeof(int) * UPT_START_SIZ);
-
+ sizeof(int) * UPT_START_SIZ);
+
LIBCFS_ALLOC (pt->upt_skip,
sizeof(int) * UPT_START_SIZ);
if (pt->upt_skip == NULL)
pt->upt_npollfd = pt->upt_nfd2idx = UPT_START_SIZ;
- rc = libcfs_socketpair(notifier);
+ rc = libcfs_socketpair(pt->upt_notifier);
if (rc != 0)
goto base_startup_failed_4;
- pt->upt_notifier_fd = notifier[0];
-
- pt->upt_pollfd[0].fd = notifier[1];
+ pt->upt_pollfd[0].fd = LIBCFS_SOCK2FD(pt->upt_notifier[1]);
pt->upt_pollfd[0].events = POLLIN;
pt->upt_pollfd[0].revents = 0;
pt->upt_idx2conn[0] = NULL;
pt->upt_errno = 0;
- CFS_INIT_LIST_HEAD (&pt->upt_pollrequests);
- CFS_INIT_LIST_HEAD (&pt->upt_stale_list);
+ INIT_LIST_HEAD(&pt->upt_pollrequests);
+ INIT_LIST_HEAD(&pt->upt_stale_list);
pthread_mutex_init(&pt->upt_pollrequests_lock, NULL);
- cfs_init_completion(&pt->upt_completion);
+ init_completion(&pt->upt_completion);
}
- /* Initialize peer hash list */
+ /* Initialize peer hash list */
for (i = 0; i < UD_PEER_HASH_SIZE; i++)
- CFS_INIT_LIST_HEAD(&usock_data.ud_peers[i]);
-
+ INIT_LIST_HEAD(&usock_data.ud_peers[i]);
+
pthread_rwlock_init(&usock_data.ud_peers_lock, NULL);
/* Spawn poll threads */
- for (i = 0; i < usock_data.ud_npollthreads; i++) {
- rc = cfs_create_thread(usocklnd_poll_thread,
- &usock_data.ud_pollthreads[i]);
- if (rc) {
- usocklnd_base_shutdown(i);
- return rc;
- }
- }
-
+ for (i = 0; i < usock_data.ud_npollthreads; i++) {
+ struct task_struct *task;
+
+ task = kthread_run(usocklnd_poll_thread,
+ &usock_data.ud_pollthreads[i], "");
+ if (IS_ERR(task)) {
+ usocklnd_base_shutdown(i);
+ return PTR_ERR(task);
+ }
+ }
+
usock_data.ud_state = UD_STATE_INITIALIZED;
-
+
return 0;
base_startup_failed_4:
usocklnd_base_shutdown(int n)
{
int i;
-
+
usock_data.ud_shutdown = 1;
for (i = 0; i < n; i++) {
usock_pollthread_t *pt = &usock_data.ud_pollthreads[i];
usocklnd_wakeup_pollthread(i);
- cfs_wait_for_completion(&pt->upt_completion);
+ wait_for_completion(&pt->upt_completion);
}
pthread_rwlock_destroy(&usock_data.ud_peers_lock);
LIBCFS_FREE (usock_data.ud_pollthreads,
usock_data.ud_npollthreads *
sizeof(usock_pollthread_t));
-
+
usock_data.ud_state = UD_STATE_INIT_NOTHING;
}
int rc;
int up;
__u32 ipaddr;
-
+
/* Find correct IP-address and update ni_nid with it.
* Two cases are supported:
* 1) no explicit interfaces are defined. NID will be assigned to
* first non-lo interface that is up;
* 2) exactly one explicit interface is defined. For example,
- * LNET_NETWORKS='tcp(eth0)' */
+ * LNET_NETWORKS='tcp(eth0)' */
if (ni->ni_interfaces[0] == NULL) {
char **names;
int i, n;
-
+
n = libcfs_ipif_enumerate(&names);
if (n <= 0) {
CERROR("Can't enumerate interfaces: %d\n", n);
}
for (i = 0; i < n; i++) {
-
+
if (!strcmp(names[i], "lo")) /* skip the loopback IF */
continue;
-
+
rc = libcfs_ipif_query(names[i], &up, &ipaddr);
if (rc != 0) {
CWARN("Can't get interface %s info: %d\n",
names[i], rc);
continue;
}
-
+
if (!up) {
CWARN("Ignoring interface %s (down)\n",
names[i]);
continue;
}
-
+
break; /* one address is quite enough */
}
-
+
libcfs_ipif_free_enumeration(names, n);
if (i >= n) {
ni->ni_interfaces[0]);
return -1;
}
-
+
CDEBUG(D_NET, "Explicit interface defined: %s. "
"%u.%u.%u.%u used\n",
ni->ni_interfaces[0], HIPQUAD(ipaddr));
-
+
}
-
+
ni->ni_nid = LNET_MKNID(LNET_NIDNET(ni->ni_nid), ipaddr);
return 0;
ni->ni_data = net;
- if (!(the_lnet.ln_pid & LNET_PID_USERFLAG)) {
- rc = usocklnd_assign_ni_nid(ni);
- if (rc != 0)
- goto startup_failed_1;
- }
+ rc = usocklnd_assign_ni_nid(ni);
+ if (rc != 0)
+ goto startup_failed_1;
LASSERT (ni->ni_lnd == &the_tcplnd);
ni->ni_maxtxcredits = usock_tuns.ut_txcredits;
ni->ni_peertxcredits = usock_tuns.ut_peertxcredits;
-
+
usock_data.ud_nets_count++;
return 0;
net->un_shutdown = 1;
- usocklnd_del_all_peers(ni);
+ usocklnd_del_all_peers(ni);
/* Wait for all peer state to clean up */
pthread_mutex_lock(&net->un_lock);
- while (net->un_peercount != 0)
+ while (net->un_peercount != 0)
pthread_cond_wait(&net->un_cond, &net->un_lock);
pthread_mutex_unlock(&net->un_lock);
-
+
/* Release usock_net_t structure */
pthread_mutex_destroy(&net->un_lock);
pthread_cond_destroy(&net->un_cond);
void
usocklnd_del_all_peers(lnet_ni_t *ni)
{
- struct list_head *ptmp;
- struct list_head *pnxt;
+ struct list_head *ptmp;
+ struct list_head *pnxt;
usock_peer_t *peer;
int i;
pthread_rwlock_wrlock(&usock_data.ud_peers_lock);
for (i = 0; i < UD_PEER_HASH_SIZE; i++) {
- list_for_each_safe (ptmp, pnxt, &usock_data.ud_peers[i]) {
- peer = list_entry (ptmp, usock_peer_t, up_list);
-
+ list_for_each_safe(ptmp, pnxt, &usock_data.ud_peers[i]) {
+ peer = list_entry(ptmp, usock_peer_t, up_list);
+
if (peer->up_ni != ni)
continue;
}
pthread_rwlock_unlock(&usock_data.ud_peers_lock);
-
+
/* wakeup all threads */
for (i = 0; i < usock_data.ud_npollthreads; i++)
usocklnd_wakeup_pollthread(i);
pthread_mutex_unlock(&peer->up_lock);
/* peer hash list is still protected by the caller */
- list_del(&peer->up_list);
+ list_del(&peer->up_list);
usocklnd_peer_decref(peer); /* peer isn't in hash list anymore */
}
usocklnd_del_conns_locked(usock_peer_t *peer)
{
int i;
-
+
for (i=0; i < N_CONN_TYPES; i++) {
usock_conn_t *conn = peer->up_conns[i];
if (conn != NULL)
- usocklnd_conn_kill(conn);
- }
+ usocklnd_conn_kill(conn);
+ }
}