Fix free memory size

The original free memory size is incorrect, fixed via using unit size
and last unit size.

Signed-off-by: Huang Ying <ying.huang@intel.com>
diff --git a/usemem.c b/usemem.c
index f0807bd..867624f 100644
--- a/usemem.c
+++ b/usemem.c
@@ -390,7 +390,8 @@
 	return p;
 }
 
-void free_memory(void *ptrs[], unsigned int nptr, unsigned long bytes)
+void free_memory(void *ptrs[], unsigned int nptr,
+		 unsigned long unit, unsigned long last_unit)
 {
 	unsigned int i;
 
@@ -398,7 +399,7 @@
 		if (opt_malloc)
 			free(ptrs[i]);
 		else
-			munmap(ptrs[i], bytes);
+			munmap(ptrs[i], i == nptr - 1 ? last_unit : unit);
 	}
 }
 
@@ -676,13 +677,14 @@
 	write(1, buf, len);
 }
 
-static void timing_free(void *ptrs[], unsigned int nptr, unsigned long bytes)
+static void timing_free(void *ptrs[], unsigned int nptr,
+			unsigned long unit, unsigned long last_unit)
 {
 	struct timeval start, stop;
 	unsigned long delta_us;
 
 	gettimeofday(&start, NULL);
-	free_memory(ptrs, nptr, bytes);
+	free_memory(ptrs, nptr, unit, last_unit);
 	gettimeofday(&stop, NULL);
 	delta_us = (stop.tv_sec - start.tv_sec) * 1000000 +
 		(stop.tv_usec - start.tv_usec);
@@ -696,6 +698,7 @@
 	struct drand48_data rand_data;
 	unsigned long unit_bytes = done_bytes;
 	unsigned long bytes = opt_bytes;
+	unsigned long last_unit;
 	void *ptrs[MAX_POINTERS];
 	unsigned int nptr = 0;
 
@@ -722,6 +725,7 @@
 		unit_bytes += do_unit(size, &rand_data,
 				      nptr < MAX_POINTERS ? &ptrs[nptr] : NULL);
 		nptr++;
+		last_unit = size;
 		bytes -= size;
 		if (runtime_exceeded())
 			break;
@@ -757,7 +761,7 @@
 	}
 
 	if (!prealloc && nptr <= MAX_POINTERS)
-		timing_free(ptrs, nptr, bytes);
+		timing_free(ptrs, nptr, unit, last_unit);
 
 	return 0;
 }