Whamcloud - gitweb
LU-5435 lnet: lustre network latency simulation
[fs/lustre-release.git] / lnet / utils / portals.c
index 8f1b2c5..a2a9f31 100644 (file)
@@ -1355,6 +1355,7 @@ fault_simul_rule_add(__u32 opc, char *name, int argc, char **argv)
                {"dest",        required_argument,      0,      'd'},
                {"rate",        required_argument,      0,      'r'},
                {"interval",    required_argument,      0,      'i'},
+               {"latency",     required_argument,      0,      'l'},
                {"portal",      required_argument,      0,      'p'},
                {"message",     required_argument,      0,      'm'},
                {0, 0, 0, 0}
@@ -1366,7 +1367,7 @@ fault_simul_rule_add(__u32 opc, char *name, int argc, char **argv)
                return -1;
        }
 
-       optstr = "s:d:r:i:p:m:";
+       optstr = opc == LNET_CTL_DROP_ADD ? "s:d:r:i:p:m:" : "s:d:r:l:p:m:";
        memset(&attr, 0, sizeof(attr));
        while (1) {
                char c = getopt_long(argc, argv, optstr, opts, NULL);
@@ -1388,11 +1389,23 @@ fault_simul_rule_add(__u32 opc, char *name, int argc, char **argv)
                        break;
 
                case 'r': /* drop rate */
-                       attr.u.drop.da_rate = strtoul(optarg, NULL, 0);
+                       if (opc == LNET_CTL_DROP_ADD)
+                               attr.u.drop.da_rate = strtoul(optarg, NULL, 0);
+                       else
+                               attr.u.delay.la_rate = strtoul(optarg, NULL, 0);
                        break;
 
                case 'i': /* time interval (# seconds) for message drop */
-                       attr.u.drop.da_interval = strtoul(optarg, NULL, 0);
+                       if (opc == LNET_CTL_DROP_ADD)
+                               attr.u.drop.da_interval = strtoul(optarg,
+                                                                 NULL, 0);
+                       else
+                               attr.u.delay.la_interval = strtoul(optarg,
+                                                                  NULL, 0);
+                       break;
+
+               case 'l': /* seconds to wait before activating rule */
+                       attr.u.delay.la_latency = strtoul(optarg, NULL, 0);
                        break;
 
                case 'p': /* portal to filter */
@@ -1415,9 +1428,28 @@ fault_simul_rule_add(__u32 opc, char *name, int argc, char **argv)
        }
        optind = 1;
 
-       if ((attr.u.drop.da_rate == 0) == (attr.u.drop.da_interval == 0)) {
-               fprintf(stderr, "please provide drop rate or interval\n");
-               return -1;
+       if (opc == LNET_CTL_DROP_ADD) {
+               /* NB: drop rate and interval are exclusive to each other */
+               if (!((attr.u.drop.da_rate == 0) ^
+                     (attr.u.drop.da_interval == 0))) {
+                       fprintf(stderr,
+                               "please provide either drop rate or interval "
+                               "but not both at the same time.\n");
+                       return -1;
+               }
+       } else if (opc == LNET_CTL_DELAY_ADD) {
+               if (!((attr.u.delay.la_rate == 0) ^
+                     (attr.u.delay.la_interval == 0))) {
+                       fprintf(stderr,
+                               "please provide either delay rate or interval "
+                               "but not both at the same time.\n");
+                       return -1;
+               }
+
+               if (attr.u.delay.la_latency == 0) {
+                       fprintf(stderr, "latency cannot be zero\n");
+                       return -1;
+               }
        }
 
        if (attr.fa_src == 0 || attr.fa_dst == 0) {
@@ -1443,8 +1475,9 @@ fault_simul_rule_add(__u32 opc, char *name, int argc, char **argv)
        }
 
        printf("Added %s rule %s->%s (1/%d)\n",
-              name, libcfs_nid2str(attr.fa_src),
-              libcfs_nid2str(attr.fa_dst), attr.u.drop.da_rate);
+              name, libcfs_nid2str(attr.fa_src), libcfs_nid2str(attr.fa_dst),
+              opc == LNET_CTL_DROP_ADD ?
+              attr.u.drop.da_rate : attr.u.delay.la_rate);
        return 0;
 
 getopt_failed:
@@ -1458,6 +1491,12 @@ jt_ptl_drop_add(int argc, char **argv)
        return fault_simul_rule_add(LNET_CTL_DROP_ADD, "drop", argc, argv);
 }
 
+int
+jt_ptl_delay_add(int argc, char **argv)
+{
+       return fault_simul_rule_add(LNET_CTL_DELAY_ADD, "delay", argc, argv);
+}
+
 static int
 fault_simul_rule_del(__u32 opc, char *name, int argc, char **argv)
 {
@@ -1541,6 +1580,12 @@ jt_ptl_drop_del(int argc, char **argv)
        return fault_simul_rule_del(LNET_CTL_DROP_DEL, "drop", argc, argv);
 }
 
+int
+jt_ptl_delay_del(int argc, char **argv)
+{
+       return fault_simul_rule_del(LNET_CTL_DELAY_DEL, "delay", argc, argv);
+}
+
 static int
 fault_simul_rule_reset(__u32 opc, char *name, int argc, char **argv)
 {
@@ -1565,6 +1610,13 @@ jt_ptl_drop_reset(int argc, char **argv)
        return fault_simul_rule_reset(LNET_CTL_DROP_RESET, "drop", argc, argv);
 }
 
+int
+jt_ptl_delay_reset(int argc, char **argv)
+{
+       return fault_simul_rule_reset(LNET_CTL_DELAY_RESET, "delay",
+                                     argc, argv);
+}
+
 static int
 fault_simul_rule_list(__u32 opc, char *name, int argc, char **argv)
 {
@@ -1608,6 +1660,19 @@ fault_simul_rule_list(__u32 opc, char *name, int argc, char **argv)
                               stat.u.drop.ds_dropped, stat.fs_count,
                               stat.fs_put, stat.fs_ack,
                               stat.fs_get, stat.fs_reply);
+
+               } else if (opc == LNET_CTL_DELAY_LIST) {
+                       printf("%s->%s (1/%d | %d, latency %d) ptl "LPX64
+                              ", msg %x, "LPU64"/"LPU64", PUT "LPU64
+                              ", ACK "LPU64", GET "LPU64", REP "LPU64"\n",
+                              libcfs_nid2str(attr.fa_src),
+                              libcfs_nid2str(attr.fa_dst),
+                              attr.u.delay.la_rate, attr.u.delay.la_interval,
+                              attr.u.delay.la_latency,
+                              attr.fa_ptl_mask, attr.fa_msg_mask,
+                              stat.u.delay.ls_delayed, stat.fs_count,
+                              stat.fs_put, stat.fs_ack, stat.fs_get,
+                              stat.fs_reply);
                }
        }
        printf("found total %d\n", pos);
@@ -1621,6 +1686,12 @@ jt_ptl_drop_list(int argc, char **argv)
        return fault_simul_rule_list(LNET_CTL_DROP_LIST, "drop", argc, argv);
 }
 
+int
+jt_ptl_delay_list(int argc, char **argv)
+{
+       return fault_simul_rule_list(LNET_CTL_DELAY_LIST, "delay", argc, argv);
+}
+
 double
 get_cycles_per_usec ()
 {