linux-media.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] media: dvb_frontend: dvb_unregister_frontend must not call dvb_detach for fe->ops.release
@ 2017-11-24 14:02 Wolfgang Rohdewald
  2017-11-26 17:10 ` Daniel Scheller
  0 siblings, 1 reply; 2+ messages in thread
From: Wolfgang Rohdewald @ 2017-11-24 14:02 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, linux-media, linux-kernel

because ops.release was never dvb_attached.
Which makes sense because f->ops.release does not attach anything.

Now, rmmod dvb_usb_pctv452e correctly sets counters for
stb6100/stb0899 to 0.

Before, stb0899 got a counter -1, and for my 4 receivers I got 3 OOPses
like

Nov 24 14:40:41 s5 kernel: [  194.211014] WARNING: CPU: 6 PID: 3055 at
   module_put.part.45+0x132/0x1a0
Call Trace:
 ? _stb0899_read_reg+0x100/0x100 [stb0899]
 ? _stb0899_read_reg+0x100/0x100 [stb0899]
 symbol_put_addr+0x38/0x60
 dvb_frontend_put+0x42/0x60 [dvb_core]
 ? stb0899_sleep+0x50/0x50 [stb0899]
 dvb_frontend_detach+0x7c/0x90 [dvb_core]
 dvb_usb_adapter_frontend_exit+0x57/0x80 [dvb_usb]
 dvb_usb_exit+0x39/0xb0 [dvb_usb]
 dvb_usb_device_exit+0x3f/0x60 [dvb_usb]
 pctv452e_usb_disconnect+0x6f/0x80 [dvb_usb_pctv452e]
 usb_unbind_interface+0x75/0x290
 ? _raw_spin_unlock_irqrestore+0x4a/0x80
 device_release_driver_internal+0x160/0x210
 driver_detach+0x40/0x80
 bus_remove_driver+0x5c/0xd0
 driver_unregister+0x2c/0x40
 usb_deregister+0x6c/0xf0
 pctv452e_usb_driver_exit+0x10/0xec0 [dvb_usb_pctv452e]

Signed-off-by: Wolfgang Rohdewald <wolfgang@rohdewald.de>
---
 drivers/media/dvb-core/dvb_frontend.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/media/dvb-core/dvb_frontend.c b/drivers/media/dvb-core/dvb_frontend.c
index 9139d01ba7ed..c2cc794299c9 100644
--- a/drivers/media/dvb-core/dvb_frontend.c
+++ b/drivers/media/dvb-core/dvb_frontend.c
@@ -150,7 +150,8 @@ static void __dvb_frontend_free(struct dvb_frontend *fe)
 
 	dvb_free_device(fepriv->dvbdev);
 
-	dvb_frontend_invoke_release(fe, fe->ops.release);
+	if (fe->ops.release)
+		fe->ops.release(fe);
 
 	kfree(fepriv);
 	fe->frontend_priv = NULL;
-- 
2.11.0

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

* Re: [PATCH] media: dvb_frontend: dvb_unregister_frontend must not call dvb_detach for fe->ops.release
  2017-11-24 14:02 [PATCH] media: dvb_frontend: dvb_unregister_frontend must not call dvb_detach for fe->ops.release Wolfgang Rohdewald
@ 2017-11-26 17:10 ` Daniel Scheller
  0 siblings, 0 replies; 2+ messages in thread
From: Daniel Scheller @ 2017-11-26 17:10 UTC (permalink / raw)
  To: Wolfgang Rohdewald; +Cc: Mauro Carvalho Chehab, linux-media, linux-kernel

Am Fri, 24 Nov 2017 15:02:30 +0100
schrieb Wolfgang Rohdewald <wolfgang@rohdewald.de>:

> because ops.release was never dvb_attached.
> Which makes sense because f->ops.release does not attach anything.
> 
> Now, rmmod dvb_usb_pctv452e correctly sets counters for
> stb6100/stb0899 to 0.
> 
> Before, stb0899 got a counter -1, and for my 4 receivers I got 3
> OOPses like
> 
> Nov 24 14:40:41 s5 kernel: [  194.211014] WARNING: CPU: 6 PID: 3055 at
>    module_put.part.45+0x132/0x1a0
> Call Trace:
>  ? _stb0899_read_reg+0x100/0x100 [stb0899]
>  ? _stb0899_read_reg+0x100/0x100 [stb0899]
>  symbol_put_addr+0x38/0x60
>  dvb_frontend_put+0x42/0x60 [dvb_core]
>  ? stb0899_sleep+0x50/0x50 [stb0899]
>  dvb_frontend_detach+0x7c/0x90 [dvb_core]
>  dvb_usb_adapter_frontend_exit+0x57/0x80 [dvb_usb]
>  dvb_usb_exit+0x39/0xb0 [dvb_usb]
>  dvb_usb_device_exit+0x3f/0x60 [dvb_usb]
>  pctv452e_usb_disconnect+0x6f/0x80 [dvb_usb_pctv452e]
>  usb_unbind_interface+0x75/0x290
>  ? _raw_spin_unlock_irqrestore+0x4a/0x80
>  device_release_driver_internal+0x160/0x210
>  driver_detach+0x40/0x80
>  bus_remove_driver+0x5c/0xd0
>  driver_unregister+0x2c/0x40
>  usb_deregister+0x6c/0xf0
>  pctv452e_usb_driver_exit+0x10/0xec0 [dvb_usb_pctv452e]
> 
> Signed-off-by: Wolfgang Rohdewald <wolfgang@rohdewald.de>
> ---
>  drivers/media/dvb-core/dvb_frontend.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/media/dvb-core/dvb_frontend.c
> b/drivers/media/dvb-core/dvb_frontend.c index
> 9139d01ba7ed..c2cc794299c9 100644 ---
> a/drivers/media/dvb-core/dvb_frontend.c +++
> b/drivers/media/dvb-core/dvb_frontend.c @@ -150,7 +150,8 @@ static
> void __dvb_frontend_free(struct dvb_frontend *fe) 
>  	dvb_free_device(fepriv->dvbdev);
>  
> -	dvb_frontend_invoke_release(fe, fe->ops.release);
> +	if (fe->ops.release)
> +		fe->ops.release(fe);
>  
>  	kfree(fepriv);
>  	fe->frontend_priv = NULL;

FWIW, this patch breaks unloading for all DVB cards in my dev system,
in that attached drivers like demod and tuner drivers won't usecount
to zero anymore ("rmmod ddbridge" keeps the usecount of stv0367 and
cxd2841er up, and "rmmod budget_av" doesn't usecount the tda10023 back
to zero).

Best regards,
Daniel Scheller
-- 
https://github.com/herrnst

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

end of thread, other threads:[~2017-11-26 17:10 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-11-24 14:02 [PATCH] media: dvb_frontend: dvb_unregister_frontend must not call dvb_detach for fe->ops.release Wolfgang Rohdewald
2017-11-26 17:10 ` Daniel Scheller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).