Hello there,
I am creating a sysctl kernel module to register 2 hierarchy under same proc name. For e.g. my_net | | net1 net2 | | t1 t2 So, I used register_sysctl_paths() API for registering the sysctl tables net1 net2 under path name my_net. Problem is when unregistering the tables dmesg shows a warning and call trace. # rmmod sysctl.ko # dmesg ------------[ cut here ]------------ WARNING: at kernel/sysctl.c:2270 unregister_sysctl_table+0xb1/0x120() (Tainted: P W ---------------- ) Hardware name: VMware Virtual Platform Modules linked in: sysctl(-)(U) ip6table_filter ip6_tables ebtable_nat ebtables xt_CHECKSUM iptable_mangle ipt_MASQUERADE iptable_nat nf_nat nf_conntrack_ipv4 nf_defrag_ipv4 xt_state nf_conntrack ipt_REJECT bridge autofs4 sunrpc fcoe libfcoe libfc scsi_transport_fc scsi_tgt 8021q garp stp llc cachefiles fscache ipv6 xt_physdev iptable_filter ip_tables dm_mirror dm_region_hash dm_log uinput ppdev parport_pc parport e1000 pcnet32 mii vmware_balloon sg i2c_piix4 i2c_core shpchp ext4 mbcache jbd2 vxspec(P)(U) vxio(P)(U) vxdmp(P)(U) sd_mod crc_t10dif sr_mod cdrom mptspi mptscsih mptbase scsi_transport_spi ata_generic pata_acpi ata_piix dm_mod [last unloaded: sysctl] Pid: 22463, comm: rmmod Tainted: P W ---------------- 2.6.32-71.el6.x86_64 #1 Call Trace: [<ffffffff8106b857>] warn_slowpath_common+0x87/0xc0 [<ffffffff8106b8aa>] warn_slowpath_null+0x1a/0x20 [<ffffffff81076251>] unregister_sysctl_table+0xb1/0x120 [<ffffffff810c611c>] ? stop_machine_destroy+0x4c/0x50 [<ffffffff810c621b>] ? stop_machine+0x4b/0x60 [<ffffffffa002d021>] sysctl_module_exit+0x21/0x23 [sysctl] [<ffffffff810ac706>] sys_delete_module+0x1a6/0x280 [<ffffffff8101ea88>] ? syscall_trace_enter+0x1d8/0x1e0 [<ffffffff81013387>] tracesys+0xd9/0xde ---[ end trace fee2c1c8e41aeb36 ]--- Kindly, help me to resolve this warning. Following is module. #include <linux/kernel.h> #include <linux/module.h> #include <linux/sysctl.h> static struct ctl_table_header * test_sysctl_header1; static struct ctl_table_header * test_sysctl_header2; int value1 = 0; int value2 = 1; int min = 10; int max = 20; static ctl_table test_table1[] = { { .ctl_name = CTL_UNNUMBERED, .procname = "value1", .data = &value1, .maxlen = sizeof(int), .mode = 0644, .proc_handler = &proc_dointvec_minmax, .strategy = &sysctl_intvec, .extra1 = &min, .extra2 = &max }, { .ctl_name = CTL_UNNUMBERED, .procname = "value2", .data = &value2, .maxlen = sizeof(int), .mode = 0644, .proc_handler = &proc_dointvec_minmax, .strategy = &sysctl_intvec, .extra1 = &min, .extra2 = &max }, { .ctl_name = 0 } }; static ctl_table test_table2[] = { { .ctl_name = CTL_UNNUMBERED, .procname = "value1", .data = &value1, .maxlen = sizeof(int), .mode = 0644, .proc_handler = &proc_dointvec_minmax, .strategy = &sysctl_intvec, .extra1 = &min, .extra2 = &max }, { .ctl_name = CTL_UNNUMBERED, .procname = "value2", .data = &value2, .maxlen = sizeof(int), .mode = 0644, .proc_handler = &proc_dointvec_minmax, .strategy = &sysctl_intvec, .extra1 = &min, .extra2 = &max }, { .ctl_name = 0 } }; static ctl_table test_net_table1[] = { { .ctl_name = CTL_UNNUMBERED, .procname = "test1", .mode = 0555, .child = test_table1 }, { .ctl_name = 0 } }; static ctl_table test_net_table2[] = { { .ctl_name = CTL_UNNUMBERED, .procname = "test2", .mode = 0555, .child = test_table2 }, { .ctl_name = 0 } }; static ctl_table test_root_table1[] = { { .ctl_name = CTL_UNNUMBERED, .procname = "net1", .mode = 0555, .child = test_net_table1 }, { .ctl_name = 0 } }; static ctl_table test_root_table2[] = { { .ctl_name = CTL_UNNUMBERED, .procname = "net2", .mode = 0555, .child = test_net_table2 }, { .ctl_name = 0 } }; static struct ctl_path net1_path[] = { { .procname = "my_net", .ctl_name = CTL_UNNUMBERED }, { } }; static int __init sysctl_module_init(void) { test_sysctl_header1 = register_sysctl_paths(net1_path, test_root_table1); test_sysctl_header2 = register_sysctl_paths(net1_path, test_root_table2); return 0; } static void __exit sysctl_module_exit(void) { unregister_sysctl_table(test_sysctl_header1); unregister_sysctl_table(test_sysctl_header2); } module_init(sysctl_module_init); module_exit(sysctl_module_exit); MODULE_LICENSE("GPL"); Thanks, Chaitanya
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies