• E
    macvtap: fix two races · 29d79196
    Eric Dumazet 提交于
    Since commit ac4e4af1 ("macvtap: Consistently use rcu functions"),
    Thomas gets two different warnings :
    
    BUG: using smp_processor_id() in preemptible [00000000] code: vhost-45891/45892
    caller is macvtap_do_read+0x45c/0x600 [macvtap]
    CPU: 1 PID: 45892 Comm: vhost-45891 Not tainted 3.11.0-bisecttest #13
    Call Trace:
    ([<00000000001126ee>] show_trace+0x126/0x144)
     [<00000000001127d2>] show_stack+0xc6/0xd4
     [<000000000068bcec>] dump_stack+0x74/0xd8
     [<0000000000481066>] debug_smp_processor_id+0xf6/0x114
     [<000003ff802e9a18>] macvtap_do_read+0x45c/0x600 [macvtap]
     [<000003ff802e9c1c>] macvtap_recvmsg+0x60/0x88 [macvtap]
     [<000003ff80318c5e>] handle_rx+0x5b2/0x800 [vhost_net]
     [<000003ff8028f77c>] vhost_worker+0x15c/0x1c4 [vhost]
     [<000000000015f3ac>] kthread+0xd8/0xe4
     [<00000000006934a6>] kernel_thread_starter+0x6/0xc
     [<00000000006934a0>] kernel_thread_starter+0x0/0xc
    
    And
    
    BUG: using smp_processor_id() in preemptible [00000000] code: vhost-45897/45898
    caller is macvlan_start_xmit+0x10a/0x1b4 [macvlan]
    CPU: 1 PID: 45898 Comm: vhost-45897 Not tainted 3.11.0-bisecttest #16
    Call Trace:
    ([<00000000001126ee>] show_trace+0x126/0x144)
     [<00000000001127d2>] show_stack+0xc6/0xd4
     [<000000000068bdb8>] dump_stack+0x74/0xd4
     [<0000000000481132>] debug_smp_processor_id+0xf6/0x114
     [<000003ff802b72ca>] macvlan_start_xmit+0x10a/0x1b4 [macvlan]
     [<000003ff802ea69a>] macvtap_get_user+0x982/0xbc4 [macvtap]
     [<000003ff802ea92a>] macvtap_sendmsg+0x4e/0x60 [macvtap]
     [<000003ff8031947c>] handle_tx+0x494/0x5ec [vhost_net]
     [<000003ff8028f77c>] vhost_worker+0x15c/0x1c4 [vhost]
     [<000000000015f3ac>] kthread+0xd8/0xe4
     [<000000000069356e>] kernel_thread_starter+0x6/0xc
     [<0000000000693568>] kernel_thread_starter+0x0/0xc
    2 locks held by vhost-45897/45898:
     #0:  (&vq->mutex){+.+.+.}, at: [<000003ff8031903c>] handle_tx+0x54/0x5ec [vhost_net]
     #1:  (rcu_read_lock){.+.+..}, at: [<000003ff802ea53c>] macvtap_get_user+0x824/0xbc4 [macvtap]
    
    In the first case, macvtap_put_user() calls macvlan_count_rx()
    in a preempt-able context, and this is not allowed.
    
    In the second case, macvtap_get_user() calls
    macvlan_start_xmit() with BH enabled, and this is not allowed.
    Reported-by: NThomas Huth <thuth@linux.vnet.ibm.com>
    Bisected-by: NThomas Huth <thuth@linux.vnet.ibm.com>
    Signed-off-by: NEric Dumazet <edumazet@google.com>
    Tested-by: NThomas Huth <thuth@linux.vnet.ibm.com>
    Cc: Vlad Yasevich <vyasevic@redhat.com>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    29d79196
macvtap.c 31.3 KB