t/memlock: sample utility to use X memory from Y threads
authorJens Axboe <axboe@fb.com>
Thu, 24 Mar 2016 23:07:05 +0000 (17:07 -0600)
committerJens Axboe <axboe@fb.com>
Thu, 24 Mar 2016 23:07:05 +0000 (17:07 -0600)
Signed-off-by: Jens Axboe <axboe@fb.com>
Makefile
t/memlock.c [new file with mode: 0644]

index 07609e6573ceaa905e110b30a82f3cd457adc435..007ae400a48a4d5314cc96528ff7919f84a8ebeb 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -234,6 +234,9 @@ T_VS_PROGS = t/fio-verify-state
 T_PIPE_ASYNC_OBJS = t/read-to-pipe-async.o
 T_PIPE_ASYNC_PROGS = t/read-to-pipe-async
 
+T_MEMLOCK_OBJS = t/memlock.o
+T_MEMLOCK_PROGS = t/memlock
+
 T_OBJS = $(T_SMALLOC_OBJS)
 T_OBJS += $(T_IEEE_OBJS)
 T_OBJS += $(T_ZIPF_OBJS)
@@ -244,6 +247,7 @@ T_OBJS += $(T_BTRACE_FIO_OBJS)
 T_OBJS += $(T_DEDUPE_OBJS)
 T_OBJS += $(T_VS_OBJS)
 T_OBJS += $(T_PIPE_ASYNC_OBJS)
+T_OBJS += $(T_MEMLOCK_OBJS)
 
 ifneq (,$(findstring CYGWIN,$(CONFIG_TARGET_OS)))
     T_DEDUPE_OBJS += os/windows/posix.o lib/hweight.o
@@ -379,6 +383,9 @@ printing.o: printing.c printing.h
 t/read-to-pipe-async: $(T_PIPE_ASYNC_OBJS)
        $(QUIET_LINK)$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(T_PIPE_ASYNC_OBJS) $(LIBS)
 
+t/memlock: $(T_MEMLOCK_OBJS)
+       $(QUIET_LINK)$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(T_MEMLOCK_OBJS) $(LIBS)
+
 t/stest: $(T_SMALLOC_OBJS)
        $(QUIET_LINK)$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(T_SMALLOC_OBJS) $(LIBS)
 
diff --git a/t/memlock.c b/t/memlock.c
new file mode 100644 (file)
index 0000000..d9d586d
--- /dev/null
@@ -0,0 +1,58 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <pthread.h>
+
+static struct thread_data {
+       unsigned long mb;
+} td;
+
+static void *worker(void *data)
+{
+       struct thread_data *td = data;
+       unsigned long index;
+       size_t size;
+       char *buf;
+       int i, first = 1;
+
+       size = td->mb * 1024UL * 1024UL;
+       buf = malloc(size);
+
+       for (i = 0; i < 100000; i++) {
+               for (index = 0; index + 4096 < size; index += 4096)
+                       memset(&buf[index+512], 0x89, 512);
+               if (first) {
+                       printf("loop%d: did %lu MB\n", i+1, size/(1024UL*1024UL));
+                       first = 0;
+               }
+       }
+       return NULL;
+}
+
+int main(int argc, char *argv[])
+{
+       unsigned long mb, threads;
+       pthread_t *pthreads;
+       int i;
+
+       if (argc < 3) {
+               printf("%s: <mb per thread> <threads>\n", argv[0]);
+               return 1;
+       }
+
+       mb = strtoul(argv[1], NULL, 10);
+       threads = strtoul(argv[2], NULL, 10);
+
+       pthreads = calloc(threads, sizeof(pthread_t));
+       td.mb = mb;
+
+       for (i = 0; i < threads; i++)
+               pthread_create(&pthreads[i], NULL, worker, &td);
+
+       for (i = 0; i < threads; i++) {
+               void *ret;
+
+               pthread_join(pthreads[i], &ret);
+       }
+       return 0;
+}