Permalink
Browse files

Support latency tests

  • Loading branch information...
1 parent 2e1109a commit a2b13fbd6929162c13e96dc398e376f885053256 Chris Smowton committed Nov 25, 2011
Showing with 171 additions and 245 deletions.
  1. +4 −4 Makefile
  2. +21 −18 pipe_lat.c
  3. +53 −19 tcp_lat.c
  4. +0 −129 tcp_nodelay_lat.c
  5. +68 −50 test.c
  6. +2 −0 test.h
  7. +23 −20 unix_lat.c
  8. +0 −5 xutil.c
View
@@ -3,13 +3,10 @@ LDFLAGS+=-lm
.PHONY: all clean run
-#TARGETS=tcp_lat tcp_thr tcp_nodelay_thr tcp_nodelay_lat
-#TARGETS+=pipe_lat pipe_thr unix_lat unix_thr
-#TARGETS+=mempipe_lat mempipe_thr mempipe_sos22_thr mempipe_sos22_spin_thr
-
TARGETS=pipe_thr tcp_thr tcp_nodelay_thr unix_thr mempipe_thr mempipe_spin_thr
TARGETS+=vmsplice_pipe_thr vmsplice_hugepages_pipe_thr vmsplice_hugepages_coop_pipe_thr vmsplice_coop_pipe_thr
TARGETS+=shmem_pipe_thr
+TARGETS+=pipe_lat unix_lat tcp_lat tcp_nodelay_lat
TARGETS+=summarise_tsc_counters
all: $(TARGETS)
@@ -23,6 +20,9 @@ all: $(TARGETS)
tcp_nodelay_thr.o: tcp_thr.c
$(CC) $(CFLAGS) $^ -c -DUSE_NODELAY -o $@
+tcp_nodelay_lat.o: tcp_lat.c
+ $(CC) $(CFLAGS) $^ -c -DUSE_NODELAY -o $@
+
mempipe_spin_thr.o: mempipe_thr.c
$(CC) $(CFLAGS) $^ -c -DNO_FUTEX -o $@
View
@@ -44,6 +44,7 @@
typedef struct {
int ifds[2];
int ofds[2];
+ void* buf;
} pipe_state;
static void
@@ -58,37 +59,39 @@ init_test(test_data *td)
}
static void
-run_child(test_data *td)
+local_init(test_data *td)
{
pipe_state *ps = (pipe_state *)td->data;
- void *buf = xmalloc(td->size);
- int i;
-
- for (i = 0; i < td->count; i++) {
- xread(ps->ifds[0], buf, td->size);
- xwrite(ps->ofds[1], buf, td->size);
- }
+ ps->buf = xmalloc(td->size);
}
static void
-run_parent(test_data *td)
+child_ping(test_data *td)
{
pipe_state *ps = (pipe_state *)td->data;
- void *buf = xmalloc(td->size);
+ xread(ps->ifds[0], ps->buf, td->size);
+ xwrite(ps->ofds[1], ps->buf, td->size);
+}
- latency_test(
- do {
- xwrite(ps->ifds[1], buf, td->size);
- xread(ps->ofds[0], buf, td->size);
- } while (0),
- td
- );
+static void
+parent_ping(test_data *td)
+{
+ pipe_state *ps = (pipe_state *)td->data;
+ xwrite(ps->ifds[1], ps->buf, td->size);
+ xread(ps->ofds[0], ps->buf, td->size);
}
int
main(int argc, char *argv[])
{
- test_t t = { "pipe_lat", init_test, run_parent, run_child };
+ test_t t = { .name = "pipe_lat",
+ .is_latency_test = 1,
+ .init_test = init_test,
+ .init_parent = local_init,
+ .init_child = local_init,
+ .parent_ping = parent_ping,
+ .child_ping = child_ping
+ };
run_test(argc, argv, &t);
return 0;
}
View
@@ -37,34 +37,44 @@
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
+#include <netinet/tcp.h>
#include "test.h"
#include "xutil.h"
+struct tcp_state {
+ struct addrinfo* info;
+ int fd;
+ void* buf;
+};
+
static void
init_test(test_data *td)
{
int ret;
char portbuf[32];
struct addrinfo hints;
+ struct tcp_state* ts = (struct tcp_state*)xmalloc(sizeof(struct tcp_state));
+ td->data = ts;
int port = 3490+td->num;
snprintf(portbuf, sizeof portbuf, "%d", port);
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
- if ((ret = getaddrinfo("127.0.0.1", portbuf, &hints, (struct addrinfo **)&td->data)) != 0)
+ if ((ret = getaddrinfo("127.0.0.1", portbuf, &hints, (struct addrinfo **)&ts->info)) != 0)
errx(1, "getaddrinfo: %s\n", gai_strerror(ret));
}
static void
-run_child(test_data *td)
+child_init(test_data *td)
{
int sockfd, new_fd, i;
- struct addrinfo *res = (struct addrinfo *)td->data;
+ struct tcp_state* ts = (struct tcp_state*)td->data;
+ ts->buf = xmalloc(td->size);
+ struct addrinfo *res = ts->info;
struct sockaddr_storage their_addr;
socklen_t addr_size;
- void *buf = xmalloc(td->size);
if ((sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) == -1)
err(1, "socket");
@@ -83,38 +93,62 @@ run_child(test_data *td)
if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &addr_size)) == -1)
err(1, "accept");
- for (i = 0; i < td->count; i++) {
- xread(new_fd, buf, td->size);
- xwrite(new_fd, buf, td->size);
- }
+#ifdef USE_NODELAY
+ int flag = 1;
+ if (setsockopt(new_fd, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(int)) == -1)
+ err(1, "setsockopt");
+#endif
+
+ ts->fd = new_fd;
+}
+
+static void child_ping(test_data* td) {
+ struct tcp_state* ts = (struct tcp_state*)td->data;
+ xread(ts->fd, ts->buf, td->size);
+ xwrite(ts->fd, ts->buf, td->size);
}
static void
-run_parent(test_data *td)
+init_parent(test_data *td)
{
- struct addrinfo *res = (struct addrinfo *)td->data;
+ struct tcp_state* ts = (struct tcp_state*)td->data;
+ ts->buf = xmalloc(td->size);
+ struct addrinfo *res = ts->info;
int sockfd;
- void *buf = xmalloc(td->size);
sleep(1);
if ((sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) == -1)
err(1, "socket");
if (connect(sockfd, res->ai_addr, res->ai_addrlen) == -1)
err(1, "connect");
- latency_test(
- do {
- xwrite(sockfd, buf, td->size);
- xread(sockfd, buf, td->size);
- } while (0),
- td
- );
+#ifdef USE_NODELAY
+ int flag = 1;
+ if (setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(int)) == -1)
+ err(1, "setsockopt");
+#endif
+
+ ts->fd = sockfd;
+}
+
+static void parent_ping(test_data* td) {
+ struct tcp_state* ts = (struct tcp_state*)td->data;
+ xwrite(ts->fd, ts->buf, td->size);
+ xread(ts->fd, ts->buf, td->size);
}
int
main(int argc, char *argv[])
{
- test_t t = { "tcp_lat", init_test, run_parent, run_child };
+ test_t t = {
+ .name = "tcp_lat",
+ .is_latency_test = 1,
+ .init_test = init_test,
+ .init_parent = init_parent,
+ .init_child = child_init,
+ .parent_ping = parent_ping,
+ .child_ping = child_ping
+};
run_test(argc, argv, &t);
return 0;
}
View
@@ -1,129 +0,0 @@
-/*
- Copyright (c) 2011 Anil Madhavapeddy <anil@recoil.org>
-
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation
- files (the "Software"), to deal in the Software without
- restriction, including without limitation the rights to use,
- copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following
- conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#include <unistd.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/socket.h>
-#include <string.h>
-#include <sys/time.h>
-#include <err.h>
-#include <inttypes.h>
-#include <netdb.h>
-
-#include <netinet/tcp.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <errno.h>
-
-#include "test.h"
-#include "xutil.h"
-
-static void
-init_test(test_data *td)
-{
- int ret;
- char portbuf[32];
- struct addrinfo hints;
- int port = 3490+td->num;
- snprintf(portbuf, sizeof portbuf, "%d", port);
- memset(&hints, 0, sizeof hints);
- hints.ai_family = AF_UNSPEC;
- hints.ai_socktype = SOCK_STREAM;
- hints.ai_flags = AI_PASSIVE;
- if ((ret = getaddrinfo("127.0.0.1", portbuf, &hints, (struct addrinfo **)&td->data)) != 0)
- errx(1, "getaddrinfo: %s\n", gai_strerror(ret));
-}
-
-static void
-run_child(test_data *td)
-{
- int sockfd, new_fd, i;
- struct addrinfo *res = (struct addrinfo *)td->data;
- struct sockaddr_storage their_addr;
- socklen_t addr_size;
- void *buf = xmalloc(td->size);
- int flag = 1;
-
- if ((sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) == -1)
- err(1, "socket");
-
- if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(int)) == -1)
- err(1, "setsockopt");
-
- while (bind(sockfd, res->ai_addr, res->ai_addrlen) == -1)
- { }
-
- if (listen(sockfd, 1) == -1)
- err(1, "listen");
-
- addr_size = sizeof their_addr;
-
- if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &addr_size)) == -1)
- err(1, "accept");
-
- if (setsockopt(new_fd, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(int)) == -1)
- err(1, "setsockopt");
-
- for (i = 0; i < td->count; i++) {
- xread(new_fd, buf, td->size);
- xwrite(new_fd, buf, td->size);
- }
-}
-
-static void
-run_parent(test_data *td)
-{
- struct addrinfo *res = (struct addrinfo *)td->data;
- int sockfd, flag=1;
- void *buf = xmalloc(td->size);
-
- sleep(1);
- if ((sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) == -1)
- err(1, "socket");
-
- if (connect(sockfd, res->ai_addr, res->ai_addrlen) == -1)
- err(1, "connect");
-
- if (setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(int)) == -1)
- err(1, "setsockopt");
-
- latency_test(
- do {
- xwrite(sockfd, buf, td->size);
- xread(sockfd, buf, td->size);
- } while (0),
- td
- );
-}
-
-int
-main(int argc, char *argv[])
-{
- test_t t = { "tcp_nodelay_lat", init_test, run_parent, run_child };
- run_test(argc, argv, &t);
- return 0;
-}
Oops, something went wrong.

0 comments on commit a2b13fb

Please sign in to comment.