• V
    Drivers: hv: vmbus: teardown hv_vmbus_con workqueue and vmbus_connection pages on shutdown · 09a19628
    Vitaly Kuznetsov 提交于
    We need to destroy hv_vmbus_con on module shutdown, otherwise the following
    crash is sometimes observed:
    
    [   76.569845] hv_vmbus: Hyper-V Host Build:9600-6.3-17-0.17039; Vmbus version:3.0
    [   82.598859] BUG: unable to handle kernel paging request at ffffffffa0003480
    [   82.599287] IP: [<ffffffffa0003480>] 0xffffffffa0003480
    [   82.599287] PGD 1f34067 PUD 1f35063 PMD 3f72d067 PTE 0
    [   82.599287] Oops: 0010 [#1] SMP
    [   82.599287] Modules linked in: [last unloaded: hv_vmbus]
    [   82.599287] CPU: 0 PID: 26 Comm: kworker/0:1 Not tainted 3.19.0-rc5_bug923184+ #488
    [   82.599287] Hardware name: Microsoft Corporation Virtual Machine/Virtual Machine, BIOS Hyper-V UEFI Release v1.0 11/26/2012
    [   82.599287] Workqueue: hv_vmbus_con 0xffffffffa0003480
    [   82.599287] task: ffff88007b6ddfa0 ti: ffff88007f8f8000 task.ti: ffff88007f8f8000
    [   82.599287] RIP: 0010:[<ffffffffa0003480>]  [<ffffffffa0003480>] 0xffffffffa0003480
    [   82.599287] RSP: 0018:ffff88007f8fbe00  EFLAGS: 00010202
    ...
    
    To avoid memory leaks we need to free monitor_pages and int_page for
    vmbus_connection. Implement vmbus_disconnect() function by separating cleanup
    path from vmbus_connect().
    
    As we use hv_vmbus_con to release channels (see free_channel() in channel_mgmt.c)
    we need to make sure the work was done before we remove the queue, do that with
    drain_workqueue(). We also need to avoid handling messages  which can (potentially)
    create new channels, so set vmbus_connection.conn_state = DISCONNECTED at the very
    beginning of vmbus_exit() and check for that in vmbus_onmessage_work().
    Signed-off-by: NVitaly Kuznetsov <vkuznets@redhat.com>
    Signed-off-by: NK. Y. Srinivasan <kys@microsoft.com>
    Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    09a19628
connection.c 12.1 KB