From: Marcelo T. <ma...@kv...> - 2008-01-10 11:26:28
|
On Thu, Jan 10, 2008 at 04:11:51PM +0900, Akio Takebe wrote: > Hi, Marcelo > > >+struct balloon_buf *alloc_balloon_buf(struct virtio_device *vdev, gfp_t > >flags) > >+{ > >+ struct balloon_buf *buf; > >+ > >+ buf = kzalloc(sizeof(struct balloon_buf), flags); > >+ if (!buf) > >+ dev_printk(KERN_ERR, &vdev->dev, "%s: alloc fail\n", __func__); > >+ > >+ return buf; > >+} > >+ > [snip..] > >+static int kvm_balloon_inflate(struct virtballoon *v, int32_t npages) > >+{ > >+ LIST_HEAD(tmp_list); > >+ struct page *page, *tmp; > >+ struct balloon_buf *buf; > >+ u32 *pfn; > >+ int allocated = 0; > >+ int i, r = -ENOMEM; > >+ > >+ buf = alloc_balloon_buf(v->vdev, GFP_KERNEL); > When does balloon driver free the buf? Hi Akio, The buffers are passed from the virtio handling routine to the balloon_thread through the balloon_work list, and then freed here: + spin_lock_irq(&v->queue_lock); + while (!list_empty(&v->balloon_work)) { + struct balloon_work *work; + struct balloon_buf *buf; + + work = list_entry(v->balloon_work.next, + struct balloon_work, list); + list_del(&work->list); + spin_unlock_irq(&v->queue_lock); + buf = work->buf; + kfree(work); + + switch(buf->hdr.cmd) { + case CMD_BALLOON_DEFLATE: + deflate_done(v, buf); + break; + case CMD_BALLOON_INFLATE: + inflate_done(v, buf); + break; + default: + printk("%s: unknown cmd 0x%x\n", __func__, + buf->hdr.cmd); + } + kfree(buf); |