From: Catalin Marinas <catalin.marinas@arm.com>
To: Ingo Molnar <mingo@elte.hu>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
Andrew Morton <akpm@linux-foundation.org>,
linux-kernel@vger.kernel.org
Subject: Re: kmemleak: Protect the seq start/next/stop sequence by rcu_read_lock()
Date: Wed, 12 Aug 2009 13:17:27 +0100 [thread overview]
Message-ID: <1250079447.20332.27.camel@pc1117.cambridge.arm.com> (raw)
In-Reply-To: <1249980905.27150.11.camel@pc1117.cambridge.arm.com>
Hi Ingo,
On Tue, 2009-08-11 at 09:55 +0100, Catalin Marinas wrote:
> On Tue, 2009-08-11 at 09:32 +0200, Ingo Molnar wrote:
> > * Catalin Marinas <catalin.marinas@arm.com> wrote:
> > > I tried similar config and with the mainline kernel I get some
> > > lockups (several seconds) with CONFIG_PREEMPT disabled on ARM
> > > machines or x86 during a scanning episode but it eventually
> > > completes the scanning. With the kmemleak patches for the next
> > > merging window, I don't get any lockups as it has more
> > > cond_resched() calls.
> >
> > How big are those patches? Kmemleak is new in .31 so if it fixes a
> > real problem it might still be acceptable.
>
> My patches for -next were posted here -
> http://lkml.org/lkml/2009/7/24/166 - but the relevant ones are pretty
> small (review/ack is welcomed):
>
> http://lkml.org/lkml/2009/7/24/176 - allow rescheduling during object
> scanning
I tried the kernel last night on x86 with most debug options enabled.
They slow down kmemleak considerably and scanning the memory while
rebuilding a kernel took several minutes with visible lockup (though it
eventually recovered).
Trying only the above patch to allow rescheduling during object scanning
seems to have eliminated those lockups. So maybe we can merge this now
and leave the task stacks for the upcoming window. I included the patch
below for review:
kmemleak: Allow rescheduling during an object scanning
From: Catalin Marinas <catalin.marinas@arm.com>
If the object size is bigger than a predefined value (4K in this case),
release the object lock during scanning and call cond_resched().
Re-acquire the lock after rescheduling and test whether the object is
still valid.
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
---
mm/kmemleak.c | 19 +++++++++++++++----
1 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/mm/kmemleak.c b/mm/kmemleak.c
index 7e8e4b0..c665626 100644
--- a/mm/kmemleak.c
+++ b/mm/kmemleak.c
@@ -107,6 +107,7 @@
#define SECS_FIRST_SCAN 60 /* delay before the first scan */
#define SECS_SCAN_WAIT 600 /* subsequent auto scanning delay */
#define GRAY_LIST_PASSES 25 /* maximum number of gray list scans */
+#define MAX_SCAN_SIZE 4096 /* maximum size of a scanned block */
#define BYTES_PER_POINTER sizeof(void *)
@@ -950,10 +951,20 @@ static void scan_object(struct kmemleak_object *object)
if (!(object->flags & OBJECT_ALLOCATED))
/* already freed object */
goto out;
- if (hlist_empty(&object->area_list))
- scan_block((void *)object->pointer,
- (void *)(object->pointer + object->size), object, 0);
- else
+ if (hlist_empty(&object->area_list)) {
+ void *start = (void *)object->pointer;
+ void *end = (void *)(object->pointer + object->size);
+
+ while (start < end && (object->flags & OBJECT_ALLOCATED)) {
+ scan_block(start, min(start + MAX_SCAN_SIZE, end),
+ object, 0);
+ start += MAX_SCAN_SIZE;
+
+ spin_unlock_irqrestore(&object->lock, flags);
+ cond_resched();
+ spin_lock_irqsave(&object->lock, flags);
+ }
+ } else
hlist_for_each_entry(area, elem, &object->area_list, node)
scan_block((void *)(object->pointer + area->offset),
(void *)(object->pointer + area->offset
Thanks.
--
Catalin
next prev parent reply other threads:[~2009-08-12 12:17 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-07-29 15:26 [PATCH] " Catalin Marinas
2009-07-30 0:00 ` Andrew Morton
2009-07-30 8:24 ` Catalin Marinas
2009-08-02 11:14 ` Ingo Molnar
2009-08-10 15:55 ` Catalin Marinas
2009-08-10 18:45 ` Ingo Molnar
2009-08-10 22:56 ` Catalin Marinas
2009-08-11 7:32 ` Ingo Molnar
2009-08-11 8:55 ` Catalin Marinas
2009-08-12 12:17 ` Catalin Marinas [this message]
2009-08-12 15:32 ` Linus Torvalds
2009-08-12 15:39 ` Catalin Marinas
2009-08-12 20:52 ` Ingo Molnar
2009-08-12 22:16 ` kmemleak: Protect the seq start/next/stop sequence byrcu_read_lock() Catalin Marinas
2009-08-13 6:52 ` Ingo Molnar
2009-08-13 9:39 ` Catalin Marinas
2009-08-13 9:44 ` Ingo Molnar
2009-08-13 14:44 ` Catalin Marinas
2009-08-14 22:45 ` Catalin Marinas
2009-08-14 22:47 ` [PATCH] kmemleak: Allow rescheduling during an object scanning Catalin Marinas
2009-08-14 22:48 ` [PATCH] kmemleak: Ignore the aperture memory hole on x86_64 Catalin Marinas
2009-08-15 14:17 ` Ingo Molnar
2009-08-15 22:34 ` Catalin Marinas
2009-08-16 7:04 ` Ingo Molnar
2009-08-16 10:08 ` Ingo Molnar
2009-08-16 21:48 ` Catalin Marinas
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=1250079447.20332.27.camel@pc1117.cambridge.arm.com \
--to=catalin.marinas@arm.com \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=torvalds@linux-foundation.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
all inboxes | Powered by JetHome®