| ======================================= | |
| crashkernel memory reservation on arm64 | |
| ======================================= | |
| Author: Baoquan He <bhe@redhat.com> | |
| Kdump mechanism is used to capture a corrupted kernel vmcore so that | |
| it can be subsequently analyzed. In order to do this, a preliminarily | |
| reserved memory is needed to pre-load the kdump kernel and boot such | |
| kernel if corruption happens. | |
| That reserved memory for kdump is adapted to be able to minimally | |
| accommodate the kdump kernel and the user space programs needed for the | |
| vmcore collection. | |
| Kernel parameter | |
| ================ | |
| Through the kernel parameters below, memory can be reserved accordingly | |
| during the early stage of the first kernel booting so that a continuous | |
| large chunk of memomy can be found. The low memory reservation needs to | |
| be considered if the crashkernel is reserved from the high memory area. | |
| - crashkernel=size@offset | |
| - crashkernel=size | |
| - crashkernel=size,high crashkernel=size,low | |
| Low memory and high memory | |
| ========================== | |
| For kdump reservations, low memory is the memory area under a specific | |
| limit, usually decided by the accessible address bits of the DMA-capable | |
| devices needed by the kdump kernel to run. Those devices not related to | |
| vmcore dumping can be ignored. On arm64, the low memory upper bound is | |
| not fixed: it is 1G on the RPi4 platform but 4G on most other systems. | |
| On special kernels built with CONFIG_ZONE_(DMA|DMA32) disabled, the | |
| whole system RAM is low memory. Outside of the low memory described | |
| above, the rest of system RAM is considered high memory. | |
| Implementation | |
| ============== | |
| 1) crashkernel=size@offset | |
| -------------------------- | |
| The crashkernel memory must be reserved at the user-specified region or | |
| fail if already occupied. | |
| 2) crashkernel=size | |
| ------------------- | |
| The crashkernel memory region will be reserved in any available position | |
| according to the search order: | |
| Firstly, the kernel searches the low memory area for an available region | |
| with the specified size. | |
| If searching for low memory fails, the kernel falls back to searching | |
| the high memory area for an available region of the specified size. If | |
| the reservation in high memory succeeds, a default size reservation in | |
| the low memory will be done. Currently the default size is 128M, | |
| sufficient for the low memory needs of the kdump kernel. | |
| Note: crashkernel=size is the recommended option for crashkernel kernel | |
| reservations. The user would not need to know the system memory layout | |
| for a specific platform. | |
| 3) crashkernel=size,high crashkernel=size,low | |
| --------------------------------------------- | |
| crashkernel=size,(high|low) are an important supplement to | |
| crashkernel=size. They allows the user to specify how much memory needs | |
| to be allocated from the high memory and low memory respectively. On | |
| many systems the low memory is precious and crashkernel reservations | |
| from this area should be kept to a minimum. | |
| To reserve memory for crashkernel=size,high, searching is first | |
| attempted from the high memory region. If the reservation succeeds, the | |
| low memory reservation will be done subsequently. | |
| If reservation from the high memory failed, the kernel falls back to | |
| searching the low memory with the specified size in crashkernel=,high. | |
| If it succeeds, no further reservation for low memory is needed. | |
| Notes: | |
| - If crashkernel=,low is not specified, the default low memory | |
| reservation will be done automatically. | |
| - if crashkernel=0,low is specified, it means that the low memory | |
| reservation is omitted intentionally. |