X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lnet%2Fselftest%2Fmodule.c;h=215ba0704d4e8cb798a98bb76f4ec3970ed45e57;hp=eb54f01fbd2e59082941ae35d4ebcd4bfaf884f1;hb=65e067d5d90270d4237a7271008561a4b432b94d;hpb=e3a7c58aebafce40323db54bf6056029e5af4a70 diff --git a/lnet/selftest/module.c b/lnet/selftest/module.c index eb54f01..215ba07 100644 --- a/lnet/selftest/module.c +++ b/lnet/selftest/module.c @@ -26,6 +26,8 @@ /* * 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/ @@ -35,21 +37,27 @@ #define DEBUG_SUBSYSTEM S_LNET #include "selftest.h" +#include "console.h" - -#define LST_INIT_NONE 0 -#define LST_INIT_RPC 1 -#define LST_INIT_FW 2 -#define LST_INIT_CONSOLE 3 - -extern int lstcon_console_init(void); -extern int lstcon_console_fini(void); +enum { + LST_INIT_NONE = 0, + LST_INIT_WI_SERIAL, + LST_INIT_WI_TEST, + LST_INIT_RPC, + LST_INIT_FW, + LST_INIT_CONSOLE +}; static int lst_init_step = LST_INIT_NONE; -void -lnet_selftest_fini (void) +struct cfs_wi_sched *lst_sched_serial; +struct cfs_wi_sched **lst_sched_test; + +static void +lnet_selftest_fini(void) { + int i; + switch (lst_init_step) { #ifdef __KERNEL__ case LST_INIT_CONSOLE: @@ -59,6 +67,21 @@ lnet_selftest_fini (void) sfw_shutdown(); case LST_INIT_RPC: srpc_shutdown(); + case LST_INIT_WI_TEST: + for (i = 0; + i < cfs_cpt_number(lnet_cpt_table()); i++) { + if (lst_sched_test[i] == NULL) + continue; + cfs_wi_sched_destroy(lst_sched_test[i]); + } + LIBCFS_FREE(lst_sched_test, + sizeof(lst_sched_test[0]) * + cfs_cpt_number(lnet_cpt_table())); + lst_sched_test = NULL; + + case LST_INIT_WI_SERIAL: + cfs_wi_sched_destroy(lst_sched_serial); + lst_sched_serial = NULL; case LST_INIT_NONE: break; default: @@ -67,7 +90,6 @@ lnet_selftest_fini (void) return; } - void lnet_selftest_structure_assertion(void) { @@ -79,10 +101,40 @@ lnet_selftest_structure_assertion(void) CLASSERT(sizeof(srpc_stat_reqst_t) == 28); } -int -lnet_selftest_init (void) +static int +lnet_selftest_init(void) { - int rc; + int nscheds; + int rc; + int i; + + rc = cfs_wi_sched_create("lst_s", lnet_cpt_table(), CFS_CPT_ANY, + 1, &lst_sched_serial); + if (rc != 0) { + CERROR("Failed to create serial WI scheduler for LST\n"); + return rc; + } + lst_init_step = LST_INIT_WI_SERIAL; + + nscheds = cfs_cpt_number(lnet_cpt_table()); + LIBCFS_ALLOC(lst_sched_test, sizeof(lst_sched_test[0]) * nscheds); + if (lst_sched_test == NULL) + goto error; + + lst_init_step = LST_INIT_WI_TEST; + for (i = 0; i < nscheds; i++) { + int nthrs = cfs_cpt_weight(lnet_cpt_table(), i); + + /* reserve at least one CPU for LND */ + nthrs = max(nthrs - 1, 1); + rc = cfs_wi_sched_create("lst_t", lnet_cpt_table(), i, + nthrs, &lst_sched_test[i]); + if (rc != 0) { + CERROR("Failed to create CPT affinity WI scheduler " + "%d for LST\n", i); + goto error; + } + } rc = srpc_startup(); if (rc != 0) { @@ -104,13 +156,12 @@ lnet_selftest_init (void) CERROR("LST can't startup console\n"); goto error; } - lst_init_step = LST_INIT_CONSOLE; + lst_init_step = LST_INIT_CONSOLE; #endif - - return 0; + return 0; error: - lnet_selftest_fini(); - return rc; + lnet_selftest_fini(); + return rc; } #ifdef __KERNEL__