• E
    vlan: fix GVRP at dismantle time · 55aee10d
    Eric Dumazet 提交于
    ip link add link eth2 eth2.103 type vlan id 103 gvrp on loose_binding on
    ip link set eth2.103 up
    rmmod tg3    # driver providing eth2
    
     BUG: unable to handle kernel NULL pointer dereference at           (null)
     IP: [<ffffffffa0030c9e>] garp_request_leave+0x3e/0xc0 [garp]
     PGD 11d251067 PUD 11b9e0067 PMD 0
     Oops: 0000 [#1] SMP
     last sysfs file: /sys/devices/virtual/net/eth2.104/ifindex
     CPU 0
     Modules linked in: tg3(-) 8021q garp nfsd lockd auth_rpcgss sunrpc libphy sg [last unloaded: x_tables]
    
     Pid: 11494, comm: rmmod Tainted: G        W   2.6.39-rc6-00261-gfd71257-dirty #580 HP ProLiant BL460c G6
     RIP: 0010:[<ffffffffa0030c9e>]  [<ffffffffa0030c9e>] garp_request_leave+0x3e/0xc0 [garp]
     RSP: 0018:ffff88007a19bae8  EFLAGS: 00010286
     RAX: 0000000000000000 RBX: ffff88011b5e2000 RCX: 0000000000000002
     RDX: 0000000000000000 RSI: 0000000000000175 RDI: ffffffffa0030d5b
     RBP: ffff88007a19bb18 R08: 0000000000000001 R09: ffff88011bd64a00
     R10: ffff88011d34ec00 R11: 0000000000000000 R12: 0000000000000002
     R13: ffff88007a19bc48 R14: ffff88007a19bb88 R15: 0000000000000001
     FS:  0000000000000000(0000) GS:ffff88011fc00000(0063) knlGS:00000000f77d76c0
     CS:  0010 DS: 002b ES: 002b CR0: 000000008005003b
     CR2: 0000000000000000 CR3: 000000011a675000 CR4: 00000000000006f0
     DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
     DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
     Process rmmod (pid: 11494, threadinfo ffff88007a19a000, task ffff8800798595c0)
     Stack:
      ffff88007a19bb36 ffff88011c84b800 ffff88011b5e2000 ffff88007a19bc48
      ffff88007a19bb88 0000000000000006 ffff88007a19bb38 ffffffffa003a5f6
      ffff88007a19bb38 670088007a19bba8 ffff88007a19bb58 ffffffffa00397e7
     Call Trace:
      [<ffffffffa003a5f6>] vlan_gvrp_request_leave+0x46/0x50 [8021q]
      [<ffffffffa00397e7>] vlan_dev_stop+0xb7/0xc0 [8021q]
      [<ffffffff8137e427>] __dev_close_many+0x87/0xe0
      [<ffffffff8137e507>] dev_close_many+0x87/0x110
      [<ffffffff8137e630>] rollback_registered_many+0xa0/0x240
      [<ffffffff8137e7e9>] unregister_netdevice_many+0x19/0x60
      [<ffffffffa00389eb>] vlan_device_event+0x53b/0x550 [8021q]
      [<ffffffff8143f448>] ? ip6mr_device_event+0xa8/0xd0
      [<ffffffff81479d03>] notifier_call_chain+0x53/0x80
      [<ffffffff81062539>] __raw_notifier_call_chain+0x9/0x10
      [<ffffffff81062551>] raw_notifier_call_chain+0x11/0x20
      [<ffffffff8137df82>] call_netdevice_notifiers+0x32/0x60
      [<ffffffff8137e69f>] rollback_registered_many+0x10f/0x240
      [<ffffffff8137e85f>] rollback_registered+0x2f/0x40
      [<ffffffff8137e8c8>] unregister_netdevice_queue+0x58/0x90
      [<ffffffff8137e9eb>] unregister_netdev+0x1b/0x30
      [<ffffffffa005d73f>] tg3_remove_one+0x6f/0x10b [tg3]
    
    We should call vlan_gvrp_request_leave() from unregister_vlan_dev(),
    not from vlan_dev_stop(), because vlan_gvrp_uninit_applicant()
    is called right after unregister_netdevice_queue(). In batch mode,
    unregister_netdevice_queue() doesn’t immediately call vlan_dev_stop().
    Signed-off-by: NEric Dumazet <eric.dumazet@gmail.com>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    55aee10d
vlan_dev.c 24.0 KB