* [PATCH v2 1/3] kmemleak: allow freeing internal objects after kmemleak was disabled @ 2014-03-17 4:07 Li Zefan 2014-03-17 4:08 ` [PATCH v2 2/3] kmemleak: remove redundant code Li Zefan ` (2 more replies) 0 siblings, 3 replies; 8+ messages in thread From: Li Zefan @ 2014-03-17 4:07 UTC (permalink / raw) To: Andrew Morton; +Cc: Catalin Marinas, LKML, linux-mm@kvack.org Currently if kmemleak is disabled, the kmemleak objects can never be freed, no matter if it's disabled by a user or due to fatal errors. Those objects can be a big waste of memory. OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME 1200264 1197433 99% 0.30K 46164 26 369312K kmemleak_object With this patch, internal objects will be freed immediately if kmemleak is disabled explicitly by a user. If it's disabled due to a kmemleak error, The user will be informed, and then he/she can reclaim memory with: # echo off > /sys/kernel/debug/kmemleak v2: use "off" handler instead of "clear" handler to do this, suggested by Catalin. Signed-off-by: Li Zefan <lizefan@huawei.com> --- Documentation/kmemleak.txt | 14 +++++++++++++- mm/kmemleak.c | 21 ++++++++++++++++----- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/Documentation/kmemleak.txt b/Documentation/kmemleak.txt index 6dc8013..00aa013 100644 --- a/Documentation/kmemleak.txt +++ b/Documentation/kmemleak.txt @@ -42,7 +42,8 @@ objects to be reported as orphan. Memory scanning parameters can be modified at run-time by writing to the /sys/kernel/debug/kmemleak file. The following parameters are supported: - off - disable kmemleak (irreversible) + off - disable kmemleak, or free all kmemleak objects if kmemleak + has been disabled due to fatal errors. (irreversible). stack=on - enable the task stacks scanning (default) stack=off - disable the tasks stacks scanning scan=on - start the automatic memory scanning thread (default) @@ -118,6 +119,17 @@ Then as usual to get your report with: # cat /sys/kernel/debug/kmemleak +Freeing kmemleak internal objects +--------------------------------- + +To allow access to previously found memory leaks even when an error fatal +to kmemleak happens, internal kmemleak objects won't be freed in this case. +Those objects may occupy a large part of physical memory. + +You can reclaim memory from those objects with: + + # echo off > /sys/kernel/debug/kmemleak + Kmemleak API ------------ diff --git a/mm/kmemleak.c b/mm/kmemleak.c index 31f01c5..7fc030e 100644 --- a/mm/kmemleak.c +++ b/mm/kmemleak.c @@ -1616,9 +1616,6 @@ static ssize_t kmemleak_write(struct file *file, const char __user *user_buf, int buf_size; int ret; - if (!atomic_read(&kmemleak_enabled)) - return -EBUSY; - buf_size = min(size, (sizeof(buf) - 1)); if (strncpy_from_user(buf, user_buf, buf_size) < 0) return -EFAULT; @@ -1628,9 +1625,18 @@ static ssize_t kmemleak_write(struct file *file, const char __user *user_buf, if (ret < 0) return ret; - if (strncmp(buf, "off", 3) == 0) + if (strncmp(buf, "off", 3) == 0) { + stop_scan_thread(); kmemleak_disable(); - else if (strncmp(buf, "stack=on", 8) == 0) + goto out; + } + + if (!atomic_read(&kmemleak_enabled)) { + ret = -EBUSY; + goto out; + } + + if (strncmp(buf, "stack=on", 8) == 0) kmemleak_stack_scan = 1; else if (strncmp(buf, "stack=off", 9) == 0) kmemleak_stack_scan = 0; @@ -1695,6 +1701,11 @@ static void kmemleak_do_cleanup(struct work_struct *work) list_for_each_entry_rcu(object, &object_list, object_list) delete_object_full(object->pointer); rcu_read_unlock(); + } else { + pr_info("Disable kmemleak without freeing internal objects, " + "so you may still check information on memory leak. " + "You may reclaim memory by writing \"off\" to " + "/sys/kernel/debug/kmemleak\n"); } mutex_unlock(&scan_mutex); } -- 1.8.0.2 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v2 2/3] kmemleak: remove redundant code 2014-03-17 4:07 [PATCH v2 1/3] kmemleak: allow freeing internal objects after kmemleak was disabled Li Zefan @ 2014-03-17 4:08 ` Li Zefan 2014-03-21 23:40 ` Catalin Marinas 2014-03-17 4:09 ` [PATCH v2 3/3] kmemleak: change some global variables to int Li Zefan 2014-03-21 23:37 ` [PATCH v2 1/3] kmemleak: allow freeing internal objects after kmemleak was disabled Catalin Marinas 2 siblings, 1 reply; 8+ messages in thread From: Li Zefan @ 2014-03-17 4:08 UTC (permalink / raw) To: Andrew Morton; +Cc: Catalin Marinas, LKML, linux-mm@kvack.org - remove kmemleak_padding(). - remove kmemleak_release(). Signed-off-by: Li Zefan <lizefan@huawei.com> --- include/linux/kmemleak.h | 2 -- mm/kmemleak.c | 7 +------ 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/include/linux/kmemleak.h b/include/linux/kmemleak.h index 2a5e554..5bb4246 100644 --- a/include/linux/kmemleak.h +++ b/include/linux/kmemleak.h @@ -30,8 +30,6 @@ extern void kmemleak_alloc_percpu(const void __percpu *ptr, size_t size) __ref; extern void kmemleak_free(const void *ptr) __ref; extern void kmemleak_free_part(const void *ptr, size_t size) __ref; extern void kmemleak_free_percpu(const void __percpu *ptr) __ref; -extern void kmemleak_padding(const void *ptr, unsigned long offset, - size_t size) __ref; extern void kmemleak_not_leak(const void *ptr) __ref; extern void kmemleak_ignore(const void *ptr) __ref; extern void kmemleak_scan_area(const void *ptr, size_t size, gfp_t gfp) __ref; diff --git a/mm/kmemleak.c b/mm/kmemleak.c index 7fc030e..54270f2 100644 --- a/mm/kmemleak.c +++ b/mm/kmemleak.c @@ -1545,11 +1545,6 @@ static int kmemleak_open(struct inode *inode, struct file *file) return seq_open(file, &kmemleak_seq_ops); } -static int kmemleak_release(struct inode *inode, struct file *file) -{ - return seq_release(inode, file); -} - static int dump_str_object_info(const char *str) { unsigned long flags; @@ -1680,7 +1675,7 @@ static const struct file_operations kmemleak_fops = { .read = seq_read, .write = kmemleak_write, .llseek = seq_lseek, - .release = kmemleak_release, + .release = seq_release, }; /* -- 1.8.0.2 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v2 2/3] kmemleak: remove redundant code 2014-03-17 4:08 ` [PATCH v2 2/3] kmemleak: remove redundant code Li Zefan @ 2014-03-21 23:40 ` Catalin Marinas 0 siblings, 0 replies; 8+ messages in thread From: Catalin Marinas @ 2014-03-21 23:40 UTC (permalink / raw) To: Li Zefan; +Cc: Andrew Morton, LKML, linux-mm@kvack.org On Mon, Mar 17, 2014 at 04:08:00AM +0000, Li Zefan wrote: > - remove kmemleak_padding(). > - remove kmemleak_release(). > > Signed-off-by: Li Zefan <lizefan@huawei.com> Acked-by: Catalin Marinas <catalin.marinas@arm.com> -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 3/3] kmemleak: change some global variables to int 2014-03-17 4:07 [PATCH v2 1/3] kmemleak: allow freeing internal objects after kmemleak was disabled Li Zefan 2014-03-17 4:08 ` [PATCH v2 2/3] kmemleak: remove redundant code Li Zefan @ 2014-03-17 4:09 ` Li Zefan 2014-03-21 23:44 ` Catalin Marinas 2014-03-21 23:37 ` [PATCH v2 1/3] kmemleak: allow freeing internal objects after kmemleak was disabled Catalin Marinas 2 siblings, 1 reply; 8+ messages in thread From: Li Zefan @ 2014-03-17 4:09 UTC (permalink / raw) To: Andrew Morton; +Cc: Catalin Marinas, LKML, linux-mm@kvack.org They don't have to be atomic_t, because they are simple boolean toggles. Signed-off-by: Li Zefan <lizefan@huawei.com> --- mm/kmemleak.c | 78 +++++++++++++++++++++++++++++------------------------------ 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/mm/kmemleak.c b/mm/kmemleak.c index 54270f2..c352c63 100644 --- a/mm/kmemleak.c +++ b/mm/kmemleak.c @@ -192,15 +192,15 @@ static struct kmem_cache *object_cache; static struct kmem_cache *scan_area_cache; /* set if tracing memory operations is enabled */ -static atomic_t kmemleak_enabled = ATOMIC_INIT(0); +static int kmemleak_enabled; /* set in the late_initcall if there were no errors */ -static atomic_t kmemleak_initialized = ATOMIC_INIT(0); +static int kmemleak_initialized; /* enables or disables early logging of the memory operations */ -static atomic_t kmemleak_early_log = ATOMIC_INIT(1); +static int kmemleak_early_log = 1; /* set if a kmemleak warning was issued */ -static atomic_t kmemleak_warning = ATOMIC_INIT(0); +static int kmemleak_warning; /* set if a fatal kmemleak error has occurred */ -static atomic_t kmemleak_error = ATOMIC_INIT(0); +static int kmemleak_error; /* minimum and maximum address that may be valid pointers */ static unsigned long min_addr = ULONG_MAX; @@ -267,7 +267,7 @@ static void kmemleak_disable(void); #define kmemleak_warn(x...) do { \ pr_warning(x); \ dump_stack(); \ - atomic_set(&kmemleak_warning, 1); \ + kmemleak_warning = 1; \ } while (0) /* @@ -805,7 +805,7 @@ static void __init log_early(int op_type, const void *ptr, size_t size, unsigned long flags; struct early_log *log; - if (atomic_read(&kmemleak_error)) { + if (kmemleak_error) { /* kmemleak stopped recording, just count the requests */ crt_early_log++; return; @@ -840,7 +840,7 @@ static void early_alloc(struct early_log *log) unsigned long flags; int i; - if (!atomic_read(&kmemleak_enabled) || !log->ptr || IS_ERR(log->ptr)) + if (!kmemleak_enabled || !log->ptr || IS_ERR(log->ptr)) return; /* @@ -893,9 +893,9 @@ void __ref kmemleak_alloc(const void *ptr, size_t size, int min_count, { pr_debug("%s(0x%p, %zu, %d)\n", __func__, ptr, size, min_count); - if (atomic_read(&kmemleak_enabled) && ptr && !IS_ERR(ptr)) + if (kmemleak_enabled && ptr && !IS_ERR(ptr)) create_object((unsigned long)ptr, size, min_count, gfp); - else if (atomic_read(&kmemleak_early_log)) + else if (kmemleak_early_log) log_early(KMEMLEAK_ALLOC, ptr, size, min_count); } EXPORT_SYMBOL_GPL(kmemleak_alloc); @@ -919,11 +919,11 @@ void __ref kmemleak_alloc_percpu(const void __percpu *ptr, size_t size) * Percpu allocations are only scanned and not reported as leaks * (min_count is set to 0). */ - if (atomic_read(&kmemleak_enabled) && ptr && !IS_ERR(ptr)) + if (kmemleak_enabled && ptr && !IS_ERR(ptr)) for_each_possible_cpu(cpu) create_object((unsigned long)per_cpu_ptr(ptr, cpu), size, 0, GFP_KERNEL); - else if (atomic_read(&kmemleak_early_log)) + else if (kmemleak_early_log) log_early(KMEMLEAK_ALLOC_PERCPU, ptr, size, 0); } EXPORT_SYMBOL_GPL(kmemleak_alloc_percpu); @@ -939,9 +939,9 @@ void __ref kmemleak_free(const void *ptr) { pr_debug("%s(0x%p)\n", __func__, ptr); - if (atomic_read(&kmemleak_enabled) && ptr && !IS_ERR(ptr)) + if (kmemleak_enabled && ptr && !IS_ERR(ptr)) delete_object_full((unsigned long)ptr); - else if (atomic_read(&kmemleak_early_log)) + else if (kmemleak_early_log) log_early(KMEMLEAK_FREE, ptr, 0, 0); } EXPORT_SYMBOL_GPL(kmemleak_free); @@ -959,9 +959,9 @@ void __ref kmemleak_free_part(const void *ptr, size_t size) { pr_debug("%s(0x%p)\n", __func__, ptr); - if (atomic_read(&kmemleak_enabled) && ptr && !IS_ERR(ptr)) + if (kmemleak_enabled && ptr && !IS_ERR(ptr)) delete_object_part((unsigned long)ptr, size); - else if (atomic_read(&kmemleak_early_log)) + else if (kmemleak_early_log) log_early(KMEMLEAK_FREE_PART, ptr, size, 0); } EXPORT_SYMBOL_GPL(kmemleak_free_part); @@ -979,11 +979,11 @@ void __ref kmemleak_free_percpu(const void __percpu *ptr) pr_debug("%s(0x%p)\n", __func__, ptr); - if (atomic_read(&kmemleak_enabled) && ptr && !IS_ERR(ptr)) + if (kmemleak_enabled && ptr && !IS_ERR(ptr)) for_each_possible_cpu(cpu) delete_object_full((unsigned long)per_cpu_ptr(ptr, cpu)); - else if (atomic_read(&kmemleak_early_log)) + else if (kmemleak_early_log) log_early(KMEMLEAK_FREE_PERCPU, ptr, 0, 0); } EXPORT_SYMBOL_GPL(kmemleak_free_percpu); @@ -999,9 +999,9 @@ void __ref kmemleak_not_leak(const void *ptr) { pr_debug("%s(0x%p)\n", __func__, ptr); - if (atomic_read(&kmemleak_enabled) && ptr && !IS_ERR(ptr)) + if (kmemleak_enabled && ptr && !IS_ERR(ptr)) make_gray_object((unsigned long)ptr); - else if (atomic_read(&kmemleak_early_log)) + else if (kmemleak_early_log) log_early(KMEMLEAK_NOT_LEAK, ptr, 0, 0); } EXPORT_SYMBOL(kmemleak_not_leak); @@ -1019,9 +1019,9 @@ void __ref kmemleak_ignore(const void *ptr) { pr_debug("%s(0x%p)\n", __func__, ptr); - if (atomic_read(&kmemleak_enabled) && ptr && !IS_ERR(ptr)) + if (kmemleak_enabled && ptr && !IS_ERR(ptr)) make_black_object((unsigned long)ptr); - else if (atomic_read(&kmemleak_early_log)) + else if (kmemleak_early_log) log_early(KMEMLEAK_IGNORE, ptr, 0, 0); } EXPORT_SYMBOL(kmemleak_ignore); @@ -1041,9 +1041,9 @@ void __ref kmemleak_scan_area(const void *ptr, size_t size, gfp_t gfp) { pr_debug("%s(0x%p)\n", __func__, ptr); - if (atomic_read(&kmemleak_enabled) && ptr && size && !IS_ERR(ptr)) + if (kmemleak_enabled && ptr && size && !IS_ERR(ptr)) add_scan_area((unsigned long)ptr, size, gfp); - else if (atomic_read(&kmemleak_early_log)) + else if (kmemleak_early_log) log_early(KMEMLEAK_SCAN_AREA, ptr, size, 0); } EXPORT_SYMBOL(kmemleak_scan_area); @@ -1061,9 +1061,9 @@ void __ref kmemleak_no_scan(const void *ptr) { pr_debug("%s(0x%p)\n", __func__, ptr); - if (atomic_read(&kmemleak_enabled) && ptr && !IS_ERR(ptr)) + if (kmemleak_enabled && ptr && !IS_ERR(ptr)) object_no_scan((unsigned long)ptr); - else if (atomic_read(&kmemleak_early_log)) + else if (kmemleak_early_log) log_early(KMEMLEAK_NO_SCAN, ptr, 0, 0); } EXPORT_SYMBOL(kmemleak_no_scan); @@ -1088,7 +1088,7 @@ static bool update_checksum(struct kmemleak_object *object) */ static int scan_should_stop(void) { - if (!atomic_read(&kmemleak_enabled)) + if (!kmemleak_enabled) return 1; /* @@ -1626,7 +1626,7 @@ static ssize_t kmemleak_write(struct file *file, const char __user *user_buf, goto out; } - if (!atomic_read(&kmemleak_enabled)) { + if (!kmemleak_enabled) { ret = -EBUSY; goto out; } @@ -1714,14 +1714,14 @@ static DECLARE_WORK(cleanup_work, kmemleak_do_cleanup); static void kmemleak_disable(void) { /* atomically check whether it was already invoked */ - if (atomic_cmpxchg(&kmemleak_error, 0, 1)) + if (cmpxchg(&kmemleak_error, 0, 1)) return; /* stop any memory operation tracing */ - atomic_set(&kmemleak_enabled, 0); + kmemleak_enabled = 0; /* check whether it is too early for a kernel thread */ - if (atomic_read(&kmemleak_initialized)) + if (kmemleak_initialized) schedule_work(&cleanup_work); pr_info("Kernel memory leak detector disabled\n"); @@ -1763,9 +1763,10 @@ void __init kmemleak_init(void) int i; unsigned long flags; + kmemleak_early_log = 0; + #ifdef CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF if (!kmemleak_skip_disable) { - atomic_set(&kmemleak_early_log, 0); kmemleak_disable(); return; } @@ -1783,12 +1784,11 @@ void __init kmemleak_init(void) /* the kernel is still in UP mode, so disabling the IRQs is enough */ local_irq_save(flags); - atomic_set(&kmemleak_early_log, 0); - if (atomic_read(&kmemleak_error)) { + if (kmemleak_error) { local_irq_restore(flags); return; } else - atomic_set(&kmemleak_enabled, 1); + kmemleak_enabled = 1; local_irq_restore(flags); /* @@ -1832,9 +1832,9 @@ void __init kmemleak_init(void) log->op_type); } - if (atomic_read(&kmemleak_warning)) { + if (kmemleak_warning) { print_log_trace(log); - atomic_set(&kmemleak_warning, 0); + kmemleak_warning = 0; } } } @@ -1846,9 +1846,9 @@ static int __init kmemleak_late_init(void) { struct dentry *dentry; - atomic_set(&kmemleak_initialized, 1); + kmemleak_initialized = 1; - if (atomic_read(&kmemleak_error)) { + if (kmemleak_error) { /* * Some error occurred and kmemleak was disabled. There is a * small chance that kmemleak_disable() was called immediately -- 1.8.0.2 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v2 3/3] kmemleak: change some global variables to int 2014-03-17 4:09 ` [PATCH v2 3/3] kmemleak: change some global variables to int Li Zefan @ 2014-03-21 23:44 ` Catalin Marinas 0 siblings, 0 replies; 8+ messages in thread From: Catalin Marinas @ 2014-03-21 23:44 UTC (permalink / raw) To: Li Zefan; +Cc: Andrew Morton, LKML, linux-mm@kvack.org On Mon, Mar 17, 2014 at 04:09:04AM +0000, Li Zefan wrote: > They don't have to be atomic_t, because they are simple boolean > toggles. > > Signed-off-by: Li Zefan <lizefan@huawei.com> A reason for which I had atomic_t was to avoid compiler optimisations but I don't immediately see how it could go wrong. Assuming that you have tested it, Acked-by: Catalin Marinas <catalin.marinas@arm.com> -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/3] kmemleak: allow freeing internal objects after kmemleak was disabled 2014-03-17 4:07 [PATCH v2 1/3] kmemleak: allow freeing internal objects after kmemleak was disabled Li Zefan 2014-03-17 4:08 ` [PATCH v2 2/3] kmemleak: remove redundant code Li Zefan 2014-03-17 4:09 ` [PATCH v2 3/3] kmemleak: change some global variables to int Li Zefan @ 2014-03-21 23:37 ` Catalin Marinas 2014-03-27 2:29 ` Li Zefan 2 siblings, 1 reply; 8+ messages in thread From: Catalin Marinas @ 2014-03-21 23:37 UTC (permalink / raw) To: Li Zefan; +Cc: Andrew Morton, LKML, linux-mm@kvack.org Hi Li, On 17 Mar 2014, at 04:07, Li Zefan <lizefan@huawei.com> wrote: > Currently if kmemleak is disabled, the kmemleak objects can never be freed, > no matter if it's disabled by a user or due to fatal errors. > > Those objects can be a big waste of memory. > > OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME > 1200264 1197433 99% 0.30K 46164 26 369312K kmemleak_object > > With this patch, internal objects will be freed immediately if kmemleak is > disabled explicitly by a user. If it's disabled due to a kmemleak error, > The user will be informed, and then he/she can reclaim memory with: > > # echo off > /sys/kernel/debug/kmemleak > > v2: use "off" handler instead of "clear" handler to do this, suggested > by Catalin. I think there was a slight misunderstanding. My point was about "echo scan=off” before “echo off”, they can just be squashed into the same action of the latter. I would keep the “clear” part separately as per your first patch. I recall people asked in the past to still be able to analyse the reports even though kmemleak failed or was disabled. Thanks, Catalin -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/3] kmemleak: allow freeing internal objects after kmemleak was disabled 2014-03-21 23:37 ` [PATCH v2 1/3] kmemleak: allow freeing internal objects after kmemleak was disabled Catalin Marinas @ 2014-03-27 2:29 ` Li Zefan 2014-03-27 12:21 ` Catalin Marinas 0 siblings, 1 reply; 8+ messages in thread From: Li Zefan @ 2014-03-27 2:29 UTC (permalink / raw) To: Catalin Marinas; +Cc: Andrew Morton, LKML, linux-mm@kvack.org (Just came back from travelling) On 2014/3/22 7:37, Catalin Marinas wrote: > Hi Li, > > On 17 Mar 2014, at 04:07, Li Zefan <lizefan@huawei.com> wrote: >> Currently if kmemleak is disabled, the kmemleak objects can never be freed, >> no matter if it's disabled by a user or due to fatal errors. >> >> Those objects can be a big waste of memory. >> >> OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME >> 1200264 1197433 99% 0.30K 46164 26 369312K kmemleak_object >> >> With this patch, internal objects will be freed immediately if kmemleak is >> disabled explicitly by a user. If it's disabled due to a kmemleak error, >> The user will be informed, and then he/she can reclaim memory with: >> >> # echo off > /sys/kernel/debug/kmemleak >> >> v2: use "off" handler instead of "clear" handler to do this, suggested >> by Catalin. > > I think there was a slight misunderstanding. My point was about "echo > scan=off!+- before !?echo off!+-, they can just be squashed into the > same action of the latter. > I'm not sure if I understand correctly, so you want the "off" handler to stop the scan thread but it will never free kmemleak objects until the user explicitly trigger the "clear" action, right? > I would keep the !?clear!+- part separately as per your first patch. I > recall people asked in the past to still be able to analyse the reports > even though kmemleak failed or was disabled. > -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/3] kmemleak: allow freeing internal objects after kmemleak was disabled 2014-03-27 2:29 ` Li Zefan @ 2014-03-27 12:21 ` Catalin Marinas 0 siblings, 0 replies; 8+ messages in thread From: Catalin Marinas @ 2014-03-27 12:21 UTC (permalink / raw) To: Li Zefan; +Cc: Andrew Morton, LKML, linux-mm@kvack.org On Thu, Mar 27, 2014 at 02:29:18AM +0000, Li Zefan wrote: > On 2014/3/22 7:37, Catalin Marinas wrote: > > On 17 Mar 2014, at 04:07, Li Zefan <lizefan@huawei.com> wrote: > >> Currently if kmemleak is disabled, the kmemleak objects can never be freed, > >> no matter if it's disabled by a user or due to fatal errors. > >> > >> Those objects can be a big waste of memory. > >> > >> OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME > >> 1200264 1197433 99% 0.30K 46164 26 369312K kmemleak_object > >> > >> With this patch, internal objects will be freed immediately if kmemleak is > >> disabled explicitly by a user. If it's disabled due to a kmemleak error, > >> The user will be informed, and then he/she can reclaim memory with: > >> > >> # echo off > /sys/kernel/debug/kmemleak > >> > >> v2: use "off" handler instead of "clear" handler to do this, suggested > >> by Catalin. > > > > I think there was a slight misunderstanding. My point was about "echo > > scan=offa?? before a??echo offa??, they can just be squashed into the > > same action of the latter. > > I'm not sure if I understand correctly, so you want the "off" handler to > stop the scan thread but it will never free kmemleak objects until the > user explicitly trigger the "clear" action, right? Yes. That's just in case someone wants to stop kmemleak but still investigate some previously reported leaks. Thanks. -- Catalin -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2014-03-27 12:22 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-03-17 4:07 [PATCH v2 1/3] kmemleak: allow freeing internal objects after kmemleak was disabled Li Zefan 2014-03-17 4:08 ` [PATCH v2 2/3] kmemleak: remove redundant code Li Zefan 2014-03-21 23:40 ` Catalin Marinas 2014-03-17 4:09 ` [PATCH v2 3/3] kmemleak: change some global variables to int Li Zefan 2014-03-21 23:44 ` Catalin Marinas 2014-03-21 23:37 ` [PATCH v2 1/3] kmemleak: allow freeing internal objects after kmemleak was disabled Catalin Marinas 2014-03-27 2:29 ` Li Zefan 2014-03-27 12:21 ` Catalin Marinas
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).