/*
* 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/
#include "selftest.h"
-
enum {
LST_INIT_NONE = 0,
- LST_INIT_WI,
+ 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;
struct cfs_wi_sched *lst_sched_serial;
-struct cfs_wi_sched *lst_sched_test;
+struct cfs_wi_sched **lst_sched_test;
void
-lnet_selftest_fini (void)
+lnet_selftest_fini(void)
{
+ int i;
+
switch (lst_init_step) {
#ifdef __KERNEL__
case LST_INIT_CONSOLE:
sfw_shutdown();
case LST_INIT_RPC:
srpc_shutdown();
- case LST_INIT_WI:
+ 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);
- cfs_wi_sched_destroy(lst_sched_test);
lst_sched_serial = NULL;
- lst_sched_test = NULL;
case LST_INIT_NONE:
break;
default:
return;
}
-
void
lnet_selftest_structure_assertion(void)
{
}
int
-lnet_selftest_init (void)
+lnet_selftest_init(void)
{
- int nthrs;
- 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)
- return rc;
-
- nthrs = cfs_cpt_weight(lnet_cpt_table(), CFS_CPT_ANY);
- rc = cfs_wi_sched_create("lst_t", lnet_cpt_table(), CFS_CPT_ANY,
- nthrs, &lst_sched_test);
if (rc != 0) {
- cfs_wi_sched_destroy(lst_sched_serial);
- lst_sched_serial = NULL;
+ CERROR("Failed to create serial WI scheduler for LST\n");
return rc;
}
- lst_init_step = LST_INIT_WI;
+ 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) {
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__