From mboxrd@z Thu Jan 1 00:00:00 1970 From: Gerd Hoffmann Subject: [PATCH v2 08/13] udmabuf: improve udmabuf_create error handling Date: Tue, 11 Sep 2018 15:42:11 +0200 Message-ID: <20180911134216.9760-9-kraxel@redhat.com> References: <20180911134216.9760-1-kraxel@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mx1.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by gabe.freedesktop.org (Postfix) with ESMTPS id 17BBE6E39F for ; Tue, 11 Sep 2018 13:42:21 +0000 (UTC) In-Reply-To: <20180911134216.9760-1-kraxel@redhat.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: dri-devel@lists.freedesktop.org Cc: Gerd Hoffmann , open list , "moderated list:DMA BUFFER SHARING FRAMEWORK" , laurent.pinchart@ideasonboard.com, "open list:DMA BUFFER SHARING FRAMEWORK" List-Id: dri-devel@lists.freedesktop.org UmVwb3J0ZWQtYnk6IExhdXJlbnQgUGluY2hhcnQgPGxhdXJlbnQucGluY2hhcnRAaWRlYXNvbmJv YXJkLmNvbT4KU2lnbmVkLW9mZi1ieTogR2VyZCBIb2ZmbWFubiA8a3JheGVsQHJlZGhhdC5jb20+ ClJldmlld2VkLWJ5OiBMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QGlkZWFzb25i b2FyZC5jb20+CkFja2VkLWJ5OiBEYW5pZWwgVmV0dGVyIDxkYW5pZWwudmV0dGVyQGZmd2xsLmNo PgotLS0KIGRyaXZlcnMvZG1hLWJ1Zi91ZG1hYnVmLmMgfCAyNSArKysrKysrKysrKystLS0tLS0t LS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgMTIgaW5zZXJ0aW9ucygrKSwgMTMgZGVsZXRpb25zKC0p CgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEtYnVmL3VkbWFidWYuYyBiL2RyaXZlcnMvZG1hLWJ1 Zi91ZG1hYnVmLmMKaW5kZXggYTAxZmNmNmE2Ni4uZTgyMTM2MTU2NiAxMDA2NDQKLS0tIGEvZHJp dmVycy9kbWEtYnVmL3VkbWFidWYuYworKysgYi9kcml2ZXJzL2RtYS1idWYvdWRtYWJ1Zi5jCkBA IC0xMjYsNyArMTI2LDcgQEAgc3RhdGljIGxvbmcgdWRtYWJ1Zl9jcmVhdGUoY29uc3Qgc3RydWN0 IHVkbWFidWZfY3JlYXRlX2xpc3QgKmhlYWQsCiAJc3RydWN0IGZpbGUgKm1lbWZkID0gTlVMTDsK IAlzdHJ1Y3QgdWRtYWJ1ZiAqdWJ1ZjsKIAlzdHJ1Y3QgZG1hX2J1ZiAqYnVmOwotCXBnb2ZmX3Qg cGdvZmYsIHBnY250LCBwZ2lkeCwgcGdidWYsIHBnbGltaXQ7CisJcGdvZmZfdCBwZ29mZiwgcGdj bnQsIHBnaWR4LCBwZ2J1ZiA9IDAsIHBnbGltaXQ7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJaW50 IHNlYWxzLCByZXQgPSAtRUlOVkFMOwogCXUzMiBpLCBmbGFnczsKQEAgLTEzOCwzMiArMTM4LDMy IEBAIHN0YXRpYyBsb25nIHVkbWFidWZfY3JlYXRlKGNvbnN0IHN0cnVjdCB1ZG1hYnVmX2NyZWF0 ZV9saXN0ICpoZWFkLAogCXBnbGltaXQgPSAoc2l6ZV9saW1pdF9tYiAqIDEwMjQgKiAxMDI0KSA+ PiBQQUdFX1NISUZUOwogCWZvciAoaSA9IDA7IGkgPCBoZWFkLT5jb3VudDsgaSsrKSB7CiAJCWlm ICghSVNfQUxJR05FRChsaXN0W2ldLm9mZnNldCwgUEFHRV9TSVpFKSkKLQkJCWdvdG8gZXJyX2Zy ZWVfdWJ1ZjsKKwkJCWdvdG8gZXJyOwogCQlpZiAoIUlTX0FMSUdORUQobGlzdFtpXS5zaXplLCBQ QUdFX1NJWkUpKQotCQkJZ290byBlcnJfZnJlZV91YnVmOworCQkJZ290byBlcnI7CiAJCXVidWYt PnBhZ2Vjb3VudCArPSBsaXN0W2ldLnNpemUgPj4gUEFHRV9TSElGVDsKIAkJaWYgKHVidWYtPnBh Z2Vjb3VudCA+IHBnbGltaXQpCi0JCQlnb3RvIGVycl9mcmVlX3VidWY7CisJCQlnb3RvIGVycjsK IAl9CiAJdWJ1Zi0+cGFnZXMgPSBrbWFsbG9jX2FycmF5KHVidWYtPnBhZ2Vjb3VudCwgc2l6ZW9m KHN0cnVjdCBwYWdlICopLAogCQkJCSAgICBHRlBfS0VSTkVMKTsKIAlpZiAoIXVidWYtPnBhZ2Vz KSB7CiAJCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2ZyZWVfdWJ1ZjsKKwkJZ290byBlcnI7 CiAJfQogCiAJcGdidWYgPSAwOwogCWZvciAoaSA9IDA7IGkgPCBoZWFkLT5jb3VudDsgaSsrKSB7 CiAJCW1lbWZkID0gZmdldChsaXN0W2ldLm1lbWZkKTsKIAkJaWYgKCFtZW1mZCkKLQkJCWdvdG8g ZXJyX3B1dF9wYWdlczsKKwkJCWdvdG8gZXJyOwogCQlpZiAoIXNobWVtX21hcHBpbmcoZmlsZV9p bm9kZShtZW1mZCktPmlfbWFwcGluZykpCi0JCQlnb3RvIGVycl9wdXRfcGFnZXM7CisJCQlnb3Rv IGVycjsKIAkJc2VhbHMgPSBtZW1mZF9mY250bChtZW1mZCwgRl9HRVRfU0VBTFMsIDApOwogCQlp ZiAoc2VhbHMgPT0gLUVJTlZBTCB8fAogCQkgICAgKHNlYWxzICYgU0VBTFNfV0FOVEVEKSAhPSBT RUFMU19XQU5URUQgfHwKIAkJICAgIChzZWFscyAmIFNFQUxTX0RFTklFRCkgIT0gMCkKLQkJCWdv dG8gZXJyX3B1dF9wYWdlczsKKwkJCWdvdG8gZXJyOwogCQlwZ29mZiA9IGxpc3RbaV0ub2Zmc2V0 ID4+IFBBR0VfU0hJRlQ7CiAJCXBnY250ID0gbGlzdFtpXS5zaXplICAgPj4gUEFHRV9TSElGVDsK IAkJZm9yIChwZ2lkeCA9IDA7IHBnaWR4IDwgcGdjbnQ7IHBnaWR4KyspIHsKQEAgLTE3MSwxMyAr MTcxLDEzIEBAIHN0YXRpYyBsb25nIHVkbWFidWZfY3JlYXRlKGNvbnN0IHN0cnVjdCB1ZG1hYnVm X2NyZWF0ZV9saXN0ICpoZWFkLAogCQkJCWZpbGVfaW5vZGUobWVtZmQpLT5pX21hcHBpbmcsIHBn b2ZmICsgcGdpZHgpOwogCQkJaWYgKElTX0VSUihwYWdlKSkgewogCQkJCXJldCA9IFBUUl9FUlIo cGFnZSk7Ci0JCQkJZ290byBlcnJfcHV0X3BhZ2VzOworCQkJCWdvdG8gZXJyOwogCQkJfQogCQkJ dWJ1Zi0+cGFnZXNbcGdidWYrK10gPSBwYWdlOwogCQl9CiAJCWZwdXQobWVtZmQpOworCQltZW1m ZCA9IE5VTEw7CiAJfQotCW1lbWZkID0gTlVMTDsKIAogCWV4cF9pbmZvLm9wcyAgPSAmdWRtYWJ1 Zl9vcHM7CiAJZXhwX2luZm8uc2l6ZSA9IHVidWYtPnBhZ2Vjb3VudCA8PCBQQUdFX1NISUZUOwpA QCAtMTg2LDcgKzE4Niw3IEBAIHN0YXRpYyBsb25nIHVkbWFidWZfY3JlYXRlKGNvbnN0IHN0cnVj dCB1ZG1hYnVmX2NyZWF0ZV9saXN0ICpoZWFkLAogCWJ1ZiA9IGRtYV9idWZfZXhwb3J0KCZleHBf aW5mbyk7CiAJaWYgKElTX0VSUihidWYpKSB7CiAJCXJldCA9IFBUUl9FUlIoYnVmKTsKLQkJZ290 byBlcnJfcHV0X3BhZ2VzOworCQlnb3RvIGVycjsKIAl9CiAKIAlmbGFncyA9IDA7CkBAIC0xOTQs MTAgKzE5NCw5IEBAIHN0YXRpYyBsb25nIHVkbWFidWZfY3JlYXRlKGNvbnN0IHN0cnVjdCB1ZG1h YnVmX2NyZWF0ZV9saXN0ICpoZWFkLAogCQlmbGFncyB8PSBPX0NMT0VYRUM7CiAJcmV0dXJuIGRt YV9idWZfZmQoYnVmLCBmbGFncyk7CiAKLWVycl9wdXRfcGFnZXM6CitlcnI6CiAJd2hpbGUgKHBn YnVmID4gMCkKIAkJcHV0X3BhZ2UodWJ1Zi0+cGFnZXNbLS1wZ2J1Zl0pOwotZXJyX2ZyZWVfdWJ1 ZjoKIAlpZiAobWVtZmQpCiAJCWZwdXQobWVtZmQpOwogCWtmcmVlKHVidWYtPnBhZ2VzKTsKLS0g CjIuOS4zCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpk cmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0 cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mx3-rdu2.redhat.com ([66.187.233.73]:57486 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727789AbeIKSln (ORCPT ); Tue, 11 Sep 2018 14:41:43 -0400 From: Gerd Hoffmann To: dri-devel@lists.freedesktop.org Cc: laurent.pinchart@ideasonboard.com, daniel@ffwll.ch, Gerd Hoffmann , Sumit Semwal , linux-media@vger.kernel.org (open list:DMA BUFFER SHARING FRAMEWORK), linaro-mm-sig@lists.linaro.org (moderated list:DMA BUFFER SHARING FRAMEWORK), linux-kernel@vger.kernel.org (open list) Subject: [PATCH v2 08/13] udmabuf: improve udmabuf_create error handling Date: Tue, 11 Sep 2018 15:42:11 +0200 Message-Id: <20180911134216.9760-9-kraxel@redhat.com> In-Reply-To: <20180911134216.9760-1-kraxel@redhat.com> References: <20180911134216.9760-1-kraxel@redhat.com> Sender: linux-media-owner@vger.kernel.org List-ID: Reported-by: Laurent Pinchart Signed-off-by: Gerd Hoffmann Reviewed-by: Laurent Pinchart Acked-by: Daniel Vetter --- drivers/dma-buf/udmabuf.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/drivers/dma-buf/udmabuf.c b/drivers/dma-buf/udmabuf.c index a01fcf6a66..e821361566 100644 --- a/drivers/dma-buf/udmabuf.c +++ b/drivers/dma-buf/udmabuf.c @@ -126,7 +126,7 @@ static long udmabuf_create(const struct udmabuf_create_list *head, struct file *memfd = NULL; struct udmabuf *ubuf; struct dma_buf *buf; - pgoff_t pgoff, pgcnt, pgidx, pgbuf, pglimit; + pgoff_t pgoff, pgcnt, pgidx, pgbuf = 0, pglimit; struct page *page; int seals, ret = -EINVAL; u32 i, flags; @@ -138,32 +138,32 @@ static long udmabuf_create(const struct udmabuf_create_list *head, pglimit = (size_limit_mb * 1024 * 1024) >> PAGE_SHIFT; for (i = 0; i < head->count; i++) { if (!IS_ALIGNED(list[i].offset, PAGE_SIZE)) - goto err_free_ubuf; + goto err; if (!IS_ALIGNED(list[i].size, PAGE_SIZE)) - goto err_free_ubuf; + goto err; ubuf->pagecount += list[i].size >> PAGE_SHIFT; if (ubuf->pagecount > pglimit) - goto err_free_ubuf; + goto err; } ubuf->pages = kmalloc_array(ubuf->pagecount, sizeof(struct page *), GFP_KERNEL); if (!ubuf->pages) { ret = -ENOMEM; - goto err_free_ubuf; + goto err; } pgbuf = 0; for (i = 0; i < head->count; i++) { memfd = fget(list[i].memfd); if (!memfd) - goto err_put_pages; + goto err; if (!shmem_mapping(file_inode(memfd)->i_mapping)) - goto err_put_pages; + goto err; seals = memfd_fcntl(memfd, F_GET_SEALS, 0); if (seals == -EINVAL || (seals & SEALS_WANTED) != SEALS_WANTED || (seals & SEALS_DENIED) != 0) - goto err_put_pages; + goto err; pgoff = list[i].offset >> PAGE_SHIFT; pgcnt = list[i].size >> PAGE_SHIFT; for (pgidx = 0; pgidx < pgcnt; pgidx++) { @@ -171,13 +171,13 @@ static long udmabuf_create(const struct udmabuf_create_list *head, file_inode(memfd)->i_mapping, pgoff + pgidx); if (IS_ERR(page)) { ret = PTR_ERR(page); - goto err_put_pages; + goto err; } ubuf->pages[pgbuf++] = page; } fput(memfd); + memfd = NULL; } - memfd = NULL; exp_info.ops = &udmabuf_ops; exp_info.size = ubuf->pagecount << PAGE_SHIFT; @@ -186,7 +186,7 @@ static long udmabuf_create(const struct udmabuf_create_list *head, buf = dma_buf_export(&exp_info); if (IS_ERR(buf)) { ret = PTR_ERR(buf); - goto err_put_pages; + goto err; } flags = 0; @@ -194,10 +194,9 @@ static long udmabuf_create(const struct udmabuf_create_list *head, flags |= O_CLOEXEC; return dma_buf_fd(buf, flags); -err_put_pages: +err: while (pgbuf > 0) put_page(ubuf->pages[--pgbuf]); -err_free_ubuf: if (memfd) fput(memfd); kfree(ubuf->pages); -- 2.9.3