From: William Breathitt Gray <vilhelm.gray@gmail.com>
To: David Lechner <david@lechnology.com>
Cc: jic23@kernel.org, kamel.bouhara@bootlin.com,
gwendal@chromium.org, alexandre.belloni@bootlin.com,
linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-stm32@st-md-mailman.stormreply.com,
linux-arm-kernel@lists.infradead.org, syednwaris@gmail.com,
patrick.havelange@essensium.com, fabrice.gasnier@st.com,
mcoquelin.stm32@gmail.com, alexandre.torgue@st.com
Subject: Re: [PATCH v5 1/5] counter: Internalize sysfs interface code
Date: Fri, 23 Oct 2020 09:12:56 -0400 [thread overview]
Message-ID: <20201023131256.GA30908@shinobu> (raw)
In-Reply-To: <d2418c64-f1c7-810d-b80e-91155e0aaffd@lechnology.com>
[-- Attachment #1: Type: text/plain, Size: 3796 bytes --]
On Tue, Oct 20, 2020 at 10:38:43AM -0500, David Lechner wrote:
> On 10/18/20 9:49 AM, William Breathitt Gray wrote:
> > On Mon, Oct 12, 2020 at 09:15:00PM -0500, David Lechner wrote:
> >> On 9/26/20 9:18 PM, William Breathitt Gray wrote:
> >>> diff --git a/drivers/counter/counter-core.c b/drivers/counter/counter-core.c
> >>> new file mode 100644
> >>> index 000000000000..987c6e8277eb
> >>> --- /dev/null
> >>> +++ b/drivers/counter/counter-core.c
> >>
> >>
> >>> +/**
> >>> + * counter_register - register Counter to the system
> >>> + * @counter: pointer to Counter to register
> >>> + *
> >>> + * This function registers a Counter to the system. A sysfs "counter" directory
> >>> + * will be created and populated with sysfs attributes correlating with the
> >>> + * Counter Signals, Synapses, and Counts respectively.
> >>> + */
> >>> +int counter_register(struct counter_device *const counter)
> >>> +{
> >>> + struct device *const dev = &counter->dev;
> >>> + int err;
> >>> +
> >>> + /* Acquire unique ID */
> >>> + counter->id = ida_simple_get(&counter_ida, 0, 0, GFP_KERNEL);
> >>> + if (counter->id < 0)
> >>> + return counter->id;
> >>> +
> >>> + /* Configure device structure for Counter */
> >>> + dev->type = &counter_device_type;
> >>> + dev->bus = &counter_bus_type;
> >>> + if (counter->parent) {
> >>> + dev->parent = counter->parent;
> >>> + dev->of_node = counter->parent->of_node;
> >>> + }
> >>> + dev_set_name(dev, "counter%d", counter->id);
> >>> + device_initialize(dev);> + dev_set_drvdata(dev, counter);
> >>> +
> >>> + /* Add Counter sysfs attributes */
> >>> + err = counter_sysfs_add(counter);
> >>> + if (err)
> >>> + goto err_free_id;
> >>> +
> >>> + /* Add device to system */
> >>> + err = device_add(dev);
> >>> + if (err) {
> >>> + put_device(dev);
> >>> + goto err_free_id;
> >>> + }
> >>> +
> >>> + return 0;
> >>> +
> >>> +err_free_id:
> >>> + /* get_device/put_device combo used to free managed resources */
> >>> + get_device(dev);
> >>> + put_device(dev);
> >>
> >> I've never seen this in a driver before, so it makes me think this is
> >> not the "right way" to do this. After device_initialize() is called, we
> >> already should have a reference to dev, so only device_put() is needed.
> >
> > I do admit this feels very hacky, but I'm not sure how to handle this
> > more elegantly. The problem is that device_initialize() is not enough by
> > itself -- it just initializes the structure, while device_add()
> > increments the reference count via a call to get_device().
>
> add_device() also releases this reference by calling put_device() in all
> return paths. The reference count is initialized to 1 in device_initialize().
>
> device_initialize > kobject_init > kobject_init_internal > kref_init
You're right, I completely overlooked this: kref_init() initializes the
reference count to 1. Therefore, the get_device() call is incorrect and
should be be removed.
> >
> > So let's assume counter_sysfs_add() fails and we go to err_free_id
> > before device_add() is called; if we ignore get_device(), the reference
> > count will be 0 at this point. We then call put_device(), which calls
> > kobject_put(), kref_put(), and eventually refcount_dec_and_test().
> >
> > The refcount_dec_and_test() function returns 0 at this point because the
> > reference count can't be decremented further (refcount is already 0), so
> > release() is never called and we end up leaking all the memory we
> > allocated in counter_sysfs_add().
> >
> > Is my logic correct here?
>
> Not quite. I think you missed a few things I mentioned above. So we never
> have a ref count of 0 until the very last call to put_device().
Ack.
William Breathitt Gray
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: William Breathitt Gray <vilhelm.gray@gmail.com>
To: David Lechner <david@lechnology.com>
Cc: kamel.bouhara@bootlin.com, gwendal@chromium.org,
alexandre.torgue@st.com, linux-iio@vger.kernel.org,
patrick.havelange@essensium.com, alexandre.belloni@bootlin.com,
linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org, mcoquelin.stm32@gmail.com,
syednwaris@gmail.com, linux-stm32@st-md-mailman.stormreply.com,
jic23@kernel.org
Subject: Re: [PATCH v5 1/5] counter: Internalize sysfs interface code
Date: Fri, 23 Oct 2020 09:12:56 -0400 [thread overview]
Message-ID: <20201023131256.GA30908@shinobu> (raw)
In-Reply-To: <d2418c64-f1c7-810d-b80e-91155e0aaffd@lechnology.com>
[-- Attachment #1.1: Type: text/plain, Size: 3796 bytes --]
On Tue, Oct 20, 2020 at 10:38:43AM -0500, David Lechner wrote:
> On 10/18/20 9:49 AM, William Breathitt Gray wrote:
> > On Mon, Oct 12, 2020 at 09:15:00PM -0500, David Lechner wrote:
> >> On 9/26/20 9:18 PM, William Breathitt Gray wrote:
> >>> diff --git a/drivers/counter/counter-core.c b/drivers/counter/counter-core.c
> >>> new file mode 100644
> >>> index 000000000000..987c6e8277eb
> >>> --- /dev/null
> >>> +++ b/drivers/counter/counter-core.c
> >>
> >>
> >>> +/**
> >>> + * counter_register - register Counter to the system
> >>> + * @counter: pointer to Counter to register
> >>> + *
> >>> + * This function registers a Counter to the system. A sysfs "counter" directory
> >>> + * will be created and populated with sysfs attributes correlating with the
> >>> + * Counter Signals, Synapses, and Counts respectively.
> >>> + */
> >>> +int counter_register(struct counter_device *const counter)
> >>> +{
> >>> + struct device *const dev = &counter->dev;
> >>> + int err;
> >>> +
> >>> + /* Acquire unique ID */
> >>> + counter->id = ida_simple_get(&counter_ida, 0, 0, GFP_KERNEL);
> >>> + if (counter->id < 0)
> >>> + return counter->id;
> >>> +
> >>> + /* Configure device structure for Counter */
> >>> + dev->type = &counter_device_type;
> >>> + dev->bus = &counter_bus_type;
> >>> + if (counter->parent) {
> >>> + dev->parent = counter->parent;
> >>> + dev->of_node = counter->parent->of_node;
> >>> + }
> >>> + dev_set_name(dev, "counter%d", counter->id);
> >>> + device_initialize(dev);> + dev_set_drvdata(dev, counter);
> >>> +
> >>> + /* Add Counter sysfs attributes */
> >>> + err = counter_sysfs_add(counter);
> >>> + if (err)
> >>> + goto err_free_id;
> >>> +
> >>> + /* Add device to system */
> >>> + err = device_add(dev);
> >>> + if (err) {
> >>> + put_device(dev);
> >>> + goto err_free_id;
> >>> + }
> >>> +
> >>> + return 0;
> >>> +
> >>> +err_free_id:
> >>> + /* get_device/put_device combo used to free managed resources */
> >>> + get_device(dev);
> >>> + put_device(dev);
> >>
> >> I've never seen this in a driver before, so it makes me think this is
> >> not the "right way" to do this. After device_initialize() is called, we
> >> already should have a reference to dev, so only device_put() is needed.
> >
> > I do admit this feels very hacky, but I'm not sure how to handle this
> > more elegantly. The problem is that device_initialize() is not enough by
> > itself -- it just initializes the structure, while device_add()
> > increments the reference count via a call to get_device().
>
> add_device() also releases this reference by calling put_device() in all
> return paths. The reference count is initialized to 1 in device_initialize().
>
> device_initialize > kobject_init > kobject_init_internal > kref_init
You're right, I completely overlooked this: kref_init() initializes the
reference count to 1. Therefore, the get_device() call is incorrect and
should be be removed.
> >
> > So let's assume counter_sysfs_add() fails and we go to err_free_id
> > before device_add() is called; if we ignore get_device(), the reference
> > count will be 0 at this point. We then call put_device(), which calls
> > kobject_put(), kref_put(), and eventually refcount_dec_and_test().
> >
> > The refcount_dec_and_test() function returns 0 at this point because the
> > reference count can't be decremented further (refcount is already 0), so
> > release() is never called and we end up leaking all the memory we
> > allocated in counter_sysfs_add().
> >
> > Is my logic correct here?
>
> Not quite. I think you missed a few things I mentioned above. So we never
> have a ref count of 0 until the very last call to put_device().
Ack.
William Breathitt Gray
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
[-- Attachment #2: Type: text/plain, Size: 176 bytes --]
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2020-10-23 13:13 UTC|newest]
Thread overview: 71+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-27 2:18 [PATCH v5 0/5] Introduce the Counter character device interface William Breathitt Gray
2020-09-27 2:18 ` William Breathitt Gray
2020-09-27 2:18 ` [PATCH v5 1/5] counter: Internalize sysfs interface code William Breathitt Gray
2020-10-13 2:15 ` David Lechner
2020-10-13 2:15 ` David Lechner
2020-10-18 14:49 ` William Breathitt Gray
2020-10-18 14:49 ` William Breathitt Gray
2020-10-20 15:38 ` David Lechner
2020-10-20 15:38 ` David Lechner
2020-10-23 13:12 ` William Breathitt Gray [this message]
2020-10-23 13:12 ` William Breathitt Gray
2020-10-15 1:38 ` David Lechner
2020-10-15 1:38 ` David Lechner
2020-10-18 17:00 ` William Breathitt Gray
2020-10-18 17:00 ` William Breathitt Gray
2020-09-27 2:18 ` [PATCH v5 2/5] docs: counter: Update to reflect sysfs internalization William Breathitt Gray
2020-09-27 2:18 ` William Breathitt Gray
2020-09-27 2:18 ` [PATCH v5 3/5] counter: Add character device interface William Breathitt Gray
2020-09-27 2:18 ` William Breathitt Gray
2020-10-14 1:40 ` David Lechner
2020-10-14 1:40 ` David Lechner
2020-10-18 16:49 ` William Breathitt Gray
2020-10-18 16:49 ` William Breathitt Gray
2020-10-20 15:53 ` David Lechner
2020-10-20 15:53 ` David Lechner
2020-10-25 12:55 ` William Breathitt Gray
2020-10-25 12:55 ` William Breathitt Gray
2020-10-25 16:36 ` David Lechner
2020-10-25 16:36 ` David Lechner
2020-10-14 17:43 ` David Lechner
2020-10-14 17:43 ` David Lechner
2020-10-14 19:05 ` William Breathitt Gray
2020-10-14 19:05 ` William Breathitt Gray
2020-10-14 22:32 ` David Lechner
2020-10-14 22:32 ` David Lechner
2020-10-14 22:40 ` David Lechner
2020-10-14 22:40 ` David Lechner
2020-10-18 16:58 ` William Breathitt Gray
2020-10-18 16:58 ` William Breathitt Gray
2020-10-20 16:06 ` David Lechner
2020-10-20 16:06 ` David Lechner
2020-10-25 13:18 ` William Breathitt Gray
2020-10-25 13:18 ` William Breathitt Gray
2020-10-25 16:34 ` David Lechner
2020-10-25 16:34 ` David Lechner
2020-10-25 17:53 ` William Breathitt Gray
2020-10-25 17:53 ` William Breathitt Gray
2020-09-27 2:18 ` [PATCH v5 4/5] docs: counter: Document " William Breathitt Gray
2020-09-27 2:18 ` William Breathitt Gray
2020-10-08 8:09 ` Pavel Machek
2020-10-08 8:09 ` Pavel Machek
2020-10-08 12:28 ` William Breathitt Gray
2020-10-08 12:28 ` William Breathitt Gray
2020-10-12 17:04 ` David Lechner
2020-10-12 17:04 ` David Lechner
2020-10-13 18:58 ` William Breathitt Gray
2020-10-13 18:58 ` William Breathitt Gray
2020-10-13 19:08 ` David Lechner
2020-10-13 19:08 ` David Lechner
2020-10-13 19:27 ` William Breathitt Gray
2020-10-13 19:27 ` William Breathitt Gray
2020-09-27 2:18 ` [PATCH v5 5/5] counter: 104-quad-8: Add IRQ support for the ACCES 104-QUAD-8 William Breathitt Gray
2020-09-27 2:18 ` William Breathitt Gray
2020-10-14 0:13 ` David Lechner
2020-10-14 0:13 ` David Lechner
2020-10-18 14:50 ` William Breathitt Gray
2020-10-18 14:50 ` William Breathitt Gray
2020-10-13 0:35 ` [PATCH v5 0/5] Introduce the Counter character device interface David Lechner
2020-10-13 0:35 ` David Lechner
2020-10-18 14:14 ` William Breathitt Gray
2020-10-18 14:14 ` William Breathitt Gray
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=20201023131256.GA30908@shinobu \
--to=vilhelm.gray@gmail.com \
--cc=alexandre.belloni@bootlin.com \
--cc=alexandre.torgue@st.com \
--cc=david@lechnology.com \
--cc=fabrice.gasnier@st.com \
--cc=gwendal@chromium.org \
--cc=jic23@kernel.org \
--cc=kamel.bouhara@bootlin.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-stm32@st-md-mailman.stormreply.com \
--cc=mcoquelin.stm32@gmail.com \
--cc=patrick.havelange@essensium.com \
--cc=syednwaris@gmail.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.