From: Andrea Arcangeli <andrea@suse.de>
To: linux-kernel@vger.kernel.org
Cc: Andrew Morton <akpm@osdl.org>, edwardsg@sgi.com
Subject: shrinker->nr = LONG_MAX means deadlock for icache
Date: Fri, 18 Nov 2005 18:12:49 +0100 [thread overview]
Message-ID: <20051118171249.GJ24970@opteron.random> (raw)
Hello,
Greg Edwards found some deadlock in the icache shrinker.
I believe the major bug is that the VM is currently potentially setting
nr = LONG_MAX before shrinking the icache (and the icache shrinker never
returns -1, which means the api doesn't currently require shrinkers to
return -1 when they're finished).
The below is the most obviously safe way I could address this problem
(still untested).
This is not necessairly the way we want to fix it in mainline, but it at
least shows what I believe to be the major cuplrit in the code (i.e. nr
growing insane ;).
Comments welcome as usual.
Signed-off-by: Andrea Arcangeli <andrea@suse.de>
diff -r 5111ab3d0d8a mm/vmscan.c
--- a/mm/vmscan.c Fri Nov 18 09:26:56 2005 +0800
+++ b/mm/vmscan.c Fri Nov 18 19:01:55 2005 +0200
@@ -201,13 +201,21 @@
list_for_each_entry(shrinker, &shrinker_list, list) {
unsigned long long delta;
unsigned long total_scan;
+ unsigned long max_pass = (*shrinker->shrinker)(0, gfp_mask);
delta = (4 * scanned) / shrinker->seeks;
- delta *= (*shrinker->shrinker)(0, gfp_mask);
+ delta *= max_pass;
do_div(delta, lru_pages + 1);
shrinker->nr += delta;
if (shrinker->nr < 0)
shrinker->nr = LONG_MAX; /* It wrapped! */
+ /*
+ * Avoid risking looping forever due to too large nr value:
+ * never try to free more than twice the estimate number of
+ * freeable entries.
+ */
+ if (shrinker->nr > max_pass * 2)
+ shrinker->nr = max_pass * 2;
total_scan = shrinker->nr;
shrinker->nr = 0;
next reply other threads:[~2005-11-18 17:12 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-11-18 17:12 Andrea Arcangeli [this message]
2005-11-19 7:29 ` shrinker->nr = LONG_MAX means deadlock for icache Andrew Morton
2005-11-19 10:37 ` Andrea Arcangeli
2005-11-19 11:03 ` Andrew Morton
2005-11-19 11:38 ` Andrea Arcangeli
2005-11-22 23:01 ` Greg Edwards
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20051118171249.GJ24970@opteron.random \
--to=andrea@suse.de \
--cc=akpm@osdl.org \
--cc=edwardsg@sgi.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox