Update dvb use of symbol_(get|put)
RFC PATCH 3/3 Update dvb use of symbol_(get|put)
From: Trent Piepho <[email protected]>
Make the dvb sub-system use the ability of symbol_(put|get) to keep track of what module did the putting or getting. In the dvb sub-system, symbol_put is called through the macro dvb_attach(). A driver for a bridge or card will attach frontends, tuners, or other helper drivers, and this card driver will be listed as the user of the helper drivers.
When the card driver unloads, a single function in dvb-core, dvb_frontend_detach(), will release all the helper drivers. Since the get() happened in the card driver, but the put() is happening in dvb-core, it is necessary to use __symbol_put_addr() so that a user other than THIS_MODULE (which would be dvb-core, while we want the card driver) can be specified.
drivers/media/dvb/bt8xx/dst.c +1 -4
@@ -1718,12 +1718,9 @@ static void dst_release(struct dvb_frontif (state->dst_ca) {dvb_unregister_device (state->dst_ca);#ifdef CONFIG_DVB_CORE_ATTACH -symbol_put (dst_ca_attach); +symbol_put_user (dst_ca_attach, fe->dvb->module);#endif } -#ifdef CONFIG_DVB_CORE_ATTACH -symbol_put (dst_attach); -#endif kfree (state); }
drivers/media/dvb/dvb-core/dvb_frontend.c +5 -4
@@ -1127,19 +1127,20 @@ void dvb_frontend_detach(struct dvb_fronvoid dvb_frontend_detach (struct dvb_frontend * fe) {void *ptr; +struct module *mod = fe->dvb->module;if (fe->ops.release_sec) { fe->ops.release_sec (fe); -symbol_put_addr (fe->ops.release_sec); +__symbol_put_addr (fe->ops.release_sec, mod); }if (fe->ops.tuner_ops.release) { fe->ops.tuner_ops.release (fe); -symbol_put_addr (fe->ops.tuner_ops.release); +__symbol_put_addr (fe->ops.tuner_ops.release, mod); } ptr = (void *)fe->ops.release;if (ptr) { - fe->ops.release (fe); -symbol_put_addr (ptr); + fe->ops.release (fe);/* This call will de-allocate fe! */ +__symbol_put_addr (ptr, mod); } }#else