X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=rate-submit.c;h=8ecd285c7d91eba927e762e9ab6e5f422c01836f;hp=2f02fe2ba8365dea762051e555b1f28651ee45e3;hb=c06379a65d467bdcc782d7e1aa067e6391cd5a68;hpb=f88817479014b87bfed3a20f9fe7dae0efb33dee diff --git a/rate-submit.c b/rate-submit.c index 2f02fe2b..8ecd285c 100644 --- a/rate-submit.c +++ b/rate-submit.c @@ -9,6 +9,36 @@ #include "lib/getrusage.h" #include "rate-submit.h" +static void check_overlap(struct io_u *io_u) +{ + int i; + struct thread_data *td; + bool overlap = false; + + do { + /* + * Allow only one thread to check for overlap at a + * time to prevent two threads from thinking the coast + * is clear and then submitting IOs that overlap with + * each other + */ + pthread_mutex_lock(&overlap_check); + for_each_td(td, i) { + if (td->runstate <= TD_SETTING_UP || + td->runstate >= TD_FINISHING || + !td->o.serialize_overlap || + td->o.io_submit_mode != IO_MODE_OFFLOAD) + continue; + + overlap = in_flight_overlap(&td->io_u_all, io_u); + if (overlap) { + pthread_mutex_unlock(&overlap_check); + break; + } + } + } while (overlap); +} + static int io_workqueue_fn(struct submit_worker *sw, struct workqueue_work *work) { @@ -17,6 +47,9 @@ static int io_workqueue_fn(struct submit_worker *sw, struct thread_data *td = sw->priv; int ret; + if (td->o.serialize_overlap) + check_overlap(io_u); + dprint(FD_RATE, "io_u %p queued by %u\n", io_u, gettid()); io_u_set(td, io_u, IO_U_F_NO_FILE_PUT);