Whamcloud - gitweb
LU-56 lnet: SMP improvements for LNet selftest
[fs/lustre-release.git] / lnet / selftest / module.c
index 1377b10..74ea2a8 100644 (file)
 
 #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
@@ -51,11 +51,13 @@ extern int lstcon_console_fini(void);
 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:
@@ -65,11 +67,21 @@ lnet_selftest_fini (void)
                         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:
@@ -78,7 +90,6 @@ lnet_selftest_fini (void)
         return;
 }
 
-
 void
 lnet_selftest_structure_assertion(void)
 {
@@ -91,25 +102,39 @@ 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) {
@@ -131,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__