From 7a7685aef81be4baed837906f26d1f2562ce91fabda11cd863f255340829da28 Mon Sep 17 00:00:00 2001 From: OBS User unknown Date: Mon, 19 Jan 2009 01:08:14 +0000 Subject: [PATCH] OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/kexec-tools?expand=0&rev=68 --- kexec-tools-ppc64-dynamic-fix-1.diff | 25 ++++++++++++++++ kexec-tools-ppc64-dynamic-fix-2.diff | 44 +++++++++++++++++++++++++++ kexec-tools-ppc64-dynamic-fix-3.diff | 45 ++++++++++++++++++++++++++++ kexec-tools.changes | 13 ++++++++ kexec-tools.spec | 16 +++++++++- 5 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 kexec-tools-ppc64-dynamic-fix-1.diff create mode 100644 kexec-tools-ppc64-dynamic-fix-2.diff create mode 100644 kexec-tools-ppc64-dynamic-fix-3.diff diff --git a/kexec-tools-ppc64-dynamic-fix-1.diff b/kexec-tools-ppc64-dynamic-fix-1.diff new file mode 100644 index 0000000..cd68cfd --- /dev/null +++ b/kexec-tools-ppc64-dynamic-fix-1.diff @@ -0,0 +1,25 @@ +From b4b79993adc9ac3094361900f34582e36f5de162 Mon Sep 17 00:00:00 2001 +From: Bernhard Walle +Date: Fri, 16 Jan 2009 18:52:29 +0100 +Subject: [PATCH] [PPC64] Fix typo in realloc_memory_ranges() + +The base_memory_range should not become memory_range. We need to realloc +base_memory_range to not change the contents of memory. That was a copy & paste +error. + + +Signed-off-by: Bernhard Walle + +diff --git a/kexec/arch/ppc64/kexec-ppc64.c b/kexec/arch/ppc64/kexec-ppc64.c +index d8347f1..b0d8acd 100644 +--- a/kexec/arch/ppc64/kexec-ppc64.c ++++ b/kexec/arch/ppc64/kexec-ppc64.c +@@ -107,7 +107,7 @@ static int realloc_memory_ranges(void) + if (!memory_range) + goto err; + +- base_memory_range = (struct memory_range *) realloc(memory_range, memory_range_len); ++ base_memory_range = (struct memory_range *) realloc(base_memory_range, memory_range_len); + if (!base_memory_range) + goto err; + diff --git a/kexec-tools-ppc64-dynamic-fix-2.diff b/kexec-tools-ppc64-dynamic-fix-2.diff new file mode 100644 index 0000000..b600aca --- /dev/null +++ b/kexec-tools-ppc64-dynamic-fix-2.diff @@ -0,0 +1,44 @@ +From ef3f522c99c0e8af06ae5af625225885f8930b19 Mon Sep 17 00:00:00 2001 +From: Bernhard Walle +Date: Fri, 16 Jan 2009 18:52:26 +0100 +Subject: [PATCH] [PPC64] Fix memory corruption when using realloc_memory_ranges() + +Because realloc_memory_ranges() makes the old memory invalid, and we return +a pointer to memory_range in get_memory_ranges(), we need to copy the contents +in get_memory_ranges(). + +Some code that calls realloc_memory_ranges() may be triggered by +get_base_ranges() which is called after get_memory_ranges(). + +Yes, the memory needs to be deleted somewhere, but I don't know currently +where it's the best, and since it's not in a loop and memory is deleted +anyway after program termination I don't want to introduce unneccessary +complexity. The problem is that get_base_ranges() gets called from +architecture independent code and that allocation is PPC64-specific here. + + +Signed-off-by: Bernhard Walle diff --git a/kexec/arch/ppc64/kexec-ppc64.c b/kexec/arch/ppc64/kexec-ppc64.c +index b0d8acd..ad8a31c 100644 + +diff --git a/kexec/arch/ppc64/kexec-ppc64.c b/kexec/arch/ppc64/kexec-ppc64.c +index b0d8acd..ad8a31c 100644 +--- a/kexec/arch/ppc64/kexec-ppc64.c ++++ b/kexec/arch/ppc64/kexec-ppc64.c +@@ -715,7 +715,16 @@ int get_memory_ranges(struct memory_range **range, int *ranges, + if (setup_memory_ranges(kexec_flags)) + return -1; + +- *range = memory_range; ++ /* ++ * copy the memory here, another realloc_memory_ranges might ++ * corrupt the old memory ++ */ ++ *range = calloc(sizeof(struct memory_range), nr_memory_ranges); ++ if (*range == NULL) ++ return -1; ++ memmove(*range, memory_range, ++ sizeof(struct memory_range) * nr_memory_ranges); ++ + *ranges = nr_memory_ranges; + fprintf(stderr, "get memory ranges:%d\n", nr_memory_ranges); + return 0; diff --git a/kexec-tools-ppc64-dynamic-fix-3.diff b/kexec-tools-ppc64-dynamic-fix-3.diff new file mode 100644 index 0000000..66b66d0 --- /dev/null +++ b/kexec-tools-ppc64-dynamic-fix-3.diff @@ -0,0 +1,45 @@ +From 8a2f02cc303147cb09f00a9d322c6bfaee32492d Mon Sep 17 00:00:00 2001 +From: Bernhard Walle +Date: Fri, 16 Jan 2009 18:52:10 +0100 +Subject: [PATCH] [PPC64] printf() consolidation + +Remove the fprintf(stderr,...) in get_memory_ranges() that adds unnecessary +output in the normal kexec case that the user don't want to see. + +Use dbgprintf() in get_base_ranges() instead of + + #ifdef DEBUG + fprintf(stderr,...) + #endif + +to to make the code more readable. + + +Signed-off-by: Bernhard Walle diff --git a/kexec/arch/ppc64/kexec-ppc64.c b/kexec/arch/ppc64/kexec-ppc64.c +index ad8a31c..8d4e42b 100644 + +diff --git a/kexec/arch/ppc64/kexec-ppc64.c b/kexec/arch/ppc64/kexec-ppc64.c +index ad8a31c..8d4e42b 100644 +--- a/kexec/arch/ppc64/kexec-ppc64.c ++++ b/kexec/arch/ppc64/kexec-ppc64.c +@@ -263,9 +263,8 @@ static int get_base_ranges(void) + closedir(dir); + sort_base_ranges(); + memory_max = base_memory_range[nr_memory_ranges - 1].end; +-#ifdef DEBUG +- fprintf(stderr, "get base memory ranges:%d\n", nr_memory_ranges); +-#endif ++ dbgprintf("get base memory ranges:%d\n", nr_memory_ranges); ++ + return 0; + } + +@@ -726,7 +725,7 @@ int get_memory_ranges(struct memory_range **range, int *ranges, + sizeof(struct memory_range) * nr_memory_ranges); + + *ranges = nr_memory_ranges; +- fprintf(stderr, "get memory ranges:%d\n", nr_memory_ranges); ++ dbgprintf("get memory ranges:%d\n", nr_memory_ranges); + return 0; + } + diff --git a/kexec-tools.changes b/kexec-tools.changes index af67072..b3a2646 100644 --- a/kexec-tools.changes +++ b/kexec-tools.changes @@ -1,3 +1,16 @@ +------------------------------------------------------------------- +Fri Jan 16 18:57:47 CET 2009 - bwalle@suse.de + +- The dynamic reallocation for PPC64 broke kdump completely. + Fix the patch so that dynamic reallocation actually works + without memory corruption (bnc #466782). + +------------------------------------------------------------------- +Fri Jan 16 15:11:37 CET 2009 - bwalle@suse.de + +- Add #!BuildIgnore on fop to speed up build (asciidoc don't + require fop for manpage generation). + ------------------------------------------------------------------- Wed Jan 07 14:30:47 CET 2009 - bwalle@suse.de diff --git a/kexec-tools.spec b/kexec-tools.spec index dabd031..6e1aa6d 100644 --- a/kexec-tools.spec +++ b/kexec-tools.spec @@ -29,7 +29,7 @@ PreReq: %insserv_prereq %fillup_prereq AutoReqProv: on Summary: Tools for fast kernel loading Version: 2.0.0 -Release: 49 +Release: 51 Source: %{name}-%{version}.tar.bz2 Source1: kexec-bootloader Source2: kexec-bootloader.8.txt @@ -53,8 +53,12 @@ Patch14: %{name}-proc-iomem-xen.diff Patch15: %{name}-parse-iomem-single-warning.diff Patch16: %{name}-exclude-gart.diff Patch17: %{name}-ppc64-memory-ranges-dynamic.diff +Patch18: %{name}-ppc64-dynamic-fix-1.diff +Patch19: %{name}-ppc64-dynamic-fix-2.diff +Patch20: %{name}-ppc64-dynamic-fix-3.diff Url: http://ftp.kernel.org/pub/linux/kernel/people/horms/kexec-tools/ BuildRoot: %{_tmppath}/%{name}-%{version}-build +#!BuildIgnore: fop BuildRequires: zlib-devel %if 0%{?suse_version} >= 1110 BuildRequires: asciidoc @@ -100,6 +104,9 @@ Authors: %patch15 -p1 %patch16 -p1 %patch17 -p1 +%patch18 -p1 +%patch19 -p1 +%patch20 -p1 %build %{?suse_update_config -f} @@ -167,6 +174,13 @@ install -m 0755 kexec.init ${RPM_BUILD_ROOT}/etc/init.d/kexec %endif %changelog +* Fri Jan 16 2009 bwalle@suse.de +- The dynamic reallocation for PPC64 broke kdump completely. + Fix the patch so that dynamic reallocation actually works + without memory corruption (bnc #466782). +* Fri Jan 16 2009 bwalle@suse.de +- Add #!BuildIgnore on fop to speed up build (asciidoc don't + require fop for manpage generation). * Wed Jan 07 2009 bwalle@suse.de - Allocate memory ranges dynamically on PPC64 (bnc #460752). * Tue Dec 09 2008 bwalle@suse.de