selftests: txtimestamp: add new command-line flags.
authorJian Yang <jianyang@google.com>
Tue, 17 Mar 2020 19:25:07 +0000 (12:25 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sun, 22 Mar 2020 03:14:13 +0000 (20:14 -0700)
A longer sleep duration between sendmsg()s makes more cachelines to be
evicted and results in higher latency. Making the duration configurable.

Add the following new flags:
-S: Configurable sleep duration.
-b: Busy loop instead of poll().

Remove the following flag:
-D: No delay between packets: subsumed by -S.

Signed-off-by: Jian Yang <jianyang@google.com>
Acked-by: Willem de Bruijn <willemb@google.com>
Acked-by: Soheil Hassas Yeganeh <soheil@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
tools/testing/selftests/networking/timestamping/txtimestamp.c

index a9b8c41a3009123b8c5dc26eec4bc0b877f6558f..ee060ae3d44f576a0bea858a2670fb7aa430dc8d 100644 (file)
@@ -65,8 +65,9 @@ static int cfg_delay_snd;
 static int cfg_delay_ack;
 static bool cfg_show_payload;
 static bool cfg_do_pktinfo;
+static bool cfg_busy_poll;
+static int cfg_sleep_usec = 50 * 1000;
 static bool cfg_loop_nodata;
-static bool cfg_no_delay;
 static bool cfg_use_cmsg;
 static bool cfg_use_pf_packet;
 static bool cfg_do_listen;
@@ -553,10 +554,11 @@ static void do_test(int family, unsigned int report_opt)
                        error(1, errno, "send");
 
                /* wait for all errors to be queued, else ACKs arrive OOO */
-               if (!cfg_no_delay)
-                       usleep(50 * NSEC_PER_USEC);
+               if (cfg_sleep_usec)
+                       usleep(cfg_sleep_usec);
 
-               __poll(fd);
+               if (!cfg_busy_poll)
+                       __poll(fd);
 
                while (!recv_errmsg(fd)) {}
        }
@@ -575,9 +577,9 @@ static void __attribute__((noreturn)) usage(const char *filepath)
                        "  -4:   only IPv4\n"
                        "  -6:   only IPv6\n"
                        "  -h:   show this message\n"
+                       "  -b:   busy poll to read from error queue\n"
                        "  -c N: number of packets for each test\n"
                        "  -C:   use cmsg to set tstamp recording options\n"
-                       "  -D:   no delay between packets\n"
                        "  -F:   poll() waits forever for an event\n"
                        "  -I:   request PKTINFO\n"
                        "  -l N: send N bytes at a time\n"
@@ -588,6 +590,7 @@ static void __attribute__((noreturn)) usage(const char *filepath)
                        "  -P:   use PF_PACKET\n"
                        "  -r:   use raw\n"
                        "  -R:   use raw (IP_HDRINCL)\n"
+                       "  -S N: usec to sleep before reading error queue\n"
                        "  -u:   use udp\n"
                        "  -v:   validate SND delay (usec)\n"
                        "  -V:   validate ACK delay (usec)\n"
@@ -601,7 +604,7 @@ static void parse_opt(int argc, char **argv)
        int proto_count = 0;
        int c;
 
-       while ((c = getopt(argc, argv, "46c:CDFhIl:LnNp:PrRuv:V:x")) != -1) {
+       while ((c = getopt(argc, argv, "46bc:CFhIl:LnNp:PrRS:uv:V:x")) != -1) {
                switch (c) {
                case '4':
                        do_ipv6 = 0;
@@ -609,15 +612,15 @@ static void parse_opt(int argc, char **argv)
                case '6':
                        do_ipv4 = 0;
                        break;
+               case 'b':
+                       cfg_busy_poll = true;
+                       break;
                case 'c':
                        cfg_num_pkts = strtoul(optarg, NULL, 10);
                        break;
                case 'C':
                        cfg_use_cmsg = true;
                        break;
-               case 'D':
-                       cfg_no_delay = true;
-                       break;
                case 'F':
                        cfg_poll_timeout = -1;
                        break;
@@ -655,6 +658,9 @@ static void parse_opt(int argc, char **argv)
                        cfg_proto = SOCK_RAW;
                        cfg_ipproto = IPPROTO_RAW;
                        break;
+               case 'S':
+                       cfg_sleep_usec = strtoul(optarg, NULL, 10);
+                       break;
                case 'u':
                        proto_count++;
                        cfg_proto = SOCK_DGRAM;