Re: [PATCH 1/5] watchdog: Create watchdog device in watchdog_dev.c

2015-12-22 Thread Guenter Roeck

On 12/22/2015 07:33 AM, Damien Riegel wrote:

On Mon, Dec 21, 2015 at 03:28:39PM -0800, Guenter Roeck wrote:

On 12/21/2015 09:31 AM, Damien Riegel wrote:

On Sun, Dec 20, 2015 at 01:04:59PM -0800, Guenter Roeck wrote:

The watchdog character device is currently created in watchdog_dev.c,
and the watchdog device in watchdog_core.c. This results in
cross-dependencies, since device creation needs to know the watchdog
character device number as well as the watchdog class, both of which
reside in watchdog_dev.c.

Create the watchdog device in watchdog_dev.c to simplify the code.

Inspired by earlier patch set from Damien Riegel.


Hi Guenter,

The main purpose of my patch was to inverse the device creation and the
cdev registration to avoid a racy situation, bu you have dropped that in
this version. Is there a reason for that?


Every other driver I looked at does it in the same order (cdev first, device
second). I don't really know if doing it differently has any undesired
side effect, so I wanted to play safe.

It would help a lot if someone listening to this exchange can confirm
that it is ok to create the device first, followed by the character device.


The issue is that some drivers use watchdog_device->dev in their
watchdog_ops functions. With a quick grep, I could spot 3 examples:

  - bcm2835_wdt_stop in bcm2835_wdt.c
  - gpio_wdt_hwping in gpio_wdt.c
  - a21_wdt_set_timeout in mena21_wdt.c

Maybe we should simply fix these drivers and keep watchdog_device->dev
for core internal usage?



Yes, I have been thinking about that - essentially move the ->dev pointer
to the internal data structure and either use pr_ functions in those drivers,
or save a pointer to the platform device (if available) and use it.

I think I'll start working on a follow-up patch set to do just that.

Guenter

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/5] watchdog: Create watchdog device in watchdog_dev.c

2015-12-22 Thread Damien Riegel
On Mon, Dec 21, 2015 at 03:28:39PM -0800, Guenter Roeck wrote:
> On 12/21/2015 09:31 AM, Damien Riegel wrote:
> >On Sun, Dec 20, 2015 at 01:04:59PM -0800, Guenter Roeck wrote:
> >>The watchdog character device is currently created in watchdog_dev.c,
> >>and the watchdog device in watchdog_core.c. This results in
> >>cross-dependencies, since device creation needs to know the watchdog
> >>character device number as well as the watchdog class, both of which
> >>reside in watchdog_dev.c.
> >>
> >>Create the watchdog device in watchdog_dev.c to simplify the code.
> >>
> >>Inspired by earlier patch set from Damien Riegel.
> >
> >Hi Guenter,
> >
> >The main purpose of my patch was to inverse the device creation and the
> >cdev registration to avoid a racy situation, bu you have dropped that in
> >this version. Is there a reason for that?
> >
> Every other driver I looked at does it in the same order (cdev first, device
> second). I don't really know if doing it differently has any undesired
> side effect, so I wanted to play safe.
> 
> It would help a lot if someone listening to this exchange can confirm
> that it is ok to create the device first, followed by the character device.

The issue is that some drivers use watchdog_device->dev in their
watchdog_ops functions. With a quick grep, I could spot 3 examples:

 - bcm2835_wdt_stop in bcm2835_wdt.c
 - gpio_wdt_hwping in gpio_wdt.c
 - a21_wdt_set_timeout in mena21_wdt.c

Maybe we should simply fix these drivers and keep watchdog_device->dev
for core internal usage?


Thanks,
Damien
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/5] watchdog: Create watchdog device in watchdog_dev.c

2015-12-21 Thread Guenter Roeck

On 12/21/2015 09:31 AM, Damien Riegel wrote:

On Sun, Dec 20, 2015 at 01:04:59PM -0800, Guenter Roeck wrote:

The watchdog character device is currently created in watchdog_dev.c,
and the watchdog device in watchdog_core.c. This results in
cross-dependencies, since device creation needs to know the watchdog
character device number as well as the watchdog class, both of which
reside in watchdog_dev.c.

Create the watchdog device in watchdog_dev.c to simplify the code.

Inspired by earlier patch set from Damien Riegel.


Hi Guenter,

The main purpose of my patch was to inverse the device creation and the
cdev registration to avoid a racy situation, bu you have dropped that in
this version. Is there a reason for that?


Every other driver I looked at does it in the same order (cdev first, device
second). I don't really know if doing it differently has any undesired
side effect, so I wanted to play safe.

It would help a lot if someone listening to this exchange can confirm
that it is ok to create the device first, followed by the character device.

Thanks,
Guenter

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/5] watchdog: Create watchdog device in watchdog_dev.c

2015-12-21 Thread Damien Riegel
On Sun, Dec 20, 2015 at 01:04:59PM -0800, Guenter Roeck wrote:
> The watchdog character device is currently created in watchdog_dev.c,
> and the watchdog device in watchdog_core.c. This results in
> cross-dependencies, since device creation needs to know the watchdog
> character device number as well as the watchdog class, both of which
> reside in watchdog_dev.c.
> 
> Create the watchdog device in watchdog_dev.c to simplify the code.
> 
> Inspired by earlier patch set from Damien Riegel.

Hi Guenter,

The main purpose of my patch was to inverse the device creation and the
cdev registration to avoid a racy situation, bu you have dropped that in
this version. Is there a reason for that?

Thanks,
Damien

> 
> Cc: Damien Riegel 
> Signed-off-by: Guenter Roeck 
> ---
>  drivers/watchdog/watchdog_core.c | 33 --
>  drivers/watchdog/watchdog_core.h |  4 +--
>  drivers/watchdog/watchdog_dev.c  | 73 
> +---
>  3 files changed, 69 insertions(+), 41 deletions(-)
> 
> diff --git a/drivers/watchdog/watchdog_core.c 
> b/drivers/watchdog/watchdog_core.c
> index 551af042867c..f0293f7d2b80 100644
> --- a/drivers/watchdog/watchdog_core.c
> +++ b/drivers/watchdog/watchdog_core.c
> @@ -42,7 +42,6 @@
>  #include "watchdog_core.h"   /* For watchdog_dev_register/... */
>  
>  static DEFINE_IDA(watchdog_ida);
> -static struct class *watchdog_class;
>  
>  /*
>   * Deferred Registration infrastructure.
> @@ -194,7 +193,7 @@ EXPORT_SYMBOL_GPL(watchdog_set_restart_priority);
>  
>  static int __watchdog_register_device(struct watchdog_device *wdd)
>  {
> - int ret, id = -1, devno;
> + int ret, id = -1;
>  
>   if (wdd == NULL || wdd->info == NULL || wdd->ops == NULL)
>   return -EINVAL;
> @@ -247,16 +246,6 @@ static int __watchdog_register_device(struct 
> watchdog_device *wdd)
>   }
>   }
>  
> - devno = wdd->cdev.dev;
> - wdd->dev = device_create(watchdog_class, wdd->parent, devno,
> - wdd, "watchdog%d", wdd->id);
> - if (IS_ERR(wdd->dev)) {
> - watchdog_dev_unregister(wdd);
> - ida_simple_remove(&watchdog_ida, id);
> - ret = PTR_ERR(wdd->dev);
> - return ret;
> - }
> -
>   if (test_bit(WDOG_STOP_ON_REBOOT, &wdd->status)) {
>   wdd->reboot_nb.notifier_call = watchdog_reboot_notifier;
>  
> @@ -265,9 +254,7 @@ static int __watchdog_register_device(struct 
> watchdog_device *wdd)
>   dev_err(wdd->dev, "Cannot register reboot notifier 
> (%d)\n",
>   ret);
>   watchdog_dev_unregister(wdd);
> - device_destroy(watchdog_class, devno);
>   ida_simple_remove(&watchdog_ida, wdd->id);
> - wdd->dev = NULL;
>   return ret;
>   }
>   }
> @@ -311,9 +298,6 @@ EXPORT_SYMBOL_GPL(watchdog_register_device);
>  
>  static void __watchdog_unregister_device(struct watchdog_device *wdd)
>  {
> - int ret;
> - int devno;
> -
>   if (wdd == NULL)
>   return;
>  
> @@ -323,13 +307,8 @@ static void __watchdog_unregister_device(struct 
> watchdog_device *wdd)
>   if (test_bit(WDOG_STOP_ON_REBOOT, &wdd->status))
>   unregister_reboot_notifier(&wdd->reboot_nb);
>  
> - devno = wdd->cdev.dev;
> - ret = watchdog_dev_unregister(wdd);
> - if (ret)
> - pr_err("error unregistering /dev/watchdog (err=%d)\n", ret);
> - device_destroy(watchdog_class, devno);
> + watchdog_dev_unregister(wdd);
>   ida_simple_remove(&watchdog_ida, wdd->id);
> - wdd->dev = NULL;
>  }
>  
>  /**
> @@ -370,9 +349,11 @@ static int __init watchdog_deferred_registration(void)
>  
>  static int __init watchdog_init(void)
>  {
> - watchdog_class = watchdog_dev_init();
> - if (IS_ERR(watchdog_class))
> - return PTR_ERR(watchdog_class);
> + int err;
> +
> + err = watchdog_dev_init();
> + if (err < 0)
> + return err;
>  
>   watchdog_deferred_registration();
>   return 0;
> diff --git a/drivers/watchdog/watchdog_core.h 
> b/drivers/watchdog/watchdog_core.h
> index 1c8d6b0e68c7..86ff962d1e15 100644
> --- a/drivers/watchdog/watchdog_core.h
> +++ b/drivers/watchdog/watchdog_core.h
> @@ -32,6 +32,6 @@
>   *   Functions/procedures to be called by the core
>   */
>  extern int watchdog_dev_register(struct watchdog_device *);
> -extern int watchdog_dev_unregister(struct watchdog_device *);
> -extern struct class * __init watchdog_dev_init(void);
> +extern void watchdog_dev_unregister(struct watchdog_device *);
> +extern int __init watchdog_dev_init(void);
>  extern void __exit watchdog_dev_exit(void);
> diff --git a/drivers/watchdog/watchdog_dev.c b/drivers/watchdog/watchdog_dev.c
> index d93118e97d11..c24392623e98 100644
> --- a/drivers/watchdog/watchdog_dev.c
> +++ b/drivers/watchdog/watchdog_dev.c
> @@ -626,17