diff mbox

[2/2] ipmi-sel: Run power action immediately if host not up

Message ID 1442286607-15755-2-git-send-email-joel@jms.id.au
State Accepted
Headers show

Commit Message

Joel Stanley Sept. 15, 2015, 3:10 a.m. UTC
Our normal sequence for a soft power action (IPMI 'power soft' or
'power cycle') involve receiving a SEL from the BMC, sending a message
to Linux's opal platform support which instructs the host OS to shut
down, and finally the host will request OPAL to cut power.

When the host is not yet up we will send the message to /dev/null, and
no action will be taken. This patches changes that behaviour to perform
the action immediately if we know how.

Signed-off-by: Joel Stanley <joel@jms.id.au>
---
 hw/ipmi/ipmi-sel.c | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

Comments

Vasant Hegde Sept. 15, 2015, 4:36 a.m. UTC | #1
On 09/15/2015 08:40 AM, Joel Stanley wrote:
> Our normal sequence for a soft power action (IPMI 'power soft' or
> 'power cycle') involve receiving a SEL from the BMC, sending a message
> to Linux's opal platform support which instructs the host OS to shut
> down, and finally the host will request OPAL to cut power.
> 
> When the host is not yet up we will send the message to /dev/null, and
> no action will be taken. This patches changes that behaviour to perform
> the action immediately if we know how.
> 
> Signed-off-by: Joel Stanley <joel@jms.id.au>
> ---
>  hw/ipmi/ipmi-sel.c | 20 ++++++++++++++++----
>  1 file changed, 16 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/ipmi/ipmi-sel.c b/hw/ipmi/ipmi-sel.c
> index 4626d9d..c446dfc 100644
> --- a/hw/ipmi/ipmi-sel.c
> +++ b/hw/ipmi/ipmi-sel.c
> @@ -457,12 +457,24 @@ static void sel_power(uint8_t power)
>  {
>  	switch (power) {
>  	case SOFT_OFF:
> -		prlog(PR_NOTICE, "soft shutdown requested\n");
> -		opal_queue_msg(OPAL_MSG_SHUTDOWN, NULL, NULL, SOFT_OFF);
> +		prlog(PR_NOTICE, "Soft shutdown requested\n");
> +		if (!debug_descriptor.opal_boot_complete &&
> +		    platform.cec_power_down) {
> +			prlog(PR_NOTICE, "Host not up, shutting down now\n");
> +			platform.cec_power_down(IPMI_CHASSIS_PWR_DOWN);
> +		} else {
> +			opal_queue_msg(OPAL_MSG_SHUTDOWN, NULL, NULL, SOFT_OFF);
> +		}
>  		break;
>  	case SOFT_REBOOT:
> -		prlog(PR_NOTICE, "soft reboot rqeuested\n");
> -		opal_queue_msg(OPAL_MSG_SHUTDOWN, NULL, NULL, SOFT_REBOOT);
> +		prlog(PR_NOTICE, "Soft reboot rqeuested\n");

Looks like copy-parse error... s/rqeuested/requested/ ..

> +		if (!debug_descriptor.opal_boot_complete &&
> +		    platform.cec_reboot) {
> +			prlog(PR_NOTICE, "Host not up, rebooting now\n");
> +			platform.cec_reboot();
> +		} else {
> +			opal_queue_msg(OPAL_MSG_SHUTDOWN, NULL, NULL, SOFT_REBOOT);
> +		}

So if platform.cec_reboot, then we will endup calling  "opal_queue_msg".. which
is not correct..
But given that cec_reboot will be set well before update opal_boot_complete
flag, probably we are fine.

-Vasant
Stewart Smith Sept. 30, 2015, 11:31 a.m. UTC | #2
Vasant Hegde <hegdevasant@linux.vnet.ibm.com> writes:
> On 09/15/2015 08:40 AM, Joel Stanley wrote:
>> Our normal sequence for a soft power action (IPMI 'power soft' or
>> 'power cycle') involve receiving a SEL from the BMC, sending a message
>> to Linux's opal platform support which instructs the host OS to shut
>> down, and finally the host will request OPAL to cut power.
>> 
>> When the host is not yet up we will send the message to /dev/null, and
>> no action will be taken. This patches changes that behaviour to perform
>> the action immediately if we know how.
>> 
>> Signed-off-by: Joel Stanley <joel@jms.id.au>
>> ---
>>  hw/ipmi/ipmi-sel.c | 20 ++++++++++++++++----
>>  1 file changed, 16 insertions(+), 4 deletions(-)
>> 
>> diff --git a/hw/ipmi/ipmi-sel.c b/hw/ipmi/ipmi-sel.c
>> index 4626d9d..c446dfc 100644
>> --- a/hw/ipmi/ipmi-sel.c
>> +++ b/hw/ipmi/ipmi-sel.c
>> @@ -457,12 +457,24 @@ static void sel_power(uint8_t power)
>>  {
>>  	switch (power) {
>>  	case SOFT_OFF:
>> -		prlog(PR_NOTICE, "soft shutdown requested\n");
>> -		opal_queue_msg(OPAL_MSG_SHUTDOWN, NULL, NULL, SOFT_OFF);
>> +		prlog(PR_NOTICE, "Soft shutdown requested\n");
>> +		if (!debug_descriptor.opal_boot_complete &&
>> +		    platform.cec_power_down) {
>> +			prlog(PR_NOTICE, "Host not up, shutting down now\n");
>> +			platform.cec_power_down(IPMI_CHASSIS_PWR_DOWN);
>> +		} else {
>> +			opal_queue_msg(OPAL_MSG_SHUTDOWN, NULL, NULL, SOFT_OFF);
>> +		}
>>  		break;
>>  	case SOFT_REBOOT:
>> -		prlog(PR_NOTICE, "soft reboot rqeuested\n");
>> -		opal_queue_msg(OPAL_MSG_SHUTDOWN, NULL, NULL, SOFT_REBOOT);
>> +		prlog(PR_NOTICE, "Soft reboot rqeuested\n");
>
> Looks like copy-parse error... s/rqeuested/requested/ ..
>
>> +		if (!debug_descriptor.opal_boot_complete &&
>> +		    platform.cec_reboot) {
>> +			prlog(PR_NOTICE, "Host not up, rebooting now\n");
>> +			platform.cec_reboot();
>> +		} else {
>> +			opal_queue_msg(OPAL_MSG_SHUTDOWN, NULL, NULL, SOFT_REBOOT);
>> +		}
>
> So if platform.cec_reboot, then we will endup calling  "opal_queue_msg".. which
> is not correct..
> But given that cec_reboot will be set well before update opal_boot_complete
> flag, probably we are fine.

Looks to be same behaviour as before, correct?

Not sure what else we should do? Maybe fall back to attn or something?
Or just print a log message wishing the user good luck (or, more likely,
the hardware/firmware/kernel developer)? :)
diff mbox

Patch

diff --git a/hw/ipmi/ipmi-sel.c b/hw/ipmi/ipmi-sel.c
index 4626d9d..c446dfc 100644
--- a/hw/ipmi/ipmi-sel.c
+++ b/hw/ipmi/ipmi-sel.c
@@ -457,12 +457,24 @@  static void sel_power(uint8_t power)
 {
 	switch (power) {
 	case SOFT_OFF:
-		prlog(PR_NOTICE, "soft shutdown requested\n");
-		opal_queue_msg(OPAL_MSG_SHUTDOWN, NULL, NULL, SOFT_OFF);
+		prlog(PR_NOTICE, "Soft shutdown requested\n");
+		if (!debug_descriptor.opal_boot_complete &&
+		    platform.cec_power_down) {
+			prlog(PR_NOTICE, "Host not up, shutting down now\n");
+			platform.cec_power_down(IPMI_CHASSIS_PWR_DOWN);
+		} else {
+			opal_queue_msg(OPAL_MSG_SHUTDOWN, NULL, NULL, SOFT_OFF);
+		}
 		break;
 	case SOFT_REBOOT:
-		prlog(PR_NOTICE, "soft reboot rqeuested\n");
-		opal_queue_msg(OPAL_MSG_SHUTDOWN, NULL, NULL, SOFT_REBOOT);
+		prlog(PR_NOTICE, "Soft reboot rqeuested\n");
+		if (!debug_descriptor.opal_boot_complete &&
+		    platform.cec_reboot) {
+			prlog(PR_NOTICE, "Host not up, rebooting now\n");
+			platform.cec_reboot();
+		} else {
+			opal_queue_msg(OPAL_MSG_SHUTDOWN, NULL, NULL, SOFT_REBOOT);
+		}
 		break;
 	default:
 		prlog(PR_WARNING, "requested bad power state: %02x\n",