Kyle, thanks for reffering,but it seems like GPL is not the case.
I want to write a module to track netdevices present.
Sort of a protocol sitting there. It is GPL'ed, but register_pm_notifier usage ( as you can see in sources)
gives linker warning "pm_chain_head undefined",since register_pm_notifier is "static inline" and expanded
to blocking_notifier_chain_unregister(&pm_chain_head, nb).
Why do you say pm_chain_head is static there ? Is it because it is not exported by EXPORT_SYMBOL ?
So what does it have to do with the license ( which is already GPL, but I just do not understand ).
What should be my choices, if I want to stay within distro kernel.
Thanks a lot.
On Feb 19, 2008 5:53 PM, Kyle McMartin <kyle@xxxxxxxxxxx> wrote:
It's hard to comment on it if you don't attach the source code...On Tue, Feb 19, 2008 at 01:41:15PM +0200, Eugene Goubine wrote:
> Hello , dear list users.
> >From my module I am trying to register for the system suspend using the *
> register_pm_notifier(nb)*
> which is expanded to *blocking_notifier_chain_register(&pm_chain_head, nb).*
> **
> I have a linker warning which tells "pm_chain_head" is undefined. I do
> see pm_chain_head in my /proc/kallsyms.
> What do I miss? Thank you.
At a guess, you tried using register_pm_notifier, that failed to link,
so you tried to use the function that it calls, which won't work since
pm_chain_head is static to the kernel/power/main.c compilation unit.
License your module under the GPL and add MODULE_LICENSE("GPL") and
you'll be able to use the register_pm_notifier export...
regards, Kyle
MODULE_LICENSE("GPL"); static int pm_event(struct notifier_block *this, unsigned long event,void *ptr) { return NOTIFY_OK; } static int netdev_event(struct notifier_block *this, unsigned long event,void *ptr) { struct net_device *net_dev = (struct net_device *)ptr; DEBUGP_P1(DL_TRACE,"Device %s\n",net_dev->name); switch (event){ case NETDEV_DOWN: DEBUGP(DL_TRACE,"NETDEV_DOWN\n"); break; case NETDEV_REGISTER: DEBUGP(DL_TRACE,"NETDEV_REGISTER\n"); break; case NETDEV_UP: DEBUGP(DL_TRACE,"NETDEV_UP\n"); break; case NETDEV_CHANGE: DEBUGP(DL_TRACE,"NETDEV_CHANGE\n"); break; case NETDEV_UNREGISTER: DEBUGP(DL_TRACE,"NETDEV_UNREGISTER\n"); break; default: DEBUGP(DL_TRACE,"Unknown netdev notification\n"); break; } return NOTIFY_OK; } struct notifier_block net_device_notifier = { .notifier_call = netdev_event }; struct notifier_block powerm_notifier = { .notifier_call = pm_event }; static int proto_init(void) { int i = 0; DEBUGP(DL_TRACE,"---->wibrouio_init\n"); i = register_netdevice_notifier(&net_device_notifier); // TODO: FIX THIS .DOES NOT WORK ! WHY? //i = register_pm_notifier(&powerm_notifier); DEBUGP(DL_TRACE,"<----wibrouio_init\n"); return 0; } static void proto_exit(void) { DEBUGP(DL_TRACE,"---->wibrouio_exit\n"); unregister_netdevice_notifier(&net_device_notifier); // TODO: FIX THIS .DOES NOT WORK ! WHY? //unregister_pm_notifier(&powerm_notifier); DEBUGP(DL_TRACE,"---->wibrouio_exit\n"); } module_init(proto_init); module_exit(proto_exit);
_______________________________________________ Fedora-kernel-list mailing list Fedora-kernel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/fedora-kernel-list