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
WARNING: multiple messages have this Message-ID (diff)
From: brgl@bgdev.pl (Bartosz Golaszewski)
To: linux-arm-kernel@lists.infradead.org
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: 50+ 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 ` Bartosz Golaszewski
2018-09-14 14:39 ` [PATCH v4 01/22] nvmem: provide nvmem_dev_name() Bartosz Golaszewski
2018-09-14 14:39 ` 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 ` 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 ` Bartosz Golaszewski
2018-09-14 14:39 ` [PATCH v4 04/22] nvmem: remove a stray newline Bartosz Golaszewski
2018-09-14 14:39 ` 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
2018-09-14 14:39 ` Bartosz Golaszewski [this message]
2018-09-14 14:39 ` [PATCH v4 06/22] nvmem: use kref Bartosz Golaszewski
2018-09-14 14:39 ` [PATCH v4 07/22] nvmem: sunxi_sid: return -ENOMEM if kzalloc() fails Bartosz Golaszewski
2018-09-14 14:39 ` 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 ` Bartosz Golaszewski
2018-09-14 14:39 ` [PATCH v4 09/22] nvmem: lpc18xx_eeprom: " Bartosz Golaszewski
2018-09-14 14:39 ` Bartosz Golaszewski
2018-09-14 14:39 ` [PATCH v4 10/22] nvmem: mxs-ocotp: " Bartosz Golaszewski
2018-09-14 14:39 ` 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 ` Bartosz Golaszewski
2018-09-14 14:40 ` [PATCH v4 12/22] nvmem: remove the global cell list Bartosz Golaszewski
2018-09-14 14:40 ` Bartosz Golaszewski
2018-09-14 14:40 ` [PATCH v4 13/22] nvmem: add support for cell info Bartosz Golaszewski
2018-09-14 14:40 ` 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 ` Bartosz Golaszewski
2018-09-14 14:40 ` [PATCH v4 15/22] nvmem: add support for cell lookups from machine code Bartosz Golaszewski
2018-09-14 14:40 ` Bartosz Golaszewski
2018-09-21 1:12 ` Srinivas Kandagatla
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 ` Bartosz Golaszewski
2018-09-14 14:40 ` [PATCH v4 17/22] nvmem: add a notifier chain Bartosz Golaszewski
2018-09-14 14:40 ` Bartosz Golaszewski
2018-09-14 14:40 ` [PATCH v4 18/22] nvmem: use SPDX license identifiers Bartosz Golaszewski
2018-09-14 14:40 ` 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 ` Bartosz Golaszewski
2018-09-14 14:40 ` [PATCH v4 20/22] nvmem: use EOPNOTSUPP instead of ENOSYS Bartosz Golaszewski
2018-09-14 14:40 ` Bartosz Golaszewski
2018-09-14 14:40 ` [PATCH v4 21/22] nvmem: fix commenting style Bartosz Golaszewski
2018-09-14 14:40 ` Bartosz Golaszewski
2018-09-14 14:40 ` [PATCH v4 22/22] nvmem: use octal permissions instead of constants Bartosz Golaszewski
2018-09-14 14:40 ` Bartosz Golaszewski
2018-09-16 14:08 ` [PATCH v4 00/22] nvmem: rework of the subsystem for non-DT users Srinivas Kandagatla
2018-09-16 14:08 ` 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 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.