From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mikulas Patocka Date: Sun, 03 Jun 2018 14:41:09 +0000 Subject: [PATCH 16/21] udlfb: handle allocation failure Message-Id: <20180603144224.714382188@twibright.com> List-Id: References: <20180603144053.875668929@twibright.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: Mikulas Patocka , Bartlomiej Zolnierkiewicz , Dave Airlie , Bernie Thompson , Ladislav Michl Cc: linux-fbdev@vger.kernel.org, dri-devel@lists.freedesktop.org Allocations larger than PAGE_ALLOC_COSTLY_ORDER are unreliable and they may fail anytime. This patch fixes the udlfb driver so that when a large alloactions fails, it tries to do multiple smaller allocations. Signed-off-by: Mikulas Patocka Cc: stable@vger.kernel.org --- drivers/video/fbdev/udlfb.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) Index: linux-4.17-rc7/drivers/video/fbdev/udlfb.c =================================--- linux-4.17-rc7.orig/drivers/video/fbdev/udlfb.c 2018-06-03 13:17:38.000000000 +0200 +++ linux-4.17-rc7/drivers/video/fbdev/udlfb.c 2018-06-03 13:17:38.000000000 +0200 @@ -1843,17 +1843,22 @@ static void dlfb_free_urb_list(struct dl static int dlfb_alloc_urb_list(struct dlfb_data *dlfb, int count, size_t size) { - int i = 0; struct urb *urb; struct urb_node *unode; char *buf; + size_t wanted_size = count * size; spin_lock_init(&dlfb->urbs.lock); +retry: dlfb->urbs.size = size; INIT_LIST_HEAD(&dlfb->urbs.list); - while (i < count) { + sema_init(&dlfb->urbs.limit_sem, 0); + dlfb->urbs.count = 0; + dlfb->urbs.available = 0; + + while (dlfb->urbs.count * size < wanted_size) { unode = kzalloc(sizeof(*unode), GFP_KERNEL); if (!unode) break; @@ -1866,11 +1871,16 @@ static int dlfb_alloc_urb_list(struct dl } unode->urb = urb; - buf = usb_alloc_coherent(dlfb->udev, MAX_TRANSFER, GFP_KERNEL, + buf = usb_alloc_coherent(dlfb->udev, size, GFP_KERNEL, &urb->transfer_dma); if (!buf) { kfree(unode); usb_free_urb(urb); + if (size > PAGE_SIZE) { + size /= 2; + dlfb_free_urb_list(dlfb); + goto retry; + } break; } @@ -1881,14 +1891,12 @@ static int dlfb_alloc_urb_list(struct dl list_add_tail(&unode->entry, &dlfb->urbs.list); - i++; + up(&dlfb->urbs.limit_sem); + dlfb->urbs.count++; + dlfb->urbs.available++; } - sema_init(&dlfb->urbs.limit_sem, i); - dlfb->urbs.count = i; - dlfb->urbs.available = i; - - return i; + return dlfb->urbs.count; } static struct urb *dlfb_get_urb(struct dlfb_data *dlfb) From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mikulas Patocka Subject: [PATCH 16/21] udlfb: handle allocation failure Date: Sun, 03 Jun 2018 16:41:09 +0200 Message-ID: <20180603144224.714382188@twibright.com> References: <20180603144053.875668929@twibright.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from leontynka.twibright.com (109-183-129-149.tmcz.cz [109.183.129.149]) by gabe.freedesktop.org (Postfix) with ESMTPS id DE8BB6E285 for ; Sun, 3 Jun 2018 15:19:24 +0000 (UTC) Content-Disposition: inline; filename=udl-allocation-failure.patch List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Mikulas Patocka , Bartlomiej Zolnierkiewicz , Dave Airlie , Bernie Thompson , Ladislav Michl Cc: linux-fbdev@vger.kernel.org, dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org QWxsb2NhdGlvbnMgbGFyZ2VyIHRoYW4gUEFHRV9BTExPQ19DT1NUTFlfT1JERVIgYXJlIHVucmVs aWFibGUgYW5kIHRoZXkKbWF5IGZhaWwgYW55dGltZS4gVGhpcyBwYXRjaCBmaXhlcyB0aGUgdWRs ZmIgZHJpdmVyIHNvIHRoYXQgd2hlbiBhIGxhcmdlCmFsbG9hY3Rpb25zIGZhaWxzLCBpdCB0cmll cyB0byBkbyBtdWx0aXBsZSBzbWFsbGVyIGFsbG9jYXRpb25zLgoKU2lnbmVkLW9mZi1ieTogTWlr dWxhcyBQYXRvY2thIDxtcGF0b2NrYUByZWRoYXQuY29tPgpDYzogc3RhYmxlQHZnZXIua2VybmVs Lm9yZwoKLS0tCiBkcml2ZXJzL3ZpZGVvL2ZiZGV2L3VkbGZiLmMgfCAgIDI2ICsrKysrKysrKysr KysrKysrLS0tLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgMTcgaW5zZXJ0aW9ucygrKSwgOSBkZWxl dGlvbnMoLSkKCkluZGV4OiBsaW51eC00LjE3LXJjNy9kcml2ZXJzL3ZpZGVvL2ZiZGV2L3VkbGZi LmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PQotLS0gbGludXgtNC4xNy1yYzcub3JpZy9kcml2ZXJzL3ZpZGVvL2ZiZGV2 L3VkbGZiLmMJMjAxOC0wNi0wMyAxMzoxNzozOC4wMDAwMDAwMDAgKzAyMDAKKysrIGxpbnV4LTQu MTctcmM3L2RyaXZlcnMvdmlkZW8vZmJkZXYvdWRsZmIuYwkyMDE4LTA2LTAzIDEzOjE3OjM4LjAw MDAwMDAwMCArMDIwMApAQCAtMTg0MywxNyArMTg0MywyMiBAQCBzdGF0aWMgdm9pZCBkbGZiX2Zy ZWVfdXJiX2xpc3Qoc3RydWN0IGRsCiAKIHN0YXRpYyBpbnQgZGxmYl9hbGxvY191cmJfbGlzdChz dHJ1Y3QgZGxmYl9kYXRhICpkbGZiLCBpbnQgY291bnQsIHNpemVfdCBzaXplKQogewotCWludCBp ID0gMDsKIAlzdHJ1Y3QgdXJiICp1cmI7CiAJc3RydWN0IHVyYl9ub2RlICp1bm9kZTsKIAljaGFy ICpidWY7CisJc2l6ZV90IHdhbnRlZF9zaXplID0gY291bnQgKiBzaXplOwogCiAJc3Bpbl9sb2Nr X2luaXQoJmRsZmItPnVyYnMubG9jayk7CiAKK3JldHJ5OgogCWRsZmItPnVyYnMuc2l6ZSA9IHNp emU7CiAJSU5JVF9MSVNUX0hFQUQoJmRsZmItPnVyYnMubGlzdCk7CiAKLQl3aGlsZSAoaSA8IGNv dW50KSB7CisJc2VtYV9pbml0KCZkbGZiLT51cmJzLmxpbWl0X3NlbSwgMCk7CisJZGxmYi0+dXJi cy5jb3VudCA9IDA7CisJZGxmYi0+dXJicy5hdmFpbGFibGUgPSAwOworCisJd2hpbGUgKGRsZmIt PnVyYnMuY291bnQgKiBzaXplIDwgd2FudGVkX3NpemUpIHsKIAkJdW5vZGUgPSBremFsbG9jKHNp emVvZigqdW5vZGUpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1bm9kZSkKIAkJCWJyZWFrOwpAQCAt MTg2NiwxMSArMTg3MSwxNiBAQCBzdGF0aWMgaW50IGRsZmJfYWxsb2NfdXJiX2xpc3Qoc3RydWN0 IGRsCiAJCX0KIAkJdW5vZGUtPnVyYiA9IHVyYjsKIAotCQlidWYgPSB1c2JfYWxsb2NfY29oZXJl bnQoZGxmYi0+dWRldiwgTUFYX1RSQU5TRkVSLCBHRlBfS0VSTkVMLAorCQlidWYgPSB1c2JfYWxs b2NfY29oZXJlbnQoZGxmYi0+dWRldiwgc2l6ZSwgR0ZQX0tFUk5FTCwKIAkJCQkJICZ1cmItPnRy YW5zZmVyX2RtYSk7CiAJCWlmICghYnVmKSB7CiAJCQlrZnJlZSh1bm9kZSk7CiAJCQl1c2JfZnJl ZV91cmIodXJiKTsKKwkJCWlmIChzaXplID4gUEFHRV9TSVpFKSB7CisJCQkJc2l6ZSAvPSAyOwor CQkJCWRsZmJfZnJlZV91cmJfbGlzdChkbGZiKTsKKwkJCQlnb3RvIHJldHJ5OworCQkJfQogCQkJ YnJlYWs7CiAJCX0KIApAQCAtMTg4MSwxNCArMTg5MSwxMiBAQCBzdGF0aWMgaW50IGRsZmJfYWxs b2NfdXJiX2xpc3Qoc3RydWN0IGRsCiAKIAkJbGlzdF9hZGRfdGFpbCgmdW5vZGUtPmVudHJ5LCAm ZGxmYi0+dXJicy5saXN0KTsKIAotCQlpKys7CisJCXVwKCZkbGZiLT51cmJzLmxpbWl0X3NlbSk7 CisJCWRsZmItPnVyYnMuY291bnQrKzsKKwkJZGxmYi0+dXJicy5hdmFpbGFibGUrKzsKIAl9CiAK LQlzZW1hX2luaXQoJmRsZmItPnVyYnMubGltaXRfc2VtLCBpKTsKLQlkbGZiLT51cmJzLmNvdW50 ID0gaTsKLQlkbGZiLT51cmJzLmF2YWlsYWJsZSA9IGk7Ci0KLQlyZXR1cm4gaTsKKwlyZXR1cm4g ZGxmYi0+dXJicy5jb3VudDsKIH0KIAogc3RhdGljIHN0cnVjdCB1cmIgKmRsZmJfZ2V0X3VyYihz dHJ1Y3QgZGxmYl9kYXRhICpkbGZiKQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJl ZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGlu Zm8vZHJpLWRldmVsCg==