From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: Sebastian Andrzej Siewior To: linux-bluetooth@vger.kernel.org Cc: linux-usb@vger.kernel.org, tglx@linutronix.de, Sebastian Andrzej Siewior , Marcel Holtmann , Johan Hedberg Subject: [PATCH] Bluetooth: btusb: use irqsave() in URB's complete callback Date: Tue, 19 Jun 2018 23:56:57 +0200 Message-Id: <20180619215657.13745-1-bigeasy@linutronix.de> MIME-Version: 1.0 List-ID: The USB completion callback does not disable interrupts while acquiring the ->lock. We want to remove the local_irq_disable() invocation from __usb_hcd_giveback_urb() and therefore it is required for the callback handler to disable the interrupts while acquiring the lock. The callback may be invoked either in IRQ or BH context depending on the USB host controller. Use the _irqsave variant of the locking primitives. Cc: Marcel Holtmann Cc: Johan Hedberg Cc: linux-bluetooth@vger.kernel.org Signed-off-by: Sebastian Andrzej Siewior --- drivers/bluetooth/btusb.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index f73a27ea28cc..f262163fecd5 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c @@ -509,9 +509,10 @@ static inline void btusb_free_frags(struct btusb_data = *data) static int btusb_recv_intr(struct btusb_data *data, void *buffer, int coun= t) { struct sk_buff *skb; + unsigned long flags; int err =3D 0; =20 - spin_lock(&data->rxlock); + spin_lock_irqsave(&data->rxlock, flags); skb =3D data->evt_skb; =20 while (count) { @@ -556,7 +557,7 @@ static int btusb_recv_intr(struct btusb_data *data, voi= d *buffer, int count) } =20 data->evt_skb =3D skb; - spin_unlock(&data->rxlock); + spin_unlock_irqrestore(&data->rxlock, flags); =20 return err; } @@ -564,9 +565,10 @@ static int btusb_recv_intr(struct btusb_data *data, vo= id *buffer, int count) static int btusb_recv_bulk(struct btusb_data *data, void *buffer, int coun= t) { struct sk_buff *skb; + unsigned long flags; int err =3D 0; =20 - spin_lock(&data->rxlock); + spin_lock_irqsave(&data->rxlock, flags); skb =3D data->acl_skb; =20 while (count) { @@ -613,7 +615,7 @@ static int btusb_recv_bulk(struct btusb_data *data, voi= d *buffer, int count) } =20 data->acl_skb =3D skb; - spin_unlock(&data->rxlock); + spin_unlock_irqrestore(&data->rxlock, flags); =20 return err; } @@ -621,9 +623,10 @@ static int btusb_recv_bulk(struct btusb_data *data, vo= id *buffer, int count) static int btusb_recv_isoc(struct btusb_data *data, void *buffer, int coun= t) { struct sk_buff *skb; + unsigned long flags; int err =3D 0; =20 - spin_lock(&data->rxlock); + spin_lock_irqsave(&data->rxlock, flags); skb =3D data->sco_skb; =20 while (count) { @@ -668,7 +671,7 @@ static int btusb_recv_isoc(struct btusb_data *data, voi= d *buffer, int count) } =20 data->sco_skb =3D skb; - spin_unlock(&data->rxlock); + spin_unlock_irqrestore(&data->rxlock, flags); =20 return err; } @@ -1066,6 +1069,7 @@ static void btusb_tx_complete(struct urb *urb) struct sk_buff *skb =3D urb->context; struct hci_dev *hdev =3D (struct hci_dev *)skb->dev; struct btusb_data *data =3D hci_get_drvdata(hdev); + unsigned long flags; =20 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status, urb->actual_length); @@ -1079,9 +1083,9 @@ static void btusb_tx_complete(struct urb *urb) hdev->stat.err_tx++; =20 done: - spin_lock(&data->txlock); + spin_lock_irqsave(&data->txlock, flags); data->tx_in_flight--; - spin_unlock(&data->txlock); + spin_unlock_irqrestore(&data->txlock, flags); =20 kfree(urb->setup_packet); =20 --=20 2.17.1 From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: Bluetooth: btusb: use irqsave() in URB's complete callback From: Sebastian Andrzej Siewior Message-Id: <20180619215657.13745-1-bigeasy@linutronix.de> Date: Tue, 19 Jun 2018 23:56:57 +0200 To: linux-bluetooth@vger.kernel.org Cc: linux-usb@vger.kernel.org, tglx@linutronix.de, Sebastian Andrzej Siewior , Marcel Holtmann , Johan Hedberg List-ID: VGhlIFVTQiBjb21wbGV0aW9uIGNhbGxiYWNrIGRvZXMgbm90IGRpc2FibGUgaW50ZXJydXB0cyB3 aGlsZSBhY3F1aXJpbmcKdGhlIC0+bG9jay4gV2Ugd2FudCB0byByZW1vdmUgdGhlIGxvY2FsX2ly cV9kaXNhYmxlKCkgaW52b2NhdGlvbiBmcm9tCl9fdXNiX2hjZF9naXZlYmFja191cmIoKSBhbmQg dGhlcmVmb3JlIGl0IGlzIHJlcXVpcmVkIGZvciB0aGUgY2FsbGJhY2sKaGFuZGxlciB0byBkaXNh YmxlIHRoZSBpbnRlcnJ1cHRzIHdoaWxlIGFjcXVpcmluZyB0aGUgbG9jay4KVGhlIGNhbGxiYWNr IG1heSBiZSBpbnZva2VkIGVpdGhlciBpbiBJUlEgb3IgQkggY29udGV4dCBkZXBlbmRpbmcgb24g dGhlClVTQiBob3N0IGNvbnRyb2xsZXIuClVzZSB0aGUgX2lycXNhdmUgdmFyaWFudCBvZiB0aGUg bG9ja2luZyBwcmltaXRpdmVzLgoKQ2M6IE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5u Lm9yZz4KQ2M6IEpvaGFuIEhlZGJlcmcgPGpvaGFuLmhlZGJlcmdAZ21haWwuY29tPgpDYzogbGlu dXgtYmx1ZXRvb3RoQHZnZXIua2VybmVsLm9yZwpTaWduZWQtb2ZmLWJ5OiBTZWJhc3RpYW4gQW5k cnplaiBTaWV3aW9yIDxiaWdlYXN5QGxpbnV0cm9uaXguZGU+Ci0tLQogZHJpdmVycy9ibHVldG9v dGgvYnR1c2IuYyB8IDIwICsrKysrKysrKysrKy0tLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgMTIg aW5zZXJ0aW9ucygrKSwgOCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0 b290aC9idHVzYi5jIGIvZHJpdmVycy9ibHVldG9vdGgvYnR1c2IuYwppbmRleCBmNzNhMjdlYTI4 Y2MuLmYyNjIxNjNmZWNkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnR1c2IuYwor KysgYi9kcml2ZXJzL2JsdWV0b290aC9idHVzYi5jCkBAIC01MDksOSArNTA5LDEwIEBAIHN0YXRp YyBpbmxpbmUgdm9pZCBidHVzYl9mcmVlX2ZyYWdzKHN0cnVjdCBidHVzYl9kYXRhICpkYXRhKQog c3RhdGljIGludCBidHVzYl9yZWN2X2ludHIoc3RydWN0IGJ0dXNiX2RhdGEgKmRhdGEsIHZvaWQg KmJ1ZmZlciwgaW50IGNvdW50KQogewogCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQg bG9uZyBmbGFnczsKIAlpbnQgZXJyID0gMDsKIAotCXNwaW5fbG9jaygmZGF0YS0+cnhsb2NrKTsK KwlzcGluX2xvY2tfaXJxc2F2ZSgmZGF0YS0+cnhsb2NrLCBmbGFncyk7CiAJc2tiID0gZGF0YS0+ ZXZ0X3NrYjsKIAogCXdoaWxlIChjb3VudCkgewpAQCAtNTU2LDcgKzU1Nyw3IEBAIHN0YXRpYyBp bnQgYnR1c2JfcmVjdl9pbnRyKHN0cnVjdCBidHVzYl9kYXRhICpkYXRhLCB2b2lkICpidWZmZXIs IGludCBjb3VudCkKIAl9CiAKIAlkYXRhLT5ldnRfc2tiID0gc2tiOwotCXNwaW5fdW5sb2NrKCZk YXRhLT5yeGxvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhdGEtPnJ4bG9jaywgZmxh Z3MpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTU2NCw5ICs1NjUsMTAgQEAgc3RhdGljIGludCBi dHVzYl9yZWN2X2ludHIoc3RydWN0IGJ0dXNiX2RhdGEgKmRhdGEsIHZvaWQgKmJ1ZmZlciwgaW50 IGNvdW50KQogc3RhdGljIGludCBidHVzYl9yZWN2X2J1bGsoc3RydWN0IGJ0dXNiX2RhdGEgKmRh dGEsIHZvaWQgKmJ1ZmZlciwgaW50IGNvdW50KQogewogCXN0cnVjdCBza19idWZmICpza2I7CisJ dW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgZXJyID0gMDsKIAotCXNwaW5fbG9jaygmZGF0YS0+ cnhsb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGF0YS0+cnhsb2NrLCBmbGFncyk7CiAJc2ti ID0gZGF0YS0+YWNsX3NrYjsKIAogCXdoaWxlIChjb3VudCkgewpAQCAtNjEzLDcgKzYxNSw3IEBA IHN0YXRpYyBpbnQgYnR1c2JfcmVjdl9idWxrKHN0cnVjdCBidHVzYl9kYXRhICpkYXRhLCB2b2lk ICpidWZmZXIsIGludCBjb3VudCkKIAl9CiAKIAlkYXRhLT5hY2xfc2tiID0gc2tiOwotCXNwaW5f dW5sb2NrKCZkYXRhLT5yeGxvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhdGEtPnJ4 bG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTYyMSw5ICs2MjMsMTAgQEAgc3Rh dGljIGludCBidHVzYl9yZWN2X2J1bGsoc3RydWN0IGJ0dXNiX2RhdGEgKmRhdGEsIHZvaWQgKmJ1 ZmZlciwgaW50IGNvdW50KQogc3RhdGljIGludCBidHVzYl9yZWN2X2lzb2Moc3RydWN0IGJ0dXNi X2RhdGEgKmRhdGEsIHZvaWQgKmJ1ZmZlciwgaW50IGNvdW50KQogewogCXN0cnVjdCBza19idWZm ICpza2I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgZXJyID0gMDsKIAotCXNwaW5fbG9j aygmZGF0YS0+cnhsb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGF0YS0+cnhsb2NrLCBmbGFn cyk7CiAJc2tiID0gZGF0YS0+c2NvX3NrYjsKIAogCXdoaWxlIChjb3VudCkgewpAQCAtNjY4LDcg KzY3MSw3IEBAIHN0YXRpYyBpbnQgYnR1c2JfcmVjdl9pc29jKHN0cnVjdCBidHVzYl9kYXRhICpk YXRhLCB2b2lkICpidWZmZXIsIGludCBjb3VudCkKIAl9CiAKIAlkYXRhLT5zY29fc2tiID0gc2ti OwotCXNwaW5fdW5sb2NrKCZkYXRhLT5yeGxvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUo JmRhdGEtPnJ4bG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTEwNjYsNiArMTA2 OSw3IEBAIHN0YXRpYyB2b2lkIGJ0dXNiX3R4X2NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYikKIAlz dHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCBoY2lfZGV2ICpoZGV2 ID0gKHN0cnVjdCBoY2lfZGV2ICopc2tiLT5kZXY7CiAJc3RydWN0IGJ0dXNiX2RhdGEgKmRhdGEg PSBoY2lfZ2V0X2RydmRhdGEoaGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCUJUX0RC RygiJXMgdXJiICVwIHN0YXR1cyAlZCBjb3VudCAlZCIsIGhkZXYtPm5hbWUsIHVyYiwgdXJiLT5z dGF0dXMsCiAJICAgICAgIHVyYi0+YWN0dWFsX2xlbmd0aCk7CkBAIC0xMDc5LDkgKzEwODMsOSBA QCBzdGF0aWMgdm9pZCBidHVzYl90eF9jb21wbGV0ZShzdHJ1Y3QgdXJiICp1cmIpCiAJCWhkZXYt PnN0YXQuZXJyX3R4Kys7CiAKIGRvbmU6Ci0Jc3Bpbl9sb2NrKCZkYXRhLT50eGxvY2spOworCXNw aW5fbG9ja19pcnFzYXZlKCZkYXRhLT50eGxvY2ssIGZsYWdzKTsKIAlkYXRhLT50eF9pbl9mbGln aHQtLTsKLQlzcGluX3VubG9jaygmZGF0YS0+dHhsb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0 b3JlKCZkYXRhLT50eGxvY2ssIGZsYWdzKTsKIAogCWtmcmVlKHVyYi0+c2V0dXBfcGFja2V0KTsK IAo=