diff mbox series

[2/2] xenbus: req->err should be updated before req->state

Message ID 20200303015859.18813-2-dongli.zhang@oracle.com (mailing list archive)
State Superseded
Headers show
Series [1/2] xenbus: req->body should be updated before req->state | expand

Commit Message

Dongli Zhang March 3, 2020, 1:58 a.m. UTC
This patch adds the barrier to guarantee that req->err is always updated
before req->state.

Otherwise, read_reply() would not return ERR_PTR(req->err) but
req->body, when process_writes()->xb_write() is failed.

Signed-off-by: Dongli Zhang <dongli.zhang@oracle.com>
---
 drivers/xen/xenbus/xenbus_comms.c | 2 ++
 1 file changed, 2 insertions(+)

Comments

Julien Grall March 3, 2020, 10:11 a.m. UTC | #1
Hi,

On 03/03/2020 01:58, Dongli Zhang wrote:
> This patch adds the barrier to guarantee that req->err is always updated
> before req->state.
> 
> Otherwise, read_reply() would not return ERR_PTR(req->err) but
> req->body, when process_writes()->xb_write() is failed.

The memory barrier below looks good. However, as mentionned in patch #1, 
barrier() is not the correct barrier to pair with virt_wmb().

> 
> Signed-off-by: Dongli Zhang <dongli.zhang@oracle.com>
> ---
>   drivers/xen/xenbus/xenbus_comms.c | 2 ++
>   1 file changed, 2 insertions(+)
> 
> diff --git a/drivers/xen/xenbus/xenbus_comms.c b/drivers/xen/xenbus/xenbus_comms.c
> index 852ed161fc2a..eb5151fc8efa 100644
> --- a/drivers/xen/xenbus/xenbus_comms.c
> +++ b/drivers/xen/xenbus/xenbus_comms.c
> @@ -397,6 +397,8 @@ static int process_writes(void)
>   	if (state.req->state == xb_req_state_aborted)
>   		kfree(state.req);
>   	else {
> +		/* write err, then update state */
> +		virt_wmb();
>   		state.req->state = xb_req_state_got_reply;
>   		wake_up(&state.req->wq);
>   	}
> 

Cheers,
diff mbox series

Patch

diff --git a/drivers/xen/xenbus/xenbus_comms.c b/drivers/xen/xenbus/xenbus_comms.c
index 852ed161fc2a..eb5151fc8efa 100644
--- a/drivers/xen/xenbus/xenbus_comms.c
+++ b/drivers/xen/xenbus/xenbus_comms.c
@@ -397,6 +397,8 @@  static int process_writes(void)
 	if (state.req->state == xb_req_state_aborted)
 		kfree(state.req);
 	else {
+		/* write err, then update state */
+		virt_wmb();
 		state.req->state = xb_req_state_got_reply;
 		wake_up(&state.req->wq);
 	}