diff --git a/cpu-all.h b/cpu-all.h
index 74d3681..e12e5d5 100644
--- a/cpu-all.h
+++ b/cpu-all.h
@@ -503,6 +503,7 @@ extern RAMList ram_list;
 
 extern const char *mem_path;
 extern int mem_prealloc;
+extern int mem_lock;
 
 /* Flags stored in the low bits of the TLB virtual address.  These are
    defined so that fast path ram access is all zeros.  */
diff --git a/exec.c b/exec.c
index bb6aa4a..de13bc9 100644
--- a/exec.c
+++ b/exec.c
@@ -2572,6 +2572,9 @@ ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
             }
             memory_try_enable_merging(new_block->host, size);
         }
+        if (mem_lock && mlockall(MCL_CURRENT | MCL_FUTURE)) {
+            perror("mlockall");
+        }
     }
     new_block->length = size;
 
diff --git a/qemu-options.hx b/qemu-options.hx
index 7d97f96..9d82f15 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -427,6 +427,14 @@ Preallocate memory when using -mem-path.
 ETEXI
 #endif
 
+DEF("mlock", 0, QEMU_OPTION_mlock,
+    "-mlock          mlock guest and qemu memory\n",
+    QEMU_ARCH_ALL)
+STEXI
+@item -mlock
+mlock guest and qemu memory.
+ETEXI
+
 DEF("k", HAS_ARG, QEMU_OPTION_k,
     "-k language     use keyboard layout (for example 'fr' for French)\n",
     QEMU_ARCH_ALL)
diff --git a/vl.c b/vl.c
index 8d305ca..c902084 100644
--- a/vl.c
+++ b/vl.c
@@ -187,6 +187,7 @@ const char *mem_path = NULL;
 #ifdef MAP_POPULATE
 int mem_prealloc = 0; /* force preallocation of physical target memory */
 #endif
+int mem_lock;
 int nb_nics;
 NICInfo nd_table[MAX_NICS];
 int autostart;
@@ -2770,6 +2771,9 @@ int main(int argc, char **argv, char **envp)
                 mem_prealloc = 1;
                 break;
 #endif
+            case QEMU_OPTION_mlock:
+                mem_lock = 1;
+                break;
             case QEMU_OPTION_d:
                 log_mask = optarg;
                 break;
