From: Jason Baron <jbaron@redhat.com>
To: catalin.marinas@arm.com, jbarnes@virtuousgeek.org, prarit@redhat.com
Cc: linux-kernel@vger.kernel.org
Subject: [PATCH RFC] kmemleak vs. memory hotplug
Date: Mon, 22 Mar 2010 15:51:50 -0400 [thread overview]
Message-ID: <20100322195149.GA2278@redhat.com> (raw)
Hi,
I noticed in the Kconfig that kmemleak can not be set without
MEMORY_HOTPLUG being unset. I'd like to be able to enable both. Below,
is an rfc patch, completely untested, as a starting point. Hopefully,
ppl more knowledgeable in this area can comment.
thanks,
-Jason
diff --git a/include/linux/kmemleak.h b/include/linux/kmemleak.h
index 99d9a67..ad89f2d 100644
--- a/include/linux/kmemleak.h
+++ b/include/linux/kmemleak.h
@@ -54,6 +54,18 @@ static inline void kmemleak_erase(void **ptr)
*ptr = NULL;
}
+extern struct mutex kmemleak_hotplug;
+
+static inline void lock_system_kmemleak(void)
+{
+ mutex_lock(&kmemleak_hotplug);
+}
+
+static inline void unlock_system_kmemleak(void)
+{
+ mutex_unlock(&kmemleak_hotplug);
+}
+
#else
static inline void kmemleak_init(void)
@@ -93,6 +105,14 @@ static inline void kmemleak_no_scan(const void *ptr)
{
}
+static inline void lock_system_kmemleak(void)
+{
+}
+
+static inline void unlock_system_kmemleak(void)
+{
+}
+
#endif /* CONFIG_DEBUG_KMEMLEAK */
#endif /* __KMEMLEAK_H */
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index 4a50fc1..2e89153 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -365,14 +365,13 @@ config SLUB_STATS
config DEBUG_KMEMLEAK
bool "Kernel memory leak detector"
- depends on DEBUG_KERNEL && EXPERIMENTAL && !MEMORY_HOTPLUG && \
+ depends on DEBUG_KERNEL && EXPERIMENTAL && \
(X86 || ARM || PPC || S390 || SUPERH)
select DEBUG_FS if SYSFS
select STACKTRACE if STACKTRACE_SUPPORT
select KALLSYMS
select CRC32
- depends on 0
help
Say Y here if you want to enable the memory leak
detector. The memory allocation/freeing is traced in a way
diff --git a/mm/kmemleak.c b/mm/kmemleak.c
index 5b069e4..509a728 100644
--- a/mm/kmemleak.c
+++ b/mm/kmemleak.c
@@ -102,6 +102,9 @@
#include <linux/kmemcheck.h>
#include <linux/kmemleak.h>
+/* exlcludes memory hotplug */
+DEFINE_MUTEX(kmemleak_hotplug);
+
/*
* Kmemleak configuration and common defines.
*/
@@ -1178,6 +1181,7 @@ static void kmemleak_scan(void)
* Struct page scanning for each node. The code below is not yet safe
* with MEMORY_HOTPLUG.
*/
+ mutex_lock(&kmemleak_hotplug);
for_each_online_node(i) {
pg_data_t *pgdat = NODE_DATA(i);
unsigned long start_pfn = pgdat->node_start_pfn;
@@ -1196,6 +1200,7 @@ static void kmemleak_scan(void)
scan_block(page, page + 1, NULL, 1);
}
}
+ mutex_unlock(&kmemleak_hotplug);
/*
* Scanning the task stacks (may introduce false negatives).
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index 78e34e6..01fc57d 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -34,6 +34,23 @@
#include "internal.h"
+/* exclude subsystems that hotplug might conflict with */
+static void lock_hotplug_exlucde(void)
+{
+ /* exclude hotplug */
+ lock_system_sleep();
+ /* exlucde kmemleak */
+ lock_system_kmemleak();
+}
+
+static void unlock_hotplug_exlucde(void)
+{
+ /* exclude hotplug */
+ unlock_system_sleep();
+ /* exlucde kmemleak */
+ unlock_system_kmemleak();
+}
+
/* add this memory to iomem resource */
static struct resource *register_memory_resource(u64 start, u64 size)
{
@@ -490,7 +507,7 @@ int __ref add_memory(int nid, u64 start, u64 size)
struct resource *res;
int ret;
- lock_system_sleep();
+ lock_hotplug_exclude();
res = register_memory_resource(start, size);
ret = -EEXIST;
@@ -537,7 +554,7 @@ error:
release_memory_resource(res);
out:
- unlock_system_sleep();
+ unlock_hotplug_exclude();
return ret;
}
EXPORT_SYMBOL_GPL(add_memory);
@@ -777,7 +794,7 @@ static int offline_pages(unsigned long start_pfn,
if (!test_pages_in_a_zone(start_pfn, end_pfn))
return -EINVAL;
- lock_system_sleep();
+ lock_hotplug_exclude();
zone = page_zone(pfn_to_page(start_pfn));
node = zone_to_nid(zone);
@@ -868,7 +885,7 @@ repeat:
writeback_set_ratelimit();
memory_notify(MEM_OFFLINE, &arg);
- unlock_system_sleep();
+ unlock_hotplug_exclude();
return 0;
failed_removal:
@@ -879,7 +896,7 @@ failed_removal:
undo_isolate_page_range(start_pfn, end_pfn);
out:
- unlock_system_sleep();
+ unlock_hotplug_exclude();
return ret;
}
next reply other threads:[~2010-03-22 19:52 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-03-22 19:51 Jason Baron [this message]
2010-03-23 9:25 ` [PATCH RFC] kmemleak vs. memory hotplug 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=20100322195149.GA2278@redhat.com \
--to=jbaron@redhat.com \
--cc=catalin.marinas@arm.com \
--cc=jbarnes@virtuousgeek.org \
--cc=linux-kernel@vger.kernel.org \
--cc=prarit@redhat.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.