From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
To: Robin Murphy <robin.murphy@arm.com>
Cc: Marc Gonzalez <marc.w.gonzalez@free.fr>,
Bjorn Andersson <bjorn.andersson@linaro.org>,
Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>,
Stephen Boyd <sboyd@kernel.org>,
Michael Turquette <mturquette@baylibre.com>,
LKML <linux-kernel@vger.kernel.org>,
Sudip Mukherjee <sudipm.mukherjee@gmail.com>,
Russell King <rmk+kernel@armlinux.org.uk>,
Guenter Roeck <linux@roeck-us.net>,
linux-clk <linux-clk@vger.kernel.org>,
Linux ARM <linux-arm-kernel@lists.infradead.org>,
x86 <x86@kernel.org>
Subject: Re: [PATCH v1] clk: Convert managed get functions to devm_add_action API
Date: Thu, 12 Dec 2019 16:16:28 -0800 [thread overview]
Message-ID: <20191213001628.GF101194@dtor-ws> (raw)
In-Reply-To: <3ce51e0b-f4eb-707d-c55d-0eaf4ac72c5a@arm.com>
On Thu, Dec 12, 2019 at 09:08:04PM +0000, Robin Murphy wrote:
> On 2019-12-12 7:10 pm, Dmitry Torokhov wrote:
> > On Thu, Dec 12, 2019 at 06:15:16PM +0000, Robin Murphy wrote:
> > > On 12/12/2019 4:59 pm, Marc Gonzalez wrote:
> > > > On 12/12/2019 15:47, Robin Murphy wrote:
> > > >
> > > > > On 12/12/2019 1:53 pm, Marc Gonzalez wrote:
> > > > >
> > > > > > On 11/12/2019 23:28, Dmitry Torokhov wrote:
> > > > > >
> > > > > > > On Wed, Dec 11, 2019 at 05:17:28PM +0100, Marc Gonzalez wrote:
> > > > > > >
> > > > > > > > What is the rationale for the devm_add_action API?
> > > > > > >
> > > > > > > For one-off and maybe complex unwind actions in drivers that wish to use
> > > > > > > devm API (as mixing devm and manual release is verboten). Also is often
> > > > > > > used when some core subsystem does not provide enough devm APIs.
> > > > > >
> > > > > > Thanks for the insight, Dmitry. Thanks to Robin too.
> > > > > >
> > > > > > This is what I understand so far:
> > > > > >
> > > > > > devm_add_action() is nice because it hides/factorizes the complexity
> > > > > > of the devres API, but it incurs a small storage overhead of one
> > > > > > pointer per call, which makes it unfit for frequently used actions,
> > > > > > such as clk_get.
> > > > > >
> > > > > > Is that correct?
> > > > > >
> > > > > > My question is: why not design the API without the small overhead?
> > > > >
> > > > > Probably because on most architectures, ARCH_KMALLOC_MINALIGN is at
> > > > > least as big as two pointers anyway, so this "overhead" should mostly be
> > > > > free in practice. Plus the devres API is almost entirely about being
> > > > > able to write simple robust code, rather than absolute efficiency - I
> > > > > mean, struct devres itself is already 5 pointers large at the absolute
> > > > > minimum ;)
> > > >
> > > > (3 pointers: 1 list_head + 1 function pointer)
> > >
> > > Ah yes, I failed to mentally preprocess the debug config :)
> > >
> > > > I'm confused. The first patch was criticized for potentially adding
> > > > an extra pointer for every devm_clk_get (e.g. 800 bytes on a 64-bit
> > > > platform with 100 clocks).
> > >
> > > I'm not sure it was a criticism so much as an observation of an aspect that
> > > deserved consideration (certainly it was on my part, and I read Dmitry's "It
> > > might still, ..." as implying the same). I'd say by this point it has been
> > > thoroughly considered, and personally I'm now happy with the conclusion that
> > > the kind of embedded platforms that will have many dozens of clocks are also
> > > the kind that will tend to have enough padding to make it moot, and thus the
> > > code simplification probably is worthwhile overall.
> >
> > I wonder if we could actually avoid allocating the data with
> > ARCH_KMALLOC_MINALIGN in all the cases. It is definitely needed for the
> > devm_k*alloc() group of functions as they are direct replacement for
> > k*alloc() APIs that give users aligned memory, but for other data
> > structures (clocks, regulators, etc, etc) it is not required.
>
> That's a very good point - perhaps something like this (only done properly)?
Yes, but it has to be done carefully.
>
> Robin.
>
> diff --git a/drivers/base/devres.c b/drivers/base/devres.c
> index 0bbb328bd17f..2382f963abbe 100644
> --- a/drivers/base/devres.c
> +++ b/drivers/base/devres.c
> @@ -26,14 +26,7 @@ struct devres_node {
>
> struct devres {
> struct devres_node node;
> - /*
> - * Some archs want to perform DMA into kmalloc caches
> - * and need a guaranteed alignment larger than
> - * the alignment of a 64-bit integer.
> - * Thus we use ARCH_KMALLOC_MINALIGN here and get exactly the same
> - * buffer alignment as if it was allocated by plain kmalloc().
> - */
> - u8 __aligned(ARCH_KMALLOC_MINALIGN) data[];
> + u8 data[];
> };
>
> struct devres_group {
> @@ -810,6 +803,17 @@ static int devm_kmalloc_match(struct device *dev, void
> *res, void *data)
> void * devm_kmalloc(struct device *dev, size_t size, gfp_t gfp)
> {
> struct devres *dr;
> + size_t align;
> +
> + /*
> + * Some archs want to perform DMA into kmalloc caches
> + * and need a guaranteed alignment larger than
> + * the alignment of a 64-bit integer.
> + * Thus we use ARCH_KMALLOC_MINALIGN here and get exactly the same
> + * buffer alignment as if it was allocated by plain kmalloc().
> + */
> + align = (ARCH_KMALLOC_MINALIGN - sizeof(*dr)) %
> ARCH_KMALLOC_MINALIGN;
> + size += align;
>
> /* use raw alloc_dr for kmalloc caller tracing */
> dr = alloc_dr(devm_kmalloc_release, size, gfp, dev_to_node(dev));
> @@ -822,7 +826,7 @@ void * devm_kmalloc(struct device *dev, size_t size,
> gfp_t gfp)
> */
> set_node_dbginfo(&dr->node, "devm_kzalloc_release", size);
> devres_add(dev, dr->data);
I think it has to be "devres_add(dev, dr->data + align);" here, as match
function checks the pointer passed to devm_kfree() with one stored in
devres structure.
> - return dr->data;
> + return dr->data + align;
> }
> EXPORT_SYMBOL_GPL(devm_kmalloc);
Thanks.
--
Dmitry
WARNING: multiple messages have this Message-ID (diff)
From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
To: Robin Murphy <robin.murphy@arm.com>
Cc: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>,
Marc Gonzalez <marc.w.gonzalez@free.fr>,
Stephen Boyd <sboyd@kernel.org>,
Michael Turquette <mturquette@baylibre.com>, x86 <x86@kernel.org>,
linux-clk <linux-clk@vger.kernel.org>,
LKML <linux-kernel@vger.kernel.org>,
Bjorn Andersson <bjorn.andersson@linaro.org>,
Russell King <rmk+kernel@armlinux.org.uk>,
Linux ARM <linux-arm-kernel@lists.infradead.org>,
Sudip Mukherjee <sudipm.mukherjee@gmail.com>,
Guenter Roeck <linux@roeck-us.net>
Subject: Re: [PATCH v1] clk: Convert managed get functions to devm_add_action API
Date: Thu, 12 Dec 2019 16:16:28 -0800 [thread overview]
Message-ID: <20191213001628.GF101194@dtor-ws> (raw)
In-Reply-To: <3ce51e0b-f4eb-707d-c55d-0eaf4ac72c5a@arm.com>
On Thu, Dec 12, 2019 at 09:08:04PM +0000, Robin Murphy wrote:
> On 2019-12-12 7:10 pm, Dmitry Torokhov wrote:
> > On Thu, Dec 12, 2019 at 06:15:16PM +0000, Robin Murphy wrote:
> > > On 12/12/2019 4:59 pm, Marc Gonzalez wrote:
> > > > On 12/12/2019 15:47, Robin Murphy wrote:
> > > >
> > > > > On 12/12/2019 1:53 pm, Marc Gonzalez wrote:
> > > > >
> > > > > > On 11/12/2019 23:28, Dmitry Torokhov wrote:
> > > > > >
> > > > > > > On Wed, Dec 11, 2019 at 05:17:28PM +0100, Marc Gonzalez wrote:
> > > > > > >
> > > > > > > > What is the rationale for the devm_add_action API?
> > > > > > >
> > > > > > > For one-off and maybe complex unwind actions in drivers that wish to use
> > > > > > > devm API (as mixing devm and manual release is verboten). Also is often
> > > > > > > used when some core subsystem does not provide enough devm APIs.
> > > > > >
> > > > > > Thanks for the insight, Dmitry. Thanks to Robin too.
> > > > > >
> > > > > > This is what I understand so far:
> > > > > >
> > > > > > devm_add_action() is nice because it hides/factorizes the complexity
> > > > > > of the devres API, but it incurs a small storage overhead of one
> > > > > > pointer per call, which makes it unfit for frequently used actions,
> > > > > > such as clk_get.
> > > > > >
> > > > > > Is that correct?
> > > > > >
> > > > > > My question is: why not design the API without the small overhead?
> > > > >
> > > > > Probably because on most architectures, ARCH_KMALLOC_MINALIGN is at
> > > > > least as big as two pointers anyway, so this "overhead" should mostly be
> > > > > free in practice. Plus the devres API is almost entirely about being
> > > > > able to write simple robust code, rather than absolute efficiency - I
> > > > > mean, struct devres itself is already 5 pointers large at the absolute
> > > > > minimum ;)
> > > >
> > > > (3 pointers: 1 list_head + 1 function pointer)
> > >
> > > Ah yes, I failed to mentally preprocess the debug config :)
> > >
> > > > I'm confused. The first patch was criticized for potentially adding
> > > > an extra pointer for every devm_clk_get (e.g. 800 bytes on a 64-bit
> > > > platform with 100 clocks).
> > >
> > > I'm not sure it was a criticism so much as an observation of an aspect that
> > > deserved consideration (certainly it was on my part, and I read Dmitry's "It
> > > might still, ..." as implying the same). I'd say by this point it has been
> > > thoroughly considered, and personally I'm now happy with the conclusion that
> > > the kind of embedded platforms that will have many dozens of clocks are also
> > > the kind that will tend to have enough padding to make it moot, and thus the
> > > code simplification probably is worthwhile overall.
> >
> > I wonder if we could actually avoid allocating the data with
> > ARCH_KMALLOC_MINALIGN in all the cases. It is definitely needed for the
> > devm_k*alloc() group of functions as they are direct replacement for
> > k*alloc() APIs that give users aligned memory, but for other data
> > structures (clocks, regulators, etc, etc) it is not required.
>
> That's a very good point - perhaps something like this (only done properly)?
Yes, but it has to be done carefully.
>
> Robin.
>
> diff --git a/drivers/base/devres.c b/drivers/base/devres.c
> index 0bbb328bd17f..2382f963abbe 100644
> --- a/drivers/base/devres.c
> +++ b/drivers/base/devres.c
> @@ -26,14 +26,7 @@ struct devres_node {
>
> struct devres {
> struct devres_node node;
> - /*
> - * Some archs want to perform DMA into kmalloc caches
> - * and need a guaranteed alignment larger than
> - * the alignment of a 64-bit integer.
> - * Thus we use ARCH_KMALLOC_MINALIGN here and get exactly the same
> - * buffer alignment as if it was allocated by plain kmalloc().
> - */
> - u8 __aligned(ARCH_KMALLOC_MINALIGN) data[];
> + u8 data[];
> };
>
> struct devres_group {
> @@ -810,6 +803,17 @@ static int devm_kmalloc_match(struct device *dev, void
> *res, void *data)
> void * devm_kmalloc(struct device *dev, size_t size, gfp_t gfp)
> {
> struct devres *dr;
> + size_t align;
> +
> + /*
> + * Some archs want to perform DMA into kmalloc caches
> + * and need a guaranteed alignment larger than
> + * the alignment of a 64-bit integer.
> + * Thus we use ARCH_KMALLOC_MINALIGN here and get exactly the same
> + * buffer alignment as if it was allocated by plain kmalloc().
> + */
> + align = (ARCH_KMALLOC_MINALIGN - sizeof(*dr)) %
> ARCH_KMALLOC_MINALIGN;
> + size += align;
>
> /* use raw alloc_dr for kmalloc caller tracing */
> dr = alloc_dr(devm_kmalloc_release, size, gfp, dev_to_node(dev));
> @@ -822,7 +826,7 @@ void * devm_kmalloc(struct device *dev, size_t size,
> gfp_t gfp)
> */
> set_node_dbginfo(&dr->node, "devm_kzalloc_release", size);
> devres_add(dev, dr->data);
I think it has to be "devres_add(dev, dr->data + align);" here, as match
function checks the pointer passed to devm_kfree() with one stored in
devres structure.
> - return dr->data;
> + return dr->data + align;
> }
> EXPORT_SYMBOL_GPL(devm_kmalloc);
Thanks.
--
Dmitry
_______________________________________________
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:[~2019-12-13 0:16 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-26 16:13 [PATCH v1] clk: Convert managed get functions to devm_add_action API Marc Gonzalez
2019-11-26 16:13 ` Marc Gonzalez
2019-11-28 18:56 ` Bjorn Andersson
2019-11-28 18:56 ` Bjorn Andersson
2019-12-02 1:42 ` Dmitry Torokhov
2019-12-02 1:42 ` Dmitry Torokhov
2019-12-02 9:25 ` Marc Gonzalez
2019-12-02 9:25 ` Marc Gonzalez
2019-12-02 13:51 ` Robin Murphy
2019-12-02 13:51 ` Robin Murphy
2019-12-11 16:17 ` Marc Gonzalez
2019-12-11 16:17 ` Marc Gonzalez
2019-12-11 22:28 ` Dmitry Torokhov
2019-12-11 22:28 ` Dmitry Torokhov
2019-12-12 13:53 ` Marc Gonzalez
2019-12-12 13:53 ` Marc Gonzalez
2019-12-12 14:17 ` Russell King - ARM Linux admin
2019-12-12 14:17 ` Russell King - ARM Linux admin
2019-12-12 14:41 ` Marc Gonzalez
2019-12-12 14:41 ` Marc Gonzalez
2019-12-12 14:46 ` Russell King - ARM Linux admin
2019-12-12 14:46 ` Russell King - ARM Linux admin
2019-12-12 15:51 ` Marc Gonzalez
2019-12-12 15:51 ` Marc Gonzalez
2019-12-12 16:13 ` Russell King - ARM Linux admin
2019-12-12 16:13 ` Russell King - ARM Linux admin
2019-12-12 14:47 ` Robin Murphy
2019-12-12 14:47 ` Robin Murphy
2019-12-12 16:59 ` Marc Gonzalez
2019-12-12 16:59 ` Marc Gonzalez
2019-12-12 17:05 ` Russell King - ARM Linux admin
2019-12-12 17:05 ` Russell King - ARM Linux admin
2019-12-12 18:15 ` Robin Murphy
2019-12-12 18:15 ` Robin Murphy
2019-12-12 19:10 ` Dmitry Torokhov
2019-12-12 19:10 ` Dmitry Torokhov
2019-12-12 21:08 ` Robin Murphy
2019-12-12 21:08 ` Robin Murphy
2019-12-13 0:16 ` Dmitry Torokhov [this message]
2019-12-13 0:16 ` Dmitry Torokhov
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=20191213001628.GF101194@dtor-ws \
--to=dmitry.torokhov@gmail.com \
--cc=bjorn.andersson@linaro.org \
--cc=kuninori.morimoto.gx@renesas.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-clk@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@roeck-us.net \
--cc=marc.w.gonzalez@free.fr \
--cc=mturquette@baylibre.com \
--cc=rmk+kernel@armlinux.org.uk \
--cc=robin.murphy@arm.com \
--cc=sboyd@kernel.org \
--cc=sudipm.mukherjee@gmail.com \
--cc=x86@kernel.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.