598e09b6b6
This is a backport of the following upstream commit. It is about freeing the wrong bitmap thing, it could increase the risk of OOM when system is in an edge of OOM. commit 0e7b1a6e3c1919c9222b662d458637ddf802dd04 Author: Arthur Zou <zzou@redhat.com> Date: Wed May 7 17:54:16 2014 +0900 [PATCH v3] Fix free bitmap_buffer_cyclic error. Description: In create_dump_bitmap() and write_kdump_pages_and_bitmap_cyclic(), What should be freed is info->partial_bitmap instead of info->bitmap. Solution: Add two functions to free the bitmap_buffer_cyclic. info->partial_bitmap1 is freed by free_bitmap1_buffer_cyclic(). info->partial_bitmap2 is freed by free_bitmap2_buffer_cyclic(). At the same time, remove thoes frees that free partial_bitmap1 or partial_bitmap2 at the end of main() because partial_bitmap1 and partial_bitmap2 has been freed after dump file has been written out, so there is no need to free it again at the end of main. Signed-off-by: Arthur Zou <zzou@redhat.com> Signed-off-by: Baoquan He <bhe@redhat.com> Acked-by: Vivek Goyal <vgoyal@redhat.com>
112 lines
2.8 KiB
Diff
112 lines
2.8 KiB
Diff
From 0e7b1a6e3c1919c9222b662d458637ddf802dd04 Mon Sep 17 00:00:00 2001
|
|
From: Arthur Zou <zzou@redhat.com>
|
|
Date: Wed, 7 May 2014 17:54:16 +0900
|
|
Subject: [PATCH] [PATCH v3] Fix free bitmap_buffer_cyclic error.
|
|
|
|
Description:
|
|
In create_dump_bitmap() and write_kdump_pages_and_bitmap_cyclic(),
|
|
What should be freed is info->partial_bitmap instead of info->bitmap.
|
|
|
|
Solution:
|
|
Add two functions to free the bitmap_buffer_cyclic. info->partial_bitmap1
|
|
is freed by free_bitmap1_buffer_cyclic(). info->partial_bitmap2 is
|
|
freed by free_bitmap2_buffer_cyclic(). At the same time, remove
|
|
thoes frees that free partial_bitmap1 or partial_bitmap2 at the end
|
|
of main() because partial_bitmap1 and partial_bitmap2 has been freed
|
|
after dump file has been written out, so there is no need to free it
|
|
again at the end of main.
|
|
|
|
Signed-off-by: Arthur Zou <zzou@redhat.com>
|
|
Signed-off-by: Baoquan He <bhe@redhat.com>
|
|
---
|
|
makedumpfile.c | 38 ++++++++++++++++++++++++++++++--------
|
|
1 file changed, 30 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/makedumpfile.c b/makedumpfile.c
|
|
index 16081a5..ef8a750 100644
|
|
--- a/makedumpfile-1.5.6/makedumpfile.c
|
|
+++ b/makedumpfile-1.5.6/makedumpfile.c
|
|
@@ -5130,6 +5130,31 @@ free_bitmap_buffer(void)
|
|
free_bitmap2_buffer();
|
|
}
|
|
|
|
+void
|
|
+free_bitmap1_buffer_cyclic()
|
|
+{
|
|
+ if (info->partial_bitmap1 != NULL){
|
|
+ free(info->partial_bitmap1);
|
|
+ info->partial_bitmap1 = NULL;
|
|
+ }
|
|
+}
|
|
+
|
|
+void
|
|
+free_bitmap2_buffer_cyclic()
|
|
+{
|
|
+ if (info->partial_bitmap2 != NULL){
|
|
+ free(info->partial_bitmap2);
|
|
+ info->partial_bitmap2 = NULL;
|
|
+ }
|
|
+}
|
|
+
|
|
+void
|
|
+free_bitmap_buffer_cyclic()
|
|
+{
|
|
+ free_bitmap1_buffer_cyclic();
|
|
+ free_bitmap2_buffer_cyclic();
|
|
+}
|
|
+
|
|
int
|
|
create_dump_bitmap(void)
|
|
{
|
|
@@ -5147,8 +5172,7 @@ create_dump_bitmap(void)
|
|
goto out;
|
|
|
|
info->num_dumpable = get_num_dumpable_cyclic();
|
|
-
|
|
- free_bitmap2_buffer();
|
|
+ free_bitmap2_buffer_cyclic();
|
|
}
|
|
|
|
} else {
|
|
@@ -6190,6 +6214,8 @@ write_elf_pages_cyclic(struct cache_data *cd_header, struct cache_data *cd_page)
|
|
if (!write_cache_bufsz(cd_page))
|
|
return FALSE;
|
|
|
|
+ free_bitmap_buffer_cyclic();
|
|
+
|
|
/*
|
|
* print [100 %]
|
|
*/
|
|
@@ -6947,7 +6973,7 @@ write_kdump_pages_and_bitmap_cyclic(struct cache_data *cd_header, struct cache_d
|
|
}
|
|
|
|
|
|
- free_bitmap1_buffer();
|
|
+ free_bitmap1_buffer_cyclic();
|
|
|
|
if (!prepare_bitmap2_buffer_cyclic())
|
|
return FALSE;
|
|
@@ -6970,7 +6996,7 @@ write_kdump_pages_and_bitmap_cyclic(struct cache_data *cd_header, struct cache_d
|
|
return FALSE;
|
|
}
|
|
|
|
-
|
|
+ free_bitmap2_buffer_cyclic();
|
|
|
|
gettimeofday(&tv_start, NULL);
|
|
|
|
@@ -9349,10 +9375,6 @@ out:
|
|
free(info->splitting_info);
|
|
if (info->p2m_mfn_frame_list != NULL)
|
|
free(info->p2m_mfn_frame_list);
|
|
- if (info->partial_bitmap1 != NULL)
|
|
- free(info->partial_bitmap1);
|
|
- if (info->partial_bitmap2 != NULL)
|
|
- free(info->partial_bitmap2);
|
|
free(info);
|
|
}
|
|
free_elf_info();
|
|
--
|
|
1.8.5.3
|
|
|