global data via module howto

Roman Kurakin rik at inse.ru
Mon Aug 21 22:33:20 UTC 2006


M. Warner Losh:

>In message: <44E994AF.6040805 at inse.ru>
>            Roman Kurakin <rik at inse.ru> writes:
>: M. Warner Losh wrote:
>: > In message: <44E87CChttp://comp.krovatka.ru/D.30105@inse.ru>
>: >             Roman Kurakin <rik at inse.ru> writes:
>: > :     I have the following problem:
>: > : module A
>: > :     int x;
>: > : 
>: > : module B
>: > :     extern int x;
>: > : 
>: > :     Module A is loaded, module B can't be loaded cause of unknow 'x'.
>: > : What should I do to make x global?
>: >
>: > Better to make module B depend on module A.  Making it global is
>: > generally a bad idea.
>: >
>: > in module A:
>: > MODULE_VERSION(A, 1);
>: >
>: > In module B:
>: > MODULE_DEPEND(B, A, 1, 1, 1);
>: >   
>: Module dependence is not the goal.
>
>Right.  That's how symbols are visible to other modules.
>
>: >
>: > : PS. I am working on porting irda support for USB devices from NetBSD.
>: > : The current model consists of two layers hw and sw. hw is the usb device
>: > : driver. sw is some software layer the same for all device and it is a
>: > : child on top of hw 'bus'. To make this working I need to add
>: > : DRIVER_MODULE for each 'bus'. To make sw independent from the
>: > : bus I need to export _driver and _class structures and put DRIVER_MODULE
>: > : in 'bus' code instead of 'child'.
>: >
>: > Are you sure that you need to do this?  I'm pretty sure that you can
>: > create a base class irdabus and then derive all the hw modules that
>: > implement irdabus from than and all the children will automatically
>: > probe.  No need to export the driver/class structures.
>: >   
>: I have a bit reversed case. In common case we have a driver for "bus" 
>: with many
>: consumers. And we have children that declares itself via DRIVER_MODULE.
>: If child could work on several buses it declares itself several times 
>: one for each
>: bus. In my case I have several drivers that could be treated as bus 
>: driver for the
>: same child:
>: 
>:  -----------USB------------
>:  |            |           |
>: ustir       uirda     smth_else
>:  \            |           /
>:   ---------irframe--------
>: 
>: Imagine, if the network interface was implemented as a child of every 
>: network
>: adapter. This is the same. In common case I'll put DRIVER_MODULE in a child
>: for each bus and recompile after adding a new one. In this case I do no 
>: want to
>: recompile the child for every new "bus" since child do not depend on 
>: such "bus"
>: - it is the same for all. So we may call this a pseudo-device with 
>: unknown list
>: of buses. I know, I could implement this other way, but I just want to 
>: play with
>: newbus a bit and the original NetBSD driver was implemented this way.
>
>I think I must have not been clear before.  I thought gave a solution
>to this that doesn't require a new DRIVER_MODULE for each new device.
>Let me try again.
>
>I'd hoped to say make ustir, uirda and smth_else all subclasses of a
>irbridge class, just like we do for pci and cardbus today.  Then
>irframe would attach to irbridge and you'd only need to list
>DRIVER_MODULE lines once.  This isn't a reversed case at all.  It is
>actually quite common, but has been 'papered over' until now via
>multiple DRIVER_MODULE lines, except in the case of pci/cardbus[*].
>
>I can provide more details on actually doing this.  Right now I'm
>doing something similar for all the iic bridges that we have in the
>kernel.  The number of devices with iicbus children is way too large
>and we can eliminate that issue via the technique.  I'd be happy to
>flesh it out a bit, or provide you with sample code if you need that.
>  
>
If you have a sample, it should help me a lot. Thanks.

>Warner
>
>[*] There's still pci and cardbus DRIVER_MODULE lines in many drivers,
>but they are almost not needed.  There's a newbus bug that I've not
>had the time to track down that prevents kldload from working
>competely correctly in some cases (like when loading the cardbus
>module).  Once I get that fixed...
>  
>
If I hit this problem for my case, I'll be glad to help to fix it.

rik



More information about the freebsd-hackers mailing list