[PATCH] Add lockmem=x option to pin memory
authorJens Axboe <axboe@suse.de>
Wed, 31 May 2006 08:13:16 +0000 (10:13 +0200)
committerJens Axboe <axboe@suse.de>
Wed, 31 May 2006 08:13:16 +0000 (10:13 +0200)
README
fio-ini.c
fio.c

diff --git a/README b/README
index bc2574e7f781b11815fde6eba24732c5610a0e70..8b84a08a8d8583ce2e24b03dc74947f565e40b84 100644 (file)
--- a/README
+++ b/README
@@ -92,7 +92,9 @@ The <jobs> format is as follows:
                        rw, offset, length
                        where with rw=0/1 for read/write, and the offset
                        and length entries being in bytes.
-
+       lockmem=x       Lock down x amount of memory on the machine, to
+                       simulate a machine with less memory available. x can
+                       include k/m/g suffix.
 
 Examples using a job file
 -------------------------
index 9f2f06eb26de77a8b90abc1bb79920aa125db527..ff121cba83e5e580db93bc632a0d947be34f8fe6 100644 (file)
--- a/fio-ini.c
+++ b/fio-ini.c
@@ -50,6 +50,7 @@ int rate_quit = 0;
 int write_lat_log = 0;
 int write_bw_log = 0;
 int exitall_on_terminate = 0;
+unsigned long long mlock_size = 0;
 
 static int setup_rate(struct thread_data *td)
 {
@@ -803,6 +804,10 @@ int parse_jobs_ini(char *file)
                                fgetpos(f, &off);
                                continue;
                        }
+                       if (!check_strcnv(p, "lockmem", &mlock_size)) {
+                               fgetpos(f, &off);
+                               continue;
+                       }
                        if (!check_strstore(p, "directory", td->directory)) {
                                fgetpos(f, &off);
                                continue;
diff --git a/fio.c b/fio.c
index 3c35039a6a4788e25bc1abc4165630cb0335769e..09f40afe4d8cbfac612aeb79a03f037a55a4e40a 100644 (file)
--- a/fio.c
+++ b/fio.c
@@ -57,6 +57,8 @@ static void update_io_ticks(void);
 static void disk_util_timer_arm(void);
 static void print_thread_status(void);
 
+extern unsigned long long mlock_size;
+
 /*
  * thread life cycle
  */
@@ -2234,8 +2236,23 @@ static void run_threads(void)
        struct thread_data *td;
        unsigned long spent;
        int i, todo, nr_running, m_rate, t_rate, nr_started;
+       void *mlocked_mem = NULL;
 
        printf("Starting %d thread%s\n", thread_number, thread_number > 1 ? "s" : "");
+
+       if (mlock_size) {
+               mlocked_mem = malloc(mlock_size);
+               if (!mlocked_mem) {
+                       perror("malloc locked mem");
+                       return;
+               }
+               if (mlock(mlocked_mem, mlock_size) < 0) {
+                       free(mlocked_mem);
+                       perror("mlock");
+                       return;
+               }
+       }
+
        fflush(stdout);
 
        signal(SIGINT, sig_handler);
@@ -2347,6 +2364,12 @@ static void run_threads(void)
        }
 
        update_io_ticks();
+
+       if (mlocked_mem) {
+               if (munlock(mlocked_mem, mlock_size) < 0)
+                       perror("munlock");
+               free(mlocked_mem);
+       }
 }
 
 static void show_group_stats(struct group_run_stats *rs, int id)