[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