From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sebastian Andrzej Siewior Subject: [PATCH 4/4] isdn: mISDN: use irqsave() in USB's complete callback Date: Wed, 20 Jun 2018 12:40:28 +0200 Message-ID: <20180620104028.18283-5-bigeasy@linutronix.de> References: <20180620104028.18283-1-bigeasy@linutronix.de> Mime-Version: 1.0 Content-Transfer-Encoding: quoted-printable Cc: Karsten Keil , linux-usb@vger.kernel.org, tglx@linutronix.de, Sebastian Andrzej Siewior To: netdev@vger.kernel.org Return-path: Received: from Galois.linutronix.de ([146.0.238.70]:59832 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754113AbeFTKmI (ORCPT ); Wed, 20 Jun 2018 06:42:08 -0400 In-Reply-To: <20180620104028.18283-1-bigeasy@linutronix.de> Sender: netdev-owner@vger.kernel.org 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: Karsten Keil Cc: netdev@vger.kernel.org Signed-off-by: Sebastian Andrzej Siewior --- drivers/isdn/hardware/mISDN/hfcsusb.c | 36 +++++++++++++++------------ 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/drivers/isdn/hardware/mISDN/hfcsusb.c b/drivers/isdn/hardware/= mISDN/hfcsusb.c index 17cc879ad2bb..6d05946b445e 100644 --- a/drivers/isdn/hardware/mISDN/hfcsusb.c +++ b/drivers/isdn/hardware/mISDN/hfcsusb.c @@ -819,6 +819,7 @@ hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, uns= igned int len, int fifon =3D fifo->fifonum; int i; int hdlc =3D 0; + unsigned long flags; =20 if (debug & DBG_HFC_CALL_TRACE) printk(KERN_DEBUG "%s: %s: fifo(%i) len(%i) " @@ -835,7 +836,7 @@ hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, uns= igned int len, return; } =20 - spin_lock(&hw->lock); + spin_lock_irqsave(&hw->lock, flags); if (fifo->dch) { rx_skb =3D fifo->dch->rx_skb; maxlen =3D fifo->dch->maxlen; @@ -844,7 +845,7 @@ hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, uns= igned int len, if (fifo->bch) { if (test_bit(FLG_RX_OFF, &fifo->bch->Flags)) { fifo->bch->dropcnt +=3D len; - spin_unlock(&hw->lock); + spin_unlock_irqrestore(&hw->lock, flags); return; } maxlen =3D bchannel_get_rxbuf(fifo->bch, len); @@ -854,7 +855,7 @@ hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, uns= igned int len, skb_trim(rx_skb, 0); pr_warning("%s.B%d: No bufferspace for %d bytes\n", hw->name, fifo->bch->nr, len); - spin_unlock(&hw->lock); + spin_unlock_irqrestore(&hw->lock, flags); return; } maxlen =3D fifo->bch->maxlen; @@ -878,7 +879,7 @@ hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, uns= igned int len, } else { printk(KERN_DEBUG "%s: %s: No mem for rx_skb\n", hw->name, __func__); - spin_unlock(&hw->lock); + spin_unlock_irqrestore(&hw->lock, flags); return; } } @@ -888,7 +889,7 @@ hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, uns= igned int len, "for fifo(%d) HFCUSB_D_RX\n", hw->name, __func__, fifon); skb_trim(rx_skb, 0); - spin_unlock(&hw->lock); + spin_unlock_irqrestore(&hw->lock, flags); return; } } @@ -942,7 +943,7 @@ hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, uns= igned int len, /* deliver transparent data to layer2 */ recv_Bchannel(fifo->bch, MISDN_ID_ANY, false); } - spin_unlock(&hw->lock); + spin_unlock_irqrestore(&hw->lock, flags); } =20 static void @@ -979,18 +980,19 @@ rx_iso_complete(struct urb *urb) __u8 *buf; static __u8 eof[8]; __u8 s0_state; + unsigned long flags; =20 fifon =3D fifo->fifonum; status =3D urb->status; =20 - spin_lock(&hw->lock); + spin_lock_irqsave(&hw->lock, flags); if (fifo->stop_gracefull) { fifo->stop_gracefull =3D 0; fifo->active =3D 0; - spin_unlock(&hw->lock); + spin_unlock_irqrestore(&hw->lock, flags); return; } - spin_unlock(&hw->lock); + spin_unlock_irqrestore(&hw->lock, flags); =20 /* * ISO transfer only partially completed, @@ -1096,15 +1098,16 @@ rx_int_complete(struct urb *urb) struct usb_fifo *fifo =3D (struct usb_fifo *) urb->context; struct hfcsusb *hw =3D fifo->hw; static __u8 eof[8]; + unsigned long flags; =20 - spin_lock(&hw->lock); + spin_lock_irqsave(&hw->lock, flags); if (fifo->stop_gracefull) { fifo->stop_gracefull =3D 0; fifo->active =3D 0; - spin_unlock(&hw->lock); + spin_unlock_irqrestore(&hw->lock, flags); return; } - spin_unlock(&hw->lock); + spin_unlock_irqrestore(&hw->lock, flags); =20 fifon =3D fifo->fifonum; if ((!fifo->active) || (urb->status)) { @@ -1172,12 +1175,13 @@ tx_iso_complete(struct urb *urb) int *tx_idx; int frame_complete, fifon, status, fillempty =3D 0; __u8 threshbit, *p; + unsigned long flags; =20 - spin_lock(&hw->lock); + spin_lock_irqsave(&hw->lock, flags); if (fifo->stop_gracefull) { fifo->stop_gracefull =3D 0; fifo->active =3D 0; - spin_unlock(&hw->lock); + spin_unlock_irqrestore(&hw->lock, flags); return; } =20 @@ -1195,7 +1199,7 @@ tx_iso_complete(struct urb *urb) } else { printk(KERN_DEBUG "%s: %s: neither BCH nor DCH\n", hw->name, __func__); - spin_unlock(&hw->lock); + spin_unlock_irqrestore(&hw->lock, flags); return; } =20 @@ -1375,7 +1379,7 @@ tx_iso_complete(struct urb *urb) hw->name, __func__, symbolic(urb_errlist, status), status, fifon); } - spin_unlock(&hw->lock); + spin_unlock_irqrestore(&hw->lock, flags); } =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: [4/4] isdn: mISDN: use irqsave() in USB's complete callback From: Sebastian Andrzej Siewior Message-Id: <20180620104028.18283-5-bigeasy@linutronix.de> Date: Wed, 20 Jun 2018 12:40:28 +0200 To: netdev@vger.kernel.org Cc: Karsten Keil , linux-usb@vger.kernel.org, tglx@linutronix.de, Sebastian Andrzej Siewior List-ID: VGhlIFVTQiBjb21wbGV0aW9uIGNhbGxiYWNrIGRvZXMgbm90IGRpc2FibGUgaW50ZXJydXB0cyB3 aGlsZSBhY3F1aXJpbmcKdGhlIC0+bG9jay4gV2Ugd2FudCB0byByZW1vdmUgdGhlIGxvY2FsX2ly cV9kaXNhYmxlKCkgaW52b2NhdGlvbiBmcm9tCl9fdXNiX2hjZF9naXZlYmFja191cmIoKSBhbmQg dGhlcmVmb3JlIGl0IGlzIHJlcXVpcmVkIGZvciB0aGUgY2FsbGJhY2sKaGFuZGxlciB0byBkaXNh YmxlIHRoZSBpbnRlcnJ1cHRzIHdoaWxlIGFjcXVpcmluZyB0aGUgbG9jay4KVGhlIGNhbGxiYWNr IG1heSBiZSBpbnZva2VkIGVpdGhlciBpbiBJUlEgb3IgQkggY29udGV4dCBkZXBlbmRpbmcgb24g dGhlClVTQiBob3N0IGNvbnRyb2xsZXIuClVzZSB0aGUgX2lycXNhdmUoKSB2YXJpYW50IG9mIHRo ZSBsb2NraW5nIHByaW1pdGl2ZXMuCgpDYzogS2Fyc3RlbiBLZWlsIDxpc2RuQGxpbnV4LXBpbmdp LmRlPgpDYzogbmV0ZGV2QHZnZXIua2VybmVsLm9yZwpTaWduZWQtb2ZmLWJ5OiBTZWJhc3RpYW4g QW5kcnplaiBTaWV3aW9yIDxiaWdlYXN5QGxpbnV0cm9uaXguZGU+Ci0tLQogZHJpdmVycy9pc2Ru L2hhcmR3YXJlL21JU0ROL2hmY3N1c2IuYyB8IDM2ICsrKysrKysrKysrKysrKy0tLS0tLS0tLS0t LQogMSBmaWxlIGNoYW5nZWQsIDIwIGluc2VydGlvbnMoKyksIDE2IGRlbGV0aW9ucygtKQoKZGlm ZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNzdXNiLmMgYi9kcml2ZXJz L2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjc3VzYi5jCmluZGV4IDE3Y2M4NzlhZDJiYi4uNmQwNTk0 NmI0NDVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjc3VzYi5j CisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNzdXNiLmMKQEAgLTgxOSw2ICs4 MTksNyBAQCBoZmNzdXNiX3J4X2ZyYW1lKHN0cnVjdCB1c2JfZmlmbyAqZmlmbywgX191OCAqZGF0 YSwgdW5zaWduZWQgaW50IGxlbiwKIAlpbnQJCWZpZm9uID0gZmlmby0+Zmlmb251bTsKIAlpbnQJ CWk7CiAJaW50CQloZGxjID0gMDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOwogCiAJaWYgKGRlYnVn ICYgREJHX0hGQ19DQUxMX1RSQUNFKQogCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzOiBmaWZv KCVpKSBsZW4oJWkpICIKQEAgLTgzNSw3ICs4MzYsNyBAQCBoZmNzdXNiX3J4X2ZyYW1lKHN0cnVj dCB1c2JfZmlmbyAqZmlmbywgX191OCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbiwKIAkJcmV0dXJu OwogCX0KIAotCXNwaW5fbG9jaygmaHctPmxvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZody0+ bG9jaywgZmxhZ3MpOwogCWlmIChmaWZvLT5kY2gpIHsKIAkJcnhfc2tiID0gZmlmby0+ZGNoLT5y eF9za2I7CiAJCW1heGxlbiA9IGZpZm8tPmRjaC0+bWF4bGVuOwpAQCAtODQ0LDcgKzg0NSw3IEBA IGhmY3N1c2JfcnhfZnJhbWUoc3RydWN0IHVzYl9maWZvICpmaWZvLCBfX3U4ICpkYXRhLCB1bnNp Z25lZCBpbnQgbGVuLAogCWlmIChmaWZvLT5iY2gpIHsKIAkJaWYgKHRlc3RfYml0KEZMR19SWF9P RkYsICZmaWZvLT5iY2gtPkZsYWdzKSkgewogCQkJZmlmby0+YmNoLT5kcm9wY250ICs9IGxlbjsK LQkJCXNwaW5fdW5sb2NrKCZody0+bG9jayk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZo dy0+bG9jaywgZmxhZ3MpOwogCQkJcmV0dXJuOwogCQl9CiAJCW1heGxlbiA9IGJjaGFubmVsX2dl dF9yeGJ1ZihmaWZvLT5iY2gsIGxlbik7CkBAIC04NTQsNyArODU1LDcgQEAgaGZjc3VzYl9yeF9m cmFtZShzdHJ1Y3QgdXNiX2ZpZm8gKmZpZm8sIF9fdTggKmRhdGEsIHVuc2lnbmVkIGludCBsZW4s CiAJCQkJc2tiX3RyaW0ocnhfc2tiLCAwKTsKIAkJCXByX3dhcm5pbmcoIiVzLkIlZDogTm8gYnVm ZmVyc3BhY2UgZm9yICVkIGJ5dGVzXG4iLAogCQkJCSAgIGh3LT5uYW1lLCBmaWZvLT5iY2gtPm5y LCBsZW4pOwotCQkJc3Bpbl91bmxvY2soJmh3LT5sb2NrKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJl c3RvcmUoJmh3LT5sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm47CiAJCX0KIAkJbWF4bGVuID0gZmlm by0+YmNoLT5tYXhsZW47CkBAIC04NzgsNyArODc5LDcgQEAgaGZjc3VzYl9yeF9mcmFtZShzdHJ1 Y3QgdXNiX2ZpZm8gKmZpZm8sIF9fdTggKmRhdGEsIHVuc2lnbmVkIGludCBsZW4sCiAJCQl9IGVs c2UgewogCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogJXM6IE5vIG1lbSBmb3Igcnhfc2tiXG4i LAogCQkJCSAgICAgICBody0+bmFtZSwgX19mdW5jX18pOwotCQkJCXNwaW5fdW5sb2NrKCZody0+ bG9jayk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmxvY2ssIGZsYWdzKTsKIAkJ CQlyZXR1cm47CiAJCQl9CiAJCX0KQEAgLTg4OCw3ICs4ODksNyBAQCBoZmNzdXNiX3J4X2ZyYW1l KHN0cnVjdCB1c2JfZmlmbyAqZmlmbywgX191OCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbiwKIAkJ CSAgICAgICAiZm9yIGZpZm8oJWQpIEhGQ1VTQl9EX1JYXG4iLAogCQkJICAgICAgIGh3LT5uYW1l LCBfX2Z1bmNfXywgZmlmb24pOwogCQkJc2tiX3RyaW0ocnhfc2tiLCAwKTsKLQkJCXNwaW5fdW5s b2NrKCZody0+bG9jayk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+bG9jaywgZmxh Z3MpOwogCQkJcmV0dXJuOwogCQl9CiAJfQpAQCAtOTQyLDcgKzk0Myw3IEBAIGhmY3N1c2Jfcnhf ZnJhbWUoc3RydWN0IHVzYl9maWZvICpmaWZvLCBfX3U4ICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVu LAogCQkvKiBkZWxpdmVyIHRyYW5zcGFyZW50IGRhdGEgdG8gbGF5ZXIyICovCiAJCXJlY3ZfQmNo YW5uZWwoZmlmby0+YmNoLCBNSVNETl9JRF9BTlksIGZhbHNlKTsKIAl9Ci0Jc3Bpbl91bmxvY2so Jmh3LT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+bG9jaywgZmxhZ3MpOwog fQogCiBzdGF0aWMgdm9pZApAQCAtOTc5LDE4ICs5ODAsMTkgQEAgcnhfaXNvX2NvbXBsZXRlKHN0 cnVjdCB1cmIgKnVyYikKIAlfX3U4ICpidWY7CiAJc3RhdGljIF9fdTggZW9mWzhdOwogCV9fdTgg czBfc3RhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWZpZm9uID0gZmlmby0+Zmlmb251 bTsKIAlzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCXNwaW5fbG9jaygmaHctPmxvY2spOworCXNw aW5fbG9ja19pcnFzYXZlKCZody0+bG9jaywgZmxhZ3MpOwogCWlmIChmaWZvLT5zdG9wX2dyYWNl ZnVsbCkgewogCQlmaWZvLT5zdG9wX2dyYWNlZnVsbCA9IDA7CiAJCWZpZm8tPmFjdGl2ZSA9IDA7 Ci0JCXNwaW5fdW5sb2NrKCZody0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3 LT5sb2NrLCBmbGFncyk7CiAJCXJldHVybjsKIAl9Ci0Jc3Bpbl91bmxvY2soJmh3LT5sb2NrKTsK KwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+bG9jaywgZmxhZ3MpOwogCiAJLyoKIAkgKiBJ U08gdHJhbnNmZXIgb25seSBwYXJ0aWFsbHkgY29tcGxldGVkLApAQCAtMTA5NiwxNSArMTA5OCwx NiBAQCByeF9pbnRfY29tcGxldGUoc3RydWN0IHVyYiAqdXJiKQogCXN0cnVjdCB1c2JfZmlmbyAq ZmlmbyA9IChzdHJ1Y3QgdXNiX2ZpZm8gKikgdXJiLT5jb250ZXh0OwogCXN0cnVjdCBoZmNzdXNi ICpodyA9IGZpZm8tPmh3OwogCXN0YXRpYyBfX3U4IGVvZls4XTsKKwl1bnNpZ25lZCBsb25nIGZs YWdzOwogCi0Jc3Bpbl9sb2NrKCZody0+bG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5s b2NrLCBmbGFncyk7CiAJaWYgKGZpZm8tPnN0b3BfZ3JhY2VmdWxsKSB7CiAJCWZpZm8tPnN0b3Bf Z3JhY2VmdWxsID0gMDsKIAkJZmlmby0+YWN0aXZlID0gMDsKLQkJc3Bpbl91bmxvY2soJmh3LT5s b2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmxvY2ssIGZsYWdzKTsKIAkJcmV0 dXJuOwogCX0KLQlzcGluX3VubG9jaygmaHctPmxvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3Rv cmUoJmh3LT5sb2NrLCBmbGFncyk7CiAKIAlmaWZvbiA9IGZpZm8tPmZpZm9udW07CiAJaWYgKCgh Zmlmby0+YWN0aXZlKSB8fCAodXJiLT5zdGF0dXMpKSB7CkBAIC0xMTcyLDEyICsxMTc1LDEzIEBA IHR4X2lzb19jb21wbGV0ZShzdHJ1Y3QgdXJiICp1cmIpCiAJaW50ICp0eF9pZHg7CiAJaW50IGZy YW1lX2NvbXBsZXRlLCBmaWZvbiwgc3RhdHVzLCBmaWxsZW1wdHkgPSAwOwogCV9fdTggdGhyZXNo Yml0LCAqcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrKCZody0+bG9jayk7 CisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5sb2NrLCBmbGFncyk7CiAJaWYgKGZpZm8tPnN0b3Bf Z3JhY2VmdWxsKSB7CiAJCWZpZm8tPnN0b3BfZ3JhY2VmdWxsID0gMDsKIAkJZmlmby0+YWN0aXZl ID0gMDsKLQkJc3Bpbl91bmxvY2soJmh3LT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9y ZSgmaHctPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTE5NSw3ICsxMTk5LDcg QEAgdHhfaXNvX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYikKIAl9IGVsc2UgewogCQlwcmludGso S0VSTl9ERUJVRyAiJXM6ICVzOiBuZWl0aGVyIEJDSCBub3IgRENIXG4iLAogCQkgICAgICAgaHct Pm5hbWUsIF9fZnVuY19fKTsKLQkJc3Bpbl91bmxvY2soJmh3LT5sb2NrKTsKKwkJc3Bpbl91bmxv Y2tfaXJxcmVzdG9yZSgmaHctPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTM3 NSw3ICsxMzc5LDcgQEAgdHhfaXNvX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYikKIAkJCSAgICAg ICBody0+bmFtZSwgX19mdW5jX18sCiAJCQkgICAgICAgc3ltYm9saWModXJiX2Vycmxpc3QsIHN0 YXR1cyksIHN0YXR1cywgZmlmb24pOwogCX0KLQlzcGluX3VubG9jaygmaHctPmxvY2spOworCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5sb2NrLCBmbGFncyk7CiB9CiAKIC8qCg==