On Sat, 9 Jan 2010 05:05:06 am Gaurav Kukreja wrote: > Hi, > > I am doing working on enabling Transcendent Memory(OLS '09) support on > lguest. > > For the same, I need ballooning support for lguest. Is there an > implmentation of Virtio Balloon driver, that I can use for my purpose? Here's a patch I had for testing. It's not a real implementation, but it serves as a start point. This patch probably won't apply now, but you can use the code: Crappy lguest balloon testing code. --- Documentation/lguest/lguest.c | 75 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff -r 62e37935e821 Documentation/lguest/lguest.c --- a/Documentation/lguest/lguest.c Sun Jun 15 23:00:15 2008 +1000 +++ b/Documentation/lguest/lguest.c Sun Jun 15 23:00:54 2008 +1000 @@ -44,6 +44,7 @@ #include "linux/virtio_console.h" #include "linux/virtio_rng.h" #include "linux/virtio_ring.h" +#include "linux/virtio_balloon.h" #include "linux/vring.h" #include "asm-x86/bootparam.h" /*L:110 We can ignore the 39 include files we need for this program, but I do @@ -2194,6 +2195,75 @@ static void setup_block_file(const char verbose("device %u: virtblock %llu sectors\n", devices.device_num, le64_to_cpu(conf.capacity)); } +/*:*/ + +static bool handle_balloon_cmd(int fd, struct device *dev) +{ + struct virtio_balloon_config conf; + int r, diff; + char cmd[80]; + + r = read(dev->fd, cmd, sizeof(cmd)-1); + if (r < 0) + err(1, "Reading balloon cmd fd"); + + /* Closed? Stop listening. */ + if (r == 0) + return false; + + cmd[r] = '\0'; + diff = atol(cmd); + if (!diff) + errx(1, "Bad balloon target diff '%s'", cmd); + + memcpy(&conf, device_config(dev), sizeof(conf)); + conf.num_pages += diff; + printf("New balloon target: %u\n", conf.num_pages); + memcpy(device_config(dev), &conf, sizeof(conf)); + + /* Config change, so trigger the irq. */ + dev->desc->config_change = 1; + trigger_irq(fd, dev->vq); + return true; +} + +static void handle_virtballoon_output(int fd, struct virtqueue *vq) +{ + unsigned int head, out, in, i; + struct iovec iov[vq->vqi.vring.num]; + + head = get_vq_desc(&vq->vqi, iov, &out, &in); + if (head < 0) + return; + + if (in) + errx(1, "Input buffers in output queue?"); + + if (out != 1 || (iov[0].iov_len % 4) != 0) + errx(1, "Surprising output num %i, len %u\n", + out, iov[0].iov_len); + + for (i = 0; i < iov[0].iov_len/4; i++) + printf("Released page %u\n", ((u32 *)iov[0].iov_base)[i]); + + add_used_and_trigger(fd, vq, head, iov[0].iov_len); +} + +/*L:199 The balloon device: this is a hack for testing. */ +static void setup_balloon_file(const char *filename, unsigned int mempages) +{ + int fd; + struct device *dev; + struct virtio_balloon_config conf = { .num_pages = 0 }; + + fd = open_or_die(filename, O_RDWR); + + dev = new_device("balloon", VIRTIO_ID_BALLOON, fd, handle_balloon_cmd); + + /* The device has one virtqueue, where the Guest places page numbers. */ + add_virtqueue(dev, VIRTQUEUE_NUM, handle_virtballoon_output); + set_config(dev, sizeof(conf), &conf); +} /* Our random number generator device reads from /dev/random into the Guest's * input buffers. The usual case is that the Guest doesn't want random numbers @@ -2326,6 +2396,7 @@ static struct option opts[] = { { "block", 1, NULL, 'b' }, { "rng", 0, NULL, 'r' }, { "initrd", 1, NULL, 'i' }, + { "balloon", 1, NULL, 'B' }, { "sharenet", 1, NULL, 's' }, { NULL }, }; @@ -2334,6 +2405,7 @@ static void usage(void) errx(1, "Usage: lguest [--verbose] " "[--tunnet=(<ipaddr>:<macaddr>|bridge:<bridgename>:<macaddr>)\n" "|--sharenet=<controlfile>]\n" + "|--balloon=<filename>]\n" "|--block=<filename>|--initrd=<filename>]...\n" "<mem-in-mb> vmlinux [args...]"); } @@ -2409,6 +2481,9 @@ int main(int argc, char *argv[]) break; case 'i': initrd_name = optarg; + break; + case 'B': + setup_balloon_file(optarg, mem/getpagesize()); break; case 's': setup_sharenet(optarg); _______________________________________________ Virtualization mailing list Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/virtualization