From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mikulas Patocka Date: Sun, 03 Jun 2018 14:40:56 +0000 Subject: [PATCH 03/21] udl-kms: handle allocation failure Message-Id: <20180603144220.065709710@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 udl kms 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/gpu/drm/udl/udl_main.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) Index: linux-4.16.12/drivers/gpu/drm/udl/udl_main.c =================================--- linux-4.16.12.orig/drivers/gpu/drm/udl/udl_main.c 2018-05-31 11:16:15.000000000 +0200 +++ linux-4.16.12/drivers/gpu/drm/udl/udl_main.c 2018-05-31 11:16:15.000000000 +0200 @@ -200,17 +200,22 @@ static void udl_free_urb_list(struct drm static int udl_alloc_urb_list(struct drm_device *dev, int count, size_t size) { struct udl_device *udl = dev->dev_private; - int i = 0; struct urb *urb; struct urb_node *unode; char *buf; + size_t wanted_size = count * size; spin_lock_init(&udl->urbs.lock); +retry: udl->urbs.size = size; INIT_LIST_HEAD(&udl->urbs.list); - while (i < count) { + sema_init(&udl->urbs.limit_sem, 0); + udl->urbs.count = 0; + udl->urbs.available = 0; + + while (udl->urbs.count * size < wanted_size) { unode = kzalloc(sizeof(struct urb_node), GFP_KERNEL); if (!unode) break; @@ -226,11 +231,16 @@ static int udl_alloc_urb_list(struct drm } unode->urb = urb; - buf = usb_alloc_coherent(udl->udev, MAX_TRANSFER, GFP_KERNEL, + buf = usb_alloc_coherent(udl->udev, size, GFP_KERNEL, &urb->transfer_dma); if (!buf) { kfree(unode); usb_free_urb(urb); + if (size > PAGE_SIZE) { + size /= 2; + udl_free_urb_list(dev); + goto retry; + } break; } @@ -241,16 +251,14 @@ static int udl_alloc_urb_list(struct drm list_add_tail(&unode->entry, &udl->urbs.list); - i++; + up(&udl->urbs.limit_sem); + udl->urbs.count++; + udl->urbs.available++; } - sema_init(&udl->urbs.limit_sem, i); - udl->urbs.count = i; - udl->urbs.available = i; - - DRM_DEBUG("allocated %d %d byte urbs\n", i, (int) size); + DRM_DEBUG("allocated %d %d byte urbs\n", udl->urbs.count, (int) size); - return i; + return udl->urbs.count; } struct urb *udl_get_urb(struct drm_device *dev) From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mikulas Patocka Subject: [PATCH 03/21] udl-kms: handle allocation failure Date: Sun, 03 Jun 2018 16:40:56 +0200 Message-ID: <20180603144220.065709710@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 18B1D6E282 for ; Sun, 3 Jun 2018 15:19:04 +0000 (UTC) Content-Disposition: inline; filename=udlkms-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 IGttcyBkcml2ZXIgc28gdGhhdCB3aGVuIGEgbGFyZ2UKYWxsb2FjdGlvbnMgZmFpbHMsIGl0IHRy aWVzIHRvIGRvIG11bHRpcGxlIHNtYWxsZXIgYWxsb2NhdGlvbnMuCgpTaWduZWQtb2ZmLWJ5OiBN aWt1bGFzIFBhdG9ja2EgPG1wYXRvY2thQHJlZGhhdC5jb20+CkNjOiBzdGFibGVAdmdlci5rZXJu ZWwub3JnCgotLS0KIGRyaXZlcnMvZ3B1L2RybS91ZGwvdWRsX21haW4uYyB8ICAgMjggKysrKysr KysrKysrKysrKysrLS0tLS0tLS0tLQogMSBmaWxlIGNoYW5nZWQsIDE4IGluc2VydGlvbnMoKyks IDEwIGRlbGV0aW9ucygtKQoKSW5kZXg6IGxpbnV4LTQuMTYuMTIvZHJpdmVycy9ncHUvZHJtL3Vk bC91ZGxfbWFpbi5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGxpbnV4LTQuMTYuMTIub3JpZy9kcml2ZXJzL2dw dS9kcm0vdWRsL3VkbF9tYWluLmMJMjAxOC0wNS0zMSAxMToxNjoxNS4wMDAwMDAwMDAgKzAyMDAK KysrIGxpbnV4LTQuMTYuMTIvZHJpdmVycy9ncHUvZHJtL3VkbC91ZGxfbWFpbi5jCTIwMTgtMDUt MzEgMTE6MTY6MTUuMDAwMDAwMDAwICswMjAwCkBAIC0yMDAsMTcgKzIwMCwyMiBAQCBzdGF0aWMg dm9pZCB1ZGxfZnJlZV91cmJfbGlzdChzdHJ1Y3QgZHJtCiBzdGF0aWMgaW50IHVkbF9hbGxvY191 cmJfbGlzdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY291bnQsIHNpemVfdCBzaXplKQog ewogCXN0cnVjdCB1ZGxfZGV2aWNlICp1ZGwgPSBkZXYtPmRldl9wcml2YXRlOwotCWludCBpID0g MDsKIAlzdHJ1Y3QgdXJiICp1cmI7CiAJc3RydWN0IHVyYl9ub2RlICp1bm9kZTsKIAljaGFyICpi dWY7CisJc2l6ZV90IHdhbnRlZF9zaXplID0gY291bnQgKiBzaXplOwogCiAJc3Bpbl9sb2NrX2lu aXQoJnVkbC0+dXJicy5sb2NrKTsKIAorcmV0cnk6CiAJdWRsLT51cmJzLnNpemUgPSBzaXplOwog CUlOSVRfTElTVF9IRUFEKCZ1ZGwtPnVyYnMubGlzdCk7CiAKLQl3aGlsZSAoaSA8IGNvdW50KSB7 CisJc2VtYV9pbml0KCZ1ZGwtPnVyYnMubGltaXRfc2VtLCAwKTsKKwl1ZGwtPnVyYnMuY291bnQg PSAwOworCXVkbC0+dXJicy5hdmFpbGFibGUgPSAwOworCisJd2hpbGUgKHVkbC0+dXJicy5jb3Vu dCAqIHNpemUgPCB3YW50ZWRfc2l6ZSkgewogCQl1bm9kZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVj dCB1cmJfbm9kZSksIEdGUF9LRVJORUwpOwogCQlpZiAoIXVub2RlKQogCQkJYnJlYWs7CkBAIC0y MjYsMTEgKzIzMSwxNiBAQCBzdGF0aWMgaW50IHVkbF9hbGxvY191cmJfbGlzdChzdHJ1Y3QgZHJt CiAJCX0KIAkJdW5vZGUtPnVyYiA9IHVyYjsKIAotCQlidWYgPSB1c2JfYWxsb2NfY29oZXJlbnQo dWRsLT51ZGV2LCBNQVhfVFJBTlNGRVIsIEdGUF9LRVJORUwsCisJCWJ1ZiA9IHVzYl9hbGxvY19j b2hlcmVudCh1ZGwtPnVkZXYsIHNpemUsIEdGUF9LRVJORUwsCiAJCQkJCSAmdXJiLT50cmFuc2Zl cl9kbWEpOwogCQlpZiAoIWJ1ZikgewogCQkJa2ZyZWUodW5vZGUpOwogCQkJdXNiX2ZyZWVfdXJi KHVyYik7CisJCQlpZiAoc2l6ZSA+IFBBR0VfU0laRSkgeworCQkJCXNpemUgLz0gMjsKKwkJCQl1 ZGxfZnJlZV91cmJfbGlzdChkZXYpOworCQkJCWdvdG8gcmV0cnk7CisJCQl9CiAJCQlicmVhazsK IAkJfQogCkBAIC0yNDEsMTYgKzI1MSwxNCBAQCBzdGF0aWMgaW50IHVkbF9hbGxvY191cmJfbGlz dChzdHJ1Y3QgZHJtCiAKIAkJbGlzdF9hZGRfdGFpbCgmdW5vZGUtPmVudHJ5LCAmdWRsLT51cmJz Lmxpc3QpOwogCi0JCWkrKzsKKwkJdXAoJnVkbC0+dXJicy5saW1pdF9zZW0pOworCQl1ZGwtPnVy YnMuY291bnQrKzsKKwkJdWRsLT51cmJzLmF2YWlsYWJsZSsrOwogCX0KIAotCXNlbWFfaW5pdCgm dWRsLT51cmJzLmxpbWl0X3NlbSwgaSk7Ci0JdWRsLT51cmJzLmNvdW50ID0gaTsKLQl1ZGwtPnVy YnMuYXZhaWxhYmxlID0gaTsKLQotCURSTV9ERUJVRygiYWxsb2NhdGVkICVkICVkIGJ5dGUgdXJi c1xuIiwgaSwgKGludCkgc2l6ZSk7CisJRFJNX0RFQlVHKCJhbGxvY2F0ZWQgJWQgJWQgYnl0ZSB1 cmJzXG4iLCB1ZGwtPnVyYnMuY291bnQsIChpbnQpIHNpemUpOwogCi0JcmV0dXJuIGk7CisJcmV0 dXJuIHVkbC0+dXJicy5jb3VudDsKIH0KIAogc3RydWN0IHVyYiAqdWRsX2dldF91cmIoc3RydWN0 IGRybV9kZXZpY2UgKmRldikKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNr dG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2Ry aS1kZXZlbAo=