Re: [PATCH v11 5/7] virtio_balloon: introduce migration primitives to balloon pages
From: Andrew Morton <akpm@linux-foundation.org>
Date: 2012-11-07 19:58:13
On Wed, 7 Nov 2012 01:05:52 -0200 Rafael Aquini [off-list ref] wrote:
quoted hunk
Memory fragmentation introduced by ballooning might reduce significantly the number of 2MB contiguous memory blocks that can be used within a guest, thus imposing performance penalties associated with the reduced number of transparent huge pages that could be used by the guest workload. Besides making balloon pages movable at allocation time and introducing the necessary primitives to perform balloon page migration/compaction, this patch also introduces the following locking scheme, in order to enhance the syncronization methods for accessing elements of struct virtio_balloon, thus providing protection against concurrent access introduced by parallel memory migration threads. ...@@ -122,18 +128,25 @@ static void set_page_pfns(u32 pfns[], struct page *page) static void fill_balloon(struct virtio_balloon *vb, size_t num) { + struct balloon_dev_info *vb_dev_info = vb->vb_dev_info; + + static DEFINE_RATELIMIT_STATE(fill_balloon_rs, + DEFAULT_RATELIMIT_INTERVAL, + DEFAULT_RATELIMIT_BURST); + /* We can only do one array worth at a time. */ num = min(num, ARRAY_SIZE(vb->pfns)); + mutex_lock(&vb->balloon_lock); for (vb->num_pfns = 0; vb->num_pfns < num; vb->num_pfns += VIRTIO_BALLOON_PAGES_PER_PAGE) { - struct page *page = alloc_page(GFP_HIGHUSER | __GFP_NORETRY | - __GFP_NOMEMALLOC | __GFP_NOWARN); + struct page *page = balloon_page_enqueue(vb_dev_info); + if (!page) { - if (printk_ratelimit()) + if (__ratelimit(&fill_balloon_rs)) dev_printk(KERN_INFO, &vb->vdev->dev, "Out of puff! Can't get %zu pages\n", - num); + VIRTIO_BALLOON_PAGES_PER_PAGE); /* Sleep for at least 1/5 of a second before retry. */ msleep(200); break;
linux-next's fill_balloon() has already been converted to dev_info_ratelimited(). I fixed everything up. Please check the result.