Re: [PATCH v2 1/5] firmware: arm_scmi: reset_rx_to_maxsz during async commands

From: Sudeep Holla
Date: Wed Jun 02 2021 - 12:09:02 EST


On Tue, Jun 01, 2021 at 11:24:17AM +0100, Cristian Marussi wrote:
> During an async commands execution the rx buffer len is at first set to
> max_msg_sz when the synchronous part of the command is first sent; once
> the synchronous part completes the transport layer waits for the delayed
> response which will be processed using the same xfer descriptor initially
> allocated, but synchronous response received at the end of the xfer will
> have shrunk the rx buffer len to the effective payload response length.
>
> Raise the rx buffer length again to max_msg_sz while waiting for the
> delayed response, while adding an informational error message.
>
> Fixes: 58ecdf03dbb9 ("firmware: arm_scmi: Add support for asynchronous commands and delayed response")
> Signed-off-by: Cristian Marussi <cristian.marussi@xxxxxxx>
> ---
> drivers/firmware/arm_scmi/driver.c | 12 ++++++++++--
> 1 file changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c
> index 66eb3f0e5daf..75141b90ae53 100644
> --- a/drivers/firmware/arm_scmi/driver.c
> +++ b/drivers/firmware/arm_scmi/driver.c
> @@ -513,8 +513,16 @@ static int do_xfer_with_response(const struct scmi_protocol_handle *ph,
> xfer->async_done = &async_response;
>
> ret = do_xfer(ph, xfer);
> - if (!ret && !wait_for_completion_timeout(xfer->async_done, timeout))
> - ret = -ETIMEDOUT;
> + if (!ret) {
> + /* rx.len would have been shrunk in the sync do_xfer above */
> + reset_rx_to_maxsz(ph, xfer);

Won't this race with delayed response notification ? I think so, let me
know if not and how. Can't we have this before we fetch the response into xfer ?

--
Regards,
Sudeep