From: Cyril Bur <cyrilbur@gmail.com>
To: linuxppc-dev@lists.ozlabs.org, linux-mtd@lists.infradead.org
Cc: benh@kernel.crashing.org, stewart@linux.vnet.ibm.com,
dwmw2@infradead.org, rlippert@google.com, alistair@popple.id.au
Subject: [PATCH v2 02/10] mtd: powernv_flash: Lock around concurrent access to OPAL
Date: Mon, 10 Jul 2017 11:30:58 +1000 [thread overview]
Message-ID: <20170710013106.27276-3-cyrilbur@gmail.com> (raw)
In-Reply-To: <20170710013106.27276-1-cyrilbur@gmail.com>
OPAL can only manage one flash access at a time and will return an
OPAL_BUSY error for each concurrent access to the flash. The simplest
way to prevent this from happening is with a mutex.
Signed-off-by: Cyril Bur <cyrilbur@gmail.com>
---
drivers/mtd/devices/powernv_flash.c | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)
diff --git a/drivers/mtd/devices/powernv_flash.c b/drivers/mtd/devices/powernv_flash.c
index a9a20c00687c..7b41af06f4fe 100644
--- a/drivers/mtd/devices/powernv_flash.c
+++ b/drivers/mtd/devices/powernv_flash.c
@@ -38,6 +38,7 @@
struct powernv_flash {
struct mtd_info mtd;
+ struct mutex lock;
u32 id;
};
@@ -59,12 +60,15 @@ static int powernv_flash_async_op(struct mtd_info *mtd, enum flash_op op,
dev_dbg(dev, "%s(op=%d, offset=0x%llx, len=%zu)\n",
__func__, op, offset, len);
+ mutex_lock(&info->lock);
+
token = opal_async_get_token_interruptible();
if (token < 0) {
if (token != -ERESTARTSYS)
dev_err(dev, "Failed to get an async token\n");
- return token;
+ rc = token;
+ goto out;
}
switch (op) {
@@ -79,18 +83,21 @@ static int powernv_flash_async_op(struct mtd_info *mtd, enum flash_op op,
break;
default:
WARN_ON_ONCE(1);
- return -EIO;
+ rc = -EIO;
+ goto out;
}
if (rc != OPAL_ASYNC_COMPLETION) {
dev_err(dev, "opal_flash_async_op(op=%d) failed (rc %d)\n",
op, rc);
opal_async_release_token(token);
- return -EIO;
+ rc = -EIO;
+ goto out;
}
rc = opal_async_wait_response(token, &msg);
opal_async_release_token(token);
+ mutex_unlock(&info->lock);
if (rc) {
dev_err(dev, "opal async wait failed (rc %d)\n", rc);
return -EIO;
@@ -106,6 +113,9 @@ static int powernv_flash_async_op(struct mtd_info *mtd, enum flash_op op,
}
return rc;
+out:
+ mutex_unlock(&info->lock);
+ return rc;
}
/**
@@ -237,6 +247,8 @@ static int powernv_flash_probe(struct platform_device *pdev)
if (ret)
goto out;
+ mutex_init(&data->lock);
+
dev_set_drvdata(dev, data);
/*
--
2.13.2
next prev parent reply other threads:[~2017-07-10 1:31 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-07-10 1:30 [PATCH v2 00/10] Allow opal-async waiters to get interrupted Cyril Bur
2017-07-10 1:30 ` [PATCH v2 01/10] mtd: powernv_flash: Use WARN_ON_ONCE() rather than BUG_ON() Cyril Bur
2017-07-10 1:30 ` Cyril Bur [this message]
2017-07-10 1:30 ` [PATCH v2 03/10] mtd: powernv_flash: Don't treat OPAL_SUCCESS as an error Cyril Bur
2017-07-10 1:31 ` [PATCH v2 04/10] mtd: powernv_flash: Remove pointless goto in driver init Cyril Bur
2017-07-10 1:31 ` [PATCH v2 05/10] powerpc/opal: Make __opal_async_{get, release}_token() static Cyril Bur
2017-07-10 1:31 ` [PATCH v2 06/10] powerpc/opal: Rework the opal-async interface Cyril Bur
2017-07-10 1:31 ` [PATCH v2 07/10] powernv/opal-sensor: remove not needed lock Cyril Bur
2017-07-10 1:31 ` [PATCH v2 08/10] powerpc/opal: Add opal_async_wait_response_interruptible() to opal-async Cyril Bur
2017-07-10 14:05 ` David Laight
2017-07-10 14:05 ` David Laight
2017-07-11 0:48 ` Cyril Bur
2017-07-10 1:31 ` [PATCH v2 09/10] powerpc/powernv: Add OPAL_BUSY to opal_error_code() Cyril Bur
2017-07-10 1:31 ` [PATCH v2 10/10] mtd: powernv_flash: Use opal_async_wait_response_interruptible() Cyril Bur
2017-07-11 4:19 ` kbuild test robot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170710013106.27276-3-cyrilbur@gmail.com \
--to=cyrilbur@gmail.com \
--cc=alistair@popple.id.au \
--cc=benh@kernel.crashing.org \
--cc=dwmw2@infradead.org \
--cc=linux-mtd@lists.infradead.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=rlippert@google.com \
--cc=stewart@linux.vnet.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.