Re: [PATCH] platform/x86: drop unneeded assignment in host_control_smi()

From: Hans de Goede
Date: Tue May 11 2021 - 07:11:05 EST


Hi Yang Li,

On 4/27/21 1:31 PM, Yang Li wrote:
> Making '==' operation with ESM_STATUS_CMD_UNSUCCESSFUL directly
> after calling the function inb() is more efficient, so assignment
> to 'cmd_status' is redundant.
>
> Eliminate the following clang_analyzer warning:
> drivers/platform/x86/dell/dcdbas.c:397:11: warning: Although the value
> stored to 'cmd_status' is used in the enclosing expression, the value is
> never actually read from 'cmd_status'
>
> No functional change.
>
> Reported-by: Abaci Robot <abaci@xxxxxxxxxxxxxxxxx>
> Signed-off-by: Yang Li <yang.lee@xxxxxxxxxxxxxxxxx>

Thank you for your patch, but as the "kernel test robot <lkp@xxxxxxxxx>"
reported, this actually breaks the check in the while loop.

cmd_status is a s8 and ESM_STATUS_CMD_UNSUCCESSFUL is defined as -1.

By dropping the intermediate step of storing the inb() value into the
s8, we end up comparing the inb() unsigned result directly to -1 which
is never true.

A possible way to fix this (without reworking the rest of the code) would
be to either cast the inb() result to a s8, so that you end up with this:


while ((s8)inb(PCAT_APM_STATUS_PORT) == ESM_STATUS_CMD_UNSUCCESSFUL) {

Also while at it please change the condition to a single line as I did
above.

Thanks & Regards,

Hans



> ---
> drivers/platform/x86/dell/dcdbas.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/platform/x86/dell/dcdbas.c b/drivers/platform/x86/dell/dcdbas.c
> index d513a59..a9e8a88 100644
> --- a/drivers/platform/x86/dell/dcdbas.c
> +++ b/drivers/platform/x86/dell/dcdbas.c
> @@ -394,7 +394,7 @@ static int host_control_smi(void)
>
> /* wait a few to see if it executed */
> num_ticks = TIMEOUT_USEC_SHORT_SEMA_BLOCKING;
> - while ((cmd_status = inb(PCAT_APM_STATUS_PORT))
> + while (inb(PCAT_APM_STATUS_PORT)
> == ESM_STATUS_CMD_UNSUCCESSFUL) {
> num_ticks--;
> if (num_ticks == EXPIRED_TIMER)
>