驱动程序文件中__devexit_p的目的是什么?

5

请问在驱动程序文件中__devexit_p的作用是什么?

我发现__devexit_p通常与驱动程序代码中的删除函数一起使用。

示例1:

static struct i2c_driver lsm9ds0_driver = {
    .driver = {
        .owner = THIS_MODULE,
        .name = LSM9DS0_DEV_NAME,
    },
    .probe = lsm9ds0_probe,
    .remove = __devexit_p(lsm9ds0_remove),
    .id_table = lsm9ds0_id,
};

例子 2:

static struct spi_driver light_driver = {
    .driver = {
        .name = "light",
        .owner = THIS_MODULE,
    },
    .probe = light_probe,
    .remove = __devexit_p(light_remove),
};

如果我从上面的示例中删除__devexit_p,会有什么区别吗?当删除__devexit_p时,它会影响驱动程序的性能吗?

1个回答

4
根据这个来自2.6.32版的LXR清单:(点击此处)
/*
Functions marked as __devexit may be discarded at kernel link time,
depending on config options.  Newer versions of binutils detect references 
from retained sections to discarded sections and flag an error.  Pointers to 
__devexit functions must use __devexit_p(function_name), the wrapper will 
insert either the function_name or NULL, depending on the config options.
*/

#if defined(MODULE) || defined(CONFIG_HOTPLUG)
#define __devexit_p(x) x
#else
#define __devexit_p(x) NULL
#endif

看起来它被用于根据代码编译为内核模块(MODULE)和CONFIG_HOTPLUG内核选项的情况,有条件地将其扩展到给定参数或NULL


这些宏已经不存在了,我实际上不记得它们是从哪个版本中被移除的。也许是v3.6? - 0andriy
是的,不再有这样的宏定义了。我只想确认一下,如果我从代码中删除了这部分,是否会对任何方面产生影响?@AndyShevchenko - runner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接