diff mbox series

[v2] RISC-V: cmdline: Add support for 'memmap' parameter

Message ID 20240624123739.43604-1-cuiyunhui@bytedance.com (mailing list archive)
State New
Headers show
Series [v2] RISC-V: cmdline: Add support for 'memmap' parameter | expand

Checks

Context Check Description
conchuod/vmtest-for-next-PR success PR summary
conchuod/patch-1-test-1 success .github/scripts/patches/tests/build_rv32_defconfig.sh
conchuod/patch-1-test-2 success .github/scripts/patches/tests/build_rv64_clang_allmodconfig.sh
conchuod/patch-1-test-3 success .github/scripts/patches/tests/build_rv64_gcc_allmodconfig.sh
conchuod/patch-1-test-4 success .github/scripts/patches/tests/build_rv64_nommu_k210_defconfig.sh
conchuod/patch-1-test-5 success .github/scripts/patches/tests/build_rv64_nommu_virt_defconfig.sh
conchuod/patch-1-test-6 success .github/scripts/patches/tests/checkpatch.sh
conchuod/patch-1-test-7 success .github/scripts/patches/tests/dtb_warn_rv64.sh
conchuod/patch-1-test-8 success .github/scripts/patches/tests/header_inline.sh
conchuod/patch-1-test-9 success .github/scripts/patches/tests/kdoc.sh
conchuod/patch-1-test-10 success .github/scripts/patches/tests/module_param.sh
conchuod/patch-1-test-11 success .github/scripts/patches/tests/verify_fixes.sh
conchuod/patch-1-test-12 success .github/scripts/patches/tests/verify_signedoff.sh

Commit Message

Yunhui Cui June 24, 2024, 12:37 p.m. UTC
Add parsing of 'memmap' to use or reserve a specific region of memory.

Implement the following memmap variants:
- memmap=nn[KMG]@ss[KMG]: force usage of a specific region of memory;
- memmap=nn[KMG]$ss[KMG]: mark specified memory as reserved;

Signed-off-by: Yunhui Cui <cuiyunhui@bytedance.com>
---
 arch/riscv/mm/init.c | 46 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 46 insertions(+)

Comments

Charlie Jenkins July 3, 2024, 9:37 p.m. UTC | #1
On Mon, Jun 24, 2024 at 08:37:39PM +0800, Yunhui Cui wrote:
> Add parsing of 'memmap' to use or reserve a specific region of memory.
> 
> Implement the following memmap variants:
> - memmap=nn[KMG]@ss[KMG]: force usage of a specific region of memory;
> - memmap=nn[KMG]$ss[KMG]: mark specified memory as reserved;
> 
> Signed-off-by: Yunhui Cui <cuiyunhui@bytedance.com>
> ---
>  arch/riscv/mm/init.c | 46 ++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 46 insertions(+)
> 
> diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c
> index e3405e4b99af..8e1d93ae5cb2 100644
> --- a/arch/riscv/mm/init.c
> +++ b/arch/riscv/mm/init.c
> @@ -208,6 +208,52 @@ static int __init early_mem(char *p)
>  }
>  early_param("mem", early_mem);
>  
> +static void __init parse_memmap_one(char *p)
> +{
> +	char *oldp;
> +	unsigned long start_at, mem_size;
> +
> +	if (!p)
> +		return;
> +
> +	oldp = p;
> +	mem_size = memparse(p, &p);
> +	if (p == oldp)
> +		return;
> +
> +	switch (*p) {
> +	case '@':
> +		start_at = memparse(p + 1, &p);
> +		memblock_add(start_at, mem_size);
> +		break;
> +
> +	case '$':
> +		start_at = memparse(p + 1, &p);
> +		memblock_reserve(start_at, mem_size);
> +		break;
> +
> +	default:
> +		pr_warn("Unrecognized memmap syntax: %s\n", p);
> +		break;
> +	}
> +}
> +
> +static int __init parse_memmap_opt(char *str)
> +{
> +	while (str) {
> +		char *k = strchr(str, ',');
> +
> +		if (k)
> +			*k++ = 0;
> +
> +		parse_memmap_one(str);
> +		str = k;
> +	}
> +
> +	return 0;
> +}
> +early_param("memmap", parse_memmap_opt);
> +
>  static void __init setup_bootmem(void)
>  {
>  	phys_addr_t vmlinux_end = __pa_symbol(&_end);
> -- 
> 2.20.1
> 

Reviewed-by: Charlie Jenkins <charlie@rivosinc.com>
Yunhui Cui July 11, 2024, 6:15 a.m. UTC | #2
Add punit in the loop.


On Thu, Jul 4, 2024 at 5:37 AM Charlie Jenkins <charlie@rivosinc.com> wrote:
>
> On Mon, Jun 24, 2024 at 08:37:39PM +0800, Yunhui Cui wrote:
> > Add parsing of 'memmap' to use or reserve a specific region of memory.
> >
> > Implement the following memmap variants:
> > - memmap=nn[KMG]@ss[KMG]: force usage of a specific region of memory;
> > - memmap=nn[KMG]$ss[KMG]: mark specified memory as reserved;
> >
> > Signed-off-by: Yunhui Cui <cuiyunhui@bytedance.com>
> > ---
> >  arch/riscv/mm/init.c | 46 ++++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 46 insertions(+)
> >
> > diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c
> > index e3405e4b99af..8e1d93ae5cb2 100644
> > --- a/arch/riscv/mm/init.c
> > +++ b/arch/riscv/mm/init.c
> > @@ -208,6 +208,52 @@ static int __init early_mem(char *p)
> >  }
> >  early_param("mem", early_mem);
> >
> > +static void __init parse_memmap_one(char *p)
> > +{
> > +     char *oldp;
> > +     unsigned long start_at, mem_size;
> > +
> > +     if (!p)
> > +             return;
> > +
> > +     oldp = p;
> > +     mem_size = memparse(p, &p);
> > +     if (p == oldp)
> > +             return;
> > +
> > +     switch (*p) {
> > +     case '@':
> > +             start_at = memparse(p + 1, &p);
> > +             memblock_add(start_at, mem_size);
> > +             break;
> > +
> > +     case '$':
> > +             start_at = memparse(p + 1, &p);
> > +             memblock_reserve(start_at, mem_size);
> > +             break;
> > +
> > +     default:
> > +             pr_warn("Unrecognized memmap syntax: %s\n", p);
> > +             break;
> > +     }
> > +}
> > +
> > +static int __init parse_memmap_opt(char *str)
> > +{
> > +     while (str) {
> > +             char *k = strchr(str, ',');
> > +
> > +             if (k)
> > +                     *k++ = 0;
> > +
> > +             parse_memmap_one(str);
> > +             str = k;
> > +     }
> > +
> > +     return 0;
> > +}
> > +early_param("memmap", parse_memmap_opt);
> > +
> >  static void __init setup_bootmem(void)
> >  {
> >       phys_addr_t vmlinux_end = __pa_symbol(&_end);
> > --
> > 2.20.1
> >
>
> Reviewed-by: Charlie Jenkins <charlie@rivosinc.com>
>

Thanks,
Yunhui
Punit Agrawal July 22, 2024, 9:13 p.m. UTC | #3
Hi Palmer,

Charlie Jenkins <charlie@rivosinc.com> writes:

> On Mon, Jun 24, 2024 at 08:37:39PM +0800, Yunhui Cui wrote:
>> Add parsing of 'memmap' to use or reserve a specific region of memory.
>> 
>> Implement the following memmap variants:
>> - memmap=nn[KMG]@ss[KMG]: force usage of a specific region of memory;
>> - memmap=nn[KMG]$ss[KMG]: mark specified memory as reserved;
>> 
>> Signed-off-by: Yunhui Cui <cuiyunhui@bytedance.com>
>> ---
>>  arch/riscv/mm/init.c | 46 ++++++++++++++++++++++++++++++++++++++++++++
>>  1 file changed, 46 insertions(+)
>> 
>> diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c
>> index e3405e4b99af..8e1d93ae5cb2 100644
>> --- a/arch/riscv/mm/init.c
>> +++ b/arch/riscv/mm/init.c
>> @@ -208,6 +208,52 @@ static int __init early_mem(char *p)
>>  }
>>  early_param("mem", early_mem);
>>  
>> +static void __init parse_memmap_one(char *p)
>> +{
>> +	char *oldp;
>> +	unsigned long start_at, mem_size;
>> +
>> +	if (!p)
>> +		return;
>> +
>> +	oldp = p;
>> +	mem_size = memparse(p, &p);
>> +	if (p == oldp)
>> +		return;
>> +
>> +	switch (*p) {
>> +	case '@':
>> +		start_at = memparse(p + 1, &p);
>> +		memblock_add(start_at, mem_size);
>> +		break;
>> +
>> +	case '$':
>> +		start_at = memparse(p + 1, &p);
>> +		memblock_reserve(start_at, mem_size);
>> +		break;
>> +
>> +	default:
>> +		pr_warn("Unrecognized memmap syntax: %s\n", p);
>> +		break;
>> +	}
>> +}
>> +
>> +static int __init parse_memmap_opt(char *str)
>> +{
>> +	while (str) {
>> +		char *k = strchr(str, ',');
>> +
>> +		if (k)
>> +			*k++ = 0;
>> +
>> +		parse_memmap_one(str);
>> +		str = k;
>> +	}
>> +
>> +	return 0;
>> +}
>> +early_param("memmap", parse_memmap_opt);
>> +
>>  static void __init setup_bootmem(void)
>>  {
>>  	phys_addr_t vmlinux_end = __pa_symbol(&_end);
>> -- 
>> 2.20.1
>> 
>
> Reviewed-by: Charlie Jenkins <charlie@rivosinc.com>

Another patch that looks good to get merged if there are no further
comments.

Any chance this can be picked up for this cycle?
Palmer Dabbelt Sept. 14, 2024, 8:21 a.m. UTC | #4
On Mon, 22 Jul 2024 14:13:14 PDT (-0700), punit.agrawal@bytedance.com wrote:
> Hi Palmer,
>
> Charlie Jenkins <charlie@rivosinc.com> writes:
>
>> On Mon, Jun 24, 2024 at 08:37:39PM +0800, Yunhui Cui wrote:
>>> Add parsing of 'memmap' to use or reserve a specific region of memory.
>>>
>>> Implement the following memmap variants:
>>> - memmap=nn[KMG]@ss[KMG]: force usage of a specific region of memory;
>>> - memmap=nn[KMG]$ss[KMG]: mark specified memory as reserved;
>>>
>>> Signed-off-by: Yunhui Cui <cuiyunhui@bytedance.com>
>>> ---
>>>  arch/riscv/mm/init.c | 46 ++++++++++++++++++++++++++++++++++++++++++++
>>>  1 file changed, 46 insertions(+)
>>>
>>> diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c
>>> index e3405e4b99af..8e1d93ae5cb2 100644
>>> --- a/arch/riscv/mm/init.c
>>> +++ b/arch/riscv/mm/init.c
>>> @@ -208,6 +208,52 @@ static int __init early_mem(char *p)
>>>  }
>>>  early_param("mem", early_mem);
>>>
>>> +static void __init parse_memmap_one(char *p)
>>> +{
>>> +	char *oldp;
>>> +	unsigned long start_at, mem_size;
>>> +
>>> +	if (!p)
>>> +		return;
>>> +
>>> +	oldp = p;
>>> +	mem_size = memparse(p, &p);
>>> +	if (p == oldp)
>>> +		return;
>>> +
>>> +	switch (*p) {
>>> +	case '@':
>>> +		start_at = memparse(p + 1, &p);
>>> +		memblock_add(start_at, mem_size);
>>> +		break;
>>> +
>>> +	case '$':
>>> +		start_at = memparse(p + 1, &p);
>>> +		memblock_reserve(start_at, mem_size);
>>> +		break;
>>> +
>>> +	default:
>>> +		pr_warn("Unrecognized memmap syntax: %s\n", p);
>>> +		break;
>>> +	}
>>> +}
>>> +
>>> +static int __init parse_memmap_opt(char *str)
>>> +{
>>> +	while (str) {
>>> +		char *k = strchr(str, ',');
>>> +
>>> +		if (k)
>>> +			*k++ = 0;
>>> +
>>> +		parse_memmap_one(str);
>>> +		str = k;
>>> +	}
>>> +
>>> +	return 0;
>>> +}
>>> +early_param("memmap", parse_memmap_opt);
>>> +
>>>  static void __init setup_bootmem(void)
>>>  {
>>>  	phys_addr_t vmlinux_end = __pa_symbol(&_end);
>>> --
>>> 2.20.1
>>>
>>
>> Reviewed-by: Charlie Jenkins <charlie@rivosinc.com>
>
> Another patch that looks good to get merged if there are no further
> comments.
>
> Any chance this can be picked up for this cycle?

Sorry for being slow here, but I don't understand the use case for this: 
we already get the memory map from the firmware, it seems like 
overriding that is just asking for issues.
Yunhui Cui Sept. 18, 2024, 3:27 a.m. UTC | #5
Hi Palmer,

On Sat, Sep 14, 2024 at 4:21 PM Palmer Dabbelt <palmer@dabbelt.com> wrote:
>
> On Mon, 22 Jul 2024 14:13:14 PDT (-0700), punit.agrawal@bytedance.com wrote:
> > Hi Palmer,
> >
> > Charlie Jenkins <charlie@rivosinc.com> writes:
> >
> >> On Mon, Jun 24, 2024 at 08:37:39PM +0800, Yunhui Cui wrote:
> >>> Add parsing of 'memmap' to use or reserve a specific region of memory.
> >>>
> >>> Implement the following memmap variants:
> >>> - memmap=nn[KMG]@ss[KMG]: force usage of a specific region of memory;
> >>> - memmap=nn[KMG]$ss[KMG]: mark specified memory as reserved;
> >>>
> >>> Signed-off-by: Yunhui Cui <cuiyunhui@bytedance.com>
> >>> ---
> >>>  arch/riscv/mm/init.c | 46 ++++++++++++++++++++++++++++++++++++++++++++
> >>>  1 file changed, 46 insertions(+)
> >>>
> >>> diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c
> >>> index e3405e4b99af..8e1d93ae5cb2 100644
> >>> --- a/arch/riscv/mm/init.c
> >>> +++ b/arch/riscv/mm/init.c
> >>> @@ -208,6 +208,52 @@ static int __init early_mem(char *p)
> >>>  }
> >>>  early_param("mem", early_mem);
> >>>
> >>> +static void __init parse_memmap_one(char *p)
> >>> +{
> >>> +   char *oldp;
> >>> +   unsigned long start_at, mem_size;
> >>> +
> >>> +   if (!p)
> >>> +           return;
> >>> +
> >>> +   oldp = p;
> >>> +   mem_size = memparse(p, &p);
> >>> +   if (p == oldp)
> >>> +           return;
> >>> +
> >>> +   switch (*p) {
> >>> +   case '@':
> >>> +           start_at = memparse(p + 1, &p);
> >>> +           memblock_add(start_at, mem_size);
> >>> +           break;
> >>> +
> >>> +   case '$':
> >>> +           start_at = memparse(p + 1, &p);
> >>> +           memblock_reserve(start_at, mem_size);
> >>> +           break;
> >>> +
> >>> +   default:
> >>> +           pr_warn("Unrecognized memmap syntax: %s\n", p);
> >>> +           break;
> >>> +   }
> >>> +}
> >>> +
> >>> +static int __init parse_memmap_opt(char *str)
> >>> +{
> >>> +   while (str) {
> >>> +           char *k = strchr(str, ',');
> >>> +
> >>> +           if (k)
> >>> +                   *k++ = 0;
> >>> +
> >>> +           parse_memmap_one(str);
> >>> +           str = k;
> >>> +   }
> >>> +
> >>> +   return 0;
> >>> +}
> >>> +early_param("memmap", parse_memmap_opt);
> >>> +
> >>>  static void __init setup_bootmem(void)
> >>>  {
> >>>     phys_addr_t vmlinux_end = __pa_symbol(&_end);
> >>> --
> >>> 2.20.1
> >>>
> >>
> >> Reviewed-by: Charlie Jenkins <charlie@rivosinc.com>
> >
> > Another patch that looks good to get merged if there are no further
> > comments.
> >
> > Any chance this can be picked up for this cycle?
>
> Sorry for being slow here, but I don't understand the use case for this:
> we already get the memory map from the firmware, it seems like
> overriding that is just asking for issues.

Without modifying the firmware, it is more convenient to complete the
reservation of the memory block in this way.
This parameter is also mentioned in Documentation/admin - guide/kernel
- parameters.txt.

Thanks,
Yunhui
diff mbox series

Patch

diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c
index e3405e4b99af..8e1d93ae5cb2 100644
--- a/arch/riscv/mm/init.c
+++ b/arch/riscv/mm/init.c
@@ -208,6 +208,52 @@  static int __init early_mem(char *p)
 }
 early_param("mem", early_mem);
 
+static void __init parse_memmap_one(char *p)
+{
+	char *oldp;
+	unsigned long start_at, mem_size;
+
+	if (!p)
+		return;
+
+	oldp = p;
+	mem_size = memparse(p, &p);
+	if (p == oldp)
+		return;
+
+	switch (*p) {
+	case '@':
+		start_at = memparse(p + 1, &p);
+		memblock_add(start_at, mem_size);
+		break;
+
+	case '$':
+		start_at = memparse(p + 1, &p);
+		memblock_reserve(start_at, mem_size);
+		break;
+
+	default:
+		pr_warn("Unrecognized memmap syntax: %s\n", p);
+		break;
+	}
+}
+
+static int __init parse_memmap_opt(char *str)
+{
+	while (str) {
+		char *k = strchr(str, ',');
+
+		if (k)
+			*k++ = 0;
+
+		parse_memmap_one(str);
+		str = k;
+	}
+
+	return 0;
+}
+early_param("memmap", parse_memmap_opt);
+
 static void __init setup_bootmem(void)
 {
 	phys_addr_t vmlinux_end = __pa_symbol(&_end);