From patchwork Thu Apr 21 12:45:30 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sasha Levin X-Patchwork-Id: 724711 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id p3LCjuTd029580 for ; Thu, 21 Apr 2011 12:45:56 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751222Ab1DUMpx (ORCPT ); Thu, 21 Apr 2011 08:45:53 -0400 Received: from mail-wy0-f174.google.com ([74.125.82.174]:47575 "EHLO mail-wy0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750961Ab1DUMpx (ORCPT ); Thu, 21 Apr 2011 08:45:53 -0400 Received: by wya21 with SMTP id 21so1393924wya.19 for ; Thu, 21 Apr 2011 05:45:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:from:to:cc:subject:date:message-id:x-mailer; bh=PG16Q0J3tYHFKpQgZAvSG9695U3+ME5z8t2xsvm+Esg=; b=dQjGmaZz10dPe0tm7MfRhacygbEPhmpVSJKs8CUhp6y/au9yK8P3mx1MQsOqc40HpR KXJ5nrstHdPPtUlp9Vin7n2x7Tl+UyIglfqvA19VBdIoL6e8MG9LUCDR2SrYUBxotctw ugfm+V0XP3sRKMp8Q0O0X5/q00xsO9g92hWeI= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer; b=MUmR8wwJOKqhXS0K1PzV58AGuVHm9BXlbfhBI0GI94HuaHpzNdwr/2P/rfUEYK/AGz jCcHuDVcrrZzHPMyF3Ip8I7QOIhHNOjPKuRd8p5F46lvcpzmo/C499AeOCOizPj+UqvO tYpsPlylLcEFxsu94WNyU7lvQGYx5yZ3wCpc8= Received: by 10.227.140.11 with SMTP id g11mr4332209wbu.57.1303389952337; Thu, 21 Apr 2011 05:45:52 -0700 (PDT) Received: from localhost.localdomain (bzq-79-179-204-49.red.bezeqint.net [79.179.204.49]) by mx.google.com with ESMTPS id h11sm1167215wbc.60.2011.04.21.05.45.50 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 21 Apr 2011 05:45:51 -0700 (PDT) From: Sasha Levin To: penberg@kernel.org Cc: mingo@elte.hu, asias.hejun@gmail.com, gorcunov@gmail.com, prasadjoshi124@gmail.com, kvm@vger.kernel.org, Sasha Levin Subject: [PATCH] kvm tools: Add option to specify backing storage for RAM Date: Thu, 21 Apr 2011 15:45:30 +0300 Message-Id: <1303389930-30303-1-git-send-email-levinsasha928@gmail.com> X-Mailer: git-send-email 1.7.5.rc1 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter1.kernel.org [140.211.167.41]); Thu, 21 Apr 2011 12:45:56 +0000 (UTC) Add --use-backing to allow for the usage of a temporary backing file for guest RAM. A temporary file is created and aollocated under /tmp and is used to back the RAM memory which is mmaped for the guest. There should be enough storage space under /tmp to use this option (at least the size of the guest RAM). Signed-off-by: Sasha Levin --- tools/kvm/include/kvm/kvm.h | 2 +- tools/kvm/kvm-run.c | 5 ++++- tools/kvm/kvm.c | 21 +++++++++++++++++++-- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/tools/kvm/include/kvm/kvm.h b/tools/kvm/include/kvm/kvm.h index fc76f98..3a44c53 100644 --- a/tools/kvm/include/kvm/kvm.h +++ b/tools/kvm/include/kvm/kvm.h @@ -25,7 +25,7 @@ struct kvm { struct interrupt_table interrupt_table; }; -struct kvm *kvm__init(const char *kvm_dev, unsigned long ram_size); +struct kvm *kvm__init(const char *kvm_dev, unsigned long ram_size, bool use_backing); void kvm__init_ram(struct kvm *self); void kvm__delete(struct kvm *self); bool kvm__load_kernel(struct kvm *kvm, const char *kernel_filename, diff --git a/tools/kvm/kvm-run.c b/tools/kvm/kvm-run.c index fb8dcae7..a925a98 100644 --- a/tools/kvm/kvm-run.c +++ b/tools/kvm/kvm-run.c @@ -69,6 +69,7 @@ static const char *host_ip_addr; static const char *guest_mac; static const char *script; static bool single_step; +static bool use_backing; static bool readonly_image; extern bool ioport_debug; extern int active_console; @@ -84,6 +85,8 @@ static const struct option options[] = { OPT_GROUP("Basic options:"), OPT_INTEGER('\0', "cpus", &nrcpus, "Number of CPUs"), OPT_U64('m', "mem", &ram_size, "Virtual machine memory size in MiB."), + OPT_BOOLEAN('\0', "use-backing", &use_backing, + "Use a backing file for virtual RAM"), OPT_STRING('i', "image", &image_filename, "image", "Disk image"), OPT_BOOLEAN('\0', "readonly", &readonly_image, "Don't write changes back to disk image"), @@ -366,7 +369,7 @@ int kvm_cmd_run(int argc, const char **argv, const char *prefix) term_init(); - kvm = kvm__init(kvm_dev, ram_size); + kvm = kvm__init(kvm_dev, ram_size, use_backing); memset(real_cmdline, 0, sizeof(real_cmdline)); strcpy(real_cmdline, "notsc nolapic noacpi pci=conf1 console=ttyS0 "); diff --git a/tools/kvm/kvm.c b/tools/kvm/kvm.c index eb1a46c..5e312e9 100644 --- a/tools/kvm/kvm.c +++ b/tools/kvm/kvm.c @@ -170,11 +170,12 @@ void kvm__init_ram(struct kvm *self) die_perror("KVM_SET_USER_MEMORY_REGION ioctl"); } -struct kvm *kvm__init(const char *kvm_dev, unsigned long ram_size) +struct kvm *kvm__init(const char *kvm_dev, unsigned long ram_size, bool use_backing) { struct kvm_pit_config pit_config = { .flags = 0, }; struct kvm *self; int ret; + int backfd; if (!kvm__cpu_supports_vm()) die("Your CPU does not support hardware virtualization"); @@ -214,7 +215,23 @@ struct kvm *kvm__init(const char *kvm_dev, unsigned long ram_size) self->ram_size = ram_size; - self->ram_start = mmap(NULL, ram_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); + if (use_backing) { + char tmp_template[] = "/tmp/kvm_ram.XXXXXX"; + + backfd = mkstemp(tmp_template); + if (backfd < 0) + die("Failed creating RAM backing file"); + + unlink(tmp_template); + + if (ftruncate(backfd, ram_size) < 0) + die("Failed resizing RAM backing file"); + + self->ram_start = mmap(NULL, ram_size, PROT_READ | PROT_WRITE, MAP_SHARED, backfd, 0); + } else { + self->ram_start = mmap(NULL, ram_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); + } + if (self->ram_start == MAP_FAILED) die("out of memory");