[linux-dvb] never do symbol_put(tunerfoo_attach);

hermann pitton hermann-pitton at arcor.de
Sat Nov 17 02:10:43 CET 2007


Am Freitag, den 16.11.2007, 19:10 -0500 schrieb mkrufky at linuxtv.org:
> Michel Ludwig wrote:
> > On Fri 16 Nov 2007, you wrote:
> >   
> >> We like to make linuxtv drivers modular and forward compatible.  There
> >> _are_ devices out there that use other tuners, and if you hardcode
> >> xc3028 into this driver, it prevents future developers from adding
> >> support for other devices without having to change existing code.
> >>     
> >
> > Sure, but no one said that tm6000-dvb is ready to go into the main tree...
> >   
> 
> I saw an issue and I felt it was appropriate for me to point it out 
> immediately.
> 
> Better to fix a problem when it is noticed, no?
> 
> >   
> >>> But anyway, how would dvb_frontend_detach(fe) release the xc3028_attach
> >>> symbol, which is requested by dvb_attach?
> >>>       
> >> The answer is self-explanatory.  Take a look at the other drivers, and
> >> take a look at dvb_frontend_detach.   (dvb_frontend.c , lines 1204 thru
> >> 1221)
> >>     
> >
> > Of course, I have done that, but it is still not clear to me. Here are the
> two 
> > macros:
> >
> > #define dvb_attach(FUNCTION, ARGS...) ({ \
> > 	void *__r = NULL; \
> > 	typeof(&FUNCTION) __a = symbol_request(FUNCTION); \
> > 	if (__a) { \
> > 		__r = (void *) __a(ARGS); \
> > 		if (__r == NULL) \
> > 			symbol_put(FUNCTION); \
> > 	} else { \
> > 		printk(KERN_ERR "DVB: Unable to find symbol
> "#FUNCTION"()\n"); \
> > 	} \
> > 	__r; \
> > })
> >
> > void dvb_frontend_detach(struct dvb_frontend* fe)
> > {
> > 	void *ptr;
> >
> > 	if (fe->ops.release_sec) {
> > 		fe->ops.release_sec(fe);
> > 		symbol_put_addr(fe->ops.release_sec);
> > 	}
> > 	if (fe->ops.tuner_ops.release) {
> > 		fe->ops.tuner_ops.release(fe);
> > 		symbol_put_addr(fe->ops.tuner_ops.release);
> > 	}
> > 	ptr = (void*)fe->ops.release;
> > 	if (ptr) {
> > 		fe->ops.release(fe);
> > 		symbol_put_addr(ptr);
> > 	}
> > }
> >
> > dvb_attach is called with xc2028_attach, hence it will request
> xc2028_attach. 
> > But dvb_frontend_detach will release xc2028_dvb_release.
> >   
> It's the same module.
> > I can try this out tomorrow, but if I have to reboot my machine after that
> to 
> > unload tuner-xc2028, then there is definitely a flaw in this approach...
> :-)
> >   
> This is the accepted and proven method used across the entire dvb tree.  
> If it doesnt work for you, then something is wrong in your code.  I 
> don't think it will cause any problem.
> 
> Hey, I was just trying to point out a flaw in your patch -- Nobody is an 
> expert, and there is always something to be learned.
> 
> -Mike
> 
> P.S. Why are you guys dropping cc's?  I cc'd linux-dvb mailing list 
> because this is a development issue.  It is important for such 
> discussions to be documented, because it is the only way for future 
> developers to learn from our mistakes.  To conduct all emails in private 
> will not lead to any progression.  This is a community, and we should 
> all be willing to give and accept advice from each other.

Mike,

I still fully under scribe that.

But we should also not create illusions for those coming later and have
to crawl through.

Sometimes it is a damned ratrace, maybe always!

With that NDA stuff not in some GNU/Linux library as fall back, it can
always start again.

I said it previously and repeat it, it comes from above and gets wild by
will.

We are only the idiots ...

Cheers,
Hermann










More information about the linux-dvb mailing list