/* * Author: Matt Dillon, placed in the public domain. * * zoneread device blksize(K) numzones seek-dispersion(M) mode */ #include #include #include #include #include #include #include #include int main(int ac, char **av) { int i; int fd; int bs; int numzones; off_t seekdisp; off_t seekbase; off_t count; int mode; char *buf; if (ac != 6) { fprintf(stderr, "zoneread device blksize(K) numzones " "seek-dispersion(M) mode\n"); fprintf(stderr, "mode 1 - linear fwd reads from each zone\n" "mode 2 - linear rev reads from each zone\n" "mode 3 - linear fwd skip interleave x 1\n" "mode 4 - linear fwd skip interleave x 2\n" "mode 5 - no seeking within the zone\n" ); exit(1); } fd = open(av[1], O_RDONLY); if (fd < 0) { perror("open"); exit(1); } bs = strtol(av[2], NULL, 0); numzones = strtol(av[3], NULL, 0); seekdisp = strtoll(av[4], NULL, 0); mode = strtol(av[5], NULL, 0); bs *= 1024; seekdisp *= 1024 * 1024; buf = mmap(NULL, bs, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0); printf("device %s bs=%d numzones=%d seekdisp=%lld mode=%d", av[1], bs, numzones, (long long)seekdisp, mode); switch(mode) { case 1: printf("(linear fwd read)\n"); break; case 2: printf("(linear rev read)\n"); break; case 3: printf("(linear fwd skip interleave x 1)\n"); break; case 4: printf("(linear fwd skip interleave x 2)\n"); break; default: printf("(no seeking within zone)\n"); break; } for (i = 0; i < numzones; ++i) { if (fork() == 0) { for (;;) { for (count = 0; count < seekdisp; count += bs) { switch(mode) { case 1: seekbase = seekdisp * i + count; break; case 2: seekbase = seekdisp * i + (seekdisp - count); break; case 3: seekbase = seekdisp * i + count; if ((count / bs) & 1) seekbase -= bs; else seekbase += bs; break; case 4: seekbase = seekdisp * i + count; switch((count / bs) & 3) { case 0: seekbase += bs * 3; break; case 1: seekbase += bs * 2; break; case 2: seekbase -= bs * 2; break; case 3: seekbase -= bs * 3; break; } break; default: seekbase = seekdisp * i; break; } lseek(fd, seekbase, 0); read(fd, buf, bs); } } /* not reached */ } } while (waitpid(-1, NULL, 0) > 0) ; exit(0); }