From fc7469226b63b92a6cd05ee83579186fb9cf8de5 Mon Sep 17 00:00:00 2001 From: "Suren A. Chilingaryan" Date: Fri, 13 Apr 2012 21:29:16 +0200 Subject: Support RAW devices by seqreader --- CMakeLists.txt | 1 + fwbench.sh | 4 +++- seqreader.c | 49 ++++++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 48 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7a24d96..b1adb70 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,6 +34,7 @@ include_directories( ) add_executable(fwbench fwbench.c) +add_executable(seqreader seqreader.c) if (USE_UFO_GENERATOR) target_link_libraries(fwbench m ufo fastwriter ${GLIB2_LIBRARIES} ${GTHREAD2_LIBRARIES}) diff --git a/fwbench.sh b/fwbench.sh index de86385..f653bb2 100755 --- a/fwbench.sh +++ b/fwbench.sh @@ -3,8 +3,10 @@ function fwbench { if [ -f ../configure.sh -a -f fwbench ]; then ../configure.sh ./fwbench $* + elif [ -f fwbench ]; then + ./fwbench $* else - fwbench $* + `which fwbench` $* fi } diff --git a/seqreader.c b/seqreader.c index c589684..1a13cf9 100644 --- a/seqreader.c +++ b/seqreader.c @@ -1,3 +1,5 @@ +#define _GNU_SOURCE + #include #include #include @@ -5,8 +7,14 @@ #include #include #include +#include +#include +#include + +#define BUFSIZE 1048576//65536 +#define BLOCK_SIZE 16384//16384 +#define WRITE_INTERVAL 1 -#define BUFSIZE 65536 int main(int argc, char *argv[]) { int err; @@ -17,28 +25,59 @@ int main(int argc, char *argv[]) { size_t us; size_t files = 0; size_t total_size = 0; + size_t last_write = 0; size_t skip; size_t run; - char buffer[65536]; + char buffer[BUFSIZE]; if (argc < 2) { - printf("Usage: %s [skip]\n", argv[0]); + printf("Usage: %s [skip]\n", argv[0]); exit(0); } + if (!strstr(argv[0], "/dev/")) { + int fd = open(argv[1], O_RDONLY|O_NOATIME|O_LARGEFILE/*|O_DIRECT*/, 0); + if (fd < 0) { + printf("Unable to open device %s\n", argv[1]); + exit(1); + } + + int size = BLOCK_SIZE; + + gettimeofday(&start, NULL); + + err = read(fd, buffer, size); + while (err > 0) { + total_size += err; + + gettimeofday(&tv, NULL); + us = (tv.tv_sec - start.tv_sec) * 1000000 + (tv.tv_usec - start.tv_usec); + if ((us - last_write) > WRITE_INTERVAL * 1000000) { + last_write = us; + printf("Reading: %s (%lu GB), Measured speed: %lu mB/s\n", argv[0], total_size / 1024 / 1024 / 1024, total_size / us); + } + err = read(fd, buffer, size); + } + + close(fd); + + + return 0; + } + chdir(argv[1]); if (argc > 2) { SKIP = atoi(argv[2]); - printf("Skip %i\n", SKIP); + printf("Skip %zu\n", SKIP); } gettimeofday(&start, NULL); for (run = 0; run < SKIP; run++) { skip = 0; dir = opendir("."); - while (ent = readdir(dir)) { + while ((ent = readdir(dir))) { struct stat st; if (((skip++)%SKIP) != run) continue; -- cgit v1.2.3