Linux kernel 增量Linux IIO生产者';s模块引用时";“正在使用”;

Linux kernel 增量Linux IIO生产者';s模块引用时";“正在使用”;,linux-kernel,linux-device-driver,iio,Linux Kernel,Linux Device Driver,Iio,我制作了一个驱动程序,它是一个工业I/O(IIO)“生产者”(它提供ADC读数)。我把它编译成一个模块。我有另一个驱动程序,它是一个IIO“消费者”,它使用来自第一个驱动程序的ADC输入(它在其probe()函数中调用IIO\u channel\u get()) 这两个驱动程序都被编译为模块,它们可以很好地协同工作。但是我发现可以rmmod第一个驱动程序,即使第二个驱动程序被加载并因此使用其ADC,这似乎令人惊讶,因为第二个驱动程序“正在使用”。最好是防止第一个驱动程序在第二个驱动程序使用时卸载

我制作了一个驱动程序,它是一个工业I/O(IIO)“生产者”(它提供ADC读数)。我把它编译成一个模块。我有另一个驱动程序,它是一个IIO“消费者”,它使用来自第一个驱动程序的ADC输入(它在其
probe()
函数中调用
IIO\u channel\u get()

这两个驱动程序都被编译为模块,它们可以很好地协同工作。但是我发现可以
rmmod
第一个驱动程序,即使第二个驱动程序被加载并因此使用其ADC,这似乎令人惊讶,因为第二个驱动程序“正在使用”。最好是防止第一个驱动程序在第二个驱动程序使用时卸载。也就是说,当第二个驱动程序调用
iio\u通道get()
时,增加第一个模块的
refcnt
,当第二个驱动程序调用
iio\u通道释放()
时,减少
refcnt
。这在概念上类似于一个char设备的模块,它的
refcnt
对于每个打开它的进程都是递增的,因此在所有进程关闭char设备文件打开之前不能卸载它

但我看不到IIO生产者实现这一点的方法(例如,我看不到第二个驱动程序调用
IIO\u channel\u get()
时可能调用的任何ops函数)。这怎么可能呢


注意,这不是经典意义上的模块依赖关系,其中一个模块依赖于另一个模块提供的函数/符号。这是IIO消费者/生产者的依赖关系。从一个到另一个的依赖关系是特定于硬件的,并且在硬件的设备树中指定。在不同的硬件上,消费者/生产者依赖关系可能涉及不同的IIO生产者模块。

生产者中@Claudio:
depmod
的可能重复与阻止模块卸载没有任何共同之处。您是否将
结构IIO\u信息的
字段
设置为生产者中的
此\u模块
。@Tsyvarev:是的。@Claudio:no,它不是模块依赖关系(其中一个模块依赖于另一个模块提供的函数/符号),而是IIO使用者/生产者依赖关系。从一个到另一个的依赖关系是特定于硬件的,并且在硬件的设备树中指定。