Fix filling verify pattern for byte sizes of 3, 5, 7, ...
[fio.git] / backend.c
index 1c4484be951e8ea437ff9cb91fa7a01818b24bb5..4d4e8efda0601f43e5400163b56af2e16f2e4110 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -910,6 +910,15 @@ static int init_io_u(struct thread_data *td)
        if ((td->io_ops->flags & FIO_NOIO) || !(td_read(td) || td_write(td)))
                data_xfer = 0;
 
+       /*
+        * if we may later need to do address alignment, then add any
+        * possible adjustment here so that we don't cause a buffer
+        * overflow later. this adjustment may be too much if we get
+        * lucky and the allocator gives us an aligned address.
+        */
+       if (td->o.odirect || td->o.mem_align || (td->io_ops->flags & FIO_RAWIO))
+               td->orig_buffer_size += page_mask + td->o.mem_align;
+
        if (td->o.mem_type == MEM_SHMHUGE || td->o.mem_type == MEM_MMAPHUGE) {
                unsigned long bs;
 
@@ -1549,6 +1558,12 @@ reaped:
                fio_terminate_threads(TERMINATE_ALL);
 }
 
+static void do_usleep(unsigned int usecs)
+{
+       check_for_running_stats();
+       usleep(usecs);
+}
+
 /*
  * Main function for kicking off and reaping jobs, as needed.
  */
@@ -1727,7 +1742,7 @@ static void run_threads(void)
                        if (mtime_since_now(&this_start) > JOB_START_TIMEOUT)
                                break;
 
-                       usleep(100000);
+                       do_usleep(100000);
 
                        for (i = 0; i < this_jobs; i++) {
                                td = map[i];
@@ -1779,12 +1794,12 @@ static void run_threads(void)
                reap_threads(&nr_running, &t_rate, &m_rate);
 
                if (todo)
-                       usleep(100000);
+                       do_usleep(100000);
        }
 
        while (nr_running) {
                reap_threads(&nr_running, &t_rate, &m_rate);
-               usleep(10000);
+               do_usleep(10000);
        }
 
        fio_idle_prof_stop();