Message ID | 20200801130856.86625-6-chenzhou10@huawei.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | support reserving crashkernel above 4G on arm64 kdump | expand |
On 08/01/20 at 09:08pm, Chen Zhou wrote: > Now the behavior of crashkernel=X has been changed, which tries low > allocation in ZONE_DMA, and fall back to high allocation if it fails. > > If requized size X is too large and leads to very little free memory > in ZONE_DMA after low allocation, the system may not work well. > So add a threshold and go for high allocation directly if the required > size is too large. The threshold is set as the half of low memory. > > If crash_base is outside ZONE_DMA, try to allocate at least 256M in > ZONE_DMA automatically. "crashkernel=Y,low" can be used to allocate > specified size low memory. For non-RPi4 platforms, change ZONE_DMA > memtioned above to ZONE_DMA32. > > So update the Documentation. > > Signed-off-by: Chen Zhou <chenzhou10@huawei.com> > --- > Documentation/admin-guide/kdump/kdump.rst | 21 ++++++++++++++++--- > .../admin-guide/kernel-parameters.txt | 11 ++++++++-- > 2 files changed, 27 insertions(+), 5 deletions(-) > > diff --git a/Documentation/admin-guide/kdump/kdump.rst b/Documentation/admin-guide/kdump/kdump.rst > index 2da65fef2a1c..4b58f97351d5 100644 > --- a/Documentation/admin-guide/kdump/kdump.rst > +++ b/Documentation/admin-guide/kdump/kdump.rst > @@ -299,7 +299,15 @@ Boot into System Kernel > "crashkernel=64M@16M" tells the system kernel to reserve 64 MB of memory > starting at physical address 0x01000000 (16MB) for the dump-capture kernel. > > - On x86 and x86_64, use "crashkernel=64M@16M". > + On x86 use "crashkernel=64M@16M". > + > + On x86_64, use "crashkernel=X" to select a region under 4G first, and > + fall back to reserve region above 4G. > + We can also use "crashkernel=X,high" to select a region above 4G, which > + also tries to allocate at least 256M below 4G automatically and > + "crashkernel=Y,low" can be used to allocate specified size low memory. > + Use "crashkernel=Y@X" if you really have to reserve memory from specified > + start address X. > > On ppc64, use "crashkernel=128M@32M". > > @@ -316,8 +324,15 @@ Boot into System Kernel > kernel will automatically locate the crash kernel image within the > first 512MB of RAM if X is not given. > > - On arm64, use "crashkernel=Y[@X]". Note that the start address of > - the kernel, X if explicitly specified, must be aligned to 2MiB (0x200000). > + On arm64, use "crashkernel=X" to try low allocation in ZONE_DMA, and > + fall back to high allocation if it fails. And go for high allocation > + directly if the required size is too large. If crash_base is outside > + ZONE_DMA, try to allocate at least 256M in ZONE_DMA automatically. > + "crashkernel=Y,low" can be used to allocate specified size low memory. > + For non-RPi4 platforms, change ZONE_DMA memtioned above to ZONE_DMA32. > + Use "crashkernel=Y@X" if you really have to reserve memory from > + specified start address X. Note that the start address of the kernel, > + X if explicitly specified, must be aligned to 2MiB (0x200000). > > Load the Dump-capture Kernel > ============================ > diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt > index fb95fad81c79..d1b6016850d6 100644 > --- a/Documentation/admin-guide/kernel-parameters.txt > +++ b/Documentation/admin-guide/kernel-parameters.txt > @@ -722,6 +722,10 @@ > [KNL, x86_64] select a region under 4G first, and > fall back to reserve region above 4G when '@offset' > hasn't been specified. > + [KNL, arm64] Try low allocation in ZONE_DMA, fall back > + to high allocation if it fails when '@offset' hasn't been > + specified. For non-RPi4 platforms, change ZONE_DMA to > + ZONE_DMA32. > See Documentation/admin-guide/kdump/kdump.rst for further details. > > crashkernel=range1:size1[,range2:size2,...][@offset] > @@ -746,13 +750,16 @@ > requires at least 64M+32K low memory, also enough extra > low memory is needed to make sure DMA buffers for 32-bit > devices won't run out. Kernel would try to allocate at > - at least 256M below 4G automatically. > + least 256M below 4G automatically. > This one let user to specify own low range under 4G > for second kernel instead. > 0: to disable low allocation. > It will be ignored when crashkernel=X,high is not used > or memory reserved is below 4G. > - > + [KNL, arm64] range under 4G. > + This one let user to specify a low range in ZONE_DMA for > + crash dump kernel. For non-RPi4 platforms, change ZONE_DMA > + to ZONE_DMA32. > cryptomgr.notests > [KNL] Disable crypto self-tests > > -- > 2.20.1 > Hi Chen, Previously I remember we talked about to use similar logic as X86, but I remember you mentioned on some arm64 platform there could be no low memory at all. Is this not a problem now for the fallback? Just be curious, thanks for the update, for the common part looks good. Acked-by: Dave Young <dyoung@redhat.com> Thanks Dave
On 2020/8/8 18:02, Dave Young wrote: > On 08/01/20 at 09:08pm, Chen Zhou wrote: >> Now the behavior of crashkernel=X has been changed, which tries low >> allocation in ZONE_DMA, and fall back to high allocation if it fails. >> >> If requized size X is too large and leads to very little free memory >> in ZONE_DMA after low allocation, the system may not work well. >> So add a threshold and go for high allocation directly if the required >> size is too large. The threshold is set as the half of low memory. >> >> If crash_base is outside ZONE_DMA, try to allocate at least 256M in >> ZONE_DMA automatically. "crashkernel=Y,low" can be used to allocate >> specified size low memory. For non-RPi4 platforms, change ZONE_DMA >> memtioned above to ZONE_DMA32. >> >> So update the Documentation. >> >> Signed-off-by: Chen Zhou <chenzhou10@huawei.com> >> --- >> Documentation/admin-guide/kdump/kdump.rst | 21 ++++++++++++++++--- >> .../admin-guide/kernel-parameters.txt | 11 ++++++++-- >> 2 files changed, 27 insertions(+), 5 deletions(-) >> >> diff --git a/Documentation/admin-guide/kdump/kdump.rst b/Documentation/admin-guide/kdump/kdump.rst >> index 2da65fef2a1c..4b58f97351d5 100644 >> --- a/Documentation/admin-guide/kdump/kdump.rst >> +++ b/Documentation/admin-guide/kdump/kdump.rst >> @@ -299,7 +299,15 @@ Boot into System Kernel >> "crashkernel=64M@16M" tells the system kernel to reserve 64 MB of memory >> starting at physical address 0x01000000 (16MB) for the dump-capture kernel. >> >> - On x86 and x86_64, use "crashkernel=64M@16M". >> + On x86 use "crashkernel=64M@16M". >> + >> + On x86_64, use "crashkernel=X" to select a region under 4G first, and >> + fall back to reserve region above 4G. >> + We can also use "crashkernel=X,high" to select a region above 4G, which >> + also tries to allocate at least 256M below 4G automatically and >> + "crashkernel=Y,low" can be used to allocate specified size low memory. >> + Use "crashkernel=Y@X" if you really have to reserve memory from specified >> + start address X. >> >> On ppc64, use "crashkernel=128M@32M". >> >> @@ -316,8 +324,15 @@ Boot into System Kernel >> kernel will automatically locate the crash kernel image within the >> first 512MB of RAM if X is not given. >> >> - On arm64, use "crashkernel=Y[@X]". Note that the start address of >> - the kernel, X if explicitly specified, must be aligned to 2MiB (0x200000). >> + On arm64, use "crashkernel=X" to try low allocation in ZONE_DMA, and >> + fall back to high allocation if it fails. And go for high allocation >> + directly if the required size is too large. If crash_base is outside >> + ZONE_DMA, try to allocate at least 256M in ZONE_DMA automatically. >> + "crashkernel=Y,low" can be used to allocate specified size low memory. >> + For non-RPi4 platforms, change ZONE_DMA memtioned above to ZONE_DMA32. >> + Use "crashkernel=Y@X" if you really have to reserve memory from >> + specified start address X. Note that the start address of the kernel, >> + X if explicitly specified, must be aligned to 2MiB (0x200000). >> >> Load the Dump-capture Kernel >> ============================ >> diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt >> index fb95fad81c79..d1b6016850d6 100644 >> --- a/Documentation/admin-guide/kernel-parameters.txt >> +++ b/Documentation/admin-guide/kernel-parameters.txt >> @@ -722,6 +722,10 @@ >> [KNL, x86_64] select a region under 4G first, and >> fall back to reserve region above 4G when '@offset' >> hasn't been specified. >> + [KNL, arm64] Try low allocation in ZONE_DMA, fall back >> + to high allocation if it fails when '@offset' hasn't been >> + specified. For non-RPi4 platforms, change ZONE_DMA to >> + ZONE_DMA32. >> See Documentation/admin-guide/kdump/kdump.rst for further details. >> >> crashkernel=range1:size1[,range2:size2,...][@offset] >> @@ -746,13 +750,16 @@ >> requires at least 64M+32K low memory, also enough extra >> low memory is needed to make sure DMA buffers for 32-bit >> devices won't run out. Kernel would try to allocate at >> - at least 256M below 4G automatically. >> + least 256M below 4G automatically. >> This one let user to specify own low range under 4G >> for second kernel instead. >> 0: to disable low allocation. >> It will be ignored when crashkernel=X,high is not used >> or memory reserved is below 4G. >> - >> + [KNL, arm64] range under 4G. >> + This one let user to specify a low range in ZONE_DMA for >> + crash dump kernel. For non-RPi4 platforms, change ZONE_DMA >> + to ZONE_DMA32. >> cryptomgr.notests >> [KNL] Disable crypto self-tests >> >> -- >> 2.20.1 >> > Hi Chen, > > Previously I remember we talked about to use similar logic as X86, but I > remember you mentioned on some arm64 platform there could be no low > memory at all. Is this not a problem now for the fallback? Just be > curious, thanks for the update, for the common part looks good. Hi Dave, Did you mean this discuss: https://lkml.org/lkml/2019/12/27/122? This is about the different implementation instead of no low memory in arm64. On arm64 platform, if there is no low memory, system will boot fail. Thanks, Chen Zhou > > Acked-by: Dave Young <dyoung@redhat.com> > > Thanks > Dave > > > . >
On 08/10/20 at 11:28am, chenzhou wrote: > On 2020/8/8 18:02, Dave Young wrote: > > On 08/01/20 at 09:08pm, Chen Zhou wrote: > >> Now the behavior of crashkernel=X has been changed, which tries low > >> allocation in ZONE_DMA, and fall back to high allocation if it fails. > >> > >> If requized size X is too large and leads to very little free memory > >> in ZONE_DMA after low allocation, the system may not work well. > >> So add a threshold and go for high allocation directly if the required > >> size is too large. The threshold is set as the half of low memory. > >> > >> If crash_base is outside ZONE_DMA, try to allocate at least 256M in > >> ZONE_DMA automatically. "crashkernel=Y,low" can be used to allocate > >> specified size low memory. For non-RPi4 platforms, change ZONE_DMA > >> memtioned above to ZONE_DMA32. > >> > >> So update the Documentation. > >> > >> Signed-off-by: Chen Zhou <chenzhou10@huawei.com> > >> --- > >> Documentation/admin-guide/kdump/kdump.rst | 21 ++++++++++++++++--- > >> .../admin-guide/kernel-parameters.txt | 11 ++++++++-- > >> 2 files changed, 27 insertions(+), 5 deletions(-) > >> > >> diff --git a/Documentation/admin-guide/kdump/kdump.rst b/Documentation/admin-guide/kdump/kdump.rst > >> index 2da65fef2a1c..4b58f97351d5 100644 > >> --- a/Documentation/admin-guide/kdump/kdump.rst > >> +++ b/Documentation/admin-guide/kdump/kdump.rst > >> @@ -299,7 +299,15 @@ Boot into System Kernel > >> "crashkernel=64M@16M" tells the system kernel to reserve 64 MB of memory > >> starting at physical address 0x01000000 (16MB) for the dump-capture kernel. > >> > >> - On x86 and x86_64, use "crashkernel=64M@16M". > >> + On x86 use "crashkernel=64M@16M". > >> + > >> + On x86_64, use "crashkernel=X" to select a region under 4G first, and > >> + fall back to reserve region above 4G. > >> + We can also use "crashkernel=X,high" to select a region above 4G, which > >> + also tries to allocate at least 256M below 4G automatically and > >> + "crashkernel=Y,low" can be used to allocate specified size low memory. > >> + Use "crashkernel=Y@X" if you really have to reserve memory from specified > >> + start address X. > >> > >> On ppc64, use "crashkernel=128M@32M". > >> > >> @@ -316,8 +324,15 @@ Boot into System Kernel > >> kernel will automatically locate the crash kernel image within the > >> first 512MB of RAM if X is not given. > >> > >> - On arm64, use "crashkernel=Y[@X]". Note that the start address of > >> - the kernel, X if explicitly specified, must be aligned to 2MiB (0x200000). > >> + On arm64, use "crashkernel=X" to try low allocation in ZONE_DMA, and > >> + fall back to high allocation if it fails. And go for high allocation > >> + directly if the required size is too large. If crash_base is outside > >> + ZONE_DMA, try to allocate at least 256M in ZONE_DMA automatically. > >> + "crashkernel=Y,low" can be used to allocate specified size low memory. > >> + For non-RPi4 platforms, change ZONE_DMA memtioned above to ZONE_DMA32. > >> + Use "crashkernel=Y@X" if you really have to reserve memory from > >> + specified start address X. Note that the start address of the kernel, > >> + X if explicitly specified, must be aligned to 2MiB (0x200000). > >> > >> Load the Dump-capture Kernel > >> ============================ > >> diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt > >> index fb95fad81c79..d1b6016850d6 100644 > >> --- a/Documentation/admin-guide/kernel-parameters.txt > >> +++ b/Documentation/admin-guide/kernel-parameters.txt > >> @@ -722,6 +722,10 @@ > >> [KNL, x86_64] select a region under 4G first, and > >> fall back to reserve region above 4G when '@offset' > >> hasn't been specified. > >> + [KNL, arm64] Try low allocation in ZONE_DMA, fall back > >> + to high allocation if it fails when '@offset' hasn't been > >> + specified. For non-RPi4 platforms, change ZONE_DMA to > >> + ZONE_DMA32. > >> See Documentation/admin-guide/kdump/kdump.rst for further details. > >> > >> crashkernel=range1:size1[,range2:size2,...][@offset] > >> @@ -746,13 +750,16 @@ > >> requires at least 64M+32K low memory, also enough extra > >> low memory is needed to make sure DMA buffers for 32-bit > >> devices won't run out. Kernel would try to allocate at > >> - at least 256M below 4G automatically. > >> + least 256M below 4G automatically. > >> This one let user to specify own low range under 4G > >> for second kernel instead. > >> 0: to disable low allocation. > >> It will be ignored when crashkernel=X,high is not used > >> or memory reserved is below 4G. > >> - > >> + [KNL, arm64] range under 4G. > >> + This one let user to specify a low range in ZONE_DMA for > >> + crash dump kernel. For non-RPi4 platforms, change ZONE_DMA > >> + to ZONE_DMA32. > >> cryptomgr.notests > >> [KNL] Disable crypto self-tests > >> > >> -- > >> 2.20.1 > >> > > Hi Chen, > > > > Previously I remember we talked about to use similar logic as X86, but I > > remember you mentioned on some arm64 platform there could be no low > > memory at all. Is this not a problem now for the fallback? Just be > > curious, thanks for the update, for the common part looks good. > Hi Dave, > > Did you mean this discuss: https://lkml.org/lkml/2019/12/27/122? > This is about the different implementation instead of no low memory in arm64. > > On arm64 platform, if there is no low memory, system will boot fail. James mentioned some systems have no memory below 4G, if I understand it correctly that means they can boot without low mem. Anyway I like the new implementation in this series if it is good enough for arm64 people. > > Thanks, > Chen Zhou > > > > Acked-by: Dave Young <dyoung@redhat.com> > > > > Thanks > > Dave > > > > > > . > > > Thanks Dave
Hi, > > Previously I remember we talked about to use similar logic as X86, but I > > remember you mentioned on some arm64 platform there could be no low > > memory at all. Is this not a problem now for the fallback? Just be > > curious, thanks for the update, for the common part looks good. > Hi Dave, > > Did you mean this discuss: https://lkml.org/lkml/2019/12/27/122? I meant about this reply instead :) https://lkml.org/lkml/2020/1/16/616 Thanks Dave
On 2020/8/10 14:03, Dave Young wrote: > Hi, > >>> Previously I remember we talked about to use similar logic as X86, but I >>> remember you mentioned on some arm64 platform there could be no low >>> memory at all. Is this not a problem now for the fallback? Just be >>> curious, thanks for the update, for the common part looks good. >> Hi Dave, >> >> Did you mean this discuss: https://lkml.org/lkml/2019/12/27/122? > I meant about this reply instead :) > https://lkml.org/lkml/2020/1/16/616 Hi Dave, Sorry for not repley in time, I was on holiday last week. The platform James mentioned may exist for which have no devices and need no low memory. For our arm64 server platform, there are some devices and need low memory. I got it. For the platform with no low memory, reserving crashkernel will always fail. How about like this: diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c index a8e34d97a894..4df18c7ea438 100644 --- a/arch/arm64/mm/init.c +++ b/arch/arm64/mm/init.c @@ -147,7 +147,7 @@ static void __init reserve_crashkernel(void) } memblock_reserve(crash_base, crash_size); - if (crash_base >= CRASH_ADDR_LOW_MAX) { + if (memstart_addr < CRASH_ADDR_LOW_MAX && crash_base >= CRASH_ADDR_LOW_MAX) { const char *rename = "Crash kernel (low)"; if (reserve_crashkernel_low()) { Thanks, Chen Zhou > > Thanks > Dave > > > . >
On 08/18/20 at 03:07pm, chenzhou wrote: > > > On 2020/8/10 14:03, Dave Young wrote: > > Hi, > > > >>> Previously I remember we talked about to use similar logic as X86, but I > >>> remember you mentioned on some arm64 platform there could be no low > >>> memory at all. Is this not a problem now for the fallback? Just be > >>> curious, thanks for the update, for the common part looks good. > >> Hi Dave, > >> > >> Did you mean this discuss: https://lkml.org/lkml/2019/12/27/122? > > I meant about this reply instead :) > > https://lkml.org/lkml/2020/1/16/616 > Hi Dave, > > Sorry for not repley in time, I was on holiday last week. Hi, no problem, thanks for following up. > > The platform James mentioned may exist for which have no devices and need no low memory. > For our arm64 server platform, there are some devices and need low memory. > > I got it. For the platform with no low memory, reserving crashkernel will always fail. > How about like this: I think the question should leave to Catalin or James, I have no suggestion about this:) > > diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c > index a8e34d97a894..4df18c7ea438 100644 > --- a/arch/arm64/mm/init.c > +++ b/arch/arm64/mm/init.c > @@ -147,7 +147,7 @@ static void __init reserve_crashkernel(void) > } > memblock_reserve(crash_base, crash_size); > > - if (crash_base >= CRASH_ADDR_LOW_MAX) { > + if (memstart_addr < CRASH_ADDR_LOW_MAX && crash_base >= CRASH_ADDR_LOW_MAX) { > const char *rename = "Crash kernel (low)"; > > if (reserve_crashkernel_low()) { > > > Thanks, > Chen Zhou > > > > > Thanks > > Dave > > > > > > . > > > >
Hi Catalin, On 2020/8/19 20:03, Dave Young wrote: > On 08/18/20 at 03:07pm, chenzhou wrote: >> >> On 2020/8/10 14:03, Dave Young wrote: >>> Hi, >>> >>>>> Previously I remember we talked about to use similar logic as X86, but I >>>>> remember you mentioned on some arm64 platform there could be no low >>>>> memory at all. Is this not a problem now for the fallback? Just be >>>>> curious, thanks for the update, for the common part looks good. >>>> Hi Dave, >>>> >>>> Did you mean this discuss: https://lkml.org/lkml/2019/12/27/122? >>> I meant about this reply instead :) >>> https://lkml.org/lkml/2020/1/16/616 >> Hi Dave, >> >> Sorry for not repley in time, I was on holiday last week. > Hi, no problem, thanks for following up. > >> The platform James mentioned may exist for which have no devices and need no low memory. >> For our arm64 server platform, there are some devices and need low memory. >> >> I got it. For the platform with no low memory, reserving crashkernel will always fail. >> How about like this: > I think the question should leave to Catalin or James, I have no > suggestion about this:) Any suggestions about this? Thanks, Chen Zhou > >> diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c >> index a8e34d97a894..4df18c7ea438 100644 >> --- a/arch/arm64/mm/init.c >> +++ b/arch/arm64/mm/init.c >> @@ -147,7 +147,7 @@ static void __init reserve_crashkernel(void) >> } >> memblock_reserve(crash_base, crash_size); >> >> - if (crash_base >= CRASH_ADDR_LOW_MAX) { >> + if (memstart_addr < CRASH_ADDR_LOW_MAX && crash_base >= CRASH_ADDR_LOW_MAX) { >> const char *rename = "Crash kernel (low)"; >> >> if (reserve_crashkernel_low()) { >> >> >> Thanks, >> Chen Zhou >> >>> Thanks >>> Dave >>> >>> >>> . >>> >> > > . >
On Tue, Aug 18, 2020 at 03:07:04PM +0800, chenzhou wrote: > On 2020/8/10 14:03, Dave Young wrote: > >>> Previously I remember we talked about to use similar logic as X86, but I > >>> remember you mentioned on some arm64 platform there could be no low > >>> memory at all. Is this not a problem now for the fallback? Just be > >>> curious, thanks for the update, for the common part looks good. > >> > >> Did you mean this discuss: https://lkml.org/lkml/2019/12/27/122? > > I meant about this reply instead :) > > https://lkml.org/lkml/2020/1/16/616 > > Sorry for not repley in time, I was on holiday last week. > > The platform James mentioned may exist for which have no devices and > need no low memory. If there is no memory below 4GB, the arm64 kernel assumes that the 32-bit devices will have some DMA offsets shifting the addresses to the bottom of the available RAM. So even if RAM starts above 4GB, we ZONE_DMA32 will be allocated in the bottom 4GB of the high memory (and if the hardware designers forgot to shift those DMA accesses, we don't have to support the platform ;)). So the arm64 notion of low memory differs slightly from the x86 one.
On Tue, Aug 18, 2020 at 03:07:04PM +0800, chenzhou wrote: > diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c > index a8e34d97a894..4df18c7ea438 100644 > --- a/arch/arm64/mm/init.c > +++ b/arch/arm64/mm/init.c > @@ -147,7 +147,7 @@ static void __init reserve_crashkernel(void) > } > memblock_reserve(crash_base, crash_size); > > - if (crash_base >= CRASH_ADDR_LOW_MAX) { > + if (memstart_addr < CRASH_ADDR_LOW_MAX && crash_base >= CRASH_ADDR_LOW_MAX) { > const char *rename = "Crash kernel (low)"; Since CRASH_ADDR_LOW_MAX is defined as arm64_dma32_phys_limit and such limit is always greater than memstart_addr, this additional check doesn't do anything. See my other reply on how ZONE_DMA32 is created on arm64.
On Sat, Aug 01, 2020 at 09:08:56PM +0800, Chen Zhou wrote: > diff --git a/Documentation/admin-guide/kdump/kdump.rst b/Documentation/admin-guide/kdump/kdump.rst > index 2da65fef2a1c..4b58f97351d5 100644 > --- a/Documentation/admin-guide/kdump/kdump.rst > +++ b/Documentation/admin-guide/kdump/kdump.rst > @@ -299,7 +299,15 @@ Boot into System Kernel > "crashkernel=64M@16M" tells the system kernel to reserve 64 MB of memory > starting at physical address 0x01000000 (16MB) for the dump-capture kernel. > > - On x86 and x86_64, use "crashkernel=64M@16M". > + On x86 use "crashkernel=64M@16M". > + > + On x86_64, use "crashkernel=X" to select a region under 4G first, and > + fall back to reserve region above 4G. > + We can also use "crashkernel=X,high" to select a region above 4G, which > + also tries to allocate at least 256M below 4G automatically and > + "crashkernel=Y,low" can be used to allocate specified size low memory. > + Use "crashkernel=Y@X" if you really have to reserve memory from specified > + start address X. > > On ppc64, use "crashkernel=128M@32M". > > @@ -316,8 +324,15 @@ Boot into System Kernel > kernel will automatically locate the crash kernel image within the > first 512MB of RAM if X is not given. > > - On arm64, use "crashkernel=Y[@X]". Note that the start address of > - the kernel, X if explicitly specified, must be aligned to 2MiB (0x200000). > + On arm64, use "crashkernel=X" to try low allocation in ZONE_DMA, and > + fall back to high allocation if it fails. And go for high allocation > + directly if the required size is too large. If crash_base is outside I wouldn't mention crash_base in the admin guide. That's an implementation detail really and admins are not supposed to read the source code to make sense of the documentation. ZONE_DMA is also a kernel internal, so you'd need to define what it is for arm64. At least the DMA and DMA32 zones are printed during kernel boot. > + ZONE_DMA, try to allocate at least 256M in ZONE_DMA automatically. > + "crashkernel=Y,low" can be used to allocate specified size low memory. > + For non-RPi4 platforms, change ZONE_DMA memtioned above to ZONE_DMA32. > + Use "crashkernel=Y@X" if you really have to reserve memory from > + specified start address X. Note that the start address of the kernel, > + X if explicitly specified, must be aligned to 2MiB (0x200000).
On 2020/9/3 1:13, Catalin Marinas wrote: > On Sat, Aug 01, 2020 at 09:08:56PM +0800, Chen Zhou wrote: >> diff --git a/Documentation/admin-guide/kdump/kdump.rst b/Documentation/admin-guide/kdump/kdump.rst >> index 2da65fef2a1c..4b58f97351d5 100644 >> --- a/Documentation/admin-guide/kdump/kdump.rst >> +++ b/Documentation/admin-guide/kdump/kdump.rst >> @@ -299,7 +299,15 @@ Boot into System Kernel >> "crashkernel=64M@16M" tells the system kernel to reserve 64 MB of memory >> starting at physical address 0x01000000 (16MB) for the dump-capture kernel. >> >> - On x86 and x86_64, use "crashkernel=64M@16M". >> + On x86 use "crashkernel=64M@16M". >> + >> + On x86_64, use "crashkernel=X" to select a region under 4G first, and >> + fall back to reserve region above 4G. >> + We can also use "crashkernel=X,high" to select a region above 4G, which >> + also tries to allocate at least 256M below 4G automatically and >> + "crashkernel=Y,low" can be used to allocate specified size low memory. >> + Use "crashkernel=Y@X" if you really have to reserve memory from specified >> + start address X. >> >> On ppc64, use "crashkernel=128M@32M". >> >> @@ -316,8 +324,15 @@ Boot into System Kernel >> kernel will automatically locate the crash kernel image within the >> first 512MB of RAM if X is not given. >> >> - On arm64, use "crashkernel=Y[@X]". Note that the start address of >> - the kernel, X if explicitly specified, must be aligned to 2MiB (0x200000). >> + On arm64, use "crashkernel=X" to try low allocation in ZONE_DMA, and >> + fall back to high allocation if it fails. And go for high allocation >> + directly if the required size is too large. If crash_base is outside > I wouldn't mention crash_base in the admin guide. That's an > implementation detail really and admins are not supposed to read the > source code to make sense of the documentation. ZONE_DMA is also a > kernel internal, so you'd need to define what it is for arm64. At least > the DMA and DMA32 zones are printed during kernel boot. Ok, i will fix this in next version. > >> + ZONE_DMA, try to allocate at least 256M in ZONE_DMA automatically. >> + "crashkernel=Y,low" can be used to allocate specified size low memory. >> + For non-RPi4 platforms, change ZONE_DMA memtioned above to ZONE_DMA32. >> + Use "crashkernel=Y@X" if you really have to reserve memory from >> + specified start address X. Note that the start address of the kernel, >> + X if explicitly specified, must be aligned to 2MiB (0x200000).
diff --git a/Documentation/admin-guide/kdump/kdump.rst b/Documentation/admin-guide/kdump/kdump.rst index 2da65fef2a1c..4b58f97351d5 100644 --- a/Documentation/admin-guide/kdump/kdump.rst +++ b/Documentation/admin-guide/kdump/kdump.rst @@ -299,7 +299,15 @@ Boot into System Kernel "crashkernel=64M@16M" tells the system kernel to reserve 64 MB of memory starting at physical address 0x01000000 (16MB) for the dump-capture kernel. - On x86 and x86_64, use "crashkernel=64M@16M". + On x86 use "crashkernel=64M@16M". + + On x86_64, use "crashkernel=X" to select a region under 4G first, and + fall back to reserve region above 4G. + We can also use "crashkernel=X,high" to select a region above 4G, which + also tries to allocate at least 256M below 4G automatically and + "crashkernel=Y,low" can be used to allocate specified size low memory. + Use "crashkernel=Y@X" if you really have to reserve memory from specified + start address X. On ppc64, use "crashkernel=128M@32M". @@ -316,8 +324,15 @@ Boot into System Kernel kernel will automatically locate the crash kernel image within the first 512MB of RAM if X is not given. - On arm64, use "crashkernel=Y[@X]". Note that the start address of - the kernel, X if explicitly specified, must be aligned to 2MiB (0x200000). + On arm64, use "crashkernel=X" to try low allocation in ZONE_DMA, and + fall back to high allocation if it fails. And go for high allocation + directly if the required size is too large. If crash_base is outside + ZONE_DMA, try to allocate at least 256M in ZONE_DMA automatically. + "crashkernel=Y,low" can be used to allocate specified size low memory. + For non-RPi4 platforms, change ZONE_DMA memtioned above to ZONE_DMA32. + Use "crashkernel=Y@X" if you really have to reserve memory from + specified start address X. Note that the start address of the kernel, + X if explicitly specified, must be aligned to 2MiB (0x200000). Load the Dump-capture Kernel ============================ diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index fb95fad81c79..d1b6016850d6 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -722,6 +722,10 @@ [KNL, x86_64] select a region under 4G first, and fall back to reserve region above 4G when '@offset' hasn't been specified. + [KNL, arm64] Try low allocation in ZONE_DMA, fall back + to high allocation if it fails when '@offset' hasn't been + specified. For non-RPi4 platforms, change ZONE_DMA to + ZONE_DMA32. See Documentation/admin-guide/kdump/kdump.rst for further details. crashkernel=range1:size1[,range2:size2,...][@offset] @@ -746,13 +750,16 @@ requires at least 64M+32K low memory, also enough extra low memory is needed to make sure DMA buffers for 32-bit devices won't run out. Kernel would try to allocate at - at least 256M below 4G automatically. + least 256M below 4G automatically. This one let user to specify own low range under 4G for second kernel instead. 0: to disable low allocation. It will be ignored when crashkernel=X,high is not used or memory reserved is below 4G. - + [KNL, arm64] range under 4G. + This one let user to specify a low range in ZONE_DMA for + crash dump kernel. For non-RPi4 platforms, change ZONE_DMA + to ZONE_DMA32. cryptomgr.notests [KNL] Disable crypto self-tests
Now the behavior of crashkernel=X has been changed, which tries low allocation in ZONE_DMA, and fall back to high allocation if it fails. If requized size X is too large and leads to very little free memory in ZONE_DMA after low allocation, the system may not work well. So add a threshold and go for high allocation directly if the required size is too large. The threshold is set as the half of low memory. If crash_base is outside ZONE_DMA, try to allocate at least 256M in ZONE_DMA automatically. "crashkernel=Y,low" can be used to allocate specified size low memory. For non-RPi4 platforms, change ZONE_DMA memtioned above to ZONE_DMA32. So update the Documentation. Signed-off-by: Chen Zhou <chenzhou10@huawei.com> --- Documentation/admin-guide/kdump/kdump.rst | 21 ++++++++++++++++--- .../admin-guide/kernel-parameters.txt | 11 ++++++++-- 2 files changed, 27 insertions(+), 5 deletions(-)