[PATCH linux dev-4.10] drivers/fsi: Fix SBEFIFO write() race condition
Eddie James
eajames at linux.vnet.ibm.com
Thu Jun 29 07:55:49 AEST 2017
From: "Edward A. James" <eajames at us.ibm.com>
There was a race condition with the XFR_WRITE_DONE flag between write()
and the worker thread. Occasionally the worker wrote all the data and
checked the flag before write() could set it.
Signed-off-by: Edward A. James <eajames at us.ibm.com>
---
drivers/fsi/fsi-sbefifo.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/fsi/fsi-sbefifo.c b/drivers/fsi/fsi-sbefifo.c
index f1bc144..d7dccf9 100644
--- a/drivers/fsi/fsi-sbefifo.c
+++ b/drivers/fsi/fsi-sbefifo.c
@@ -688,6 +688,12 @@ static ssize_t sbefifo_write_common(struct sbefifo_client *client,
len -= n;
ret += n;
+ /* set flag before starting the worker, as it may run through
+ * and check the flag before we exit this loop!
+ */
+ if (!len)
+ set_bit(SBEFIFO_XFR_WRITE_DONE, &xfr->flags);
+
/*
* Drain the write buffer.
*/
@@ -696,7 +702,6 @@ static ssize_t sbefifo_write_common(struct sbefifo_client *client,
sbefifo_put(sbefifo);
}
- set_bit(SBEFIFO_XFR_WRITE_DONE, &xfr->flags);
sbefifo_put_client(client);
return ret;
--
1.8.3.1
More information about the openbmc
mailing list