Add support for runtime log compression

If log_compression=64M is specified, fio will "bite" off chunks of
the IO logs and runtime compress them with zlib. This can greatly
reduce the amount of memory required to do iops/bw/lat logging of
a run, at the cost of using some background CPU for the compression.

Signed-off-by: Jens Axboe <axboe@fb.com>
diff --git a/stat.c b/stat.c
index 58744a8..ccf08a6 100644
--- a/stat.c
+++ b/stat.c
@@ -1565,7 +1565,7 @@
 			     enum fio_ddir ddir, unsigned int bs,
 			     unsigned long t, uint64_t offset)
 {
-	const int nr_samples = iolog->nr_samples;
+	uint64_t nr_samples = iolog->nr_samples;
 	struct io_sample *s;
 
 	if (iolog->disabled)
@@ -1579,14 +1579,24 @@
 		void *new_log;
 
 		new_size = 2 * iolog->max_samples * log_entry_sz(iolog);
-		new_log = realloc(iolog->log, new_size);
-		if (!new_log) {
-			log_err("fio: failed extending iolog! Will stop logging.\n");
-			iolog->disabled = 1;
-			return;
+
+		if (iolog->log_gz && (new_size > iolog->log_gz)) {
+			if (iolog_flush(iolog, 0)) {
+				log_err("fio: failed flushing iolog! Will stop logging.\n");
+				iolog->disabled = 1;
+				return;
+			}
+			nr_samples = iolog->nr_samples;
+		} else {
+			new_log = realloc(iolog->log, new_size);
+			if (!new_log) {
+				log_err("fio: failed extending iolog! Will stop logging.\n");
+				iolog->disabled = 1;
+				return;
+			}
+			iolog->log = new_log;
+			iolog->max_samples <<= 1;
 		}
-		iolog->log = new_log;
-		iolog->max_samples <<= 1;
 	}
 
 	s = get_sample(iolog, nr_samples);