[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <87blt8csyx.fsf@mpe.ellerman.id.au>
Date: Tue, 19 Nov 2019 16:53:26 +1100
From: Michael Ellerman <mpe@...erman.id.au>
To: Chen Wandun <chenwandun@...wei.com>, tyreld@...ux.ibm.com,
linuxppc-dev@...ts.ozlabs.org, linux-kernel@...r.kernel.org,
mahesh@...ux.vnet.ibm.com, paulus@...ba.org
Cc: chenwandun@...wei.com
Subject: Re: [PATCH] powerpc/pseries: remove variable 'status' set but not used
Chen Wandun <chenwandun@...wei.com> writes:
> Fixes gcc '-Wunused-but-set-variable' warning:
>
> arch/powerpc/platforms/pseries/ras.c: In function ras_epow_interrupt:
> arch/powerpc/platforms/pseries/ras.c:319:6: warning: variable status set but not used [-Wunused-but-set-variable]
Thanks for the patch.
But it almost certainly is wrong to not check the status.
It's calling firmware and just assuming that the call succeeded. It then
goes on to use the result that should have been written by firmware, but
is now potentially random junk.
So I'd much rather a patch to change it to check the status.
> diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c
> index 1d7f973..4a61d0f 100644
> --- a/arch/powerpc/platforms/pseries/ras.c
> +++ b/arch/powerpc/platforms/pseries/ras.c
> @@ -316,12 +316,11 @@ static irqreturn_t ras_hotplug_interrupt(int irq, void *dev_id)
> /* Handle environmental and power warning (EPOW) interrupts. */
> static irqreturn_t ras_epow_interrupt(int irq, void *dev_id)
> {
> - int status;
> int state;
> int critical;
>
> - status = rtas_get_sensor_fast(EPOW_SENSOR_TOKEN, EPOW_SENSOR_INDEX,
> - &state);
> + rtas_get_sensor_fast(EPOW_SENSOR_TOKEN, EPOW_SENSOR_INDEX,
> + &state);
This is calling a helper which already does some translation of the
return value, any value < 0 indicates an error.
> @@ -330,12 +329,12 @@ static irqreturn_t ras_epow_interrupt(int irq, void *dev_id)
>
> spin_lock(&ras_log_buf_lock);
>
> - status = rtas_call(ras_check_exception_token, 6, 1, NULL,
> - RTAS_VECTOR_EXTERNAL_INTERRUPT,
> - virq_to_hw(irq),
> - RTAS_EPOW_WARNING,
> - critical, __pa(&ras_log_buf),
> - rtas_get_error_log_max());
> + rtas_call(ras_check_exception_token, 6, 1, NULL,
> + RTAS_VECTOR_EXTERNAL_INTERRUPT,
> + virq_to_hw(irq),
> + RTAS_EPOW_WARNING,
> + critical, __pa(&ras_log_buf),
> + rtas_get_error_log_max());
This is directly calling firmware.
As documented in LoPAPR, a negative status indicates an error, 0
indicates a new error log was found (ie. the function should continue),
or 1 there was no error log (ie. nothing to do).
cheers
> log_error(ras_log_buf, ERR_TYPE_RTAS_LOG, 0);
>
> --
> 2.7.4
Powered by blists - more mailing lists