diff mbox

[8/9] kvm tools: Add 'kvm balloon' command

Message ID 1309370538-7947-8-git-send-email-levinsasha928@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Sasha Levin June 29, 2011, 6:02 p.m. UTC
Add a command to allow easily inflate/deflate the balloon driver in running
instances.

Usage:
kvm balloon [command] [instance name] [size]

command is either inflate or deflate, and size is represented in MB.
Target instance must be named (started with '--name').

Signed-off-by: Sasha Levin <levinsasha928@gmail.com>
---
 tools/kvm/Makefile                  |    1 +
 tools/kvm/include/kvm/kvm-balloon.h |    6 ++++++
 tools/kvm/kvm-balloon.c             |   34 ++++++++++++++++++++++++++++++++++
 tools/kvm/kvm-cmd.c                 |   12 +++++++-----
 tools/kvm/virtio/balloon.c          |    8 ++++----
 5 files changed, 52 insertions(+), 9 deletions(-)
 create mode 100644 tools/kvm/include/kvm/kvm-balloon.h
 create mode 100644 tools/kvm/kvm-balloon.c
diff mbox

Patch

diff --git a/tools/kvm/Makefile b/tools/kvm/Makefile
index a1b2f4c..4823c77 100644
--- a/tools/kvm/Makefile
+++ b/tools/kvm/Makefile
@@ -50,6 +50,7 @@  OBJS	+= kvm-cmd.o
 OBJS	+= kvm-debug.o
 OBJS	+= kvm-help.o
 OBJS    += kvm-pause.o
+OBJS    += kvm-balloon.o
 OBJS	+= kvm-run.o
 OBJS	+= mptable.o
 OBJS	+= rbtree.o
diff --git a/tools/kvm/include/kvm/kvm-balloon.h b/tools/kvm/include/kvm/kvm-balloon.h
new file mode 100644
index 0000000..f5f92b9
--- /dev/null
+++ b/tools/kvm/include/kvm/kvm-balloon.h
@@ -0,0 +1,6 @@ 
+#ifndef KVM__BALLOON_H
+#define KVM__BALLOON_H
+
+int kvm_cmd_balloon(int argc, const char **argv, const char *prefix);
+
+#endif
diff --git a/tools/kvm/kvm-balloon.c b/tools/kvm/kvm-balloon.c
new file mode 100644
index 0000000..277cada
--- /dev/null
+++ b/tools/kvm/kvm-balloon.c
@@ -0,0 +1,34 @@ 
+#include <stdio.h>
+#include <string.h>
+#include <signal.h>
+
+#include <kvm/util.h>
+#include <kvm/kvm-cmd.h>
+#include <kvm/kvm-balloon.h>
+#include <kvm/kvm.h>
+
+int kvm_cmd_balloon(int argc, const char **argv, const char *prefix)
+{
+	int pid;
+	int amount, i;
+	int inflate = 0;
+
+	if (argc != 3)
+		die("Usage: kvm balloon [command] [instance name] [amount]\n");
+
+	pid = kvm__get_pid_by_instance(argv[1]);
+	if (pid < 0)
+		die("Failed locating instance name");
+
+	if (strcmp(argv[0], "inflate") == 0)
+		inflate = 1;
+	else if (strcmp(argv[0], "deflate"))
+		die("command can be either 'inflate' or 'deflate'");
+
+	amount = atoi(argv[2]);
+
+	for (i = 0; i < amount; i++)
+		kill(pid, inflate ? SIGKVMADDMEM : SIGKVMDELMEM);
+
+	return 0;
+}
diff --git a/tools/kvm/kvm-cmd.c b/tools/kvm/kvm-cmd.c
index ffbc4ff..1598781 100644
--- a/tools/kvm/kvm-cmd.c
+++ b/tools/kvm/kvm-cmd.c
@@ -7,16 +7,18 @@ 
 /* user defined header files */
 #include "kvm/kvm-debug.h"
 #include "kvm/kvm-pause.h"
+#include "kvm/kvm-balloon.h"
 #include "kvm/kvm-help.h"
 #include "kvm/kvm-cmd.h"
 #include "kvm/kvm-run.h"
 
 struct cmd_struct kvm_commands[] = {
-	{ "pause", kvm_cmd_pause, NULL,         0 },
-	{ "debug", kvm_cmd_debug, NULL,         0 },
-	{ "help",  kvm_cmd_help,  NULL,         0 },
-	{ "run",   kvm_cmd_run,   kvm_run_help, 0 },
-	{ NULL,    NULL,          NULL,         0 },
+	{ "pause",	kvm_cmd_pause,		NULL,         0 },
+	{ "debug",	kvm_cmd_debug,		NULL,         0 },
+	{ "balloon",	kvm_cmd_balloon,	NULL,         0 },
+	{ "help",	kvm_cmd_help,		NULL,         0 },
+	{ "run",	kvm_cmd_run,		kvm_run_help, 0 },
+	{ NULL,		NULL,			NULL,         0 },
 };
 
 /*
diff --git a/tools/kvm/virtio/balloon.c b/tools/kvm/virtio/balloon.c
index ab9ccb7..854d04b 100644
--- a/tools/kvm/virtio/balloon.c
+++ b/tools/kvm/virtio/balloon.c
@@ -39,7 +39,7 @@  struct bln_dev {
 	/* virtio queue */
 	u16			queue_selector;
 	struct virt_queue	vqs[NUM_VIRT_QUEUES];
-	void			*jobs[NUM_VIRT_QUEUES];
+	struct thread_pool__job	jobs[NUM_VIRT_QUEUES];
 
 	struct virtio_balloon_config config;
 };
@@ -174,13 +174,13 @@  static bool virtio_bln_pci_io_out(struct ioport *ioport, struct kvm *kvm, u16 po
 
 		vring_init(&queue->vring, VIRTIO_BLN_QUEUE_SIZE, p, VIRTIO_PCI_VRING_ALIGN);
 
-		bdev.jobs[bdev.queue_selector] = thread_pool__add_job(kvm, virtio_bln_do_io, queue);
+		thread_pool__init_job(&bdev.jobs[bdev.queue_selector], kvm, virtio_bln_do_io, queue);
 
 		ioevent = (struct ioevent) {
 			.io_addr		= bdev.base_addr + VIRTIO_PCI_QUEUE_NOTIFY,
 			.io_len			= sizeof(u16),
 			.fn			= ioevent_callback,
-			.fn_ptr			= bdev.jobs[bdev.queue_selector],
+			.fn_ptr			= &bdev.jobs[bdev.queue_selector],
 			.datamatch		= bdev.queue_selector,
 			.fn_kvm			= kvm,
 			.fd			= eventfd(0, 0),
@@ -196,7 +196,7 @@  static bool virtio_bln_pci_io_out(struct ioport *ioport, struct kvm *kvm, u16 po
 	case VIRTIO_PCI_QUEUE_NOTIFY: {
 		u16 queue_index;
 		queue_index		= ioport__read16(data);
-		thread_pool__do_job(bdev.jobs[queue_index]);
+		thread_pool__do_job(&bdev.jobs[queue_index]);
 		break;
 	}
 	case VIRTIO_PCI_STATUS: