Thread (1 message) 1 message, 1 author, 2012-11-12

Re: [PATCH v11 5/7] virtio_balloon: introduce migration primitives to balloon pages

From: Rusty Russell <hidden>
Date: 2012-11-12 07:50:13
Also in: linux-mm, lkml

Rafael Aquini [off-list ref] writes:
On Thu, Nov 08, 2012 at 09:32:18AM +1030, Rusty Russell wrote:
quoted
The first one can be delayed, the second one can be delayed if the host
didn't ask for VIRTIO_BALLOON_F_MUST_TELL_HOST (qemu doesn't).

We could implement a proper request queue for these, and return -EAGAIN
if the queue fills.  Though in practice, it's not important (it might
help performance).
I liked the idea. Give me the directions to accomplish it and I'll give it a try
for sure.
OK, let's get this applied first, but here are some pointers:

Here's the current callback function when the host has processed the
buffers we put in the queue:

 static void balloon_ack(struct virtqueue *vq)
 {
	struct virtio_balloon *vb = vq->vdev->priv;

	wake_up(&vb->acked);
 }

It's almost a noop: here's how we use it to make our queues synchronous:

 static void tell_host(struct virtio_balloon *vb, struct virtqueue *vq)
 {
	struct scatterlist sg;
	unsigned int len;

	sg_init_one(&sg, vb->pfns, sizeof(vb->pfns[0]) * vb->num_pfns);

	/* We should always be able to add one buffer to an empty queue. */
	if (virtqueue_add_buf(vq, &sg, 1, 0, vb, GFP_KERNEL) < 0)
		BUG();
	virtqueue_kick(vq);

	/* When host has read buffer, this completes via balloon_ack */
	wait_event(vb->acked, virtqueue_get_buf(vq, &len));
 }

And we set up the callback when we create the virtqueue:

	vq_callback_t *callbacks[] = { balloon_ack, balloon_ack, stats_request };
...
	err = vb->vdev->config->find_vqs(vb->vdev, nvqs, vqs, callbacks, names);

So off the top of my head it should be as simple as changing tell_host()
to only wait if the virtqueue_add_buf() fails (ie. queue is full).

Hmm, though you will want to synchronize the inflate and deflate queues:
if we tell the host we're giving a page up we want it to have seen that
before we tell it we're using it again...

Cheers,
Rusty.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help