mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
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


  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®