From mboxrd@z Thu Jan 1 00:00:00 1970 From: "SangOg Na" Subject: Can I make ipv6 module inactive at my pentaval driver? Date: Wed, 21 Jun 2006 14:41:32 +0900 Message-ID: <029d01c694f5$5d3d3ab0$3047efcb@nsowork> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_029A_01C69540.C9E4ABD0" Return-path: Received: from [203.239.71.1] ([203.239.71.1]:64683 "EHLO ns.pentamedia.com") by vger.kernel.org with ESMTP id S1751113AbWFUFli (ORCPT ); Wed, 21 Jun 2006 01:41:38 -0400 Received: from nsowork ([203.239.71.48]) (authenticated) by ns.pentamedia.com (8.11.6/8.11.6) with ESMTP id k5L5erh14170 for ; Wed, 21 Jun 2006 14:40:54 +0900 To: Sender: netdev-owner@vger.kernel.org List-Id: netdev.vger.kernel.org This is a multi-part message in MIME format. ------=_NextPart_000_029A_01C69540.C9E4ABD0 Content-Type: text/plain; format=flowed; charset="ks_c_5601-1987"; reply-type=original Content-Transfer-Encoding: 7bit Hi! I'm working for pentamedia in Korea. My company makes one-way satellite receiver card whose name is pentavalue. Pentavalue cards receive DVB-S packets and extract IP packets and push them into TCP/IP stack. pentavalue driver works in linux kernel 2.4.20. I'm porting pentavalue driver to 2.6.17 kernel, but reference count problem occurs. There is no code updating reference count in driver source. I insert debug code in kernel source at dev_put and dev_hold in include/linux/netdevice.h file. static inline void dev_put(struct net_device *dev) { atomic_dec(&dev->refcnt); + if (*(dev)->name=='p') { + printk("-%s- %d\n",dev->name,atomic_read(&dev->refcnt)); + dump_stack(); + } } static inline void dev_hold(struct net_device *dev) { atomic_inc(&dev->refcnt); + if (*(dev)->name=='p') { + printk("+%s+ %d\n",dev->name,atomic_read(&dev->refcnt)); + dump_stack(); + } } I found ipv6 module notifier increase refcnt and not decrease refcnt. refcnt increases by 3 when the device opens and closes using ifconfig. I modified driver source for enabling rmmod by setting refcnt to 4 before cleanup module. I will attach command log file. ------=_NextPart_000_029A_01C69540.C9E4ABD0 Content-Type: application/octet-stream; name="pentaval.log" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="pentaval.log" # modprobe pentaval # dmesg -c PentaVal_init_one: [bus:0x0,device:0x8,function:0x0] PentaVal_init_one: = [vender/device/subvendor/subdevice:0x109e,0x036e,0x15c8,0x0133] PentaVal_init_board: MMIO region size:start 0xF7FFF000-> = 0xF7FFFFFF,len:0x1000 ACPI: PCI Interrupt 0000:00:08.0[A] -> GSI 16 (level, low) -> IRQ 20 PentaVal_init_board: Physical MMIO region start 0xF7FFF000 PentaVal_init_board: Virtual MMIO region start 0xDE87E000 PentaVal_init_one: PCI FN0 Physical start:0xF7FFF000 PentaVal_init_one: PCI FN0 Virtual start:0xDE87E000 PentaVal_init_one: [bus:0x0,device:0x8,function:0x1] PentaVal_init_one: = [vender/device/subvendor/subdevice:0x109e,0x0878,0x15c8,0x0133] PentaVal_init_board: MMIO region size:start 0xF7FFE000-> = 0xF7FFEFFF,len:0x1000 ACPI: PCI Interrupt 0000:00:08.1[A] -> GSI 16 (level, low) -> IRQ 20 PentaVal_init_board: Physical MMIO region start 0xF7FFE000 PentaVal_init_board: Virtual MMIO region start 0xDEC24000 PentaVal_init_one: PCI FN1 Physical start:0xF7FFE000 PentaVal_init_one: PCI FN1 Virtual start:0xDEC24000 +pentaval0+ 1 alloc_divert_blk+0x6b/0x6f = register_netdevice+0x67/0x2b5 register_netdev+0x5b/0x68 = PentaVal_init_one+0x26d/0x30f [pentaval] pci_call_probe+0xf/0x12 = __pci_device_probe+0x33/0x47 pci_device_probe+0x1f/0x34 = driver_probe_device+0x43/0x9c __driver_attach+0x0/0x5c = __driver_attach+0x37/0x5c bus_for_each_dev+0x46/0x6c kobject_add+0x94/0xb3 driver_attach+0x14/0x18 __driver_attach+0x0/0x5c bus_add_driver+0x54/0x84 = driver_register+0x7b/0x80 __pci_register_driver+0x3e/0x4f = blocking_notifier_call_chain+0x20/0x37 PentaVal_init_module+0xf/0x12 [pentaval] = sys_init_module+0x89/0x13d syscall_call+0x7/0xb=20 +pentaval0+ 2 register_netdevice+0x288/0x2b5 = register_netdev+0x5b/0x68 PentaVal_init_one+0x26d/0x30f [pentaval] = pci_call_probe+0xf/0x12 __pci_device_probe+0x33/0x47 = pci_device_probe+0x1f/0x34 driver_probe_device+0x43/0x9c = __driver_attach+0x0/0x5c __driver_attach+0x37/0x5c = bus_for_each_dev+0x46/0x6c kobject_add+0x94/0xb3 driver_attach+0x14/0x18 __driver_attach+0x0/0x5c = bus_add_driver+0x54/0x84 driver_register+0x7b/0x80 = __pci_register_driver+0x3e/0x4f blocking_notifier_call_chain+0x20/0x37 = PentaVal_init_module+0xf/0x12 [pentaval] sys_init_module+0x89/0x13d syscall_call+0x7/0xb -> www.pentamedia.com/english/products/penta-value.htm Pentamedia Satellite Data Broadcast Receiver PCI Pent@VALUE(#1) pentaval0: at 0xf7fff000 0xf7ffe000 IRQ 20 pentaval0: vendor 0x109e device 0x878 pentaval0: subsystem 0x15c8 subsystem vendor 0x133 pentaval0: ver 2.1.10 release date 2002/11/11 # ifconfig pentaval0 up # dmesg -c #nso:2 PentaVal_open: pentaval0: Starting up Pent@VALUE card (card idx =3D 0) #nso:2 +pentaval0+ 3 qdisc_alloc+0xa8/0xc2 HWP_SetMultiCast+0xe5/0xf3 = [pentaval] PentaVal_set_rx_mode+0x0/0xa1 [pentaval] = qdisc_create_dflt+0x10/0x3e dev_activate+0x26/0xd1 dev_open+0x4e/0x65 dev_change_flags+0x49/0xeb = devinet_ioctl+0x24b/0x4bc inet_ioctl+0x44/0x63 sock_ioctl+0x1aa/0x1c7 do_ioctl+0x26/0x4f vfs_ioctl+0x16c/0x179 sys_ioctl+0x2b/0x46 syscall_call+0x7/0xb +pentaval0+ 4 neigh_parms_alloc+0xa5/0xd7 = ipv6_add_dev+0x92/0x1d1 [ipv6] ipv6_find_idev+0x40/0x5b [ipv6] = addrconf_add_dev+0x36/0x52 [ipv6] addrconf_dev_config+0x5d/0x9a [ipv6] = rtmsg_ifinfo+0x69/0x71 addrconf_notify+0xc5/0x19b [ipv6] = notifier_call_chain+0x1c/0x33 raw_notifier_call_chain+0x11/0x15 = dev_open+0x5b/0x65 dev_change_flags+0x49/0xeb = devinet_ioctl+0x24b/0x4bc inet_ioctl+0x44/0x63 sock_ioctl+0x1aa/0x1c7 do_ioctl+0x26/0x4f vfs_ioctl+0x16c/0x179 sys_ioctl+0x2b/0x46 syscall_call+0x7/0xb +pentaval0+ 5 ipv6_add_dev+0xcd/0x1d1 [ipv6] = ipv6_find_idev+0x40/0x5b [ipv6] addrconf_add_dev+0x36/0x52 [ipv6] = addrconf_dev_config+0x5d/0x9a [ipv6] rtmsg_ifinfo+0x69/0x71 = addrconf_notify+0xc5/0x19b [ipv6] notifier_call_chain+0x1c/0x33 = raw_notifier_call_chain+0x11/0x15 dev_open+0x5b/0x65 dev_change_flags+0x49/0xeb devinet_ioctl+0x24b/0x4bc inet_ioctl+0x44/0x63 sock_ioctl+0x1aa/0x1c7 do_ioctl+0x26/0x4f vfs_ioctl+0x16c/0x179 sys_ioctl+0x2b/0x46 syscall_call+0x7/0xb=20 +pentaval0+ 6 dev_get_by_index+0x36/0x3a = ip6_route_add+0x73/0x635 [ipv6] register_proc_table+0xcb/0xdf = addrconf_add_mroute+0x66/0x6b [ipv6] addrconf_add_dev+0x45/0x52 [ipv6] = addrconf_dev_config+0x5d/0x9a [ipv6] rtmsg_ifinfo+0x69/0x71 = addrconf_notify+0xc5/0x19b [ipv6] notifier_call_chain+0x1c/0x33 = raw_notifier_call_chain+0x11/0x15 dev_open+0x5b/0x65 dev_change_flags+0x49/0xeb devinet_ioctl+0x24b/0x4bc inet_ioctl+0x44/0x63 sock_ioctl+0x1aa/0x1c7 do_ioctl+0x26/0x4f vfs_ioctl+0x16c/0x179 sys_ioctl+0x2b/0x46 syscall_call+0x7/0xb=20 +pentaval0+ 7 dev_get_by_index+0x36/0x3a = ip6_route_add+0x73/0x635 [ipv6] addrconf_prefix_route+0x7d/0x85 [ipv6] = addrconf_add_lroute+0x34/0x38 [ipv6] addrconf_add_dev+0x4b/0x52 [ipv6] = addrconf_dev_config+0x5d/0x9a [ipv6] rtmsg_ifinfo+0x69/0x71 = addrconf_notify+0xc5/0x19b [ipv6] notifier_call_chain+0x1c/0x33 = raw_notifier_call_chain+0x11/0x15 dev_open+0x5b/0x65 dev_change_flags+0x49/0xeb devinet_ioctl+0x24b/0x4bc inet_ioctl+0x44/0x63 sock_ioctl+0x1aa/0x1c7 do_ioctl+0x26/0x4f vfs_ioctl+0x16c/0x179 sys_ioctl+0x2b/0x46 syscall_call+0x7/0xb=20 +pentaval0+ 8 dev_get_by_index+0x36/0x3a = ip6_route_add+0x73/0x635 [ipv6] addrconf_prefix_route+0x7d/0x85 [ipv6] = addrconf_dad_start+0x36/0xb9 [ipv6] addrconf_add_linklocal+0x2b/0x43 [ipv6] = addrconf_dev_config+0x90/0x9a [ipv6] addrconf_notify+0xc5/0x19b [ipv6] = notifier_call_chain+0x1c/0x33 raw_notifier_call_chain+0x11/0x15 = dev_open+0x5b/0x65 dev_change_flags+0x49/0xeb = devinet_ioctl+0x24b/0x4bc inet_ioctl+0x44/0x63 sock_ioctl+0x1aa/0x1c7 do_ioctl+0x26/0x4f vfs_ioctl+0x16c/0x179 sys_ioctl+0x2b/0x46 syscall_call+0x7/0xb -pentaval0- 7 dst_destroy+0x88/0xc1 fib6_add+0xa3/0xb7 [ipv6] ip6_ins_rt+0x29/0x37 [ipv6] = addrconf_prefix_route+0x7d/0x85 [ipv6] addrconf_dad_start+0x36/0xb9 [ipv6] = addrconf_add_linklocal+0x2b/0x43 [ipv6] addrconf_dev_config+0x90/0x9a [ipv6] = addrconf_notify+0xc5/0x19b [ipv6] notifier_call_chain+0x1c/0x33 = raw_notifier_call_chain+0x11/0x15 dev_open+0x5b/0x65 dev_change_flags+0x49/0xeb devinet_ioctl+0x24b/0x4bc inet_ioctl+0x44/0x63 sock_ioctl+0x1aa/0x1c7 do_ioctl+0x26/0x4f vfs_ioctl+0x16c/0x179 sys_ioctl+0x2b/0x46 syscall_call+0x7/0xb=20 +pentaval0+ 8 ndisc_dst_alloc+0x70/0x121 [ipv6] = ndisc_send_rs+0x5e/0x363 [ipv6] ip6_output+0x0/0x40 [ipv6] = fib6_prune_clones+0x14/0x18 [ipv6] fib6_prune_clone+0x0/0x13 [ipv6] = addrconf_dad_completed+0x69/0xa5 [ipv6] addrconf_add_linklocal+0x2b/0x43 [ipv6] = addrconf_dev_config+0x90/0x9a [ipv6] addrconf_notify+0xc5/0x19b [ipv6] = notifier_call_chain+0x1c/0x33 raw_notifier_call_chain+0x11/0x15 = dev_open+0x5b/0x65 dev_change_flags+0x49/0xeb = devinet_ioctl+0x24b/0x4bc inet_ioctl+0x44/0x63 sock_ioctl+0x1aa/0x1c7 do_ioctl+0x26/0x4f vfs_ioctl+0x16c/0x179 sys_ioctl+0x2b/0x46 syscall_call+0x7/0xb +pentaval0+ 9 neigh_create+0x67/0x1a6 neigh_lookup+0x1a/0x87 neigh_lookup+0x80/0x87 = ndisc_dst_alloc+0x9e/0x121 [ipv6] ndisc_send_rs+0x5e/0x363 [ipv6] = ip6_output+0x0/0x40 [ipv6] fib6_prune_clones+0x14/0x18 [ipv6] = fib6_prune_clone+0x0/0x13 [ipv6] addrconf_dad_completed+0x69/0xa5 [ipv6] = addrconf_add_linklocal+0x2b/0x43 [ipv6] addrconf_dev_config+0x90/0x9a [ipv6] = addrconf_notify+0xc5/0x19b [ipv6] notifier_call_chain+0x1c/0x33 = raw_notifier_call_chain+0x11/0x15 dev_open+0x5b/0x65 dev_change_flags+0x49/0xeb devinet_ioctl+0x24b/0x4bc inet_ioctl+0x44/0x63 sock_ioctl+0x1aa/0x1c7 do_ioctl+0x26/0x4f vfs_ioctl+0x16c/0x179 sys_ioctl+0x2b/0x46 syscall_call+0x7/0xb=20 +pentaval0+ 10 ndisc_dst_alloc+0x70/0x121 [ipv6] = ndisc_send_rs+0x5e/0x363 [ipv6] ip6_output+0x0/0x40 [ipv6] = addrconf_rs_timer+0x0/0xa7 [ipv6] addrconf_rs_timer+0x7d/0xa7 [ipv6] = run_timer_softirq+0x114/0x157 __do_softirq+0x34/0x7d do_softirq+0x22/0x26 do_IRQ+0x1e/0x24 common_interrupt+0x1a/0x20 mwait_idle+0x1a/0x2a cpu_idle+0x42/0x57 start_kernel+0x17b/0x17d=20 +pentaval0+ 11 ndisc_dst_alloc+0x70/0x121 [ipv6] = ndisc_send_rs+0x5e/0x363 [ipv6] ip6_output+0x0/0x40 [ipv6] = kfree_skbmem+0x69/0x6d addrconf_rs_timer+0x0/0xa7 [ipv6] = addrconf_rs_timer+0x7d/0xa7 [ipv6] run_timer_softirq+0x114/0x157 = __do_softirq+0x34/0x7d do_softirq+0x22/0x26 do_IRQ+0x1e/0x24 common_interrupt+0x1a/0x20 mwait_idle+0x1a/0x2a cpu_idle+0x42/0x57 start_kernel+0x17b/0x17d pentaval0: no IPv6 routers present # ifconfig pentaval0 down # dmesg -c =3Dnso:11 PentaVal_close: pentaval0: Shutting down Pent@VALUE card (card idx =3D0) =3Dnso:11 -pentaval0- 10 dst_destroy+0x88/0xc1 fib6_del_route+0x134/0x14d = [ipv6] fib6_del+0x5a/0xb3 [ipv6] = fib6_clean_node+0x29/0x6b [ipv6] fib6_walk_continue+0x85/0xe6 [ipv6] = fib6_walk+0x3f/0x69 [ipv6] fib6_clean_tree+0x33/0x37 [ipv6] = fib6_clean_node+0x0/0x6b [ipv6] fib6_clean_tree+0x33/0x37 [ipv6] = fib6_ifdown+0x0/0x1f [ipv6] rt6_ifdown+0x24/0x2c [ipv6] fib6_ifdown+0x0/0x1f = [ipv6] addrconf_ifdown+0x51/0x2ac [ipv6] = addrconf_notify+0x14c/0x19b [ipv6] notifier_call_chain+0x1c/0x33 = raw_notifier_call_chain+0x11/0x15 dev_close+0x5b/0x62 dev_change_flags+0x49/0xeb devinet_ioctl+0x24b/0x4bc inet_ioctl+0x44/0x63 sock_ioctl+0x1aa/0x1c7 do_ioctl+0x26/0x4f vfs_ioctl+0x16c/0x179 sys_ioctl+0x2b/0x46 syscall_call+0x7/0xb=20 -pentaval0- 9 dst_destroy+0x88/0xc1 fib6_del_route+0x134/0x14d = [ipv6] fib6_del+0x5a/0xb3 [ipv6] = fib6_clean_node+0x29/0x6b [ipv6] fib6_walk_continue+0x85/0xe6 [ipv6] = fib6_walk+0x3f/0x69 [ipv6] fib6_clean_tree+0x33/0x37 [ipv6] = fib6_clean_node+0x0/0x6b [ipv6] fib6_clean_tree+0x33/0x37 [ipv6] = fib6_ifdown+0x0/0x1f [ipv6] rt6_ifdown+0x24/0x2c [ipv6] fib6_ifdown+0x0/0x1f = [ipv6] addrconf_ifdown+0x51/0x2ac [ipv6] = addrconf_notify+0x14c/0x19b [ipv6] notifier_call_chain+0x1c/0x33 = raw_notifier_call_chain+0x11/0x15 dev_close+0x5b/0x62 dev_change_flags+0x49/0xeb devinet_ioctl+0x24b/0x4bc inet_ioctl+0x44/0x63 sock_ioctl+0x1aa/0x1c7 do_ioctl+0x26/0x4f vfs_ioctl+0x16c/0x179 sys_ioctl+0x2b/0x46 syscall_call+0x7/0xb=20 # rmmod pentaval # dmesg -c nso:9 mtu:1500 -pentaval0- 3 neigh_parms_release+0x76/0xa5 = addrconf_ifdown+0x282/0x2ac [ipv6] addrconf_notify+0x14c/0x19b [ipv6] = notifier_call_chain+0x1c/0x33 raw_notifier_call_chain+0x11/0x15 = unregister_netdevice+0x151/0x1e1 unregister_netdev+0x10/0x18 = PentaVal_remove_one+0xb5/0x11d [pentaval] pci_device_remove+0x19/0x2c = __device_release_driver+0x58/0x85 driver_detach+0x49/0x76 = bus_remove_driver+0x2c/0x4d driver_unregister+0xb/0x15 = pci_unregister_driver+0xe/0x19 PentaVal_cleanup_module+0xa/0xc [pentaval] = sys_delete_module+0x10d/0x132 do_munmap+0xdf/0xeb sys_munmap+0x31/0x4b syscall_call+0x7/0xb=20 -pentaval0- 2 unregister_netdevice+0x190/0x1e1 = unregister_netdev+0x10/0x18 PentaVal_remove_one+0xb5/0x11d [pentaval] = pci_device_remove+0x19/0x2c __device_release_driver+0x58/0x85 = driver_detach+0x49/0x76 bus_remove_driver+0x2c/0x4d = driver_unregister+0xb/0x15 pci_unregister_driver+0xe/0x19 = PentaVal_cleanup_module+0xa/0xc [pentaval] sys_delete_module+0x10d/0x132 = do_munmap+0xdf/0xeb sys_munmap+0x31/0x4b syscall_call+0x7/0xb -pentaval0- 1 __qdisc_destroy+0x76/0x84 rcu_do_batch+0x1a/0x71 rcu_process_callbacks+0xf/0x22 = tasklet_action+0x3a/0x59 __do_softirq+0x34/0x7d do_softirq+0x22/0x26 do_IRQ+0x1e/0x24 common_interrupt+0x1a/0x20 mwait_idle+0x1a/0x2a cpu_idle+0x42/0x57 start_kernel+0x17b/0x17d=20 -pentaval0- 0 unregister_netdevice+0x1db/0x1e1 = unregister_netdev+0x10/0x18 PentaVal_remove_one+0xb5/0x11d [pentaval] = pci_device_remove+0x19/0x2c __device_release_driver+0x58/0x85 = driver_detach+0x49/0x76 bus_remove_driver+0x2c/0x4d = driver_unregister+0xb/0x15 pci_unregister_driver+0xe/0x19 = PentaVal_cleanup_module+0xa/0xc [pentaval] sys_delete_module+0x10d/0x132 = do_munmap+0xdf/0xeb sys_munmap+0x31/0x4b syscall_call+0x7/0xb ACPI: PCI interrupt for device 0000:00:08.1 disabled ------=_NextPart_000_029A_01C69540.C9E4ABD0--