From: Bartosz Golaszewski <brgl@bgdev.pl>
To: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>,
"David S . Miller" <davem@davemloft.net>,
Mauro Carvalho Chehab <mchehab+samsung@kernel.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Andrew Morton <akpm@linux-foundation.org>,
Arnd Bergmann <arnd@arndb.de>, Jonathan Corbet <corbet@lwn.net>,
Sekhar Nori <nsekhar@ti.com>, Kevin Hilman <khilman@kernel.org>,
David Lechner <david@lechnology.com>,
Boris Brezillon <boris.brezillon@bootlin.com>,
Andrew Lunn <andrew@lunn.ch>, Alban Bedel <albeu@free.fr>,
Maxime Ripard <maxime.ripard@bootlin.com>,
Chen-Yu Tsai <wens@csie.org>
Cc: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
Bartosz Golaszewski <bgolaszewski@baylibre.com>
Subject: [PATCH v4 06/22] nvmem: use kref
Date: Fri, 14 Sep 2018 16:39:55 +0200 [thread overview]
Message-ID: <20180914144011.27614-7-brgl@bgdev.pl> (raw)
In-Reply-To: <20180914144011.27614-1-brgl@bgdev.pl>
From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Use kref for reference counting. Use an approach similar to the one
seen in the common clock subsystem: don't actually destroy the nvmem
device until the last user puts it. This way we can get rid of the
users check from nvmem_unregister().
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
---
drivers/nvmem/core.c | 44 ++++++++++++++++++++++----------------------
1 file changed, 22 insertions(+), 22 deletions(-)
diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c
index ffed8fa16936..552ffedce38e 100644
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
@@ -19,6 +19,7 @@
#include <linux/fs.h>
#include <linux/idr.h>
#include <linux/init.h>
+#include <linux/kref.h>
#include <linux/module.h>
#include <linux/nvmem-consumer.h>
#include <linux/nvmem-provider.h>
@@ -31,7 +32,7 @@ struct nvmem_device {
int stride;
int word_size;
int id;
- int users;
+ struct kref refcnt;
size_t size;
bool read_only;
int flags;
@@ -463,6 +464,8 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config)
return ERR_PTR(rval);
}
+ kref_init(&nvmem->refcnt);
+
nvmem->id = rval;
nvmem->owner = config->owner;
if (!nvmem->owner && config->dev->driver)
@@ -532,6 +535,20 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config)
}
EXPORT_SYMBOL_GPL(nvmem_register);
+static void nvmem_device_release(struct kref *kref)
+{
+ struct nvmem_device *nvmem;
+
+ nvmem = container_of(kref, struct nvmem_device, refcnt);
+
+ if (nvmem->flags & FLAG_COMPAT)
+ device_remove_bin_file(nvmem->base_dev, &nvmem->eeprom);
+
+ nvmem_device_remove_all_cells(nvmem);
+ device_del(&nvmem->dev);
+ put_device(&nvmem->dev);
+}
+
/**
* nvmem_unregister() - Unregister previously registered nvmem device
*
@@ -541,19 +558,7 @@ EXPORT_SYMBOL_GPL(nvmem_register);
*/
int nvmem_unregister(struct nvmem_device *nvmem)
{
- mutex_lock(&nvmem_mutex);
- if (nvmem->users) {
- mutex_unlock(&nvmem_mutex);
- return -EBUSY;
- }
- mutex_unlock(&nvmem_mutex);
-
- if (nvmem->flags & FLAG_COMPAT)
- device_remove_bin_file(nvmem->base_dev, &nvmem->eeprom);
-
- nvmem_device_remove_all_cells(nvmem);
- device_del(&nvmem->dev);
- put_device(&nvmem->dev);
+ kref_put(&nvmem->refcnt, nvmem_device_release);
return 0;
}
@@ -647,7 +652,6 @@ static struct nvmem_device *__nvmem_device_get(struct device_node *np,
}
}
- nvmem->users++;
mutex_unlock(&nvmem_mutex);
if (!try_module_get(nvmem->owner)) {
@@ -655,22 +659,18 @@ static struct nvmem_device *__nvmem_device_get(struct device_node *np,
"could not increase module refcount for cell %s\n",
nvmem_dev_name(nvmem));
- mutex_lock(&nvmem_mutex);
- nvmem->users--;
- mutex_unlock(&nvmem_mutex);
-
return ERR_PTR(-EINVAL);
}
+ kref_get(&nvmem->refcnt);
+
return nvmem;
}
static void __nvmem_device_put(struct nvmem_device *nvmem)
{
module_put(nvmem->owner);
- mutex_lock(&nvmem_mutex);
- nvmem->users--;
- mutex_unlock(&nvmem_mutex);
+ kref_put(&nvmem->refcnt, nvmem_device_release);
}
static struct nvmem_device *nvmem_find(const char *name)
--
2.18.0
next prev parent reply other threads:[~2018-09-14 14:42 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-09-14 14:39 [PATCH v4 00/22] nvmem: rework of the subsystem for non-DT users Bartosz Golaszewski
2018-09-14 14:39 ` [PATCH v4 01/22] nvmem: provide nvmem_dev_name() Bartosz Golaszewski
2018-09-14 14:39 ` [PATCH v4 02/22] nvmem: remove the name field from struct nvmem_device Bartosz Golaszewski
2018-09-14 14:39 ` [PATCH v4 03/22] nvmem: use list_for_each_entry_safe in nvmem_device_remove_all_cells() Bartosz Golaszewski
2018-09-14 14:39 ` [PATCH v4 04/22] nvmem: remove a stray newline Bartosz Golaszewski
2018-09-14 14:39 ` [PATCH v4 05/22] nvmem: check the return value of nvmem_add_cells() Bartosz Golaszewski
2018-09-14 14:39 ` Bartosz Golaszewski [this message]
2018-09-14 14:39 ` [PATCH v4 07/22] nvmem: sunxi_sid: return -ENOMEM if kzalloc() fails Bartosz Golaszewski
2018-09-14 14:39 ` [PATCH v4 08/22] nvmem: sunxi_sid: use devm_nvmem_register() Bartosz Golaszewski
2018-09-14 14:39 ` [PATCH v4 09/22] nvmem: lpc18xx_eeprom: " Bartosz Golaszewski
2018-09-14 14:39 ` [PATCH v4 10/22] nvmem: mxs-ocotp: " Bartosz Golaszewski
2018-09-14 14:40 ` [PATCH v4 11/22] nvmem: change the signature of nvmem_unregister() Bartosz Golaszewski
2018-09-14 14:40 ` [PATCH v4 12/22] nvmem: remove the global cell list Bartosz Golaszewski
2018-09-14 14:40 ` [PATCH v4 13/22] nvmem: add support for cell info Bartosz Golaszewski
2018-09-14 14:40 ` [PATCH v4 14/22] nvmem: resolve cells from DT at registration time Bartosz Golaszewski
2018-09-14 14:40 ` [PATCH v4 15/22] nvmem: add support for cell lookups from machine code Bartosz Golaszewski
2018-09-21 1:12 ` Srinivas Kandagatla
2018-09-14 14:40 ` [PATCH v4 16/22] Documentation: nvmem: document cell tables and lookup entries Bartosz Golaszewski
2018-09-14 14:40 ` [PATCH v4 17/22] nvmem: add a notifier chain Bartosz Golaszewski
2018-09-14 14:40 ` [PATCH v4 18/22] nvmem: use SPDX license identifiers Bartosz Golaszewski
2018-09-14 14:40 ` [PATCH v4 19/22] nvmem: make the naming of arguments in nvmem_cell_get() consistent Bartosz Golaszewski
2018-09-14 14:40 ` [PATCH v4 20/22] nvmem: use EOPNOTSUPP instead of ENOSYS Bartosz Golaszewski
2018-09-14 14:40 ` [PATCH v4 21/22] nvmem: fix commenting style Bartosz Golaszewski
2018-09-14 14:40 ` [PATCH v4 22/22] nvmem: use octal permissions instead of constants Bartosz Golaszewski
2018-09-16 14:08 ` [PATCH v4 00/22] nvmem: rework of the subsystem for non-DT users Srinivas Kandagatla
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=20180914144011.27614-7-brgl@bgdev.pl \
--to=brgl@bgdev.pl \
--cc=akpm@linux-foundation.org \
--cc=albeu@free.fr \
--cc=andrew@lunn.ch \
--cc=arnd@arndb.de \
--cc=bgolaszewski@baylibre.com \
--cc=boris.brezillon@bootlin.com \
--cc=corbet@lwn.net \
--cc=davem@davemloft.net \
--cc=david@lechnology.com \
--cc=gregkh@linuxfoundation.org \
--cc=khilman@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=maxime.ripard@bootlin.com \
--cc=mchehab+samsung@kernel.org \
--cc=nsekhar@ti.com \
--cc=srinivas.kandagatla@linaro.org \
--cc=wens@csie.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).