From: Guenter Roeck <linux@roeck-us.net>
To: Marc Gonzalez <marc_gonzalez@sigmadesigns.com>
Cc: Wim Van Sebroeck <wim@iguana.be>,
linux-watchdog@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
Mans Rullgard <mans@mansr.com>,
Thibaud Cornic <thibaud_cornic@sigmadesigns.com>,
Mark Rutland <mark.rutland@arm.com>,
Uwe Kleine-Konig <u.kleine-koenig@pengutronix.de>,
Arnd Bergmann <arnd@arndb.de>
Subject: Re: [PATCH 56/62] watchdog: tangox_wdt: Convert to use device managed functions
Date: Wed, 11 Jan 2017 09:51:10 -0800 [thread overview]
Message-ID: <20170111175110.GB22289@roeck-us.net> (raw)
In-Reply-To: <f7d9227c-4912-5c52-5ba7-ae7fa3b89857@sigmadesigns.com>
On Wed, Jan 11, 2017 at 04:28:12PM +0100, Marc Gonzalez wrote:
> On 11/01/2017 15:25, Guenter Roeck wrote:
> > On 01/11/2017 04:31 AM, Marc Gonzalez wrote:
> >> On 11/01/2017 11:52, Guenter Roeck wrote:
> >>
> >>> On 01/11/2017 01:07 AM, Marc Gonzalez wrote:
> >>>
> >>>>> @@ -134,12 +134,15 @@ static int tangox_wdt_probe(struct platform_device *pdev)
> >>>>> err = clk_prepare_enable(dev->clk);
> >>>>> if (err)
> >>>>> return err;
> >>>>> + err = devm_add_action_or_reset(&pdev->dev,
> >>>>> + (void(*)(void *))clk_disable_unprepare,
> >>>>> + dev->clk);
> >>>>> + if (err)
> >>>>> + return err;
> >>>>
> >>>> Hello Guenter,
> >>>>
> >>>> I would rather avoid the function pointer cast.
> >>>> How about defining an auxiliary function for the cleanup action?
> >>>>
> >>>> clk_disable_unprepare() is static inline, so gcc will have to
> >>>> define an auxiliary function either way. What do you think?
> >>>
> >>> Not really. It would just make it more complicated to replace the
> >>> call with devm_clk_prepare_enable(), should it ever find its way
> >>> into the light of day.
> >>
> >> More complicated, because the cleanup function will have to be deleted later?
> >> The compiler will warn if someone forgets to do that.
> >>
> >> In my opinion, it's not a good idea to rely on the fact that casting
> >> void(*)(struct clk *clk) to void(*)(void *) is likely to work as expected
> >> on most platforms. (It has undefined behavior, strictly speaking.)
> >
> > I do hear that you object to this code.
> >
> > However, I must admit that you completely lost me here. It is a cast from
> > one function pointer to another,
>
> Perhaps you are used to work at the assembly level, where pointers are
> just addresses, and all pointers are interchangeable.
>
> At a slightly higher level (C abstract machine), it is not so.
>
> > passed as argument to another function,
> > with a secondary cast of its argument from a typed pointer to a void pointer.
> > I don't think C permits for "undefined behavior, strictly speaking".
>
> The C standard leaves quite a lot of behavior undefined, e.g.
>
> char *foo = "hello";
> foo[1] = 'a'; // UB
>
> char buf[4];
> *(int *)&buf = 0xdeadbeef; // UB
>
> 1 << 64; // UB
>
Ah, yes, I stand corrected.
However, some other unrelated undefined behavior does not mean that this
specific behavior is undefined.
So far we have a claim that a cast to a void * may somehow be different
to a cast to a different pointer, if used as function argument, and that
the behavior with such a cast may be undefined. In other words, you claim
that a function implemented as, say,
void func(int *var) {}
might result in undefined behavior if some header file declares it as
void func(void *);
and it is called as
int var;
func(&var);
That seems really far fetched to me.
I do get the message that you do not like this kind of cast. But that doesn't
mean it is not correct.
> > Besides, that same mechanism is already used elsewhere, which is how I
> > got the idea. Are you claiming that there are situations where it won't
> > work ?
>
> If this technique is already used elsewhere in the kernel, then I'll
> crawl back under my rock (and weep).
>
git grep "(void(\*)(void \*))"
and variants thereof:
git grep "(void(\*)"
> I can see two issues with the code you propose.
>
> First is the same for all casts: silencing potential warnings,
> e.g. if the prototype of clk_disable_unprepare ever changed.
> (Though casts are required for vararg function arguments.)
>
Understood. However, one should really hope that anyone changing
an API has a look at all its callers and does not just pray that
there are no problems.
> Second is just theory and not a real-world concern.
>
> >> Do you really dislike the portable solution I suggested? :-(
> >
> > It is not more portable than the above. It is more expensive and adds more
> > code.
>
> Maybe I am mistaken. Can you tell me why adding an auxiliary function
> is more expensive? (In CPU cycles?)
>
In terms of code required. The idea here is to simplify the code, not
to make it more complex. The auxiliary function needs to be declared
and maintained in each affected file. I do find it easier and better
(and safer, for that matter) to let the C compiler handle it.
Guenter
next prev parent reply other threads:[~2017-01-11 17:51 UTC|newest]
Thread overview: 98+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-01-10 23:34 [PATCH 00/62] watchdog: " Guenter Roeck
2017-01-10 23:34 ` [PATCH 01/62] watchdog: asm9260_wdt: Convert to use device managed functions and other improvements Guenter Roeck
2017-01-10 23:34 ` [PATCH 02/62] watchdog: aspeed_wdt: Convert to use device managed functions Guenter Roeck
2017-01-11 5:18 ` Joel Stanley
2017-01-10 23:34 ` [PATCH 03/62] watchdog: at91sam9_wdt: " Guenter Roeck
2017-01-10 23:34 ` [PATCH 04/62] watchdog: atlas7_wdt: Convert to use device managed functions and other improvements Guenter Roeck
2017-01-10 23:34 ` [PATCH 05/62] watchdog: bcm2835_wdt: " Guenter Roeck
2017-01-14 6:27 ` Eric Anholt
2017-01-10 23:34 ` [PATCH 06/62] watchdog: bcm47xx_wdt: Convert to use device managed functions Guenter Roeck
2017-01-10 23:34 ` [PATCH 07/62] watchdog: bcm7038_wdt: Convert to use device managed functions and other improvements Guenter Roeck
2017-01-10 23:34 ` [PATCH 08/62] watchdog: bcm_kona_wdt: " Guenter Roeck
2017-01-10 23:34 ` [PATCH 09/62] watchdog: cadence_wdt: " Guenter Roeck
2017-01-10 23:34 ` [PATCH 10/62] watchdog: coh901327_wdt: Convert to use device managed functions Guenter Roeck
2017-01-11 15:48 ` Linus Walleij
2017-01-10 23:34 ` [PATCH 11/62] watchdog: da9052_wdt: " Guenter Roeck
2017-01-17 14:12 ` Adam Thomson
2017-01-10 23:34 ` [PATCH 12/62] watchdog: da9055_wdt: " Guenter Roeck
2017-01-17 13:58 ` Adam Thomson
2017-01-10 23:34 ` [PATCH 13/62] watchdog: da9062_wdt: " Guenter Roeck
2017-01-17 14:17 ` Adam Thomson
2017-01-10 23:34 ` [PATCH 14/62] watchdog: da9063_wdt: " Guenter Roeck
2017-01-17 14:19 ` Adam Thomson
2017-01-10 23:34 ` [PATCH 15/62] watchdog: davinci_wdt: Convert to use device managed functions and other improvements Guenter Roeck
2017-01-10 23:34 ` [PATCH 16/62] watchdog: digicolor_wdt: " Guenter Roeck
2017-01-12 11:47 ` Baruch Siach
2017-01-10 23:34 ` [PATCH 17/62] watchdog: dw_wdt: Convert to use device managed functions Guenter Roeck
2017-01-10 23:34 ` [PATCH 18/62] watchdog: ep93xx_wdt: " Guenter Roeck
2017-01-10 23:34 ` [PATCH 19/62] watchdog: gpio_wdt: " Guenter Roeck
2017-01-10 23:34 ` [PATCH 20/62] watchdog: iTCO_wdt: Replace shutdown function with call to watchdog_stop_on_reboot Guenter Roeck
2017-01-11 23:36 ` Andy Shevchenko
2017-01-10 23:34 ` [PATCH 21/62] watchdog: imgpdc_wdt: Convert to use device managed functions and other improvements Guenter Roeck
2017-01-10 23:34 ` [PATCH 22/62] watchdog: imx2_wdt: Convert to use device managed functions Guenter Roeck
2017-01-10 23:34 ` [PATCH 23/62] watchdog: intel-mid_wdt: " Guenter Roeck
2017-01-11 23:36 ` Andy Shevchenko
2017-01-10 23:34 ` [PATCH 24/62] watchdog: jz4740_wdt: " Guenter Roeck
2017-01-10 23:34 ` [PATCH 25/62] watchdog: kempld_wdt: Convert to use device managed functions and other improvements Guenter Roeck
2017-01-10 23:34 ` [PATCH 26/62] watchdog: loongson1_wdt: Convert to use device managed functions Guenter Roeck
2017-01-10 23:34 ` [PATCH 27/62] watchdog: lpc18xx_wdt: Convert to use device managed functions and other improvements Guenter Roeck
2017-01-10 23:34 ` [PATCH 28/62] watchdog: max63xx_wdt: Convert to use device managed functions Guenter Roeck
2017-01-10 23:34 ` [PATCH 29/62] watchdog: max77620_wdt: " Guenter Roeck
2017-01-10 23:34 ` [PATCH 30/62] watchdog: mena21_wdt: Convert to use device managed functions and other improvements Guenter Roeck
2017-01-13 8:08 ` Johannes Thumshirn
2017-01-11 0:44 ` [PATCH 31/62] watchdog: menf21bmc_wdt: Convert to use device managed functions Guenter Roeck
2017-01-11 0:44 ` [PATCH 32/62] watchdog: meson_gxbb_wdt: Convert to use device managed functions and other improvements Guenter Roeck
2017-01-11 8:42 ` Neil Armstrong
2017-01-11 18:44 ` Kevin Hilman
2017-01-11 0:44 ` [PATCH 33/62] watchdog: meson_wdt: " Guenter Roeck
2017-01-11 18:45 ` Kevin Hilman
2017-01-11 0:44 ` [PATCH 34/62] watchdog: moxart_wdt: Convert to use device managed functions Guenter Roeck
2017-01-11 0:44 ` [PATCH 35/62] watchdog: mpc8xxx_wdt: " Guenter Roeck
2017-01-11 0:44 ` [PATCH 36/62] watchdog: mt7621_wdt: Convert to use device managed functions and other improvements Guenter Roeck
2017-01-11 0:44 ` [PATCH 37/62] watchdog: mtk_wdt: " Guenter Roeck
2017-01-11 0:44 ` [PATCH 38/62] watchdog: nic7018_wdt: Convert to use device managed functions Guenter Roeck
2017-01-11 0:44 ` [PATCH 39/62] watchdog: of_xilinx_wdt: " Guenter Roeck
2017-01-11 0:44 ` [PATCH 40/62] watchdog: omap_wdt: " Guenter Roeck
2017-01-11 0:44 ` [PATCH 41/62] watchdog: orion_wdt: Convert to use device managed functions and other improvements Guenter Roeck
2017-01-11 0:44 ` [PATCH 42/62] watchdog: pic32-dmt: Convert to use device managed functions Guenter Roeck
2017-01-11 0:44 ` [PATCH 43/62] watchdog: pic32-wdt: " Guenter Roeck
2017-01-11 0:44 ` [PATCH 44/62] watchdog: pnx4008_wdt: " Guenter Roeck
2017-01-12 0:13 ` Vladimir Zapolskiy
2017-01-11 0:44 ` [PATCH 45/62] watchdog: qcom-wdt: " Guenter Roeck
2017-01-11 0:44 ` [PATCH 46/62] watchdog: renesas_wdt: " Guenter Roeck
2017-01-11 0:44 ` [PATCH 47/62] watchdog: retu_wdt: Convert to use device managed functions and other improvements Guenter Roeck
2017-01-11 0:44 ` [PATCH 48/62] watchdog: rt2880_wdt: " Guenter Roeck
2017-01-11 0:44 ` [PATCH 49/62] watchdog: sama5d4_wdt: Convert to use device managed functions Guenter Roeck
2017-01-11 0:44 ` [PATCH 50/62] watchdog: sbsa_gwdt: Convert to use device managed functions and other improvements Guenter Roeck
2017-01-11 0:45 ` [PATCH 51/62] watchdog: shwdt: " Guenter Roeck
2017-01-11 2:09 ` [PATCH 52/62] watchdog: sirfsoc_wdt: " Guenter Roeck
2017-01-11 2:09 ` [PATCH 53/62] watchdog: st_lpc_wdt: Convert to use device managed functions Guenter Roeck
2017-01-11 2:09 ` [PATCH 54/62] watchdog: stmp3xxx_rtc_wdt: " Guenter Roeck
2017-01-11 2:09 ` [PATCH 55/62] watchdog: sunxi_wdt: Convert to use device managed functions and other improvements Guenter Roeck
2017-01-11 12:15 ` Maxime Ripard
2017-01-11 2:09 ` [PATCH 56/62] watchdog: tangox_wdt: Convert to use device managed functions Guenter Roeck
2017-01-11 9:07 ` Marc Gonzalez
2017-01-11 10:52 ` Guenter Roeck
2017-01-11 12:31 ` Marc Gonzalez
2017-01-11 14:25 ` Guenter Roeck
2017-01-11 14:43 ` Måns Rullgård
2017-01-11 15:28 ` Marc Gonzalez
2017-01-11 17:51 ` Guenter Roeck [this message]
2017-01-12 9:44 ` Marc Gonzalez
2017-01-12 9:57 ` Uwe Kleine-König
2017-01-12 11:24 ` Måns Rullgård
2017-01-12 12:15 ` Marc Gonzalez
2017-01-11 14:39 ` Uwe Kleine-König
2017-01-11 14:50 ` Vladimir Zapolskiy
2017-01-11 17:28 ` Guenter Roeck
2017-01-13 5:17 ` Guenter Roeck
2017-01-12 0:12 ` Andy Shevchenko
2017-01-12 1:29 ` Guenter Roeck
2017-01-11 2:09 ` [PATCH 57/62] watchdog: tegra_wdt: " Guenter Roeck
2017-01-19 11:04 ` Thierry Reding
2017-01-11 2:09 ` [PATCH 58/62] watchdog: ts4800_wdt: " Guenter Roeck
2017-01-11 2:09 ` [PATCH 59/62] watchdog: twl4030_wdt: " Guenter Roeck
2017-01-11 2:09 ` [PATCH 60/62] watchdog: txx9wdt: Convert to use device managed functions and other improvements Guenter Roeck
2017-01-11 2:09 ` [PATCH 61/62] watchdog: ux500_wdt: Convert to use device managed functions Guenter Roeck
2017-01-11 2:09 ` [PATCH 62/62] watchdog: wm831x_wdt: " Guenter Roeck
2017-01-12 10:04 ` Charles Keepax
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=20170111175110.GB22289@roeck-us.net \
--to=linux@roeck-us.net \
--cc=arnd@arndb.de \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-watchdog@vger.kernel.org \
--cc=mans@mansr.com \
--cc=marc_gonzalez@sigmadesigns.com \
--cc=mark.rutland@arm.com \
--cc=thibaud_cornic@sigmadesigns.com \
--cc=u.kleine-koenig@pengutronix.de \
--cc=wim@iguana.be \
/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
all inboxes | Powered by JetHome®