diff mbox series

[v3,03/13] core/flash: Don't hold flash_lock for the entirety of an opal_flash_op()

Message ID 1578338508-13424-4-git-send-email-debmc@linux.ibm.com
State New, archived
Headers show
Series ipmi-hiomap: Enablement for Async opal_flash_op's | expand

Checks

Context Check Description
snowpatch_ozlabs/apply_patch success Successfully applied on branch master (d75e82dbfbb9443efeb3f9a5921ac23605aab469)
snowpatch_ozlabs/snowpatch_job_snowpatch-skiboot success Test snowpatch/job/snowpatch-skiboot on branch master
snowpatch_ozlabs/snowpatch_job_snowpatch-skiboot-dco success Signed-off-by present

Commit Message

Deb McLemore Jan. 6, 2020, 7:21 p.m. UTC
From: Cyril Bur <cyril.bur@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@au1.ibm.com>
Reviewed-By: Alistair Popple <alistair@popple.id.au>
Signed-off-by: Stewart Smith <stewart@linux.ibm.com>
---
 core/flash.c | 19 ++++++-------------
 1 file changed, 6 insertions(+), 13 deletions(-)
diff mbox series

Patch

diff --git a/core/flash.c b/core/flash.c
index 78e0023..d97d88e 100644
--- a/core/flash.c
+++ b/core/flash.c
@@ -429,23 +429,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) {
@@ -481,13 +474,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;
 }