lkml.org 
[lkml]   [2011]   [Apr]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[PATCH v2] virtio_balloon: disable oom killer when fill balloon
When memory pressure is high, virtio ballooning will probably cause oom killing.
Even if alloc_page with GFP_NORETRY itself does not directly trigger oom it
will make memory becoming low then memory alloc of other processes will trigger
oom killing. It is not desired behaviour.

Here disable oom killer in fill_balloon to address this issue.
Add code comment as KOSAKI Motohiro's suggestion.

Signed-off-by: Dave Young <hidave.darkstar@gmail.com>
---
drivers/virtio/virtio_balloon.c | 8 ++++++++
1 file changed, 8 insertions(+)

--- linux-2.6.orig/drivers/virtio/virtio_balloon.c 2011-04-26 11:39:14.053118406 +0800
+++ linux-2.6/drivers/virtio/virtio_balloon.c 2011-04-26 16:54:56.419741542 +0800
@@ -25,6 +25,7 @@
#include <linux/freezer.h>
#include <linux/delay.h>
#include <linux/slab.h>
+#include <linux/oom.h>

struct virtio_balloon
{
@@ -102,6 +103,12 @@ static void fill_balloon(struct virtio_b
/* We can only do one array worth at a time. */
num = min(num, ARRAY_SIZE(vb->pfns));

+ /* Disable oom killer for indirect oom due to our memory consuming
+ * Currently only hibernation code use oom_killer_disable,
+ * hibernation will freeze us before disable oom killer, so
+ * It's safe here without locks.
+ */
+ oom_killer_disable();
for (vb->num_pfns = 0; vb->num_pfns < num; vb->num_pfns++) {
struct page *page = alloc_page(GFP_HIGHUSER | __GFP_NORETRY |
__GFP_NOMEMALLOC | __GFP_NOWARN);
@@ -119,6 +126,7 @@ static void fill_balloon(struct virtio_b
vb->num_pages++;
list_add(&page->lru, &vb->pages);
}
+ oom_killer_enable();

/* Didn't get any? Oh well. */
if (vb->num_pfns == 0)

\
 
 \ /
  Last update: 2011-04-26 10:51    [W:0.072 / U:23.488 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site