Re: Incrementing module reference count

From: Borislav Petkov
Date: Sat Dec 08 2012 - 06:44:51 EST


On Fri, Dec 07, 2012 at 05:14:39PM -0800, Aaron Williams wrote:
> Hi,
>
> I have a kernel module which other modules register with in order to
> export access functions. So far I have everything working but I want
> to prevent a module that is registered with my module from unloading
> since now my module is dependent on the other module.
>
> Is there a way I can cause the reference count of the module
> registering with my module to increase? I tried calling get_device
> with the device structure of the module that is registering but that
> does not seem to work.
>
> For example, I have the following function:
>
> /**
> * Adds a mapping of a device node to a memory accessor
> *
> * @param[in] dev - device
> * @param[in] macc - memory accessor
> *
> * @returns 0 for success or -ENOMEM
> */
> int of_memory_accessor_register(struct device *dev,
> struct memory_accessor *macc)
> {
> struct of_macc_entry *mentry;
>
> mentry = kmalloc(sizeof(*mentry), GFP_KERNEL);
> if (mentry == NULL)
> return -ENOMEM;
>
> mentry->dev = dev;
> mentry->macc = macc;
>
> mutex_lock(&lock);
>
> get_device(dev);
> list_add(&(mentry->list), &macc_list);
>
> mutex_unlock(&lock);
>
> return 0;
> }
> EXPORT_SYMBOL(of_memory_accessor_register);
>
> Basically my module is used for things like serial EEPROMs and
> whatnot so that external modules can find the accessor functions
> based on the device tree. In my case I am updating the Vitesse
> VSC848X driver so that it can read the SFP module when it is plugged
> in using the AT24 I2C EEPROM module. I want to prevent the at24
> module from unloading while other modules in turn are using it. The
> at24 module does not export any symbols.

>From a quick code scan, at24 has this:

static struct i2c_driver at24_driver = {
.driver = {
.name = "at24",
.owner = THIS_MODULE,
},
.probe = at24_probe,
.remove = __devexit_p(at24_remove),
.id_table = at24_ids,
};

and then you could do:

try_module_get(at24_driver.driver->owner);

from your code. AFAICT, of course.

HTH.

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