X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lnet%2Fklnds%2Fmxlnd%2Fmxlnd.c;h=dbe998f713274b9006b8bb26a0ff2dee10a9573f;hb=9c6ebfd11be1cc11629a2960c8c818492e1f0980;hp=34faab7ab929f399095ea8e25b28704ef28e5e57;hpb=6e3ec5812ebd1b5ecf7cae584f429b013ffe7431;p=fs%2Flustre-release.git diff --git a/lnet/klnds/mxlnd/mxlnd.c b/lnet/klnds/mxlnd/mxlnd.c index 34faab7..dbe998f 100644 --- a/lnet/klnds/mxlnd/mxlnd.c +++ b/lnet/klnds/mxlnd/mxlnd.c @@ -1,6 +1,4 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * +/* * GPL HEADER START * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -26,9 +24,11 @@ * 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. + * * Copyright (C) 2006 Myricom, Inc. */ /* @@ -65,9 +65,9 @@ mxlnd_free_pages(kmx_pages_t *p) for (i = 0; i < npages; i++) { if (p->mxg_pages[i] != NULL) { __free_page(p->mxg_pages[i]); - cfs_spin_lock(&kmxlnd_data.kmx_mem_lock); - kmxlnd_data.kmx_mem_used -= PAGE_SIZE; - cfs_spin_unlock(&kmxlnd_data.kmx_mem_lock); + spin_lock(&kmxlnd_data.kmx_mem_lock); + kmxlnd_data.kmx_mem_used -= PAGE_SIZE; + spin_unlock(&kmxlnd_data.kmx_mem_lock); } } @@ -98,9 +98,9 @@ mxlnd_alloc_pages(kmx_pages_t **pp, int npages) mxlnd_free_pages(p); return -ENOMEM; } - cfs_spin_lock(&kmxlnd_data.kmx_mem_lock); - kmxlnd_data.kmx_mem_used += PAGE_SIZE; - cfs_spin_unlock(&kmxlnd_data.kmx_mem_lock); + spin_lock(&kmxlnd_data.kmx_mem_lock); + kmxlnd_data.kmx_mem_used += PAGE_SIZE; + spin_unlock(&kmxlnd_data.kmx_mem_lock); } *pp = p; @@ -348,7 +348,7 @@ mxlnd_init_mx(lnet_ni_t *ni) MXLND_MSG_MAGIC, MXLND_CONNECT_TIMEOUT/CFS_HZ*1000, &kmxlnd_data.kmx_epa); if (mxret != MX_SUCCESS) { - CDEBUG(D_NETERROR, "unable to connect to myself (%s)\n", mx_strerror(mxret)); + CNETERR("unable to connect to myself (%s)\n", mx_strerror(mxret)); goto failed_with_endpoint; } @@ -385,24 +385,25 @@ failed_with_init: * mxlnd_thread_start - spawn a kernel thread with this function * @fn - function pointer * @arg - pointer to the parameter data + * @name - name of new thread * * Returns 0 on success and a negative value on failure */ int -mxlnd_thread_start(int (*fn)(void *arg), void *arg) +mxlnd_thread_start(int (*fn)(void *arg), void *arg, char *name) { - int pid = 0; + cfs_task *task; int i = (int) ((long) arg); cfs_atomic_inc(&kmxlnd_data.kmx_nthreads); - cfs_init_completion(&kmxlnd_data.kmx_completions[i]); - - pid = cfs_kernel_thread (fn, arg, 0); - if (pid < 0) { - CERROR("cfs_kernel_thread() failed with %d\n", pid); - cfs_atomic_dec(&kmxlnd_data.kmx_nthreads); - } - return pid; + init_completion(&kmxlnd_data.kmx_completions[i]); + + task = kthread_run(fn, arg, name); + if (IS_ERR(task)) { + CERROR("cfs_create_thread() failed with %d\n", PTR_ERR(task)); + cfs_atomic_dec(&kmxlnd_data.kmx_nthreads); + } + return PTR_ERR(task); } /** @@ -416,7 +417,7 @@ mxlnd_thread_stop(long id) { int i = (int) id; cfs_atomic_dec (&kmxlnd_data.kmx_nthreads); - cfs_complete(&kmxlnd_data.kmx_completions[i]); + complete(&kmxlnd_data.kmx_completions[i]); } /** @@ -453,8 +454,8 @@ mxlnd_shutdown (lnet_ni_t *ni) /* wakeup request_waitds */ mx_wakeup(kmxlnd_data.kmx_endpt); - cfs_up(&kmxlnd_data.kmx_tx_queue_sem); - cfs_up(&kmxlnd_data.kmx_conn_sem); + up(&kmxlnd_data.kmx_tx_queue_sem); + up(&kmxlnd_data.kmx_conn_sem); mxlnd_sleep(2 * CFS_HZ); /* fall through */ @@ -464,13 +465,13 @@ mxlnd_shutdown (lnet_ni_t *ni) CDEBUG(D_NET, "waiting on threads\n"); /* wait for threads to complete */ for (i = 0; i < nthreads; i++) { - cfs_wait_for_completion(&kmxlnd_data.kmx_completions[i]); + wait_for_completion(&kmxlnd_data.kmx_completions[i]); } LASSERT(cfs_atomic_read(&kmxlnd_data.kmx_nthreads) == 0); CDEBUG(D_NET, "freeing completions\n"); MXLND_FREE(kmxlnd_data.kmx_completions, - nthreads * sizeof(cfs_completion_t)); + nthreads * sizeof(struct completion)); /* fall through */ @@ -560,25 +561,25 @@ mxlnd_startup (lnet_ni_t *ni) kmxlnd_data.kmx_incarnation = (((__u64)tv.tv_sec) * 1000000) + tv.tv_usec; CDEBUG(D_NET, "my incarnation is %llu\n", kmxlnd_data.kmx_incarnation); - cfs_rwlock_init (&kmxlnd_data.kmx_global_lock); - cfs_spin_lock_init (&kmxlnd_data.kmx_mem_lock); + rwlock_init (&kmxlnd_data.kmx_global_lock); + spin_lock_init (&kmxlnd_data.kmx_mem_lock); CFS_INIT_LIST_HEAD (&kmxlnd_data.kmx_conn_reqs); CFS_INIT_LIST_HEAD (&kmxlnd_data.kmx_conn_zombies); CFS_INIT_LIST_HEAD (&kmxlnd_data.kmx_orphan_msgs); - cfs_spin_lock_init (&kmxlnd_data.kmx_conn_lock); - cfs_sema_init(&kmxlnd_data.kmx_conn_sem, 0); + spin_lock_init (&kmxlnd_data.kmx_conn_lock); + sema_init(&kmxlnd_data.kmx_conn_sem, 0); for (i = 0; i < MXLND_HASH_SIZE; i++) { CFS_INIT_LIST_HEAD (&kmxlnd_data.kmx_peers[i]); } CFS_INIT_LIST_HEAD (&kmxlnd_data.kmx_tx_idle); - cfs_spin_lock_init (&kmxlnd_data.kmx_tx_idle_lock); - kmxlnd_data.kmx_tx_next_cookie = 1; - CFS_INIT_LIST_HEAD (&kmxlnd_data.kmx_tx_queue); - cfs_spin_lock_init (&kmxlnd_data.kmx_tx_queue_lock); - cfs_sema_init(&kmxlnd_data.kmx_tx_queue_sem, 0); + spin_lock_init (&kmxlnd_data.kmx_tx_idle_lock); + kmxlnd_data.kmx_tx_next_cookie = 1; + CFS_INIT_LIST_HEAD (&kmxlnd_data.kmx_tx_queue); + spin_lock_init (&kmxlnd_data.kmx_tx_queue_lock); + sema_init(&kmxlnd_data.kmx_tx_queue_sem, 0); kmxlnd_data.kmx_init = MXLND_INIT_DATA; /*****************************************************/ @@ -603,73 +604,80 @@ mxlnd_startup (lnet_ni_t *ni) /* start threads */ MXLND_ALLOC(kmxlnd_data.kmx_completions, - nthreads * sizeof(cfs_completion_t)); + nthreads * sizeof(struct completion)); if (kmxlnd_data.kmx_completions == NULL) { CERROR("failed to alloc kmxlnd_data.kmx_completions\n"); goto failed; } memset(kmxlnd_data.kmx_completions, 0, - nthreads * sizeof(cfs_completion_t)); + nthreads * sizeof(struct completion)); CDEBUG(D_NET, "using %d %s in mx_wait_any()\n", *kmxlnd_tunables.kmx_n_waitd, *kmxlnd_tunables.kmx_n_waitd == 1 ? "thread" : "threads"); for (i = 0; i < *kmxlnd_tunables.kmx_n_waitd; i++) { + char name[24]; + memset(name, 0, sizeof(name)); + snprintf(name, sizeof(name), "mxlnd_request_waitd_%02ld", i); ret = mxlnd_thread_start(mxlnd_request_waitd, (void*)((long)i)); - if (ret < 0) { - CERROR("Starting mxlnd_request_waitd[%d] failed with %d\n", i, ret); + if (ret < 0) { + CERROR("Starting mxlnd_request_waitd[%d] " + "failed with %d\n", i, ret); cfs_atomic_set(&kmxlnd_data.kmx_shutdown, 1); mx_wakeup(kmxlnd_data.kmx_endpt); for (--i; i >= 0; i--) { - cfs_wait_for_completion(&kmxlnd_data.kmx_completions[i]); + wait_for_completion(&kmxlnd_data.kmx_completions[i]); } LASSERT(cfs_atomic_read(&kmxlnd_data.kmx_nthreads) == 0); MXLND_FREE(kmxlnd_data.kmx_completions, - nthreads * sizeof(cfs_completion_t)); + nthreads * sizeof(struct completion)); goto failed; } } - ret = mxlnd_thread_start(mxlnd_tx_queued, (void*)((long)i++)); + ret = mxlnd_thread_start(mxlnd_tx_queued, (void *)((long)i++), + "mxlnd_tx_queued"); if (ret < 0) { CERROR("Starting mxlnd_tx_queued failed with %d\n", ret); cfs_atomic_set(&kmxlnd_data.kmx_shutdown, 1); mx_wakeup(kmxlnd_data.kmx_endpt); for (--i; i >= 0; i--) { - cfs_wait_for_completion(&kmxlnd_data.kmx_completions[i]); + wait_for_completion(&kmxlnd_data.kmx_completions[i]); } LASSERT(cfs_atomic_read(&kmxlnd_data.kmx_nthreads) == 0); MXLND_FREE(kmxlnd_data.kmx_completions, - nthreads * sizeof(cfs_completion_t)); + nthreads * sizeof(struct completion)); goto failed; } - ret = mxlnd_thread_start(mxlnd_timeoutd, (void*)((long)i++)); + ret = mxlnd_thread_start(mxlnd_timeoutd, (void *)((long)i++), + "mxlnd_timeoutd"); if (ret < 0) { CERROR("Starting mxlnd_timeoutd failed with %d\n", ret); cfs_atomic_set(&kmxlnd_data.kmx_shutdown, 1); mx_wakeup(kmxlnd_data.kmx_endpt); - cfs_up(&kmxlnd_data.kmx_tx_queue_sem); + up(&kmxlnd_data.kmx_tx_queue_sem); for (--i; i >= 0; i--) { - cfs_wait_for_completion(&kmxlnd_data.kmx_completions[i]); + wait_for_completion(&kmxlnd_data.kmx_completions[i]); } LASSERT(cfs_atomic_read(&kmxlnd_data.kmx_nthreads) == 0); MXLND_FREE(kmxlnd_data.kmx_completions, - nthreads * sizeof(cfs_completion_t)); + nthreads * sizeof(struct completion)); goto failed; } - ret = mxlnd_thread_start(mxlnd_connd, (void*)((long)i++)); + ret = mxlnd_thread_start(mxlnd_connd, (void *)((long)i++), + "mxlnd_connd"); if (ret < 0) { CERROR("Starting mxlnd_connd failed with %d\n", ret); cfs_atomic_set(&kmxlnd_data.kmx_shutdown, 1); mx_wakeup(kmxlnd_data.kmx_endpt); - cfs_up(&kmxlnd_data.kmx_tx_queue_sem); + up(&kmxlnd_data.kmx_tx_queue_sem); for (--i; i >= 0; i--) { - cfs_wait_for_completion(&kmxlnd_data.kmx_completions[i]); + wait_for_completion(&kmxlnd_data.kmx_completions[i]); } LASSERT(cfs_atomic_read(&kmxlnd_data.kmx_nthreads) == 0); MXLND_FREE(kmxlnd_data.kmx_completions, - nthreads * sizeof(cfs_completion_t)); + nthreads * sizeof(struct completion)); goto failed; }