-
-
Notifications
You must be signed in to change notification settings - Fork 65
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add "xen/balloon: fix cancelled balloon action" patch
Fix xen-balloon thread using 100% CPU
- Loading branch information
Showing
2 changed files
with
68 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
From c0901b425d5939b7f3ce6c3f4bb7a0161b819745 Mon Sep 17 00:00:00 2001 | ||
From: Juergen Gross <[email protected]> | ||
Date: Mon, 4 Oct 2021 17:05:48 +0200 | ||
Subject: [PATCH] xen/balloon: fix cancelled balloon action | ||
MIME-Version: 1.0 | ||
Content-Type: text/plain; charset=UTF-8 | ||
Content-Transfer-Encoding: 8bit | ||
|
||
In case a ballooning action is cancelled the new kernel thread handling | ||
the ballooning might end up in a busy loop. | ||
|
||
Fix that by handling the cancelled action gracefully. | ||
|
||
Cc: [email protected] | ||
Fixes: 8480ed9c2bbd56 ("xen/balloon: use a kernel thread instead a workqueue") | ||
Reported-by: Marek Marczykowski-Górecki <[email protected]> | ||
Signed-off-by: Juergen Gross <[email protected]> | ||
--- | ||
drivers/xen/balloon.c | 21 +++++++++++++++------ | ||
1 file changed, 15 insertions(+), 6 deletions(-) | ||
|
||
diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c | ||
index 43ebfe36ac27..3a50f097ed3e 100644 | ||
--- a/drivers/xen/balloon.c | ||
+++ b/drivers/xen/balloon.c | ||
@@ -491,12 +491,12 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp) | ||
} | ||
|
||
/* | ||
- * Stop waiting if either state is not BP_EAGAIN and ballooning action is | ||
- * needed, or if the credit has changed while state is BP_EAGAIN. | ||
+ * Stop waiting if either state is BP_DONE and ballooning action is | ||
+ * needed, or if the credit has changed while state is not BP_DONE. | ||
*/ | ||
static bool balloon_thread_cond(enum bp_state state, long credit) | ||
{ | ||
- if (state != BP_EAGAIN) | ||
+ if (state == BP_DONE) | ||
credit = 0; | ||
|
||
return current_credit() != credit || kthread_should_stop(); | ||
@@ -516,10 +516,19 @@ static int balloon_thread(void *unused) | ||
|
||
set_freezable(); | ||
for (;;) { | ||
- if (state == BP_EAGAIN) | ||
- timeout = balloon_stats.schedule_delay * HZ; | ||
- else | ||
+ switch (state) { | ||
+ case BP_DONE: | ||
+ case BP_ECANCELED: | ||
timeout = 3600 * HZ; | ||
+ break; | ||
+ case BP_EAGAIN: | ||
+ timeout = balloon_stats.schedule_delay * HZ; | ||
+ break; | ||
+ case BP_WAIT: | ||
+ timeout = HZ; | ||
+ break; | ||
+ } | ||
+ | ||
credit = current_credit(); | ||
|
||
wait_event_freezable_timeout(balloon_thread_wq, | ||
-- | ||
2.26.2 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters