From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bartlomiej Zolnierkiewicz Date: Tue, 03 Jul 2018 14:52:19 +0000 Subject: Re: [PATCH] fb: fix lost console when the user unplugs a USB adapter Message-Id: <5091035.TYlAUG7jeO@amdc3058> List-Id: References: In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: Mikulas Patocka Cc: Dave Airlie , linux-fbdev@vger.kernel.org, Ladislav Michl , Bernie Thompson , dri-devel@lists.freedesktop.org Hi, On Sunday, June 03, 2018 11:46:29 AM Mikulas Patocka wrote: > I have a USB display adapter using the udlfb driver and I use it on an ARM > board that doesn't have any graphics card. When I plug the adapter in, the > console is properly displayed, however when I unplug and re-plug the > adapter, the console is not displayed and I can't access it until I reboot > the board. > > The reason is this: > When the adapter is unplugged, dlfb_usb_disconnect calls > unlink_framebuffer, then it waits until the reference count drops to zero > and then it deallocates the framebuffer. However, the console that is > attached to the framebuffer device keeps the reference count non-zero, so > the framebuffer device is never destroyed. When the USB adapter is plugged > again, it creates a new device /dev/fb1 and the console is not attached to > it. > > This patch fixes the bug by unbinding the console from unlink_framebuffer. > The code to unbind the console is moved from do_unregister_framebuffer to > a function unbind_console. When the console is unbound, the reference > count drops to zero and the udlfb driver frees the framebuffer. When the > adapter is plugged back, a new framebuffer is created and the console is > attached to it. > > Signed-off-by: Mikulas Patocka > Cc: stable@vger.kernel.org After this change unbind_console() will be called twice in the standard framebuffer unregister path: - first time, directly by do_unregister_framebuffer() - second time, indirectly by do_unregister_framebuffer()->unlink_framebuffer() This doesn't look correctly. Also why can't udlfb just use unregister_framebuffer() like all other drivers (it uses unlink_framebuffer() and it is the only user of this helper)? > --- > drivers/video/fbdev/core/fbmem.c | 21 +++++++++++++++++---- > 1 file changed, 17 insertions(+), 4 deletions(-) > > Index: linux-4.16.12/drivers/video/fbdev/core/fbmem.c > =================================> --- linux-4.16.12.orig/drivers/video/fbdev/core/fbmem.c 2018-05-26 06:13:20.000000000 +0200 > +++ linux-4.16.12/drivers/video/fbdev/core/fbmem.c 2018-05-26 06:13:20.000000000 +0200 > @@ -1805,12 +1805,12 @@ static int do_register_framebuffer(struc > return 0; > } > > -static int do_unregister_framebuffer(struct fb_info *fb_info) > +static int unbind_console(struct fb_info *fb_info) > { > struct fb_event event; > - int i, ret = 0; > + int ret; > + int i = fb_info->node; > > - i = fb_info->node; > if (i < 0 || i >= FB_MAX || registered_fb[i] != fb_info) > return -EINVAL; > > @@ -1825,6 +1825,16 @@ static int do_unregister_framebuffer(str > unlock_fb_info(fb_info); > console_unlock(); > > + return ret; > +} > + > +static int do_unregister_framebuffer(struct fb_info *fb_info) > +{ > + struct fb_event event; > + int ret; > + > + ret = unbind_console(fb_info); > + > if (ret) > return -EINVAL; > > @@ -1835,7 +1845,7 @@ static int do_unregister_framebuffer(str > (fb_info->pixmap.flags & FB_PIXMAP_DEFAULT)) > kfree(fb_info->pixmap.addr); > fb_destroy_modelist(&fb_info->modelist); > - registered_fb[i] = NULL; > + registered_fb[fb_info->node] = NULL; > num_registered_fb--; > fb_cleanup_device(fb_info); > event.info = fb_info; > @@ -1860,6 +1870,9 @@ int unlink_framebuffer(struct fb_info *f > device_destroy(fb_class, MKDEV(FB_MAJOR, i)); > fb_info->dev = NULL; > } > + > + unbind_console(fb_info); > + > return 0; > } > EXPORT_SYMBOL(unlink_framebuffer); Best regards, -- Bartlomiej Zolnierkiewicz Samsung R&D Institute Poland Samsung Electronics From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bartlomiej Zolnierkiewicz Subject: Re: [PATCH] fb: fix lost console when the user unplugs a USB adapter Date: Tue, 03 Jul 2018 16:52:19 +0200 Message-ID: <5091035.TYlAUG7jeO@amdc3058> References: Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) by gabe.freedesktop.org (Postfix) with ESMTPS id D7CB96E717 for ; Tue, 3 Jul 2018 14:52:24 +0000 (UTC) In-reply-to: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Mikulas Patocka Cc: Dave Airlie , linux-fbdev@vger.kernel.org, Ladislav Michl , Bernie Thompson , dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org CkhpLAoKT24gU3VuZGF5LCBKdW5lIDAzLCAyMDE4IDExOjQ2OjI5IEFNIE1pa3VsYXMgUGF0b2Nr YSB3cm90ZToKPiBJIGhhdmUgYSBVU0IgZGlzcGxheSBhZGFwdGVyIHVzaW5nIHRoZSB1ZGxmYiBk cml2ZXIgYW5kIEkgdXNlIGl0IG9uIGFuIEFSTQo+IGJvYXJkIHRoYXQgZG9lc24ndCBoYXZlIGFu eSBncmFwaGljcyBjYXJkLiBXaGVuIEkgcGx1ZyB0aGUgYWRhcHRlciBpbiwgdGhlCj4gY29uc29s ZSBpcyBwcm9wZXJseSBkaXNwbGF5ZWQsIGhvd2V2ZXIgd2hlbiBJIHVucGx1ZyBhbmQgcmUtcGx1 ZyB0aGUKPiBhZGFwdGVyLCB0aGUgY29uc29sZSBpcyBub3QgZGlzcGxheWVkIGFuZCBJIGNhbid0 IGFjY2VzcyBpdCB1bnRpbCBJIHJlYm9vdAo+IHRoZSBib2FyZC4KPiAKPiBUaGUgcmVhc29uIGlz IHRoaXM6Cj4gV2hlbiB0aGUgYWRhcHRlciBpcyB1bnBsdWdnZWQsIGRsZmJfdXNiX2Rpc2Nvbm5l Y3QgY2FsbHMKPiB1bmxpbmtfZnJhbWVidWZmZXIsIHRoZW4gaXQgd2FpdHMgdW50aWwgdGhlIHJl ZmVyZW5jZSBjb3VudCBkcm9wcyB0byB6ZXJvCj4gYW5kIHRoZW4gaXQgZGVhbGxvY2F0ZXMgdGhl IGZyYW1lYnVmZmVyLiBIb3dldmVyLCB0aGUgY29uc29sZSB0aGF0IGlzCj4gYXR0YWNoZWQgdG8g dGhlIGZyYW1lYnVmZmVyIGRldmljZSBrZWVwcyB0aGUgcmVmZXJlbmNlIGNvdW50IG5vbi16ZXJv LCBzbwo+IHRoZSBmcmFtZWJ1ZmZlciBkZXZpY2UgaXMgbmV2ZXIgZGVzdHJveWVkLiBXaGVuIHRo ZSBVU0IgYWRhcHRlciBpcyBwbHVnZ2VkCj4gYWdhaW4sIGl0IGNyZWF0ZXMgYSBuZXcgZGV2aWNl IC9kZXYvZmIxIGFuZCB0aGUgY29uc29sZSBpcyBub3QgYXR0YWNoZWQgdG8KPiBpdC4KPiAKPiBU aGlzIHBhdGNoIGZpeGVzIHRoZSBidWcgYnkgdW5iaW5kaW5nIHRoZSBjb25zb2xlIGZyb20gdW5s aW5rX2ZyYW1lYnVmZmVyLgo+IFRoZSBjb2RlIHRvIHVuYmluZCB0aGUgY29uc29sZSBpcyBtb3Zl ZCBmcm9tIGRvX3VucmVnaXN0ZXJfZnJhbWVidWZmZXIgdG8KPiBhIGZ1bmN0aW9uIHVuYmluZF9j b25zb2xlLiBXaGVuIHRoZSBjb25zb2xlIGlzIHVuYm91bmQsIHRoZSByZWZlcmVuY2UKPiBjb3Vu dCBkcm9wcyB0byB6ZXJvIGFuZCB0aGUgdWRsZmIgZHJpdmVyIGZyZWVzIHRoZSBmcmFtZWJ1ZmZl ci4gV2hlbiB0aGUKPiBhZGFwdGVyIGlzIHBsdWdnZWQgYmFjaywgYSBuZXcgZnJhbWVidWZmZXIg aXMgY3JlYXRlZCBhbmQgdGhlIGNvbnNvbGUgaXMKPiBhdHRhY2hlZCB0byBpdC4KPiAKPiBTaWdu ZWQtb2ZmLWJ5OiBNaWt1bGFzIFBhdG9ja2EgPG1wYXRvY2thQHJlZGhhdC5jb20+Cj4gQ2M6IHN0 YWJsZUB2Z2VyLmtlcm5lbC5vcmcKCkFmdGVyIHRoaXMgY2hhbmdlIHVuYmluZF9jb25zb2xlKCkg d2lsbCBiZSBjYWxsZWQgdHdpY2UgaW4gdGhlIHN0YW5kYXJkCmZyYW1lYnVmZmVyIHVucmVnaXN0 ZXIgcGF0aDoKCi0gZmlyc3QgdGltZSwgZGlyZWN0bHkgYnkgZG9fdW5yZWdpc3Rlcl9mcmFtZWJ1 ZmZlcigpCgotIHNlY29uZCB0aW1lLCBpbmRpcmVjdGx5IGJ5IGRvX3VucmVnaXN0ZXJfZnJhbWVi dWZmZXIoKS0+dW5saW5rX2ZyYW1lYnVmZmVyKCkKClRoaXMgZG9lc24ndCBsb29rIGNvcnJlY3Rs eS4KCkFsc28gd2h5IGNhbid0IHVkbGZiIGp1c3QgdXNlIHVucmVnaXN0ZXJfZnJhbWVidWZmZXIo KSBsaWtlIGFsbCBvdGhlcgpkcml2ZXJzIChpdCB1c2VzIHVubGlua19mcmFtZWJ1ZmZlcigpIGFu ZCBpdCBpcyB0aGUgb25seSB1c2VyIG9mIHRoaXMKaGVscGVyKT8KCj4gLS0tCj4gIGRyaXZlcnMv dmlkZW8vZmJkZXYvY29yZS9mYm1lbS5jIHwgICAyMSArKysrKysrKysrKysrKysrKy0tLS0KPiAg MSBmaWxlIGNoYW5nZWQsIDE3IGluc2VydGlvbnMoKyksIDQgZGVsZXRpb25zKC0pCj4gCj4gSW5k ZXg6IGxpbnV4LTQuMTYuMTIvZHJpdmVycy92aWRlby9mYmRldi9jb3JlL2ZibWVtLmMKPiA9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09Cj4gLS0tIGxpbnV4LTQuMTYuMTIub3JpZy9kcml2ZXJzL3ZpZGVvL2ZiZGV2L2NvcmUv ZmJtZW0uYwkyMDE4LTA1LTI2IDA2OjEzOjIwLjAwMDAwMDAwMCArMDIwMAo+ICsrKyBsaW51eC00 LjE2LjEyL2RyaXZlcnMvdmlkZW8vZmJkZXYvY29yZS9mYm1lbS5jCTIwMTgtMDUtMjYgMDY6MTM6 MjAuMDAwMDAwMDAwICswMjAwCj4gQEAgLTE4MDUsMTIgKzE4MDUsMTIgQEAgc3RhdGljIGludCBk b19yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihzdHJ1Ywo+ICAJcmV0dXJuIDA7Cj4gIH0KPiAgCj4gLXN0 YXRpYyBpbnQgZG9fdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5m bykKPiArc3RhdGljIGludCB1bmJpbmRfY29uc29sZShzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbykK PiAgewo+ICAJc3RydWN0IGZiX2V2ZW50IGV2ZW50Owo+IC0JaW50IGksIHJldCA9IDA7Cj4gKwlp bnQgcmV0Owo+ICsJaW50IGkgPSBmYl9pbmZvLT5ub2RlOwo+ICAKPiAtCWkgPSBmYl9pbmZvLT5u b2RlOwo+ICAJaWYgKGkgPCAwIHx8IGkgPj0gRkJfTUFYIHx8IHJlZ2lzdGVyZWRfZmJbaV0gIT0g ZmJfaW5mbykKPiAgCQlyZXR1cm4gLUVJTlZBTDsKPiAgCj4gQEAgLTE4MjUsNiArMTgyNSwxNiBA QCBzdGF0aWMgaW50IGRvX3VucmVnaXN0ZXJfZnJhbWVidWZmZXIoc3RyCj4gIAl1bmxvY2tfZmJf aW5mbyhmYl9pbmZvKTsKPiAgCWNvbnNvbGVfdW5sb2NrKCk7Cj4gIAo+ICsJcmV0dXJuIHJldDsK PiArfQo+ICsKPiArc3RhdGljIGludCBkb191bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKHN0cnVjdCBm Yl9pbmZvICpmYl9pbmZvKQo+ICt7Cj4gKwlzdHJ1Y3QgZmJfZXZlbnQgZXZlbnQ7Cj4gKwlpbnQg cmV0Owo+ICsKPiArCXJldCA9IHVuYmluZF9jb25zb2xlKGZiX2luZm8pOwo+ICsKPiAgCWlmIChy ZXQpCj4gIAkJcmV0dXJuIC1FSU5WQUw7Cj4gIAo+IEBAIC0xODM1LDcgKzE4NDUsNyBAQCBzdGF0 aWMgaW50IGRvX3VucmVnaXN0ZXJfZnJhbWVidWZmZXIoc3RyCj4gIAkgICAgKGZiX2luZm8tPnBp eG1hcC5mbGFncyAmIEZCX1BJWE1BUF9ERUZBVUxUKSkKPiAgCQlrZnJlZShmYl9pbmZvLT5waXht YXAuYWRkcik7Cj4gIAlmYl9kZXN0cm95X21vZGVsaXN0KCZmYl9pbmZvLT5tb2RlbGlzdCk7Cj4g LQlyZWdpc3RlcmVkX2ZiW2ldID0gTlVMTDsKPiArCXJlZ2lzdGVyZWRfZmJbZmJfaW5mby0+bm9k ZV0gPSBOVUxMOwo+ICAJbnVtX3JlZ2lzdGVyZWRfZmItLTsKPiAgCWZiX2NsZWFudXBfZGV2aWNl KGZiX2luZm8pOwo+ICAJZXZlbnQuaW5mbyA9IGZiX2luZm87Cj4gQEAgLTE4NjAsNiArMTg3MCw5 IEBAIGludCB1bmxpbmtfZnJhbWVidWZmZXIoc3RydWN0IGZiX2luZm8gKmYKPiAgCQlkZXZpY2Vf ZGVzdHJveShmYl9jbGFzcywgTUtERVYoRkJfTUFKT1IsIGkpKTsKPiAgCQlmYl9pbmZvLT5kZXYg PSBOVUxMOwo+ICAJfQo+ICsKPiArCXVuYmluZF9jb25zb2xlKGZiX2luZm8pOwo+ICsKPiAgCXJl dHVybiAwOwo+ICB9Cj4gIEVYUE9SVF9TWU1CT0wodW5saW5rX2ZyYW1lYnVmZmVyKTsKCkJlc3Qg cmVnYXJkcywKLS0KQmFydGxvbWllaiBab2xuaWVya2lld2ljegpTYW1zdW5nIFImRCBJbnN0aXR1 dGUgUG9sYW5kClNhbXN1bmcgRWxlY3Ryb25pY3MKCl9fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxp c3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFu L2xpc3RpbmZvL2RyaS1kZXZlbAo=