#define TARGET_HOSTNAME "localhost"
#define BYTES (128*1024*1024UL)
-#define BUFSIZE (64*1024)
+#define BUFSIZE (64*1024U)
#define NR (BYTES/BUFSIZE)
printf("%Ld cycles/sec\n", cycles_per_sec);
}
-static int child(struct sockaddr *addr, int len)
+static int child(void)
{
static char buffer[BUFSIZE];
int sk;
struct sockaddr_in s_to;
struct hostent *hp;
double r1, r2, r3, r4, r5;
- int i, pipefd[2];
+ unsigned int i;
+ int pipefd[2];
loff_t off = 0;
r1 = r2 = r3 = r4 = r5 = 0;
fprintf(stdout, "BUFSIZE = %d\n", BUFSIZE);
fflush(stdout);
- if (connect(sk, (struct sockaddr *)&s_to, len) < 0)
+ if (connect(sk, (struct sockaddr *)&s_to, sizeof(s_to)) < 0)
return error("connect");
start_timing("Empty buffer");
- for (i = 0; i < NR; i++)
- write(sk, buffer, BUFSIZE);
+ for (i = 0; i < NR; i++) {
+ if (write(sk, buffer, BUFSIZE) != BUFSIZE)
+ return error("empty buffer write");
+ }
end_timing(NR*BUFSIZE, &r1);
fd = open("largefile", O_RDONLY);
for (i = 0; i < NR; i++) {
if (read(fd, buffer, BUFSIZE) != BUFSIZE)
return error("largefile read");
- write(sk, buffer, BUFSIZE);
+ if (write(sk, buffer, BUFSIZE) != BUFSIZE)
+ return error("largefile write");
}
end_timing(NR*BUFSIZE, &r2);
close(fd);
start_timing("sendfile");
sendfile_again:
sk = socket(PF_INET, SOCK_STREAM, 0);
- if (connect(sk, (struct sockaddr *)&s_to, len) < 0)
+ if (connect(sk, (struct sockaddr *)&s_to, sizeof(s_to)) < 0)
return error("connect");
fd = open("largefile", O_RDONLY);
start_timing("splice-pipe");
splice_pipe_again:
sk = socket(PF_INET, SOCK_STREAM, 0);
- if (connect(sk, (struct sockaddr *)&s_to, len) < 0)
+ if (connect(sk, (struct sockaddr *)&s_to, sizeof(s_to)) < 0)
return error("connect");
fd = open("largefile", O_RDONLY);
i = NR*BUFSIZE;
off = 0;
do {
- int ret = splice(fd, &off, pipefd[1], NULL, min(i, BUFSIZE), SPLICE_F_NONBLOCK);
+ int ret = ssplice(fd, &off, pipefd[1], NULL, min(i, BUFSIZE), SPLICE_F_NONBLOCK);
if (ret <= 0)
return error("splice-pipe-in");
i -= ret;
while (ret > 0) {
int flags = i ? SPLICE_F_MORE : 0;
- int written = splice(pipefd[0], NULL, sk, NULL, ret, flags);
+ int written = ssplice(pipefd[0], NULL, sk, NULL, ret, flags);
if (written <= 0)
return error("splice-pipe-out");
ret -= written;
start_timing("splice");
splice_again:
sk = socket(PF_INET, SOCK_STREAM, 0);
- if (connect(sk, (struct sockaddr *)&s_to, len) < 0)
+ if (connect(sk, (struct sockaddr *)&s_to, sizeof(s_to)) < 0)
return error("connect");
fd = open("largefile", O_RDONLY);
int flags = BUFSIZE < i ? SPLICE_F_MORE : 0;
int ret;
- ret = splice(fd, &off, sk, NULL, min(i, BUFSIZE), flags);
+ ret = ssplice(fd, &off, sk, NULL, min(i, BUFSIZE), flags);
if (ret <= 0)
return error("splice");
BUG_ON(fd == -1);
close(fd);
- fd = open(".tmp_mmap", O_RDWR|O_CREAT|O_TRUNC);
+ fd = open(".tmp_mmap", O_RDWR|O_CREAT|O_TRUNC, 0644);
BUG_ON(fd == -1);
ret = write(fd, zerobuff, 4096);
BUG_ON(ret != 4096);
do { \
__asm__ __volatile__("rdtsc" : "=A" (val)); \
} while (0)
+#elif defined(__x86_64__)
+#define rdtscll(val) \
+do { \
+ uint64_t lo, hi; \
+ __asm__ __volatile__("rdtsc" : "=a" (lo), "=d" (hi)); \
+ (val) = (hi << 32) | lo; \
+} while (0)
#if 0
#elif defined(__ia64__)
#define rdtscll(val) \
* We are a nice +19 SCHED_BATCH task:
*/
BUG_ON(sched_setscheduler(0, SCHED_BATCH, &p) != 0);
- nice(40);
+ if (nice(40) < 0)
+ perror("nice");
rdtscll(t0);
while (cycles >= 0) {
}
}
-int main(int argc, char **argv)
+int main(__attribute__((__unused__)) int argc, __attribute__((__unused__)) char **argv)
{
- unsigned int sk, len;
- struct sockaddr addr;
pid_t pid;
setup_shared_var();
signal(SIGCHLD, SIG_IGN);
- sk = socket(PF_INET, SOCK_STREAM, 0);
- if (sk < 0) {
- perror("socket");
- exit(1);
- }
- if (listen(sk, 1) < 0) {
- perror("listen");
- exit(1);
- }
- len = sizeof(addr);
- if (getsockname(sk, &addr, &len) < 0) {
- perror("getsockname");
- exit(1);
- }
+
pid = fork();
if (!pid) {
lowprio_cycle_soak_loop();
exit(0);
}
- nice(-20);
- child(&addr, len);
+
+ if (nice(-20) < 0)
+ perror("nice");
+
+ child();
kill(pid, SIGHUP);
exit(0);
}