• Michael S. Tsirkin's avatar
    Bluetooth: virtio_bt: fix device removal · dc65b4b0
    Michael S. Tsirkin authored
    Device removal is clearly out of virtio spec: it attempts to remove
    unused buffers from a VQ before invoking device reset. To fix, make
    open/close NOPs and do all cleanup/setup in probe/remove.
    
    NB: This is a hacky way to handle this - virtbt_{open,close} as NOP is
    not really what a driver is supposed to be doing. These are transport
    enable/disable callbacks from the BT core towards the driver. It maps to
    a device being enabled/disabled by something like bluetoothd for
    example. So if disabled, users expect that no resources/queues are in
    use.  It does work with all other transports like USB, SDIO, UART etc.
    There should be no buffer used if the device is powered off. We also
    don’t have any USB URBs in-flight if the transport is not active.
    
    The way to implement a proper fix would be using vq reset if supported,
    or even using a full device reset.
    
    The cost of the hack is a single skb wasted on an unused bt device.
    
    NB2: with this fix in place driver still suffers from a race condition
    if an interrupt triggers while device is being reset.  To fix, in the
    virtbt_close() callback we should deactivate all interrupts.  To be
    fixed.
    
    squashed fixup: bluetooth: virtio_bt: fix an error code in probe()
    Signed-off-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
    Reported-by: default avatarHulk Robot <hulkci@huawei.com>
    Signed-off-by: default avatarYang Yingliang <yangyingliang@huawei.com>
    Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    Message-Id: <20220811080943.198245-1-mst@redhat.com>
    Signed-off-by: default avatarLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
    Tested-by: default avatarIgor Skalkin <Igor.Skalkin@opensynergy.com>
    dc65b4b0
virtio_bt.c 8.47 KB