[PATCH] Fixup stat queue file read
[fio.git] / fio.c
diff --git a/fio.c b/fio.c
index bc0083433a445ed688bdf04c11b63dab224ba524..df284581e0434f3e9eaeac327ee7952c88374000 100644 (file)
--- a/fio.c
+++ b/fio.c
@@ -57,6 +57,8 @@ static void update_io_ticks(void);
 static void disk_util_timer_arm(void);
 static void print_thread_status(void);
 
+extern unsigned long long mlock_size;
+
 /*
  * thread life cycle
  */
@@ -1136,7 +1138,7 @@ static void do_io(struct thread_data *td)
        if (td->cur_depth)
                cleanup_pending_aio(td);
 
-       if (should_fsync(td) && td->fsync_blocks)
+       if (should_fsync(td) && td->end_fsync)
                sync_td(td);
 }
 
@@ -1158,6 +1160,8 @@ static int init_io(struct thread_data *td)
                return fio_posixaio_init(td);
        else if (td->io_engine == FIO_SGIO)
                return fio_sgio_init(td);
+       else if (td->io_engine == FIO_SPLICEIO)
+               return fio_spliceio_init(td);
        else {
                fprintf(stderr, "bad io_engine %d\n", td->io_engine);
                return 1;
@@ -1735,23 +1739,19 @@ static void init_disk_util(struct thread_data *td)
                return;
 
        /*
-        * for md/dm, there's no queue dir. we already have the right place
+        * If there's a ../queue/ directory there, we are inside a partition.
+        * Check if that is the case and jump back. For loop/md/dm etc we
+        * are already in the right spot.
         */
-       sprintf(tmp, "%s/stat", foo);
-       if (stat(tmp, &st)) {
-               /*
-                * if this is inside a partition dir, jump back to parent
-                */
-               sprintf(tmp, "%s/queue", foo);
+       sprintf(tmp, "%s/../queue", foo);
+       if (!stat(tmp, &st)) {
+               p = dirname(foo);
+               sprintf(tmp, "%s/queue", p);
                if (stat(tmp, &st)) {
-                       p = dirname(foo);
-                       sprintf(tmp, "%s/queue", p);
-                       if (stat(tmp, &st)) {
-                               fprintf(stderr, "unknown sysfs layout\n");
-                               return;
-                       }
-                       sprintf(foo, "%s", p);
+                       fprintf(stderr, "unknown sysfs layout\n");
+                       return;
                }
+               sprintf(foo, "%s", p);
        }
 
        disk_util_add(dev, foo);
@@ -2227,11 +2227,60 @@ static void reap_threads(int *nr_running, int *t_rate, int *m_rate)
        }
 }
 
+static void fio_unpin_memory(void *pinned)
+{
+       if (pinned) {
+               if (munlock(pinned, mlock_size) < 0)
+                       perror("munlock");
+               munmap(pinned, mlock_size);
+       }
+}
+
+static void *fio_pin_memory(void)
+{
+       long pagesize, pages;
+       void *ptr;
+
+       if (!mlock_size)
+               return NULL;
+
+       /*
+        * Don't allow mlock of more than real_mem-128MB
+        */
+       pagesize = sysconf(_SC_PAGESIZE);
+       pages = sysconf(_SC_PHYS_PAGES);
+       if (pages != -1 && pagesize != -1) {
+               unsigned long long real_mem = pages * pagesize;
+
+               if ((mlock_size + 128 * 1024 * 1024) > real_mem) {
+                       mlock_size = real_mem - 128 * 1024 * 1024;
+                       printf("fio: limiting mlocked memory to %lluMiB\n",
+                                                       mlock_size >> 20);
+               }
+       }
+
+       ptr = mmap(NULL, mlock_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | OS_MAP_ANON, 0, 0);
+       if (!ptr) {
+               perror("malloc locked mem");
+               return NULL;
+       }
+       if (mlock(ptr, mlock_size) < 0) {
+               munmap(ptr, mlock_size);
+               perror("mlock");
+               return NULL;
+       }
+
+       return ptr;
+}
+
 static void run_threads(void)
 {
        struct thread_data *td;
        unsigned long spent;
        int i, todo, nr_running, m_rate, t_rate, nr_started;
+       void *mlocked_mem;
+
+       mlocked_mem = fio_pin_memory();
 
        printf("Starting %d thread%s\n", thread_number, thread_number > 1 ? "s" : "");
        fflush(stdout);
@@ -2345,6 +2394,7 @@ static void run_threads(void)
        }
 
        update_io_ticks();
+       fio_unpin_memory(mlocked_mem);
 }
 
 static void show_group_stats(struct group_run_stats *rs, int id)