-/* -*- 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.
*
* You should have received a copy of the GNU General Public License
* 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
- * have any questions.
+ * http://www.gnu.org/licenses/gpl-2.0.html
*
* 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, 2015, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#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_exit(void)
{
- switch (lst_init_step) {
-#ifdef __KERNEL__
- case LST_INIT_CONSOLE:
- lstcon_console_fini();
-#endif
- case LST_INIT_FW:
- sfw_shutdown();
- case LST_INIT_RPC:
- srpc_shutdown();
- case LST_INIT_NONE:
- break;
- default:
- LBUG();
- }
- return;
+ int i;
+
+ switch (lst_init_step) {
+ case LST_INIT_CONSOLE:
+ lstcon_console_fini();
+ /* fallthrough */
+ case LST_INIT_FW:
+ sfw_shutdown();
+ /* fallthrough */
+ case LST_INIT_RPC:
+ srpc_shutdown();
+ /* fallthrough */
+ 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]);
+ }
+ CFS_FREE_PTR_ARRAY(lst_sched_test,
+ cfs_cpt_number(lnet_cpt_table()));
+ lst_sched_test = NULL;
+ /* fallthrough */
+ case LST_INIT_WI_SERIAL:
+ cfs_wi_sched_destroy(lst_sched_serial);
+ lst_sched_serial = NULL;
+ /* fallthrough */
+ case LST_INIT_NONE:
+ break;
+ default:
+ LBUG();
+ }
}
-
void
lnet_selftest_structure_assertion(void)
{
- CLASSERT(sizeof(srpc_msg_t) == 160);
- CLASSERT(sizeof(srpc_test_reqst_t) == 70);
- CLASSERT(offsetof(srpc_msg_t, msg_body.tes_reqst.tsr_concur) == 72);
- CLASSERT(offsetof(srpc_msg_t, msg_body.tes_reqst.tsr_ndest) == 78);
- CLASSERT(sizeof(srpc_stat_reply_t) == 136);
- CLASSERT(sizeof(srpc_stat_reqst_t) == 28);
+ BUILD_BUG_ON(sizeof(struct srpc_msg) != 160);
+ BUILD_BUG_ON(sizeof(struct srpc_test_reqst) != 70);
+ BUILD_BUG_ON(offsetof(struct srpc_msg, msg_body.tes_reqst.tsr_concur) !=
+ 72);
+ BUILD_BUG_ON(offsetof(struct srpc_msg, msg_body.tes_reqst.tsr_ndest) !=
+ 78);
+ BUILD_BUG_ON(sizeof(struct srpc_stat_reply) != 136);
+ BUILD_BUG_ON(sizeof(struct srpc_stat_reqst) != 28);
}
-int
-lnet_selftest_init (void)
+static int __init
+lnet_selftest_init(void)
{
- int rc;
-
- rc = srpc_startup();
- if (rc != 0) {
- CERROR("LST can't startup rpc\n");
- goto error;
- }
- lst_init_step = LST_INIT_RPC;
-
- rc = sfw_startup();
- if (rc != 0) {
- CERROR("LST can't startup framework\n");
- goto error;
- }
- lst_init_step = LST_INIT_FW;
-
-#ifdef __KERNEL__
- rc = lstcon_console_init();
- if (rc != 0) {
- CERROR("LST can't startup console\n");
- goto error;
- }
- lst_init_step = LST_INIT_CONSOLE;
-#endif
-
- return 0;
+ 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());
+ CFS_ALLOC_PTR_ARRAY(lst_sched_test, 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 CPU partition affinity WI scheduler %d for LST\n",
+ i);
+ goto error;
+ }
+ }
+
+ rc = srpc_startup();
+ if (rc != 0) {
+ CERROR("LST can't startup rpc\n");
+ goto error;
+ }
+ lst_init_step = LST_INIT_RPC;
+
+ rc = sfw_startup();
+ if (rc != 0) {
+ CERROR("LST can't startup framework\n");
+ goto error;
+ }
+ lst_init_step = LST_INIT_FW;
+
+ rc = lstcon_console_init();
+ if (rc != 0) {
+ CERROR("LST can't startup console\n");
+ goto error;
+ }
+ lst_init_step = LST_INIT_CONSOLE;
+ return 0;
error:
- lnet_selftest_fini();
- return rc;
+ lnet_selftest_exit();
+ return rc;
}
-#ifdef __KERNEL__
-
+MODULE_AUTHOR("OpenSFS, Inc. <http://www.lustre.org/>");
MODULE_DESCRIPTION("LNet Selftest");
+MODULE_VERSION("2.8.0");
MODULE_LICENSE("GPL");
-cfs_module(lnet, "0.9.0", lnet_selftest_init, lnet_selftest_fini);
-
-#else
-
-int
-selftest_wait_events (void)
-{
- int evts = 0;
-
- for (;;) {
- /* Consume all pending events */
- while (srpc_check_event(0))
- evts++;
- evts += stt_check_events();
- evts += swi_check_events();
- if (evts != 0) break;
-
- /* Nothing happened, block for events */
- evts += srpc_check_event(stt_poll_interval());
- /* We may have blocked, check for expired timers */
- evts += stt_check_events();
- if (evts == 0) /* timed out and still no event */
- break;
- }
-
- return evts;
-}
-
-#endif
+module_init(lnet_selftest_init);
+module_exit(lnet_selftest_exit);