[Skiboot] [RFC PATCH 3/6] core/flash: Don't hold flash_lock for the entirety of an opal_flash_op()
Stewart Smith
stewart at linux.ibm.com
Thu Feb 28 17:18:23 AEDT 2019
From: Cyril Bur <cyril.bur at au1.ibm.com>
It doesn't make sense to hold the lock to the flash for an entire flash
op. The flash_lock provides mutual exclusion to the flashes structure
and each flash element has a busy boolean which ensures that mutual
exclusion on access of the flash.
Signed-off-by: Cyril Bur <cyril.bur at au1.ibm.com>
Reviewed-By: Alistair Popple <alistair at popple.id.au>
Signed-off-by: Stewart Smith <stewart at linux.ibm.com>
---
core/flash.c | 19 ++++++-------------
1 file changed, 6 insertions(+), 13 deletions(-)
diff --git a/core/flash.c b/core/flash.c
index f468b4263c79..69d157afc16d 100644
--- a/core/flash.c
+++ b/core/flash.c
@@ -352,23 +352,16 @@ static int64_t opal_flash_op(enum flash_op op, uint64_t id, uint64_t offset,
struct flash *flash = NULL;
int rc;
- if (!try_lock(&flash_lock))
- return OPAL_BUSY;
-
list_for_each(&flashes, flash, list)
if (flash->id == id)
break;
- if (flash->id != id) {
+ if (flash->id != id)
/* Couldn't find the flash */
- rc = OPAL_PARAMETER;
- goto err;
- }
+ return OPAL_PARAMETER;
- if (flash->busy) {
- rc = OPAL_BUSY;
- goto err;
- }
+ if (!flash_reserve(flash))
+ return OPAL_BUSY;
if (size > flash->size || offset >= flash->size
|| offset + size > flash->size) {
@@ -404,13 +397,13 @@ static int64_t opal_flash_op(enum flash_op op, uint64_t id, uint64_t offset,
goto err;
}
- unlock(&flash_lock);
+ flash_release(flash);
opal_queue_msg(OPAL_MSG_ASYNC_COMP, NULL, NULL, token, rc);
return OPAL_ASYNC_COMPLETION;
err:
- unlock(&flash_lock);
+ flash_release(flash);
return rc;
}
--
2.20.1
More information about the Skiboot
mailing list