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 v3 06/21] nvmem: use kref Date: Wed, 12 Sep 2018 09:51:14 +0200 [thread overview] Message-ID: <20180912075129.25185-7-brgl@bgdev.pl> (raw) In-Reply-To: <20180912075129.25185-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 v3 06/21] nvmem: use kref Date: Wed, 12 Sep 2018 09:51:14 +0200 [thread overview] Message-ID: <20180912075129.25185-7-brgl@bgdev.pl> (raw) In-Reply-To: <20180912075129.25185-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-12 7:51 UTC|newest] Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-09-12 7:51 [PATCH v3 00/21] nvmem: rework of the subsystem for non-DT users Bartosz Golaszewski 2018-09-12 7:51 ` Bartosz Golaszewski 2018-09-12 7:51 ` [PATCH v3 01/21] nvmem: provide nvmem_dev_name() Bartosz Golaszewski 2018-09-12 7:51 ` Bartosz Golaszewski 2018-09-12 7:51 ` [PATCH v3 02/21] nvmem: remove the name field from struct nvmem_device Bartosz Golaszewski 2018-09-12 7:51 ` Bartosz Golaszewski 2018-09-12 7:51 ` [PATCH v3 03/21] nvmem: use list_for_each_entry_safe in nvmem_device_remove_all_cells() Bartosz Golaszewski 2018-09-12 7:51 ` Bartosz Golaszewski 2018-09-12 7:51 ` [PATCH v3 04/21] nvmem: remove a stray newline Bartosz Golaszewski 2018-09-12 7:51 ` Bartosz Golaszewski 2018-09-12 7:51 ` [PATCH v3 05/21] nvmem: check the return value of nvmem_add_cells() Bartosz Golaszewski 2018-09-12 7:51 ` Bartosz Golaszewski 2018-09-12 7:51 ` Bartosz Golaszewski [this message] 2018-09-12 7:51 ` [PATCH v3 06/21] nvmem: use kref Bartosz Golaszewski 2018-09-12 7:51 ` [PATCH v3 07/21] nvmem: lpc18xx_eeprom: use devm_nvmem_register() Bartosz Golaszewski 2018-09-12 7:51 ` Bartosz Golaszewski 2018-09-12 7:51 ` [PATCH v3 08/21] nvmem: sunxi_sid: " Bartosz Golaszewski 2018-09-12 7:51 ` Bartosz Golaszewski 2018-09-13 1:38 ` kbuild test robot 2018-09-13 1:38 ` kbuild test robot 2018-09-13 8:39 ` Bartosz Golaszewski 2018-09-13 8:39 ` Bartosz Golaszewski 2018-09-12 7:51 ` [PATCH v3 09/21] nvmem: mxs-ocotp: " Bartosz Golaszewski 2018-09-12 7:51 ` Bartosz Golaszewski 2018-09-12 7:51 ` [PATCH v3 10/21] nvmem: change the signature of nvmem_unregister() Bartosz Golaszewski 2018-09-12 7:51 ` Bartosz Golaszewski 2018-09-13 0:34 ` kbuild test robot 2018-09-13 0:34 ` kbuild test robot 2018-09-13 1:46 ` kbuild test robot 2018-09-13 1:46 ` kbuild test robot 2018-09-12 7:51 ` [PATCH v3 11/21] nvmem: remove the global cell list Bartosz Golaszewski 2018-09-12 7:51 ` Bartosz Golaszewski 2018-09-12 7:51 ` [PATCH v3 12/21] nvmem: add support for cell info Bartosz Golaszewski 2018-09-12 7:51 ` Bartosz Golaszewski 2018-09-12 7:51 ` [PATCH v3 13/21] nvmem: resolve cells from DT at registration time Bartosz Golaszewski 2018-09-12 7:51 ` Bartosz Golaszewski 2018-09-12 7:51 ` [PATCH v3 14/21] nvmem: add support for cell lookups from machine code Bartosz Golaszewski 2018-09-12 7:51 ` Bartosz Golaszewski 2018-09-12 7:51 ` [PATCH v3 15/21] Documentation: nvmem: document cell tables and lookup entries Bartosz Golaszewski 2018-09-12 7:51 ` Bartosz Golaszewski 2018-09-12 7:51 ` [PATCH v3 16/21] nvmem: add a notifier chain Bartosz Golaszewski 2018-09-12 7:51 ` Bartosz Golaszewski 2018-09-12 9:33 ` Bartosz Golaszewski 2018-09-12 9:33 ` Bartosz Golaszewski 2018-09-12 7:51 ` [PATCH v3 17/21] nvmem: use SPDX license identifiers Bartosz Golaszewski 2018-09-12 7:51 ` Bartosz Golaszewski 2018-09-12 7:51 ` [PATCH v3 18/21] nvmem: make the naming of arguments in nvmem_cell_get() consistent Bartosz Golaszewski 2018-09-12 7:51 ` Bartosz Golaszewski 2018-09-12 7:51 ` [PATCH v3 19/21] nvmem: use EOPNOTSUPP instead of ENOSYS Bartosz Golaszewski 2018-09-12 7:51 ` Bartosz Golaszewski 2018-09-12 7:51 ` [PATCH v3 20/21] nvmem: fix commenting style Bartosz Golaszewski 2018-09-12 7:51 ` Bartosz Golaszewski 2018-09-12 7:51 ` [PATCH v3 21/21] nvmem: use octal permissions instead of constants Bartosz Golaszewski 2018-09-12 7:51 ` Bartosz Golaszewski 2018-09-14 14:43 ` [PATCH v3 00/21] nvmem: rework of the subsystem for non-DT users Bartosz Golaszewski 2018-09-14 14:43 ` Bartosz Golaszewski
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=20180912075129.25185-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: linkBe 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.