Fix thread hang when using async engines (libaio,etc.) when too low of a iops rate is specified.

Rate limiting logic was using thread_data->cur_depth to decide the
min_evts number to ask for during its "flush" prior to sleeping.
td->cur_depth, however, does not properly track in-flight IOs submitted
to the async engines.  Added field to thread_data structure and use
that, instead, to track IOs currently in flight.

Signed-off-by: Ryan Marchand <rmarchan@amazon.com>
Signed-off-by: Steven Noonan <snoonan@amazon.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
diff --git a/ioengines.c b/ioengines.c
index e8ed871..4c609f2 100644
--- a/ioengines.c
+++ b/ioengines.c
@@ -222,9 +222,14 @@
 	if (max && td->io_ops->getevents)
 		r = td->io_ops->getevents(td, min, max, t);
 out:
-	if (r >= 0)
+	if (r >= 0) {
+		/*
+ 		 * Reflect that our submitted requests were retrieved with
+		 * whatever OS async calls are in the underlying engine.
+		 */
+		td->io_u_in_flight -= r;
 		io_u_mark_complete(td, r);
-	else
+	} else
 		td_verror(td, r, "get_events");
 
 	dprint(FD_IO, "getevents: %d\n", r);
@@ -344,14 +349,19 @@
 	if (!td->cur_depth || !td->io_u_queued)
 		return 0;
 
-	io_u_mark_depth(td, td->io_u_queued);
-	td->io_u_queued = 0;
+	io_u_mark_depth(td, td->io_u_queued);	
 
 	if (td->io_ops->commit) {
 		ret = td->io_ops->commit(td);
 		if (ret)
 			td_verror(td, -ret, "io commit");
 	}
+	
+	/*
+	 * Reflect that events were submitted as async IO requests.
+	 */
+	td->io_u_in_flight += td->io_u_queued;
+	td->io_u_queued = 0;
 
 	return 0;
 }