All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] pda_power: USB notifier fixes
@ 2014-03-30 13:34 Mathias Krause
  2014-03-30 13:34 ` [PATCH 1/2] pda_power: Statically initialize notifier block Mathias Krause
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Mathias Krause @ 2014-03-30 13:34 UTC (permalink / raw)
  To: Dmitry Eremin-Solenikov, David Woodhouse
  Cc: linux-kernel, Mathias Krause, PaX Team, Felipe Balbi, Anton Vorontsov

The notifier block can and should be initialized statically. Fixed in
patch 1.

While doing patch 1 I noticed, that the USB notifier that gets registered
in pda_power_probe() never gets unregistered. Fixed in patch 2.

Beware: The patches are compile tested only, as I have no such hardware!

Please apply!

Mathias Krause (2):
  pda_power: Statically initialize notifier block
  pda_power: Unregister USB notifier in pda_power_remove()

 drivers/power/pda_power.c |   11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

-- 
1.7.10.4


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 1/2] pda_power: Statically initialize notifier block
  2014-03-30 13:34 [PATCH 0/2] pda_power: USB notifier fixes Mathias Krause
@ 2014-03-30 13:34 ` Mathias Krause
  2014-03-30 13:34 ` [PATCH 2/2] pda_power: Unregister USB notifier in pda_power_remove() Mathias Krause
  2014-04-14 19:51 ` [PATCH 0/2] pda_power: USB notifier fixes Mathias Krause
  2 siblings, 0 replies; 8+ messages in thread
From: Mathias Krause @ 2014-03-30 13:34 UTC (permalink / raw)
  To: Dmitry Eremin-Solenikov, David Woodhouse
  Cc: linux-kernel, Mathias Krause, PaX Team, Felipe Balbi, Anton Vorontsov

Instead of initializing the notifier block in pda_power_probe(),
initialize it statically. This safes us some code.

Found in the PaX patch, written by the PaX Team.

Cc: PaX Team <pageexec@freemail.hu>
Cc: Felipe Balbi <balbi@ti.com>
Cc: Anton Vorontsov <anton@enomsg.org>
Signed-off-by: Mathias Krause <minipli@googlemail.com>
---
 drivers/power/pda_power.c |    6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/power/pda_power.c b/drivers/power/pda_power.c
index 0c52e2a0d9..87a963d0a8 100644
--- a/drivers/power/pda_power.c
+++ b/drivers/power/pda_power.c
@@ -37,7 +37,6 @@ static int polling;
 
 #if IS_ENABLED(CONFIG_USB_PHY)
 static struct usb_phy *transceiver;
-static struct notifier_block otg_nb;
 #endif
 
 static struct regulator *ac_draw;
@@ -258,6 +257,10 @@ static int otg_handle_notification(struct notifier_block *nb,
 
 	return NOTIFY_OK;
 }
+
+static struct notifier_block otg_nb = {
+	.notifier_call = otg_handle_notification,
+};
 #endif
 
 static int pda_power_probe(struct platform_device *pdev)
@@ -369,7 +372,6 @@ static int pda_power_probe(struct platform_device *pdev)
 
 #if IS_ENABLED(CONFIG_USB_PHY)
 	if (!IS_ERR_OR_NULL(transceiver) && pdata->use_otg_notifier) {
-		otg_nb.notifier_call = otg_handle_notification;
 		ret = usb_register_notifier(transceiver, &otg_nb);
 		if (ret) {
 			dev_err(dev, "failure to register otg notifier\n");
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/2] pda_power: Unregister USB notifier in pda_power_remove()
  2014-03-30 13:34 [PATCH 0/2] pda_power: USB notifier fixes Mathias Krause
  2014-03-30 13:34 ` [PATCH 1/2] pda_power: Statically initialize notifier block Mathias Krause
@ 2014-03-30 13:34 ` Mathias Krause
  2014-04-14 21:35   ` Felipe Balbi
  2014-04-14 19:51 ` [PATCH 0/2] pda_power: USB notifier fixes Mathias Krause
  2 siblings, 1 reply; 8+ messages in thread
From: Mathias Krause @ 2014-03-30 13:34 UTC (permalink / raw)
  To: Dmitry Eremin-Solenikov, David Woodhouse
  Cc: linux-kernel, Mathias Krause, PaX Team, Felipe Balbi, Anton Vorontsov

If we've registered a notifier in pda_power_probe() we must deregister
it in pda_power_remove() to not let it work on stale data like, e.g.,
the charger timer.

Cc: Felipe Balbi <balbi@ti.com>
Cc: Anton Vorontsov <anton@enomsg.org>
Signed-off-by: Mathias Krause <minipli@googlemail.com>
---
 drivers/power/pda_power.c |    5 +++++
 1 file changed, 5 insertions(+)

diff --git a/drivers/power/pda_power.c b/drivers/power/pda_power.c
index 87a963d0a8..aba23d6848 100644
--- a/drivers/power/pda_power.c
+++ b/drivers/power/pda_power.c
@@ -430,6 +430,11 @@ static int pda_power_remove(struct platform_device *pdev)
 	if (pdata->is_ac_online && ac_irq)
 		free_irq(ac_irq->start, &pda_psy_ac);
 
+#if IS_ENABLED(CONFIG_USB_PHY)
+	if (!IS_ERR_OR_NULL(transceiver) && pdata->use_otg_notifier)
+		usb_unregister_notifier(transceiver, &otg_nb);
+#endif
+
 	if (polling)
 		del_timer_sync(&polling_timer);
 	del_timer_sync(&charger_timer);
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH 0/2] pda_power: USB notifier fixes
  2014-03-30 13:34 [PATCH 0/2] pda_power: USB notifier fixes Mathias Krause
  2014-03-30 13:34 ` [PATCH 1/2] pda_power: Statically initialize notifier block Mathias Krause
  2014-03-30 13:34 ` [PATCH 2/2] pda_power: Unregister USB notifier in pda_power_remove() Mathias Krause
@ 2014-04-14 19:51 ` Mathias Krause
  2 siblings, 0 replies; 8+ messages in thread
From: Mathias Krause @ 2014-04-14 19:51 UTC (permalink / raw)
  To: Dmitry Eremin-Solenikov, David Woodhouse
  Cc: linux-kernel, Mathias Krause, PaX Team, Felipe Balbi, Anton Vorontsov

On 30 March 2014 15:34, Mathias Krause <minipli@googlemail.com> wrote:
> The notifier block can and should be initialized statically. Fixed in
> patch 1.
>
> While doing patch 1 I noticed, that the USB notifier that gets registered
> in pda_power_probe() never gets unregistered. Fixed in patch 2.
>
> Beware: The patches are compile tested only, as I have no such hardware!
>
> Please apply!
>
> Mathias Krause (2):
>   pda_power: Statically initialize notifier block
>   pda_power: Unregister USB notifier in pda_power_remove()
>
>  drivers/power/pda_power.c |   11 +++++++++--
>  1 file changed, 9 insertions(+), 2 deletions(-)
>
> --

Ping? Any opinions on this series? Dmitry, David?

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/2] pda_power: Unregister USB notifier in pda_power_remove()
  2014-03-30 13:34 ` [PATCH 2/2] pda_power: Unregister USB notifier in pda_power_remove() Mathias Krause
@ 2014-04-14 21:35   ` Felipe Balbi
  2014-04-14 22:07     ` Mathias Krause
  0 siblings, 1 reply; 8+ messages in thread
From: Felipe Balbi @ 2014-04-14 21:35 UTC (permalink / raw)
  To: Mathias Krause
  Cc: Dmitry Eremin-Solenikov, David Woodhouse, linux-kernel, PaX Team,
	Felipe Balbi, Anton Vorontsov

[-- Attachment #1: Type: text/plain, Size: 1150 bytes --]

On Sun, Mar 30, 2014 at 03:34:15PM +0200, Mathias Krause wrote:
> If we've registered a notifier in pda_power_probe() we must deregister
> it in pda_power_remove() to not let it work on stale data like, e.g.,
> the charger timer.
> 
> Cc: Felipe Balbi <balbi@ti.com>
> Cc: Anton Vorontsov <anton@enomsg.org>
> Signed-off-by: Mathias Krause <minipli@googlemail.com>
> ---
>  drivers/power/pda_power.c |    5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/drivers/power/pda_power.c b/drivers/power/pda_power.c
> index 87a963d0a8..aba23d6848 100644
> --- a/drivers/power/pda_power.c
> +++ b/drivers/power/pda_power.c
> @@ -430,6 +430,11 @@ static int pda_power_remove(struct platform_device *pdev)
>  	if (pdata->is_ac_online && ac_irq)
>  		free_irq(ac_irq->start, &pda_psy_ac);
>  
> +#if IS_ENABLED(CONFIG_USB_PHY)
> +	if (!IS_ERR_OR_NULL(transceiver) && pdata->use_otg_notifier)

IS_ERR() should be enough here.

> +		usb_unregister_notifier(transceiver, &otg_nb);
> +#endif
> +
>  	if (polling)
>  		del_timer_sync(&polling_timer);
>  	del_timer_sync(&charger_timer);
> -- 
> 1.7.10.4
> 

-- 
balbi

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/2] pda_power: Unregister USB notifier in pda_power_remove()
  2014-04-14 21:35   ` Felipe Balbi
@ 2014-04-14 22:07     ` Mathias Krause
  2014-04-14 22:08       ` Felipe Balbi
  0 siblings, 1 reply; 8+ messages in thread
From: Mathias Krause @ 2014-04-14 22:07 UTC (permalink / raw)
  To: Felipe Balbi
  Cc: Dmitry Eremin-Solenikov, David Woodhouse, linux-kernel, PaX Team,
	Anton Vorontsov

On 14 April 2014 23:35, Felipe Balbi <balbi@ti.com> wrote:
> On Sun, Mar 30, 2014 at 03:34:15PM +0200, Mathias Krause wrote:
>> If we've registered a notifier in pda_power_probe() we must deregister
>> it in pda_power_remove() to not let it work on stale data like, e.g.,
>> the charger timer.
>>
>> Cc: Felipe Balbi <balbi@ti.com>
>> Cc: Anton Vorontsov <anton@enomsg.org>
>> Signed-off-by: Mathias Krause <minipli@googlemail.com>
>> ---
>>  drivers/power/pda_power.c |    5 +++++
>>  1 file changed, 5 insertions(+)
>>
>> diff --git a/drivers/power/pda_power.c b/drivers/power/pda_power.c
>> index 87a963d0a8..aba23d6848 100644
>> --- a/drivers/power/pda_power.c
>> +++ b/drivers/power/pda_power.c
>> @@ -430,6 +430,11 @@ static int pda_power_remove(struct platform_device *pdev)
>>       if (pdata->is_ac_online && ac_irq)
>>               free_irq(ac_irq->start, &pda_psy_ac);
>>
>> +#if IS_ENABLED(CONFIG_USB_PHY)
>> +     if (!IS_ERR_OR_NULL(transceiver) && pdata->use_otg_notifier)
>
> IS_ERR() should be enough here.

That's true! The usb_get_phy() call in pda_power_probe() will always
return a valid pointer or an ERR_PTR() -- never NULL. Albeit, looking
at usb_get_phy(), it contains another bug, returning a valid pointer,
even when the try_module_get() call fails. *sigh* It should set ptr to
an ERR_PTR() in this case.

Anyway, probably all the transceiver checks in pda_power.c can be
changed to IS_ERR() checks. The reason I am using IS_ERR_OR_NULL() in
my patch is that I just copied the test from a few lines below. I'll
create a follow up patch in case somebody cares about this series in
the first place.

>
>> +             usb_unregister_notifier(transceiver, &otg_nb);
>> +#endif
>> +
>>       if (polling)
>>               del_timer_sync(&polling_timer);
>>       del_timer_sync(&charger_timer);
>> --
>> 1.7.10.4
>>
>
> --
> balbi

Thanks,
Mathias

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/2] pda_power: Unregister USB notifier in pda_power_remove()
  2014-04-14 22:07     ` Mathias Krause
@ 2014-04-14 22:08       ` Felipe Balbi
  2014-04-14 22:11         ` Mathias Krause
  0 siblings, 1 reply; 8+ messages in thread
From: Felipe Balbi @ 2014-04-14 22:08 UTC (permalink / raw)
  To: Mathias Krause
  Cc: Felipe Balbi, Dmitry Eremin-Solenikov, David Woodhouse,
	linux-kernel, PaX Team, Anton Vorontsov

[-- Attachment #1: Type: text/plain, Size: 1879 bytes --]

On Tue, Apr 15, 2014 at 12:07:13AM +0200, Mathias Krause wrote:
> On 14 April 2014 23:35, Felipe Balbi <balbi@ti.com> wrote:
> > On Sun, Mar 30, 2014 at 03:34:15PM +0200, Mathias Krause wrote:
> >> If we've registered a notifier in pda_power_probe() we must deregister
> >> it in pda_power_remove() to not let it work on stale data like, e.g.,
> >> the charger timer.
> >>
> >> Cc: Felipe Balbi <balbi@ti.com>
> >> Cc: Anton Vorontsov <anton@enomsg.org>
> >> Signed-off-by: Mathias Krause <minipli@googlemail.com>
> >> ---
> >>  drivers/power/pda_power.c |    5 +++++
> >>  1 file changed, 5 insertions(+)
> >>
> >> diff --git a/drivers/power/pda_power.c b/drivers/power/pda_power.c
> >> index 87a963d0a8..aba23d6848 100644
> >> --- a/drivers/power/pda_power.c
> >> +++ b/drivers/power/pda_power.c
> >> @@ -430,6 +430,11 @@ static int pda_power_remove(struct platform_device *pdev)
> >>       if (pdata->is_ac_online && ac_irq)
> >>               free_irq(ac_irq->start, &pda_psy_ac);
> >>
> >> +#if IS_ENABLED(CONFIG_USB_PHY)
> >> +     if (!IS_ERR_OR_NULL(transceiver) && pdata->use_otg_notifier)
> >
> > IS_ERR() should be enough here.
> 
> That's true! The usb_get_phy() call in pda_power_probe() will always
> return a valid pointer or an ERR_PTR() -- never NULL. Albeit, looking
> at usb_get_phy(), it contains another bug, returning a valid pointer,
> even when the try_module_get() call fails. *sigh* It should set ptr to
> an ERR_PTR() in this case.

good catch, can you send a patch for that ?

> Anyway, probably all the transceiver checks in pda_power.c can be
> changed to IS_ERR() checks. The reason I am using IS_ERR_OR_NULL() in
> my patch is that I just copied the test from a few lines below. I'll
> create a follow up patch in case somebody cares about this series in
> the first place.

awesome, thanks

-- 
balbi

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/2] pda_power: Unregister USB notifier in pda_power_remove()
  2014-04-14 22:08       ` Felipe Balbi
@ 2014-04-14 22:11         ` Mathias Krause
  0 siblings, 0 replies; 8+ messages in thread
From: Mathias Krause @ 2014-04-14 22:11 UTC (permalink / raw)
  To: Felipe Balbi
  Cc: Dmitry Eremin-Solenikov, David Woodhouse, linux-kernel, PaX Team,
	Anton Vorontsov

On 15 April 2014 00:08, Felipe Balbi <balbi@ti.com> wrote:
> On Tue, Apr 15, 2014 at 12:07:13AM +0200, Mathias Krause wrote:
>> On 14 April 2014 23:35, Felipe Balbi <balbi@ti.com> wrote:
>> > On Sun, Mar 30, 2014 at 03:34:15PM +0200, Mathias Krause wrote:
>> >> If we've registered a notifier in pda_power_probe() we must deregister
>> >> it in pda_power_remove() to not let it work on stale data like, e.g.,
>> >> the charger timer.
>> >>
>> >> Cc: Felipe Balbi <balbi@ti.com>
>> >> Cc: Anton Vorontsov <anton@enomsg.org>
>> >> Signed-off-by: Mathias Krause <minipli@googlemail.com>
>> >> ---
>> >>  drivers/power/pda_power.c |    5 +++++
>> >>  1 file changed, 5 insertions(+)
>> >>
>> >> diff --git a/drivers/power/pda_power.c b/drivers/power/pda_power.c
>> >> index 87a963d0a8..aba23d6848 100644
>> >> --- a/drivers/power/pda_power.c
>> >> +++ b/drivers/power/pda_power.c
>> >> @@ -430,6 +430,11 @@ static int pda_power_remove(struct platform_device *pdev)
>> >>       if (pdata->is_ac_online && ac_irq)
>> >>               free_irq(ac_irq->start, &pda_psy_ac);
>> >>
>> >> +#if IS_ENABLED(CONFIG_USB_PHY)
>> >> +     if (!IS_ERR_OR_NULL(transceiver) && pdata->use_otg_notifier)
>> >
>> > IS_ERR() should be enough here.
>>
>> That's true! The usb_get_phy() call in pda_power_probe() will always
>> return a valid pointer or an ERR_PTR() -- never NULL. Albeit, looking
>> at usb_get_phy(), it contains another bug, returning a valid pointer,
>> even when the try_module_get() call fails. *sigh* It should set ptr to
>> an ERR_PTR() in this case.
>
> good catch, can you send a patch for that ?

Sure, will do it tomorrow.

>
>> Anyway, probably all the transceiver checks in pda_power.c can be
>> changed to IS_ERR() checks. The reason I am using IS_ERR_OR_NULL() in
>> my patch is that I just copied the test from a few lines below. I'll
>> create a follow up patch in case somebody cares about this series in
>> the first place.
>
> awesome, thanks
>
> --
> balbi


Cheers,
Mathias

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2014-04-14 22:11 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-03-30 13:34 [PATCH 0/2] pda_power: USB notifier fixes Mathias Krause
2014-03-30 13:34 ` [PATCH 1/2] pda_power: Statically initialize notifier block Mathias Krause
2014-03-30 13:34 ` [PATCH 2/2] pda_power: Unregister USB notifier in pda_power_remove() Mathias Krause
2014-04-14 21:35   ` Felipe Balbi
2014-04-14 22:07     ` Mathias Krause
2014-04-14 22:08       ` Felipe Balbi
2014-04-14 22:11         ` Mathias Krause
2014-04-14 19:51 ` [PATCH 0/2] pda_power: USB notifier fixes Mathias Krause

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.