Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 18 Mar 2009 09:16:22 -0700
From:      Julian Elischer <julian@elischer.org>
To:        Ash Gokhale <ash@aeria.net>
Cc:        freebsd-net@freebsd.org
Subject:   Re: netgraph modules won't unload after use
Message-ID:  <49C11E56.7090809@elischer.org>
In-Reply-To: <6CBA0923-DAF1-4FD5-A670-F5888BCA47B1@aeria.net>
References:  <6CBA0923-DAF1-4FD5-A670-F5888BCA47B1@aeria.net>

next in thread | previous in thread | raw e-mail | index | archive | help
Ash Gokhale wrote:
>  I'm developing a kernel module that will be doing inspection and needed 
> access to raw network frames,
>  so I turned to netgraph  as the solution.However it seems that netgraph 
> will not permit a module
>  to unload once it's participated in a mkpeer/connect operation. 
> Rebooting to remove a module is
>  angrymaking (not like mtx/sleep crashes).
> 
>     This going into the kernel because my bpf based userland stuff is 
> probably not going to hold up to the packet rate.
> 
> Should I file a PR? Or is there magic in the documentation I havn't found?
> 
> 
> I've observed the trouble in 7.0 release, and tonight's  7_RELENG, with 
> GENERIC + WITNESS/INVARIANTS
> 
> The module code  ( cobbled together from netgraph/ng_sample.c / ng_echo.c)
> http://pastebin.com/m31b6ece6
> 
> The module loads and unloads fine until connected to a netgraph hook:

hmm they are supposed to, and they did in the past..
let me check...

root@trafmon1:kldload ng_ether
root@trafmon1:ifconfig
bge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
         options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
         ether 00:11:43:30:fb:8a
         inet 10.7.2.3 netmask 0xffffff00 broadcast 10.7.2.255
         media: Ethernet autoselect (100baseTX <full-duplex>)
         status: active
bge1: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
         options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
         ether 00:11:43:30:fb:8b
         media: Ethernet autoselect (none)
         status: no carrier
fxp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
         options=b<RXCSUM,TXCSUM,VLAN_MTU>
         ether 00:0e:0c:62:aa:14
         inet 10.7.0.101 netmask 0xffffff00 broadcast 10.7.0.255
         media: Ethernet autoselect (100baseTX <full-duplex>)
         status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
         inet 127.0.0.1 netmask 0xff000000
root@trafmon1:ngctl
+ list
There are 4 total nodes:
   Name: bge0            Type: ether           ID: 00000002   Num hooks: 0
   Name: bge1            Type: ether           ID: 00000003   Num hooks: 0
   Name: ngctl4252       Type: socket          ID: 00000005   Num hooks: 0
   Name: fxp0            Type: ether           ID: 00000004   Num hooks: 0
+ mkpeer bge0: hole lower hook
+ list
There are 5 total nodes:
   Name: <unnamed>       Type: hole            ID: 00000006   Num hooks: 1
   Name: bge0            Type: ether           ID: 00000002   Num hooks: 1
   Name: bge1            Type: ether           ID: 00000003   Num hooks: 0
   Name: ngctl4252       Type: socket          ID: 00000005   Num hooks: 0
   Name: fxp0            Type: ether           ID: 00000004   Num hooks: 0
+ shutdown [6]:
+ list
There are 4 total nodes:
   Name: bge0            Type: ether           ID: 00000002   Num hooks: 0
   Name: bge1            Type: ether           ID: 00000003   Num hooks: 0
   Name: ngctl4252       Type: socket          ID: 00000005   Num hooks: 0
   Name: fxp0            Type: ether           ID: 00000004   Num hooks: 0
+ quit
root@trafmon1:kldstat -v
Id Refs Address    Size     Name
  1   36 0xc0400000 6a9c28   kernel (/boot/kernel/kernel)

[...]

  7    1 0xccb16000 4000     ng_ether.ko (/boot/kernel/ng_ether.ko)
         Contains modules:
                 Id Name
                 246 ng_ether
  8    1 0xccb1b000 2000     ng_hole.ko (/boot/kernel/ng_hole.ko)
         Contains modules:
                 Id Name
                 247 ng_hole
root@trafmon1:klunload ng_hole
klunload: Command not found.
root@trafmon1:kldunload ng_hole
root@trafmon1:kldunload ng_ether
kldunload: can't unload file: Device busy
root@trafmon1:kldstat -v
Id Refs Address    Size     Name
  1   36 0xc0400000 6a9c28   kernel (/boot/kernel/kernel)

[...]

  7    1 0xccb16000 4000     ng_ether.ko (/boot/kernel/ng_ether.ko)
         Contains modules:
                 Id Name
                 246 ng_ether
root@trafmon1:


this is expected.  ng-ether is not unloadable as the connections are 
too complicated to unwind easily.. one day....

root@trafmon1:

>> Stop in /root/tmp/food.ko.
>> Exit 1
>> #Mar 18 03:14:31  kernel: quiesced                  
>> :ro:~/tmp/food.ko:3:14:31:32
>> Mar 18 03:14:31  kernel: foodmod unloaded
> 
> 
> Seems that I can't unload some of the other netgraph types either ( it's 
> not just me):
> 
>> #kldunload ng_ether                                 
>> :ro:~/tmp/food.ko:3:24:07:41
>> kldunload: can't unload file: Device busy
>> Exit 1

try unloading a node that IS unloadable..

see the following comment in ng_ehter.c:
          /*
           * Note that the base code won't try to unload us until
           * all nodes have been removed, and that can't happen
           * until all Ethernet interfaces are removed. In any
           * case, we know there are no nodes left if the action
           * is MOD_UNLOAD, so there's no need to detach any nodes.
           */

so we can't run this unless you have removeable ethernet interfaces, 
and have removed them.



> 
> 
> _______________________________________________
> freebsd-net@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-net
> To unsubscribe, send any mail to "freebsd-net-unsubscribe@freebsd.org"




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?49C11E56.7090809>