From patchwork Wed Jun 29 18:02:12 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sasha Levin X-Patchwork-Id: 929882 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter2.kernel.org (8.14.4/8.14.4) with ESMTP id p5TI4ac5005439 for ; Wed, 29 Jun 2011 18:04:36 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756584Ab1F2SEe (ORCPT ); Wed, 29 Jun 2011 14:04:34 -0400 Received: from mail-qy0-f181.google.com ([209.85.216.181]:52561 "EHLO mail-qy0-f181.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756541Ab1F2SEc (ORCPT ); Wed, 29 Jun 2011 14:04:32 -0400 Received: by mail-qy0-f181.google.com with SMTP id 9so856813qyk.19 for ; Wed, 29 Jun 2011 11:04:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; bh=RWfskujn3pJ/5sbpi6TIKbciwpkOEXkzLMZURhOoKx0=; b=kgf9jOFli/eqsDnDVU4pqScLiVQsNkzpOAvW6yy6LlEbxE26DGBzhv78zsPvOJqKT+ I8DHFmk7GjUSzvwMZLESXDUGuVsijDv+gncIM3a56+YvSy0AisakTPNcN0EZuFeCcDzr QGlW8/rClVSb5wLNc7WNChevi4Jf/Oi1QYdSU= Received: by 10.229.218.210 with SMTP id hr18mr864758qcb.10.1309370671434; Wed, 29 Jun 2011 11:04:31 -0700 (PDT) Received: from localhost.localdomain (c-71-232-157-243.hsd1.ma.comcast.net [71.232.157.243]) by mx.google.com with ESMTPS id e18sm1067677qcs.29.2011.06.29.11.04.29 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 29 Jun 2011 11:04:30 -0700 (PDT) From: Sasha Levin To: penberg@kernel.org Cc: kvm@vger.kernel.org, mingo@elte.hu, asias.hejun@gmail.com, gorcunov@gmail.com, prasadjoshi124@gmail.com, Sasha Levin Subject: [PATCH 3/9] kvm tools: Allow giving instance names Date: Wed, 29 Jun 2011 14:02:12 -0400 Message-Id: <1309370538-7947-3-git-send-email-levinsasha928@gmail.com> X-Mailer: git-send-email 1.7.6 In-Reply-To: <1309370538-7947-1-git-send-email-levinsasha928@gmail.com> References: <1309370538-7947-1-git-send-email-levinsasha928@gmail.com> 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 (demeter2.kernel.org [140.211.167.43]); Wed, 29 Jun 2011 18:04:36 +0000 (UTC) This will allow tracking instance names and sending commands to specific instances if multiple instances are running. Signed-off-by: Sasha Levin --- tools/kvm/include/kvm/kvm.h | 5 +++- tools/kvm/kvm-run.c | 5 +++- tools/kvm/kvm.c | 55 ++++++++++++++++++++++++++++++++++++++++++- tools/kvm/term.c | 3 ++ 4 files changed, 65 insertions(+), 3 deletions(-) diff --git a/tools/kvm/include/kvm/kvm.h b/tools/kvm/include/kvm/kvm.h index 7d90d35..5ad3236 100644 --- a/tools/kvm/include/kvm/kvm.h +++ b/tools/kvm/include/kvm/kvm.h @@ -41,9 +41,11 @@ struct kvm { const char *vmlinux; struct disk_image **disks; int nr_disks; + + const char *name; }; -struct kvm *kvm__init(const char *kvm_dev, u64 ram_size); +struct kvm *kvm__init(const char *kvm_dev, u64 ram_size, const char *name); int kvm__max_cpus(struct kvm *kvm); void kvm__init_ram(struct kvm *kvm); void kvm__delete(struct kvm *kvm); @@ -61,6 +63,7 @@ bool kvm__deregister_mmio(struct kvm *kvm, u64 phys_addr); void kvm__pause(void); void kvm__continue(void); void kvm__notify_paused(void); +int kvm__get_pid_by_instance(const char *name); /* * Debugging diff --git a/tools/kvm/kvm-run.c b/tools/kvm/kvm-run.c index 0dece2d..a4abf76 100644 --- a/tools/kvm/kvm-run.c +++ b/tools/kvm/kvm-run.c @@ -69,6 +69,7 @@ static const char *network; static const char *host_ip_addr; static const char *guest_mac; static const char *script; +static const char *guest_name; static bool single_step; static bool readonly_image[MAX_DISK_IMAGES]; static bool vnc; @@ -132,6 +133,8 @@ static int virtio_9p_rootdir_parser(const struct option *opt, const char *arg, i static const struct option options[] = { OPT_GROUP("Basic options:"), + OPT_STRING('\0', "name", &guest_name, "guest name", + "A name for the guest"), OPT_INTEGER('c', "cpus", &nrcpus, "Number of CPUs"), OPT_U64('m', "mem", &ram_size, "Virtual machine memory size in MiB."), OPT_CALLBACK('d', "disk", NULL, "image", "Disk image", img_name_parser), @@ -546,7 +549,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, guest_name); ioeventfd__init(); diff --git a/tools/kvm/kvm.c b/tools/kvm/kvm.c index c400c70..4f723a6 100644 --- a/tools/kvm/kvm.c +++ b/tools/kvm/kvm.c @@ -113,11 +113,60 @@ static struct kvm *kvm__new(void) return kvm; } +static void kvm__create_pidfile(struct kvm *kvm) +{ + int fd; + char full_name[PATH_MAX], pid[10]; + + if (!kvm->name) + return; + + mkdir("/var/run/kvm-tools", 0777); + sprintf(full_name, "/var/run/kvm-tools/%s.pid", kvm->name); + fd = open(full_name, O_CREAT | O_WRONLY, 0666); + sprintf(pid, "%u\n", getpid()); + if (write(fd, pid, strlen(pid)) <= 0) + die("Failed creating PID file"); + close(fd); +} + +static void kvm__remove_pidfile(struct kvm *kvm) +{ + char full_name[PATH_MAX]; + + if (!kvm->name) + return; + + sprintf(full_name, "/var/run/kvm-tools/%s.pid", kvm->name); + unlink(full_name); +} + +int kvm__get_pid_by_instance(const char *name) +{ + int fd, pid; + char pid_str[10], pid_file[PATH_MAX]; + + sprintf(pid_file, "/var/run/kvm-tools/%s.pid", name); + fd = open(pid_file, O_RDONLY); + if (fd < 0) + return -1; + + if (read(fd, pid_str, 10) == 0) + return -1; + + pid = atoi(pid_str); + if (pid < 0) + return -1; + + return pid; +} + void kvm__delete(struct kvm *kvm) { kvm__stop_timer(kvm); munmap(kvm->ram_start, kvm->ram_size); + kvm__remove_pidfile(kvm); free(kvm); } @@ -237,7 +286,7 @@ int kvm__max_cpus(struct kvm *kvm) return ret; } -struct kvm *kvm__init(const char *kvm_dev, u64 ram_size) +struct kvm *kvm__init(const char *kvm_dev, u64 ram_size, const char *name) { struct kvm_pit_config pit_config = { .flags = 0, }; struct kvm *kvm; @@ -300,6 +349,10 @@ struct kvm *kvm__init(const char *kvm_dev, u64 ram_size) if (ret < 0) die_perror("KVM_CREATE_IRQCHIP ioctl"); + kvm->name = name; + + kvm__create_pidfile(kvm); + return kvm; } diff --git a/tools/kvm/term.c b/tools/kvm/term.c index 9947223..a0cb03f 100644 --- a/tools/kvm/term.c +++ b/tools/kvm/term.c @@ -9,7 +9,9 @@ #include "kvm/read-write.h" #include "kvm/term.h" #include "kvm/util.h" +#include "kvm/kvm.h" +extern struct kvm *kvm; static struct termios orig_term; int term_escape_char = 0x01; /* ctrl-a is used for escape */ @@ -32,6 +34,7 @@ int term_getc(int who) if (term_got_escape) { term_got_escape = false; if (c == 'x') { + kvm__delete(kvm); printf("\n # KVM session terminated.\n"); exit(1); }