@@ -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
new file mode 100644
@@ -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
new file mode 100644
@@ -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;
+}
@@ -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 },
};
/*
@@ -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:
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