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: [RESEND,V3,1/3] USB: serial: f81232: clear overrun flag From: Oliver Neukum Message-Id: <1554107689.6310.17.camel@suse.com> Date: Mon, 01 Apr 2019 10:34:49 +0200 To: "Ji-Ze Hong \(Peter Hong\)" , peter_hong@fintek.com.tw, johan@kernel.org, gregkh@linuxfoundation.org Cc: "Ji-Ze Hong \(Peter Hong\)" , linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org List-ID: T24gTW8sIDIwMTktMDQtMDEgYXQgMTQ6MDAgKzA4MDAsICBKaS1aZSBIb25nIChQZXRlciBIb25n KSAgd3JvdGU6CgpIaSwKSSBhbSBhZnJhaWQgdGhlcmUgaXMgYSByYWNlIGNvbmRpaW9uIGluIHRo aXMgY29kZS4KCgo+IEBAIC0zMTUsNiArMzE4LDcgQEAgc3RhdGljIHZvaWQgZjgxMjMyX3Byb2Nl c3NfcmVhZF91cmIoc3RydWN0IHVyYiAqdXJiKQo+ICAKPiAgCQkJaWYgKGxzciAmIFVBUlRfTFNS X09FKSB7Cj4gIAkJCQlwb3J0LT5pY291bnQub3ZlcnJ1bisrOwo+ICsJCQkJc2NoZWR1bGVfd29y aygmcHJpdi0+bHNyX3dvcmspOwoKVW5jb25kaXRpb25hbGx5IHNjaGVkdWxlZAoKPiAgCQkJCXR0 eV9pbnNlcnRfZmxpcF9jaGFyKCZwb3J0LT5wb3J0LCAwLAo+ICAJCQkJCQlUVFlfT1ZFUlJVTik7 Cj4gIAkJCX0KClsuLl0gCj4gK3N0YXRpYyBpbnQgZjgxMjMyX3N1c3BlbmQoc3RydWN0IHVzYl9z ZXJpYWwgKnNlcmlhbCwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCj4gK3sKPiArCXN0cnVjdCBmODEy MzJfcHJpdmF0ZSAqcG9ydF9wcml2Owo+ICsKPiArCXBvcnRfcHJpdiA9IHVzYl9nZXRfc2VyaWFs X3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbMF0pOwo+ICsJZmx1c2hfd29yaygmcG9ydF9wcml2LT5s c3Jfd29yayk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gIHN0YXRpYyBzdHJ1Y3QgdXNi X3NlcmlhbF9kcml2ZXIgZjgxMjMyX2RldmljZSA9IHsKPiAgCS5kcml2ZXIgPSB7Cj4gIAkJLm93 bmVyID0JVEhJU19NT0RVTEUsCj4gQEAgLTY1NSw2ICs2ODgsNyBAQCBzdGF0aWMgc3RydWN0IHVz Yl9zZXJpYWxfZHJpdmVyIGY4MTIzMl9kZXZpY2UgPSB7Cj4gIAkucmVhZF9pbnRfY2FsbGJhY2sg PQlmODEyMzJfcmVhZF9pbnRfY2FsbGJhY2ssCj4gIAkucG9ydF9wcm9iZSA9CQlmODEyMzJfcG9y dF9wcm9iZSwKPiAgCS5wb3J0X3JlbW92ZSA9CQlmODEyMzJfcG9ydF9yZW1vdmUsCj4gKwkuc3Vz cGVuZCA9CQlmODEyMzJfc3VzcGVuZCwKClBsZWFzZSBoYXZlIGEgbG9vayBhdDoKaW50IHVzYl9z ZXJpYWxfc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1l c3NhZ2UpCnsKICAgICAgICBzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gdXNiX2dldF9pbnRm ZGF0YShpbnRmKTsKICAgICAgICBpbnQgaSwgciA9IDA7CgoKICAgICAgICBzZXJpYWwtPnN1c3Bl bmRpbmcgPSAxOwoKCiAgICAgICAgLyoKICAgICAgICAgKiBzZXJpYWwtPnR5cGUtPnN1c3BlbmQo KSBNVVNUIHJldHVybiAwIGluIHN5c3RlbSBzbGVlcCBjb250ZXh0LAogICAgICAgICAqIG90aGVy d2lzZSwgdGhlIHJlc3VtZSBjYWxsYmFjayBoYXMgdG8gcmVjb3ZlciBkZXZpY2UgZnJvbQogICAg ICAgICAqIHByZXZpb3VzIHN1c3BlbmQgZmFpbHVyZS4KICAgICAgICAgKi8KICAgICAgICBpZiAo c2VyaWFsLT50eXBlLT5zdXNwZW5kKSB7CiAgICAgICAgICAgICAgICByID0gc2VyaWFsLT50eXBl LT5zdXNwZW5kKHNlcmlhbCwgbWVzc2FnZSk7CiAgICAgICAgICAgICAgICBpZiAociA8IDApIHsK ICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsLT5zdXNwZW5kaW5nID0gMDsKICAgICAgICAg ICAgICAgICAgICAgICAgZ290byBlcnJfb3V0OwogICAgICAgICAgICAgICAgfQogICAgICAgIH0K CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgKytpKQogICAgICAg ICAgICAgICAgdXNiX3NlcmlhbF9wb3J0X3BvaXNvbl91cmJzKHNlcmlhbC0+cG9ydFtpXSk7CmVy cl9vdXQ6CiAgICAgICAgcmV0dXJuIHI7Cn0KRVhQT1JUX1NZTUJPTCh1c2Jfc2VyaWFsX3N1c3Bl bmQpOwoKQXMgeW91IGNhbiBzZWUsIHRoZSBzdXNwZW5kIG1ldGhvZCBpcyBjYWxsZWQgZmlyc3Qg YW5kIHRoZW4gdGhlIFVSQnMKYXJlIHBvaXNvbmVkLiBUaGF0IG1lYW5zIHRoYXQgYWZ0ZXIgeW91 IGhhdmUgZmx1c2hlZCB0aGUgd29yaywgaXQgbWF5CmJlIHN1Ym1pdHRlZCBhZ2Fpbi4gVGhlIGZp eCB3b3VsZCBiZSB0byB0ZXN0IHRoZSAnc3VzcGVuZGluZycgZmxhZwpiZWZvcmUgeW91IHNjaGVk dWxlIHdvcmsgKGFuZCByZWNoZWNrIHRoZSBuZWVkIHRvIHNjaGVkdWxlIGl0CmR1cmluZyByZXN1 bWUpCgoJUmVnYXJkcwoJCU9saXZlcgo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2C27FC43381 for ; Mon, 1 Apr 2019 08:35:03 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 05052213A2 for ; Mon, 1 Apr 2019 08:35:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732029AbfDAIfB (ORCPT ); Mon, 1 Apr 2019 04:35:01 -0400 Received: from mx2.suse.de ([195.135.220.15]:53302 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1725867AbfDAIfB (ORCPT ); Mon, 1 Apr 2019 04:35:01 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id E7894AF1E; Mon, 1 Apr 2019 08:34:59 +0000 (UTC) Message-ID: <1554107689.6310.17.camel@suse.com> Subject: Re: [RESEND PATCH V3 1/3] USB: serial: f81232: clear overrun flag From: Oliver Neukum To: "Ji-Ze Hong (Peter Hong)" , peter_hong@fintek.com.tw, johan@kernel.org, gregkh@linuxfoundation.org Cc: "Ji-Ze Hong (Peter Hong)" , linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org Date: Mon, 01 Apr 2019 10:34:49 +0200 In-Reply-To: <1554098453-31278-1-git-send-email-hpeter+linux_kernel@gmail.com> References: <1554098453-31278-1-git-send-email-hpeter+linux_kernel@gmail.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.26.6 Mime-Version: 1.0 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mo, 2019-04-01 at 14:00 +0800, Ji-Ze Hong (Peter Hong) wrote: Hi, I am afraid there is a race condiion in this code. > @@ -315,6 +318,7 @@ static void f81232_process_read_urb(struct urb *urb) > > if (lsr & UART_LSR_OE) { > port->icount.overrun++; > + schedule_work(&priv->lsr_work); Unconditionally scheduled > tty_insert_flip_char(&port->port, 0, > TTY_OVERRUN); > } [..] > +static int f81232_suspend(struct usb_serial *serial, pm_message_t message) > +{ > + struct f81232_private *port_priv; > + > + port_priv = usb_get_serial_port_data(serial->port[0]); > + flush_work(&port_priv->lsr_work); > + > + return 0; > +} > + > static struct usb_serial_driver f81232_device = { > .driver = { > .owner = THIS_MODULE, > @@ -655,6 +688,7 @@ static struct usb_serial_driver f81232_device = { > .read_int_callback = f81232_read_int_callback, > .port_probe = f81232_port_probe, > .port_remove = f81232_port_remove, > + .suspend = f81232_suspend, Please have a look at: int usb_serial_suspend(struct usb_interface *intf, pm_message_t message) { struct usb_serial *serial = usb_get_intfdata(intf); int i, r = 0; serial->suspending = 1; /* * serial->type->suspend() MUST return 0 in system sleep context, * otherwise, the resume callback has to recover device from * previous suspend failure. */ if (serial->type->suspend) { r = serial->type->suspend(serial, message); if (r < 0) { serial->suspending = 0; goto err_out; } } for (i = 0; i < serial->num_ports; ++i) usb_serial_port_poison_urbs(serial->port[i]); err_out: return r; } EXPORT_SYMBOL(usb_serial_suspend); As you can see, the suspend method is called first and then the URBs are poisoned. That means that after you have flushed the work, it may be submitted again. The fix would be to test the 'suspending' flag before you schedule work (and recheck the need to schedule it during resume) Regards Oliver