All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3] powerpc: increase MIN RMA size for CAS negotiation
@ 2025-03-12 16:36 Avnish Chouhan
  2025-03-12 18:58 ` Daniel Kiper via Grub-devel
  0 siblings, 1 reply; 3+ messages in thread
From: Avnish Chouhan @ 2025-03-12 16:36 UTC (permalink / raw)
  To: grub-devel; +Cc: daniel.kiper, brking, meghanaprakash, mamatha4, Avnish Chouhan

Change RMA size from 512 MB to 768 MB which will result
in more memory at boot time for PowerPC. When vTPM, Secure Boot or
FADump are enabled on PowerPC, the 512 MB RMA memory is not sufficient for
booting. With this 512 MB RMA, GRUB2 runs out of memory and fails to
boot the machine. Sometimes even usage of CDROM requires more memory
for installation and along with the options mentioned above exhausts
the boot memory which results in boot failures. Increasing the RMA size
will resolves multiple out of memory issues observed in PowerPC.

Failure details (GRUB2 debugs):

  kern/ieee1275/init.c:550: mm requested region of size 8513000, flags 1
  kern/ieee1275/init.c:563: Cannot satisfy allocation and retain minimum runtime space
  kern/ieee1275/init.c:550: mm requested region of size 8513000, flags 0
  kern/ieee1275/init.c:563: Cannot satisfy allocation and retain minimum runtime space
  kern/file.c:215: Closing `/ppc/ppc64/initrd.img' ...
  kern/disk.c:297: Closing `ieee1275//vdevice/v-scsi@30000067/disk@8300000000000000'...
  kern/disk.c:311: Closing `ieee1275//vdevice/v-scsi@30000067/disk@8300000000000000' succeeded.
  kern/file.c:225: Closing `/ppc/ppc64/initrd.img' failed with 3.
  kern/file.c:148: Opening `/ppc/ppc64/initrd.img' succeeded.
  error: ../../grub-core/kern/mm.c:552:out of memory.

Signed-off-by: Avnish Chouhan <avnish@linux.ibm.com>
---
 grub-core/kern/ieee1275/init.c | 44 ++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 40 insertions(+), 4 deletions(-)

diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c
index dfbd0b8..aa3c932 100644
--- a/grub-core/kern/ieee1275/init.c
+++ b/grub-core/kern/ieee1275/init.c
@@ -852,7 +852,7 @@ grub_ieee1275_ibm_cas (void)
     .vec1 = 0x80, /* ignore */
     .vec2_size = 1 + sizeof (struct option_vector2) - 2,
     .vec2 = {
-      0, 0, -1, -1, -1, -1, -1, 512, -1, 0, 48
+      0, 0, -1, -1, -1, -1, -1, 768, -1, 0, 48
     },
     .vec3_size = 2 - 1,
     .vec3 = 0x00e0, /* ask for FP + VMX + DFP but don't halt if unsatisfied */
@@ -889,6 +889,10 @@ grub_claim_heap (void)
 {
   grub_err_t err;
   grub_uint32_t total = HEAP_MAX_SIZE;
+#if defined(__powerpc__)
+  grub_uint32_t ibm_ca_support_reboot = 0;
+  grub_ssize_t actual;
+#endif
 
   err = grub_ieee1275_total_mem (&rmo_top);
 
@@ -901,11 +905,43 @@ grub_claim_heap (void)
     grub_mm_add_region_fn = grub_ieee1275_mm_add_region;
 
 #if defined(__powerpc__)
+  /* Check if it's a CAS reboot with below property. If so, we will skip CAS call */
+  if (grub_ieee1275_get_integer_property (grub_ieee1275_chosen,
+                                          "ibm,client-architecture-support-reboot",
+                                          &ibm_ca_support_reboot,
+                                          sizeof (ibm_ca_support_reboot),
+                                          &actual) >= 0)
+    grub_dprintf ("ieee1275", "ibm,client-architecture-support-reboot: %u\n",
+                  ibm_ca_support_reboot);
+
   if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_CAN_TRY_CAS_FOR_MORE_MEMORY))
     {
-      /* if we have an error, don't call CAS, just hope for the best */
-      if (err == GRUB_ERR_NONE && rmo_top < (512 * 1024 * 1024))
-	grub_ieee1275_ibm_cas ();
+      /*
+       * If we have an error, don't call CAS. Just hope for the best.
+       * Along with the above, if the rmo_top is 512 MB or above. We
+       * will skip the CAS call. However, if we call CAS, the rmo_top
+       * will be set to 768 MB via CAS Vector2. But we need to call
+       * CAS with "rmo_top < 512 MB" to avoid the issue on the older
+       * Linux kernel, which still uses rmo_top as 512 MB. If we call
+       * CAS with a condition "rmo_top < 768 MB", it will result in an
+       * issue due to the IBM CAS reboot feature and we won't be able
+       * to boot the newer kernel. Whenever a reboot is detected as
+       * the CAS reboot by GRUB. It will boot the machine with the
+       * last booted kernel by reading the variable "boot-last-label"
+       * which has the info related to the last boot and it's specific
+       * to IBM PowerPC. Due to this, the machine will boot with the
+       * last booted kernel which has rmo_top as 512 MB. Also, if the
+       * reboot is detected as a CAS reboot, the GRUB will skip the CAS
+       * call. As the CAS has already been called earlier, so it is
+       * not required to call CAS even if the other conditions are met.
+       * This condition will prevent a scenario where the machine will
+       * keep doing the CAS calls and change MIN_RMA from 512 to 768 to
+       * 512 to 768 and so on older kernels. Without this check, the
+       * machine will stuck in this mentioned stage forever.
+       * IBM PAPR : https://openpower.foundation/specifications/linuxonpower/
+       */
+      if (!ibm_ca_support_reboot && err == GRUB_ERR_NONE && rmo_top < (512 * 1024 * 1024))
+        grub_ieee1275_ibm_cas ();
     }
 #endif
 
-- 
2.39.3


_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v3] powerpc: increase MIN RMA size for CAS negotiation
  2025-03-12 16:36 [PATCH v3] powerpc: increase MIN RMA size for CAS negotiation Avnish Chouhan
@ 2025-03-12 18:58 ` Daniel Kiper via Grub-devel
  2025-03-13  5:54   ` Avnish Chouhan
  0 siblings, 1 reply; 3+ messages in thread
From: Daniel Kiper via Grub-devel @ 2025-03-12 18:58 UTC (permalink / raw)
  To: Avnish Chouhan; +Cc: Daniel Kiper, grub-devel, brking, meghanaprakash, mamatha4

On Wed, Mar 12, 2025 at 10:06:15PM +0530, Avnish Chouhan wrote:
> Change RMA size from 512 MB to 768 MB which will result
> in more memory at boot time for PowerPC. When vTPM, Secure Boot or
> FADump are enabled on PowerPC, the 512 MB RMA memory is not sufficient for
> booting. With this 512 MB RMA, GRUB2 runs out of memory and fails to
> boot the machine. Sometimes even usage of CDROM requires more memory
> for installation and along with the options mentioned above exhausts
> the boot memory which results in boot failures. Increasing the RMA size
> will resolves multiple out of memory issues observed in PowerPC.
>
> Failure details (GRUB2 debugs):
>
>   kern/ieee1275/init.c:550: mm requested region of size 8513000, flags 1
>   kern/ieee1275/init.c:563: Cannot satisfy allocation and retain minimum runtime space
>   kern/ieee1275/init.c:550: mm requested region of size 8513000, flags 0
>   kern/ieee1275/init.c:563: Cannot satisfy allocation and retain minimum runtime space
>   kern/file.c:215: Closing `/ppc/ppc64/initrd.img' ...
>   kern/disk.c:297: Closing `ieee1275//vdevice/v-scsi@30000067/disk@8300000000000000'...
>   kern/disk.c:311: Closing `ieee1275//vdevice/v-scsi@30000067/disk@8300000000000000' succeeded.
>   kern/file.c:225: Closing `/ppc/ppc64/initrd.img' failed with 3.
>   kern/file.c:148: Opening `/ppc/ppc64/initrd.img' succeeded.
>   error: ../../grub-core/kern/mm.c:552:out of memory.
>
> Signed-off-by: Avnish Chouhan <avnish@linux.ibm.com>
> ---
>  grub-core/kern/ieee1275/init.c | 44 ++++++++++++++++++++++++++++++++++++++++----
>  1 file changed, 40 insertions(+), 4 deletions(-)
>
> diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c
> index dfbd0b8..aa3c932 100644
> --- a/grub-core/kern/ieee1275/init.c
> +++ b/grub-core/kern/ieee1275/init.c
> @@ -852,7 +852,7 @@ grub_ieee1275_ibm_cas (void)

The function is preceded by a comment which is not correct after this patch.

>      .vec1 = 0x80, /* ignore */
>      .vec2_size = 1 + sizeof (struct option_vector2) - 2,
>      .vec2 = {
> -      0, 0, -1, -1, -1, -1, -1, 512, -1, 0, 48
> +      0, 0, -1, -1, -1, -1, -1, 768, -1, 0, 48
>      },
>      .vec3_size = 2 - 1,
>      .vec3 = 0x00e0, /* ask for FP + VMX + DFP but don't halt if unsatisfied */
> @@ -889,6 +889,10 @@ grub_claim_heap (void)
>  {
>    grub_err_t err;
>    grub_uint32_t total = HEAP_MAX_SIZE;
> +#if defined(__powerpc__)
> +  grub_uint32_t ibm_ca_support_reboot = 0;
> +  grub_ssize_t actual;
> +#endif
>
>    err = grub_ieee1275_total_mem (&rmo_top);
>
> @@ -901,11 +905,43 @@ grub_claim_heap (void)
>      grub_mm_add_region_fn = grub_ieee1275_mm_add_region;
>
>  #if defined(__powerpc__)
> +  /* Check if it's a CAS reboot with below property. If so, we will skip CAS call */
> +  if (grub_ieee1275_get_integer_property (grub_ieee1275_chosen,
> +                                          "ibm,client-architecture-support-reboot",
> +                                          &ibm_ca_support_reboot,
> +                                          sizeof (ibm_ca_support_reboot),
> +                                          &actual) >= 0)
> +    grub_dprintf ("ieee1275", "ibm,client-architecture-support-reboot: %u\n",

Even if "%u" is correct please use PRIuGRUB_UINT32_T instead.

> +                  ibm_ca_support_reboot);
> +
>    if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_CAN_TRY_CAS_FOR_MORE_MEMORY))
>      {
> -      /* if we have an error, don't call CAS, just hope for the best */
> -      if (err == GRUB_ERR_NONE && rmo_top < (512 * 1024 * 1024))
> -	grub_ieee1275_ibm_cas ();
> +      /*
> +       * If we have an error, don't call CAS. Just hope for the best.
> +       * Along with the above, if the rmo_top is 512 MB or above. We
> +       * will skip the CAS call. However, if we call CAS, the rmo_top
> +       * will be set to 768 MB via CAS Vector2. But we need to call
> +       * CAS with "rmo_top < 512 MB" to avoid the issue on the older
> +       * Linux kernel, which still uses rmo_top as 512 MB. If we call
> +       * CAS with a condition "rmo_top < 768 MB", it will result in an
> +       * issue due to the IBM CAS reboot feature and we won't be able
> +       * to boot the newer kernel. Whenever a reboot is detected as
> +       * the CAS reboot by GRUB. It will boot the machine with the
> +       * last booted kernel by reading the variable "boot-last-label"
> +       * which has the info related to the last boot and it's specific
> +       * to IBM PowerPC. Due to this, the machine will boot with the
> +       * last booted kernel which has rmo_top as 512 MB. Also, if the
> +       * reboot is detected as a CAS reboot, the GRUB will skip the CAS
> +       * call. As the CAS has already been called earlier, so it is
> +       * not required to call CAS even if the other conditions are met.
> +       * This condition will prevent a scenario where the machine will
> +       * keep doing the CAS calls and change MIN_RMA from 512 to 768 to
> +       * 512 to 768 and so on older kernels. Without this check, the

It is not entirely clear what changes MIN_RMA back from 768 to 512.
I think it should be explained/clarified.

> +       * machine will stuck in this mentioned stage forever.
> +       * IBM PAPR : https://openpower.foundation/specifications/linuxonpower/

Thank you for adding the link to the spec.

Now the commit message and comment looks much better.

Daniel

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v3] powerpc: increase MIN RMA size for CAS negotiation
  2025-03-12 18:58 ` Daniel Kiper via Grub-devel
@ 2025-03-13  5:54   ` Avnish Chouhan
  0 siblings, 0 replies; 3+ messages in thread
From: Avnish Chouhan @ 2025-03-13  5:54 UTC (permalink / raw)
  To: Daniel Kiper; +Cc: grub-devel, brking, meghanaprakash, mamatha4

On 2025-03-13 00:28, Daniel Kiper wrote:
> On Wed, Mar 12, 2025 at 10:06:15PM +0530, Avnish Chouhan wrote:
>> Change RMA size from 512 MB to 768 MB which will result
>> in more memory at boot time for PowerPC. When vTPM, Secure Boot or
>> FADump are enabled on PowerPC, the 512 MB RMA memory is not sufficient 
>> for
>> booting. With this 512 MB RMA, GRUB2 runs out of memory and fails to
>> boot the machine. Sometimes even usage of CDROM requires more memory
>> for installation and along with the options mentioned above exhausts
>> the boot memory which results in boot failures. Increasing the RMA 
>> size
>> will resolves multiple out of memory issues observed in PowerPC.
>> 
>> Failure details (GRUB2 debugs):
>> 
>>   kern/ieee1275/init.c:550: mm requested region of size 8513000, flags 
>> 1
>>   kern/ieee1275/init.c:563: Cannot satisfy allocation and retain 
>> minimum runtime space
>>   kern/ieee1275/init.c:550: mm requested region of size 8513000, flags 
>> 0
>>   kern/ieee1275/init.c:563: Cannot satisfy allocation and retain 
>> minimum runtime space
>>   kern/file.c:215: Closing `/ppc/ppc64/initrd.img' ...
>>   kern/disk.c:297: Closing 
>> `ieee1275//vdevice/v-scsi@30000067/disk@8300000000000000'...
>>   kern/disk.c:311: Closing 
>> `ieee1275//vdevice/v-scsi@30000067/disk@8300000000000000' succeeded.
>>   kern/file.c:225: Closing `/ppc/ppc64/initrd.img' failed with 3.
>>   kern/file.c:148: Opening `/ppc/ppc64/initrd.img' succeeded.
>>   error: ../../grub-core/kern/mm.c:552:out of memory.
>> 
>> Signed-off-by: Avnish Chouhan <avnish@linux.ibm.com>
>> ---
>>  grub-core/kern/ieee1275/init.c | 44 
>> ++++++++++++++++++++++++++++++++++++++++----
>>  1 file changed, 40 insertions(+), 4 deletions(-)
>> 
>> diff --git a/grub-core/kern/ieee1275/init.c 
>> b/grub-core/kern/ieee1275/init.c
>> index dfbd0b8..aa3c932 100644
>> --- a/grub-core/kern/ieee1275/init.c
>> +++ b/grub-core/kern/ieee1275/init.c
>> @@ -852,7 +852,7 @@ grub_ieee1275_ibm_cas (void)
> 
> The function is preceded by a comment which is not correct after this 
> patch.

Hi Daniel,
Thank you for your reviews!

I'll change this comment.

> 
>>      .vec1 = 0x80, /* ignore */
>>      .vec2_size = 1 + sizeof (struct option_vector2) - 2,
>>      .vec2 = {
>> -      0, 0, -1, -1, -1, -1, -1, 512, -1, 0, 48
>> +      0, 0, -1, -1, -1, -1, -1, 768, -1, 0, 48
>>      },
>>      .vec3_size = 2 - 1,
>>      .vec3 = 0x00e0, /* ask for FP + VMX + DFP but don't halt if 
>> unsatisfied */
>> @@ -889,6 +889,10 @@ grub_claim_heap (void)
>>  {
>>    grub_err_t err;
>>    grub_uint32_t total = HEAP_MAX_SIZE;
>> +#if defined(__powerpc__)
>> +  grub_uint32_t ibm_ca_support_reboot = 0;
>> +  grub_ssize_t actual;
>> +#endif
>> 
>>    err = grub_ieee1275_total_mem (&rmo_top);
>> 
>> @@ -901,11 +905,43 @@ grub_claim_heap (void)
>>      grub_mm_add_region_fn = grub_ieee1275_mm_add_region;
>> 
>>  #if defined(__powerpc__)
>> +  /* Check if it's a CAS reboot with below property. If so, we will 
>> skip CAS call */
>> +  if (grub_ieee1275_get_integer_property (grub_ieee1275_chosen,
>> +                                          
>> "ibm,client-architecture-support-reboot",
>> +                                          &ibm_ca_support_reboot,
>> +                                          sizeof 
>> (ibm_ca_support_reboot),
>> +                                          &actual) >= 0)
>> +    grub_dprintf ("ieee1275", 
>> "ibm,client-architecture-support-reboot: %u\n",
> 
> Even if "%u" is correct please use PRIuGRUB_UINT32_T instead.

Sure, I'll change this!

> 
>> +                  ibm_ca_support_reboot);
>> +
>>    if (grub_ieee1275_test_flag 
>> (GRUB_IEEE1275_FLAG_CAN_TRY_CAS_FOR_MORE_MEMORY))
>>      {
>> -      /* if we have an error, don't call CAS, just hope for the best 
>> */
>> -      if (err == GRUB_ERR_NONE && rmo_top < (512 * 1024 * 1024))
>> -	grub_ieee1275_ibm_cas ();
>> +      /*
>> +       * If we have an error, don't call CAS. Just hope for the best.
>> +       * Along with the above, if the rmo_top is 512 MB or above. We
>> +       * will skip the CAS call. However, if we call CAS, the rmo_top
>> +       * will be set to 768 MB via CAS Vector2. But we need to call
>> +       * CAS with "rmo_top < 512 MB" to avoid the issue on the older
>> +       * Linux kernel, which still uses rmo_top as 512 MB. If we call
>> +       * CAS with a condition "rmo_top < 768 MB", it will result in 
>> an
>> +       * issue due to the IBM CAS reboot feature and we won't be able
>> +       * to boot the newer kernel. Whenever a reboot is detected as
>> +       * the CAS reboot by GRUB. It will boot the machine with the
>> +       * last booted kernel by reading the variable "boot-last-label"
>> +       * which has the info related to the last boot and it's 
>> specific
>> +       * to IBM PowerPC. Due to this, the machine will boot with the
>> +       * last booted kernel which has rmo_top as 512 MB. Also, if the
>> +       * reboot is detected as a CAS reboot, the GRUB will skip the 
>> CAS
>> +       * call. As the CAS has already been called earlier, so it is
>> +       * not required to call CAS even if the other conditions are 
>> met.
>> +       * This condition will prevent a scenario where the machine 
>> will
>> +       * keep doing the CAS calls and change MIN_RMA from 512 to 768 
>> to
>> +       * 512 to 768 and so on older kernels. Without this check, the
> 
> It is not entirely clear what changes MIN_RMA back from 768 to 512.
> I think it should be explained/clarified.

Sure, I'll explain this as suggested!

> 
>> +       * machine will stuck in this mentioned stage forever.
>> +       * IBM PAPR : 
>> https://openpower.foundation/specifications/linuxonpower/
> 
> Thank you for adding the link to the spec.
> 
> Now the commit message and comment looks much better.
> 
> Daniel

Regards,
Avnish Chouhan

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2025-03-13  5:55 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-12 16:36 [PATCH v3] powerpc: increase MIN RMA size for CAS negotiation Avnish Chouhan
2025-03-12 18:58 ` Daniel Kiper via Grub-devel
2025-03-13  5:54   ` Avnish Chouhan

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.