--------------
We have added just one extra check in the code
"!ibm_ca_support_reboot" to
check whether the reboot is a CAS reboot or not!
And these are below comments in the patch which are in question:
+ /*
+ * If we have an error or the reboot is detected as CAS reboot,
+ * 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. Though if we call CAS, the rmo_top
will
+ * be set to 768 MB via CAS Vector2. This condition is required
to avoid the
+ * issue where the older Linux kernels are still using rmo_top
as 512 MB.
+ * If we call CAS where rmo_top is less then 768 MB, this will
result in an issue
+ * due to IBM CAS reboot feature and we won't be able to boot
the newer kernel.
+ * The machine will boot with the last booted kernel which has
rmo_top as 512 MB.
+ */
I'm tried to explain in the comment on when the CAS will be called.
And why
we need to use this old condition "rmo_top < 512 MB" and not "rmo_top
< 768
MB".
+ if (!ibm_ca_support_reboot && err == GRUB_ERR_NONE && rmo_top <
(512
* 1024 * 1024))
+ grub_ieee1275_ibm_cas ();
}
Condition 1: (!ibm_ca_support_reboot)
This condition checks whether the last reboot is caused by CAS. If the
reboot is detected as a CAS reboot, the GRUB will skip the CAS call.
As the
CAS has already been called earlier and it's not required to call even
if
the other conditions are met!
Condition 2: (rmo_top < (512 * 1024 * 1024))
If the machine detects rmo_top as less than 512 MB, the CAS will be
called.
Why we need this condition:
Logically as we are changing MIN_RMA as 768 MB in GRUB
Options_vector2. We
should check "rmo_top < (768 * 1024 * 1024)" and not "rmo_top < (512 *
1024
* 1024)".
In the patch, whenever we are calling CAS. We set MIN_RMA as 768 MB.
But we
decide when to call CAS is based on old condition rmo_top < 512 MB.
Logically it should be 768 MB. But we can't do this right now due to
the
below scenarios. We will change this condition to "rmo_top < (768 *
1024 *
1024)" in the future.
*****
Scenario 1:
In kernel prom_init.c file. The Options_vector2 is using 512 MB as
MIN_RMA.
And GRUB is using "rmo_top < (768 * 1024 * 1024)" to call CAS.
1. Machine boots, GRUB detects rmo_top as less than 512 MB.
GRUB calls CAS and sets MIN_RMA as 768MB.
The machine reboots after the CAS call. (Every CAS call will result
in a reboot)
2. Machine boots, GRUB detects rmo_top is not as less than 512 MB.
GRUB skips CAS call.
3. After this kernel boots and detects MIN_RMA as other than its 512
MB required value.
It calls CAS and makes the MIN_RMA again to 512 MB.
As the CAS is called, the machine will go for a reboot again.
4. Now GRUB will again detects rmo_top as less than 512 MB (changed by
kernel).
And then we will again go back to step 1.
And machine will keep doing the CAS calls and change MIN_RMA from 512
to 768
to 512 to 768 and so on. With this, the machine will stuck in this
stage
forever!
*****
In the above scenario 1, with (!ibm_ca_support_reboot) condition in
place.
We will avoid this CAS reboot loop. But if we use "rmo_top < (768 *
1024 *
1024)". The machine will never get stuck in reboot loop, but as the
CAS is
called from GRUB (currently all the powerpc machines has rmo_top is
512 MB).
The IBM CAS reboot feature will not allow us to boot with the newer
kernel!
IBM CAS reboot feature:
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" that has the info related to the last boot. This is
specific to IBM powerpc and no other architecture has this.
*****
Scenario 2:
In kernel prom_init.c file. The Options_vector2 is using 768 MB as
MIN_RMA.
And GRUB is using "rmo_top < (768 * 1024 * 1024)" to call CAS.
1. Machine boots, GRUB detects rmo_top as less than 512 MB.
GRUB calls CAS and sets MIN_RMA as 768MB.
The machine reboots after the CAS call. (Every CAS call will result
in a reboot)
2. Machine boots, GRUB detects rmo_top is not as less than 512 MB.
GRUB skips CAS call.
3. But as the last boot was a CAS reboot, the machine will boot with
the
last booted kernel having MIN_RMA as 512 MB. We will not see an option
to
choose which kernel a user like to boot to.
*****
_________________
Please let me know if you feel I need to change or add any content in
my
"comment" in the patch. I have tried my best to explain and cover
these
above scenarios in simple and short message.
And let me know if you have any queries on this!