[PATCH] Add support for soft reserved memory range

Jacek Tomaka jacekt at dug.com
Fri Aug 23 19:06:48 PDT 2024


A friendly ping.

On Wed, Aug 14, 2024 at 12:33 AM Jacek Tomaka <jacekt at dugeo.com> wrote:
>
> Essentially catch up with e820 related changes in the kernel.
> Intel Sapphire Rappids MAX has high bandwidth memory which is
> precious resource that is better not allocated by the kernel.
>
> Userspace later can enable soft reserved range using daxctl.
>
> Signed-off-by: Jacek Tomaka <jacek.tomaka at poczta.fm>
> ---
>  include/x86/x86-linux.h               | 2 ++
>  kexec/arch/i386/crashdump-x86.c       | 7 +++++++
>  kexec/arch/i386/kexec-multiboot-x86.c | 1 +
>  kexec/arch/i386/kexec-x86-common.c    | 5 +++++
>  kexec/arch/i386/x86-linux-setup.c     | 3 +++
>  kexec/firmware_memmap.c               | 2 ++
>  kexec/kexec.h                         | 1 +
>  7 files changed, 21 insertions(+)
>
> diff --git a/include/x86/x86-linux.h b/include/x86/x86-linux.h
> index 9646102835..fbde93df94 100644
> --- a/include/x86/x86-linux.h
> +++ b/include/x86/x86-linux.h
> @@ -23,6 +23,8 @@ struct e820entry {
>  #define E820_NVS       4
>  #define E820_PMEM       7
>  #define E820_PRAM       12
> +#define E820_SOFT_RESERVED 0xefffffff
> +
>  } __attribute__((packed));
>  #endif
>
> diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
> index a01031e570..49108b2032 100644
> --- a/kexec/arch/i386/crashdump-x86.c
> +++ b/kexec/arch/i386/crashdump-x86.c
> @@ -288,6 +288,10 @@ static int get_crash_memory_ranges(struct memory_range **range, int *ranges,
>                         type = RANGE_RESERVED;
>                 } else if (memcmp(str, "Reserved\n", 9) == 0) {
>                         type = RANGE_RESERVED;
> +               } else if (memcmp(str, "soft reserved\n", 14) == 0 ) {
> +                       type = RANGE_SOFT_RESERVED;
> +               } else if (memcmp(str, "Soft Reserved\n", 14) == 0 ) {
> +                       type = RANGE_SOFT_RESERVED;
>                 } else if (memcmp(str, "GART\n", 5) == 0) {
>                         gart_start = start;
>                         gart_end = end;
> @@ -615,6 +619,8 @@ static void cmdline_add_memmap_internal(char *cmdline, unsigned long startk,
>                 strcat (str_mmap, "K@");
>         else if (type == RANGE_RESERVED)
>                 strcat (str_mmap, "K$");
> +       else if (type == RANGE_SOFT_RESERVED)
> +               strcat (str_mmap, "K*");
>         else if (type == RANGE_ACPI || type == RANGE_ACPI_NVS)
>                 strcat (str_mmap, "K#");
>         else if (type == RANGE_PRAM)
> @@ -985,6 +991,7 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
>                 if ( !( mem_range[i].type == RANGE_ACPI
>                         || mem_range[i].type == RANGE_ACPI_NVS
>                         || mem_range[i].type == RANGE_RESERVED
> +                       || mem_range[i].type == RANGE_SOFT_RESERVED
>                         || mem_range[i].type == RANGE_PMEM
>                         || mem_range[i].type == RANGE_PRAM))
>                         continue;
> diff --git a/kexec/arch/i386/kexec-multiboot-x86.c b/kexec/arch/i386/kexec-multiboot-x86.c
> index 33c885a2fa..49d57cb5ae 100644
> --- a/kexec/arch/i386/kexec-multiboot-x86.c
> +++ b/kexec/arch/i386/kexec-multiboot-x86.c
> @@ -379,6 +379,7 @@ int multiboot_x86_load(int argc, char **argv, const char *buf, off_t len,
>                         mmap[i].Type = 4;
>                         break;
>                 case RANGE_RESERVED:
> +               case RANGE_SOFT_RESERVED:
>                 default:
>                         mmap[i].Type = 2;  /* Not RAM (reserved) */
>                 }
> diff --git a/kexec/arch/i386/kexec-x86-common.c b/kexec/arch/i386/kexec-x86-common.c
> index ffc95a9e43..116c4f4fd3 100644
> --- a/kexec/arch/i386/kexec-x86-common.c
> +++ b/kexec/arch/i386/kexec-x86-common.c
> @@ -99,6 +99,9 @@ static int get_memory_ranges_proc_iomem(struct memory_range **range, int *ranges
>                 else if (strncasecmp(str, "reserved\n", 9) == 0) {
>                         type = RANGE_RESERVED;
>                 }
> +               else if (strncasecmp(str, "soft reserved\n", 9) == 0) {
> +                       type = RANGE_SOFT_RESERVED;
> +               }
>                 else if (memcmp(str, "ACPI Tables\n", 12) == 0) {
>                         type = RANGE_ACPI;
>                 }
> @@ -170,6 +173,8 @@ unsigned xen_e820_to_kexec_type(uint32_t type)
>                         return RANGE_PMEM;
>                 case E820_PRAM:
>                         return RANGE_PRAM;
> +               case E820_SOFT_RESERVED;
> +                       return RANGE_SOFT_RESERVED;
>                 case E820_RESERVED:
>                 default:
>                         return RANGE_RESERVED;
> diff --git a/kexec/arch/i386/x86-linux-setup.c b/kexec/arch/i386/x86-linux-setup.c
> index 73251b9339..afc83fe729 100644
> --- a/kexec/arch/i386/x86-linux-setup.c
> +++ b/kexec/arch/i386/x86-linux-setup.c
> @@ -755,6 +755,9 @@ static void add_e820_map_from_mr(struct x86_linux_param_header *real_mode,
>                         case RANGE_PRAM:
>                                 e820[i].type = E820_PRAM;
>                                 break;
> +                       case RANGE_SOFT_RESERVED:
> +                               e820[i].type = E820_SOFT_RESERVED;
> +                               break;
>                         default:
>                         case RANGE_RESERVED:
>                                 e820[i].type = E820_RESERVED;
> diff --git a/kexec/firmware_memmap.c b/kexec/firmware_memmap.c
> index 457c3dc9a6..fa0c22140a 100644
> --- a/kexec/firmware_memmap.c
> +++ b/kexec/firmware_memmap.c
> @@ -182,6 +182,8 @@ static int parse_memmap_entry(const char *entry, struct memory_range *range)
>                 range->type = RANGE_RESERVED;
>         else if (strcmp(type, "Reserved") == 0)
>                 range->type = RANGE_RESERVED;
> +        else if (strcmp(type, "Soft Reserved") == 0)
> +                range->type = RANGE_SOFT_RESERVED;
>         else if (strcmp(type, "Unknown E820 type") == 0)
>                 range->type = RANGE_RESERVED;
>         else if (strcmp(type, "ACPI Non-volatile Storage") == 0)
> diff --git a/kexec/kexec.h b/kexec/kexec.h
> index 31c323f674..dbb27a7607 100644
> --- a/kexec/kexec.h
> +++ b/kexec/kexec.h
> @@ -139,6 +139,7 @@ struct memory_range {
>  #define RANGE_UNCACHED 4
>  #define RANGE_PMEM             6
>  #define RANGE_PRAM             11
> +#define RANGE_SOFT_RESERVED 0xefffffff
>  };
>
>  struct memory_ranges {
> --
> 2.17.0
>


-- 
Jacek Tomaka
Principal Software Engineer

76 Kings Park Road
West Perth 6005 WA, Australia
tel +61 8 9287 4143
jacekt at dug.com
www.dug.com
www.dug.comwww.dug.com



More information about the kexec mailing list