MINOR: compression: report zlib memory usage

Show the memory usage and the max memory available for zlib.
The value stored is now the memory used instead of the remaining
available memory.
diff --git a/doc/configuration.txt b/doc/configuration.txt
index 94a1f22..ded48de 100644
--- a/doc/configuration.txt
+++ b/doc/configuration.txt
@@ -718,7 +718,10 @@
   Sets the maximum amount of RAM in megabytes per process usable by the zlib.
   When the maximum amount is reached, future sessions will not compress as long
   as RAM is unavailable. When sets to 0, there is no limit.
-  The default value is 0.
+  The default value is 0. The value is available in bytes on the UNIX socket
+  with "show info" on the line "MaxZlibMemUsage", the memory used by zlib is
+  "ZlibMemUsage" in bytes.
+
 
 noepoll
   Disables the use of the "epoll" event polling system on Linux. It is
diff --git a/include/proto/compression.h b/include/proto/compression.h
index 1614edd..0eaa216 100644
--- a/include/proto/compression.h
+++ b/include/proto/compression.h
@@ -41,6 +41,8 @@
 
 
 #ifdef USE_ZLIB
+extern long zlib_used_memory;
+
 int deflate_init(struct comp_ctx **comp_ctx, int level);
 int deflate_add_data(struct comp_ctx *comp_ctx, const char *in_data, int in_len, struct buffer *out);
 int deflate_flush(struct comp_ctx *comp_ctx, struct buffer *out, int flag);
diff --git a/include/types/global.h b/include/types/global.h
index f2a0102..081cf54 100644
--- a/include/types/global.h
+++ b/include/types/global.h
@@ -87,7 +87,7 @@
 	int maxsock;		/* max # of sockets */
 	int rlimit_nofile;	/* default ulimit-n value : 0=unset */
 	int rlimit_memmax;	/* default ulimit-d in megs value : 0=unset */
-	int maxzlibmem;         /* max RAM for zlib in megs */
+	long maxzlibmem;        /* max RAM for zlib in bytes */
 	int mode;
 	unsigned int req_count; /* HTTP request counter */
 	int last_checks;
diff --git a/src/cfgparse.c b/src/cfgparse.c
index d4b3d91..1fe2708 100644
--- a/src/cfgparse.c
+++ b/src/cfgparse.c
@@ -885,7 +885,7 @@
 			err_code |= ERR_ALERT | ERR_FATAL;
 			goto out;
 		}
-		global.maxzlibmem = atol(args[1]);
+		global.maxzlibmem = atol(args[1]) * 1024L * 1024L;
 	}
 	else if (!strcmp(args[0], "ulimit-n")) {
 		if (global.rlimit_nofile != 0) {
diff --git a/src/compression.c b/src/compression.c
index c1e1afd..1df0f57 100644
--- a/src/compression.c
+++ b/src/compression.c
@@ -47,7 +47,7 @@
 static struct pool_head *zlib_pool_head = NULL;
 static struct pool_head *zlib_pool_pending_buf = NULL;
 
-static long long zlib_memory_available = -1;
+long zlib_used_memory = 0;
 
 #endif
 
@@ -301,10 +301,7 @@
 #ifdef USE_ZLIB
 	z_stream *strm;
 
-	if (global.maxzlibmem > 0 && zlib_memory_available < 0)
-		zlib_memory_available = global.maxzlibmem * 1024 * 1024;  /*  Megabytes to bytes */
-
-	if (global.maxzlibmem > 0 && zlib_memory_available < sizeof(struct comp_ctx))
+	if (global.maxzlibmem > 0 && (global.maxzlibmem - zlib_used_memory) < sizeof(struct comp_ctx))
 		return -1;
 #endif
 
@@ -315,7 +312,7 @@
 	if (*comp_ctx == NULL)
 		return -1;
 #ifdef USE_ZLIB
-	zlib_memory_available -= sizeof(struct comp_ctx);
+	zlib_used_memory += sizeof(struct comp_ctx);
 
 	strm = &(*comp_ctx)->strm;
 	strm->zalloc = alloc_zlib;
@@ -337,9 +334,8 @@
 	*comp_ctx = NULL;
 
 #ifdef USE_ZLIB
-	zlib_memory_available += sizeof(struct comp_ctx);
+	zlib_used_memory -= sizeof(struct comp_ctx);
 #endif
-
 	return 0;
 }
 
@@ -380,7 +376,6 @@
 	return 0;
 }
 
-
 int identity_reset(struct comp_ctx *comp_ctx)
 {
 	return 0;
@@ -406,10 +401,8 @@
 	static char round = 0; /* order in deflateInit2 */
 	void *buf = NULL;
 
-	if (global.maxzlibmem > 0 && zlib_memory_available < items * size){
-		buf = NULL;
+	if (global.maxzlibmem > 0 && (global.maxzlibmem - zlib_used_memory) < (long)(items * size))
 		goto end;
-	}
 
 	switch (round) {
 		case 0:
@@ -442,8 +435,8 @@
 			ctx->zlib_pending_buf = buf = pool_alloc2(zlib_pool_pending_buf);
 		break;
 	}
-	if (buf != NULL && global.maxzlibmem > 0)
-		zlib_memory_available -= items * size;
+	if (buf != NULL)
+		zlib_used_memory += items * size;
 
 end:
 
@@ -474,8 +467,7 @@
 		pool = zlib_pool_pending_buf;
 
 	pool_free2(pool, ptr);
-	if (global.maxzlibmem > 0)
-		zlib_memory_available += pool->size;
+	zlib_used_memory -= pool->size;
 }
 
 /**************************
diff --git a/src/dumpstats.c b/src/dumpstats.c
index 32825b0..2a07140 100644
--- a/src/dumpstats.c
+++ b/src/dumpstats.c
@@ -42,6 +42,7 @@
 #include <proto/backend.h>
 #include <proto/channel.h>
 #include <proto/checks.h>
+#include <proto/compression.h>
 #include <proto/dumpstats.h>
 #include <proto/fd.h>
 #include <proto/freq_ctr.h>
@@ -1747,6 +1748,10 @@
 				     "CompressBpsIn: %u\n"
 				     "CompressBpsOut: %u\n"
 				     "CompressBpsRateLim: %u\n"
+#ifdef USE_ZLIB
+				     "ZlibMemUsage: %ld\n"
+				     "MaxZlibMemUsage: %ld\n"
+#endif
 				     "Tasks: %d\n"
 				     "Run_queue: %d\n"
 				     "Idle_pct: %d\n"
@@ -1765,6 +1770,9 @@
 				     read_freq_ctr(&global.conn_per_sec), global.cps_lim, global.cps_max,
 				     read_freq_ctr(&global.comp_bps_in), read_freq_ctr(&global.comp_bps_out),
 				     global.comp_rate_lim,
+#ifdef USE_ZLIB
+				     zlib_used_memory, global.maxzlibmem,
+#endif
 				     nb_tasks_cur, run_queue_cur, idle_pct,
 				     global.node, global.desc?global.desc:""
 				     );