On Thu, Aug 13, 2020 at 01:40:50PM +0200, [email protected] wrote:
> On Thu, Aug 13, 2020 at 08:31:15AM +0100, Christoph Hellwig wrote:
> > On Thu, Aug 13, 2020 at 10:44:38AM +0800, Jacob Wen wrote:
> > > wake_up_bit() uses waitqueue_active() that needs the explicit smp_mb().
> > 
> > Sounds like the barrier should go into wake_up_bit then..
> 
> Oh, thanks for reminding me..
> 
> https://lkml.kernel.org/r/[email protected]
> 
> I'll try and get back to that.

+++ b/drivers/bluetooth/btmtkuart.c
@@ -340,11 +340,8 @@ static int btmtkuart_recv_event(struct hci_dev *hdev, 
struct sk_buff *skb)
 
        if (hdr->evt == HCI_EV_VENDOR) {
                if (test_and_clear_bit(BTMTKUART_TX_WAIT_VND_EVT,
-                                      &bdev->tx_state)) {
-                       /* Barrier to sync with other CPUs */
-                       smp_mb__after_atomic();
+                                      &bdev->tx_state))
                        wake_up_bit(&bdev->tx_state, BTMTKUART_TX_WAIT_VND_EVT);
-               }
        }
 
        return 0;

It'd be nice to be able to write:

        if (hdr->evt == HCI_EV_VENDOR)
                test_clear_and_wake_up_bit(&bdev->tx_state,
                                                BTMTKUART_TX_WAIT_VND_EVT);

... maybe with a better name.

Reply via email to