From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from cantor2.suse.de ([195.135.220.15]:59493 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965146AbbEFH23 (ORCPT ); Wed, 6 May 2015 03:28:29 -0400 From: Jan Kara To: linux-mm@kvack.org Cc: linux-media@vger.kernel.org, Hans Verkuil , dri-devel@lists.freedesktop.org, Pawel Osciak , Mauro Carvalho Chehab , mgorman@suse.de, Marek Szyprowski , linux-samsung-soc@vger.kernel.org, Jan Kara Subject: [PATCH 5/9] media: vb2: Convert vb2_dma_sg_get_userptr() to use frame vector Date: Wed, 6 May 2015 09:28:12 +0200 Message-Id: <1430897296-5469-6-git-send-email-jack@suse.cz> In-Reply-To: <1430897296-5469-1-git-send-email-jack@suse.cz> References: <1430897296-5469-1-git-send-email-jack@suse.cz> Sender: linux-media-owner@vger.kernel.org List-ID: Acked-by: Marek Szyprowski Tested-by: Marek Szyprowski Signed-off-by: Jan Kara --- drivers/media/v4l2-core/videobuf2-dma-sg.c | 97 +++++------------------------- 1 file changed, 15 insertions(+), 82 deletions(-) diff --git a/drivers/media/v4l2-core/videobuf2-dma-sg.c b/drivers/media/v4l2-core/videobuf2-dma-sg.c index afd4b514affc..4ee1b3fbfe2a 100644 --- a/drivers/media/v4l2-core/videobuf2-dma-sg.c +++ b/drivers/media/v4l2-core/videobuf2-dma-sg.c @@ -38,6 +38,7 @@ struct vb2_dma_sg_buf { struct device *dev; void *vaddr; struct page **pages; + struct frame_vector *vec; int offset; enum dma_data_direction dma_dir; struct sg_table sg_table; @@ -51,7 +52,6 @@ struct vb2_dma_sg_buf { unsigned int num_pages; atomic_t refcount; struct vb2_vmarea_handler handler; - struct vm_area_struct *vma; struct dma_buf_attachment *db_attach; }; @@ -224,25 +224,17 @@ static void vb2_dma_sg_finish(void *buf_priv) dma_sync_sg_for_cpu(buf->dev, sgt->sgl, sgt->nents, buf->dma_dir); } -static inline int vma_is_io(struct vm_area_struct *vma) -{ - return !!(vma->vm_flags & (VM_IO | VM_PFNMAP)); -} - static void *vb2_dma_sg_get_userptr(void *alloc_ctx, unsigned long vaddr, unsigned long size, enum dma_data_direction dma_dir) { struct vb2_dma_sg_conf *conf = alloc_ctx; struct vb2_dma_sg_buf *buf; - unsigned long first, last; - int num_pages_from_user; - struct vm_area_struct *vma; struct sg_table *sgt; DEFINE_DMA_ATTRS(attrs); + struct frame_vector *vec; dma_set_attr(DMA_ATTR_SKIP_CPU_SYNC, &attrs); - buf = kzalloc(sizeof *buf, GFP_KERNEL); if (!buf) return NULL; @@ -253,63 +245,19 @@ static void *vb2_dma_sg_get_userptr(void *alloc_ctx, unsigned long vaddr, buf->offset = vaddr & ~PAGE_MASK; buf->size = size; buf->dma_sgt = &buf->sg_table; + vec = vb2_create_framevec(vaddr, size, buf->dma_dir == DMA_FROM_DEVICE); + if (IS_ERR(vec)) + goto userptr_fail_pfnvec; + buf->vec = vec; - first = (vaddr & PAGE_MASK) >> PAGE_SHIFT; - last = ((vaddr + size - 1) & PAGE_MASK) >> PAGE_SHIFT; - buf->num_pages = last - first + 1; - - buf->pages = kzalloc(buf->num_pages * sizeof(struct page *), - GFP_KERNEL); - if (!buf->pages) - goto userptr_fail_alloc_pages; - - down_read(¤t->mm->mmap_sem); - vma = find_vma(current->mm, vaddr); - if (!vma) { - dprintk(1, "no vma for address %lu\n", vaddr); - goto userptr_fail_find_vma; - } - - if (vma->vm_end < vaddr + size) { - dprintk(1, "vma at %lu is too small for %lu bytes\n", - vaddr, size); - goto userptr_fail_find_vma; - } - - buf->vma = vb2_get_vma(vma); - if (!buf->vma) { - dprintk(1, "failed to copy vma\n"); - goto userptr_fail_find_vma; - } - - if (vma_is_io(buf->vma)) { - for (num_pages_from_user = 0; - num_pages_from_user < buf->num_pages; - ++num_pages_from_user, vaddr += PAGE_SIZE) { - unsigned long pfn; - - if (follow_pfn(vma, vaddr, &pfn)) { - dprintk(1, "no page for address %lu\n", vaddr); - break; - } - buf->pages[num_pages_from_user] = pfn_to_page(pfn); - } - } else - num_pages_from_user = get_user_pages(current, current->mm, - vaddr & PAGE_MASK, - buf->num_pages, - buf->dma_dir == DMA_FROM_DEVICE, - 1, /* force */ - buf->pages, - NULL); - up_read(¤t->mm->mmap_sem); - - if (num_pages_from_user != buf->num_pages) - goto userptr_fail_get_user_pages; + buf->pages = frame_vector_pages(vec); + if (IS_ERR(buf->pages)) + goto userptr_fail_sgtable; + buf->num_pages = frame_vector_count(vec); if (sg_alloc_table_from_pages(buf->dma_sgt, buf->pages, buf->num_pages, buf->offset, size, 0)) - goto userptr_fail_alloc_table_from_pages; + goto userptr_fail_sgtable; sgt = &buf->sg_table; /* @@ -323,19 +271,9 @@ static void *vb2_dma_sg_get_userptr(void *alloc_ctx, unsigned long vaddr, userptr_fail_map: sg_free_table(&buf->sg_table); -userptr_fail_alloc_table_from_pages: -userptr_fail_get_user_pages: - dprintk(1, "get_user_pages requested/got: %d/%d]\n", - buf->num_pages, num_pages_from_user); - if (!vma_is_io(buf->vma)) - while (--num_pages_from_user >= 0) - put_page(buf->pages[num_pages_from_user]); - down_read(¤t->mm->mmap_sem); - vb2_put_vma(buf->vma); -userptr_fail_find_vma: - up_read(¤t->mm->mmap_sem); - kfree(buf->pages); -userptr_fail_alloc_pages: +userptr_fail_sgtable: + vb2_destroy_framevec(vec); +userptr_fail_pfnvec: kfree(buf); return NULL; } @@ -362,13 +300,8 @@ static void vb2_dma_sg_put_userptr(void *buf_priv) while (--i >= 0) { if (buf->dma_dir == DMA_FROM_DEVICE) set_page_dirty_lock(buf->pages[i]); - if (!vma_is_io(buf->vma)) - put_page(buf->pages[i]); } - kfree(buf->pages); - down_read(¤t->mm->mmap_sem); - vb2_put_vma(buf->vma); - up_read(¤t->mm->mmap_sem); + vb2_destroy_framevec(buf->vec); kfree(buf); } -- 2.1.4 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jan Kara Subject: [PATCH 5/9] media: vb2: Convert vb2_dma_sg_get_userptr() to use frame vector Date: Wed, 6 May 2015 09:28:12 +0200 Message-ID: <1430897296-5469-6-git-send-email-jack@suse.cz> References: <1430897296-5469-1-git-send-email-jack@suse.cz> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1430897296-5469-1-git-send-email-jack@suse.cz> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: linux-mm@kvack.org Cc: linux-samsung-soc@vger.kernel.org, Jan Kara , Pawel Osciak , Mauro Carvalho Chehab , dri-devel@lists.freedesktop.org, mgorman@suse.de, Marek Szyprowski , linux-media@vger.kernel.org List-Id: linux-samsung-soc@vger.kernel.org QWNrZWQtYnk6IE1hcmVrIFN6eXByb3dza2kgPG0uc3p5cHJvd3NraUBzYW1zdW5nLmNvbT4KVGVz dGVkLWJ5OiBNYXJlayBTenlwcm93c2tpIDxtLnN6eXByb3dza2lAc2Ftc3VuZy5jb20+ClNpZ25l ZC1vZmYtYnk6IEphbiBLYXJhIDxqYWNrQHN1c2UuY3o+Ci0tLQogZHJpdmVycy9tZWRpYS92NGwy LWNvcmUvdmlkZW9idWYyLWRtYS1zZy5jIHwgOTcgKysrKystLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCiAxIGZpbGUgY2hhbmdlZCwgMTUgaW5zZXJ0aW9ucygrKSwgODIgZGVsZXRpb25zKC0pCgpk aWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdmlkZW9idWYyLWRtYS1zZy5jIGIv ZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdmlkZW9idWYyLWRtYS1zZy5jCmluZGV4IGFmZDRiNTE0 YWZmYy4uNGVlMWIzZmJmZTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92 aWRlb2J1ZjItZG1hLXNnLmMKKysrIGIvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdmlkZW9idWYy LWRtYS1zZy5jCkBAIC0zOCw2ICszOCw3IEBAIHN0cnVjdCB2YjJfZG1hX3NnX2J1ZiB7CiAJc3Ry dWN0IGRldmljZQkJCSpkZXY7CiAJdm9pZAkJCQkqdmFkZHI7CiAJc3RydWN0IHBhZ2UJCQkqKnBh Z2VzOworCXN0cnVjdCBmcmFtZV92ZWN0b3IJCSp2ZWM7CiAJaW50CQkJCW9mZnNldDsKIAllbnVt IGRtYV9kYXRhX2RpcmVjdGlvbgkJZG1hX2RpcjsKIAlzdHJ1Y3Qgc2dfdGFibGUJCQlzZ190YWJs ZTsKQEAgLTUxLDcgKzUyLDYgQEAgc3RydWN0IHZiMl9kbWFfc2dfYnVmIHsKIAl1bnNpZ25lZCBp bnQJCQludW1fcGFnZXM7CiAJYXRvbWljX3QJCQlyZWZjb3VudDsKIAlzdHJ1Y3QgdmIyX3ZtYXJl YV9oYW5kbGVyCWhhbmRsZXI7Ci0Jc3RydWN0IHZtX2FyZWFfc3RydWN0CQkqdm1hOwogCiAJc3Ry dWN0IGRtYV9idWZfYXR0YWNobWVudAkqZGJfYXR0YWNoOwogfTsKQEAgLTIyNCwyNSArMjI0LDE3 IEBAIHN0YXRpYyB2b2lkIHZiMl9kbWFfc2dfZmluaXNoKHZvaWQgKmJ1Zl9wcml2KQogCWRtYV9z eW5jX3NnX2Zvcl9jcHUoYnVmLT5kZXYsIHNndC0+c2dsLCBzZ3QtPm5lbnRzLCBidWYtPmRtYV9k aXIpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCB2bWFfaXNfaW8oc3RydWN0IHZtX2FyZWFfc3Ry dWN0ICp2bWEpCi17Ci0JcmV0dXJuICEhKHZtYS0+dm1fZmxhZ3MgJiAoVk1fSU8gfCBWTV9QRk5N QVApKTsKLX0KLQogc3RhdGljIHZvaWQgKnZiMl9kbWFfc2dfZ2V0X3VzZXJwdHIodm9pZCAqYWxs b2NfY3R4LCB1bnNpZ25lZCBsb25nIHZhZGRyLAogCQkJCSAgICB1bnNpZ25lZCBsb25nIHNpemUs CiAJCQkJICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRtYV9kaXIpCiB7CiAJc3RydWN0IHZi Ml9kbWFfc2dfY29uZiAqY29uZiA9IGFsbG9jX2N0eDsKIAlzdHJ1Y3QgdmIyX2RtYV9zZ19idWYg KmJ1ZjsKLQl1bnNpZ25lZCBsb25nIGZpcnN0LCBsYXN0OwotCWludCBudW1fcGFnZXNfZnJvbV91 c2VyOwotCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwogCXN0cnVjdCBzZ190YWJsZSAqc2d0 OwogCURFRklORV9ETUFfQVRUUlMoYXR0cnMpOworCXN0cnVjdCBmcmFtZV92ZWN0b3IgKnZlYzsK IAogCWRtYV9zZXRfYXR0cihETUFfQVRUUl9TS0lQX0NQVV9TWU5DLCAmYXR0cnMpOwotCiAJYnVm ID0ga3phbGxvYyhzaXplb2YgKmJ1ZiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWYpCiAJCXJldHVy biBOVUxMOwpAQCAtMjUzLDYzICsyNDUsMTkgQEAgc3RhdGljIHZvaWQgKnZiMl9kbWFfc2dfZ2V0 X3VzZXJwdHIodm9pZCAqYWxsb2NfY3R4LCB1bnNpZ25lZCBsb25nIHZhZGRyLAogCWJ1Zi0+b2Zm c2V0ID0gdmFkZHIgJiB+UEFHRV9NQVNLOwogCWJ1Zi0+c2l6ZSA9IHNpemU7CiAJYnVmLT5kbWFf c2d0ID0gJmJ1Zi0+c2dfdGFibGU7CisJdmVjID0gdmIyX2NyZWF0ZV9mcmFtZXZlYyh2YWRkciwg c2l6ZSwgYnVmLT5kbWFfZGlyID09IERNQV9GUk9NX0RFVklDRSk7CisJaWYgKElTX0VSUih2ZWMp KQorCQlnb3RvIHVzZXJwdHJfZmFpbF9wZm52ZWM7CisJYnVmLT52ZWMgPSB2ZWM7CiAKLQlmaXJz dCA9ICh2YWRkciAgICAgICAgICAgJiBQQUdFX01BU0spID4+IFBBR0VfU0hJRlQ7Ci0JbGFzdCAg PSAoKHZhZGRyICsgc2l6ZSAtIDEpICYgUEFHRV9NQVNLKSA+PiBQQUdFX1NISUZUOwotCWJ1Zi0+ bnVtX3BhZ2VzID0gbGFzdCAtIGZpcnN0ICsgMTsKLQotCWJ1Zi0+cGFnZXMgPSBremFsbG9jKGJ1 Zi0+bnVtX3BhZ2VzICogc2l6ZW9mKHN0cnVjdCBwYWdlICopLAotCQkJICAgICBHRlBfS0VSTkVM KTsKLQlpZiAoIWJ1Zi0+cGFnZXMpCi0JCWdvdG8gdXNlcnB0cl9mYWlsX2FsbG9jX3BhZ2VzOwot Ci0JZG93bl9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCXZtYSA9IGZpbmRfdm1hKGN1 cnJlbnQtPm1tLCB2YWRkcik7Ci0JaWYgKCF2bWEpIHsKLQkJZHByaW50aygxLCAibm8gdm1hIGZv ciBhZGRyZXNzICVsdVxuIiwgdmFkZHIpOwotCQlnb3RvIHVzZXJwdHJfZmFpbF9maW5kX3ZtYTsK LQl9Ci0KLQlpZiAodm1hLT52bV9lbmQgPCB2YWRkciArIHNpemUpIHsKLQkJZHByaW50aygxLCAi dm1hIGF0ICVsdSBpcyB0b28gc21hbGwgZm9yICVsdSBieXRlc1xuIiwKLQkJCXZhZGRyLCBzaXpl KTsKLQkJZ290byB1c2VycHRyX2ZhaWxfZmluZF92bWE7Ci0JfQotCi0JYnVmLT52bWEgPSB2YjJf Z2V0X3ZtYSh2bWEpOwotCWlmICghYnVmLT52bWEpIHsKLQkJZHByaW50aygxLCAiZmFpbGVkIHRv IGNvcHkgdm1hXG4iKTsKLQkJZ290byB1c2VycHRyX2ZhaWxfZmluZF92bWE7Ci0JfQotCi0JaWYg KHZtYV9pc19pbyhidWYtPnZtYSkpIHsKLQkJZm9yIChudW1fcGFnZXNfZnJvbV91c2VyID0gMDsK LQkJICAgICBudW1fcGFnZXNfZnJvbV91c2VyIDwgYnVmLT5udW1fcGFnZXM7Ci0JCSAgICAgKytu dW1fcGFnZXNfZnJvbV91c2VyLCB2YWRkciArPSBQQUdFX1NJWkUpIHsKLQkJCXVuc2lnbmVkIGxv bmcgcGZuOwotCi0JCQlpZiAoZm9sbG93X3Bmbih2bWEsIHZhZGRyLCAmcGZuKSkgewotCQkJCWRw cmludGsoMSwgIm5vIHBhZ2UgZm9yIGFkZHJlc3MgJWx1XG4iLCB2YWRkcik7Ci0JCQkJYnJlYWs7 Ci0JCQl9Ci0JCQlidWYtPnBhZ2VzW251bV9wYWdlc19mcm9tX3VzZXJdID0gcGZuX3RvX3BhZ2Uo cGZuKTsKLQkJfQotCX0gZWxzZQotCQludW1fcGFnZXNfZnJvbV91c2VyID0gZ2V0X3VzZXJfcGFn ZXMoY3VycmVudCwgY3VycmVudC0+bW0sCi0JCQkJCSAgICAgdmFkZHIgJiBQQUdFX01BU0ssCi0J CQkJCSAgICAgYnVmLT5udW1fcGFnZXMsCi0JCQkJCSAgICAgYnVmLT5kbWFfZGlyID09IERNQV9G Uk9NX0RFVklDRSwKLQkJCQkJICAgICAxLCAvKiBmb3JjZSAqLwotCQkJCQkgICAgIGJ1Zi0+cGFn ZXMsCi0JCQkJCSAgICAgTlVMTCk7Ci0JdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsK LQotCWlmIChudW1fcGFnZXNfZnJvbV91c2VyICE9IGJ1Zi0+bnVtX3BhZ2VzKQotCQlnb3RvIHVz ZXJwdHJfZmFpbF9nZXRfdXNlcl9wYWdlczsKKwlidWYtPnBhZ2VzID0gZnJhbWVfdmVjdG9yX3Bh Z2VzKHZlYyk7CisJaWYgKElTX0VSUihidWYtPnBhZ2VzKSkKKwkJZ290byB1c2VycHRyX2ZhaWxf c2d0YWJsZTsKKwlidWYtPm51bV9wYWdlcyA9IGZyYW1lX3ZlY3Rvcl9jb3VudCh2ZWMpOwogCiAJ aWYgKHNnX2FsbG9jX3RhYmxlX2Zyb21fcGFnZXMoYnVmLT5kbWFfc2d0LCBidWYtPnBhZ2VzLAog CQkJYnVmLT5udW1fcGFnZXMsIGJ1Zi0+b2Zmc2V0LCBzaXplLCAwKSkKLQkJZ290byB1c2VycHRy X2ZhaWxfYWxsb2NfdGFibGVfZnJvbV9wYWdlczsKKwkJZ290byB1c2VycHRyX2ZhaWxfc2d0YWJs ZTsKIAogCXNndCA9ICZidWYtPnNnX3RhYmxlOwogCS8qCkBAIC0zMjMsMTkgKzI3MSw5IEBAIHN0 YXRpYyB2b2lkICp2YjJfZG1hX3NnX2dldF91c2VycHRyKHZvaWQgKmFsbG9jX2N0eCwgdW5zaWdu ZWQgbG9uZyB2YWRkciwKIAogdXNlcnB0cl9mYWlsX21hcDoKIAlzZ19mcmVlX3RhYmxlKCZidWYt PnNnX3RhYmxlKTsKLXVzZXJwdHJfZmFpbF9hbGxvY190YWJsZV9mcm9tX3BhZ2VzOgotdXNlcnB0 cl9mYWlsX2dldF91c2VyX3BhZ2VzOgotCWRwcmludGsoMSwgImdldF91c2VyX3BhZ2VzIHJlcXVl c3RlZC9nb3Q6ICVkLyVkXVxuIiwKLQkJYnVmLT5udW1fcGFnZXMsIG51bV9wYWdlc19mcm9tX3Vz ZXIpOwotCWlmICghdm1hX2lzX2lvKGJ1Zi0+dm1hKSkKLQkJd2hpbGUgKC0tbnVtX3BhZ2VzX2Zy b21fdXNlciA+PSAwKQotCQkJcHV0X3BhZ2UoYnVmLT5wYWdlc1tudW1fcGFnZXNfZnJvbV91c2Vy XSk7Ci0JZG93bl9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCXZiMl9wdXRfdm1hKGJ1 Zi0+dm1hKTsKLXVzZXJwdHJfZmFpbF9maW5kX3ZtYToKLQl1cF9yZWFkKCZjdXJyZW50LT5tbS0+ bW1hcF9zZW0pOwotCWtmcmVlKGJ1Zi0+cGFnZXMpOwotdXNlcnB0cl9mYWlsX2FsbG9jX3BhZ2Vz OgordXNlcnB0cl9mYWlsX3NndGFibGU6CisJdmIyX2Rlc3Ryb3lfZnJhbWV2ZWModmVjKTsKK3Vz ZXJwdHJfZmFpbF9wZm52ZWM6CiAJa2ZyZWUoYnVmKTsKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTM2 MiwxMyArMzAwLDggQEAgc3RhdGljIHZvaWQgdmIyX2RtYV9zZ19wdXRfdXNlcnB0cih2b2lkICpi dWZfcHJpdikKIAl3aGlsZSAoLS1pID49IDApIHsKIAkJaWYgKGJ1Zi0+ZG1hX2RpciA9PSBETUFf RlJPTV9ERVZJQ0UpCiAJCQlzZXRfcGFnZV9kaXJ0eV9sb2NrKGJ1Zi0+cGFnZXNbaV0pOwotCQlp ZiAoIXZtYV9pc19pbyhidWYtPnZtYSkpCi0JCQlwdXRfcGFnZShidWYtPnBhZ2VzW2ldKTsKIAl9 Ci0Ja2ZyZWUoYnVmLT5wYWdlcyk7Ci0JZG93bl9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0p OwotCXZiMl9wdXRfdm1hKGJ1Zi0+dm1hKTsKLQl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9z ZW0pOworCXZiMl9kZXN0cm95X2ZyYW1ldmVjKGJ1Zi0+dmVjKTsKIAlrZnJlZShidWYpOwogfQog Ci0tIAoyLjEuNAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3Jn Cmh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wi0-f181.google.com (mail-wi0-f181.google.com [209.85.212.181]) by kanga.kvack.org (Postfix) with ESMTP id 593516B0080 for ; Wed, 6 May 2015 03:28:40 -0400 (EDT) Received: by wizk4 with SMTP id k4so190712505wiz.1 for ; Wed, 06 May 2015 00:28:40 -0700 (PDT) Received: from mx2.suse.de (cantor2.suse.de. [195.135.220.15]) by mx.google.com with ESMTPS id u19si32577934wjq.76.2015.05.06.00.28.26 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 06 May 2015 00:28:27 -0700 (PDT) From: Jan Kara Subject: [PATCH 5/9] media: vb2: Convert vb2_dma_sg_get_userptr() to use frame vector Date: Wed, 6 May 2015 09:28:12 +0200 Message-Id: <1430897296-5469-6-git-send-email-jack@suse.cz> In-Reply-To: <1430897296-5469-1-git-send-email-jack@suse.cz> References: <1430897296-5469-1-git-send-email-jack@suse.cz> Sender: owner-linux-mm@kvack.org List-ID: To: linux-mm@kvack.org Cc: linux-media@vger.kernel.org, Hans Verkuil , dri-devel@lists.freedesktop.org, Pawel Osciak , Mauro Carvalho Chehab , mgorman@suse.de, Marek Szyprowski , linux-samsung-soc@vger.kernel.org, Jan Kara Acked-by: Marek Szyprowski Tested-by: Marek Szyprowski Signed-off-by: Jan Kara --- drivers/media/v4l2-core/videobuf2-dma-sg.c | 97 +++++------------------------- 1 file changed, 15 insertions(+), 82 deletions(-) diff --git a/drivers/media/v4l2-core/videobuf2-dma-sg.c b/drivers/media/v4l2-core/videobuf2-dma-sg.c index afd4b514affc..4ee1b3fbfe2a 100644 --- a/drivers/media/v4l2-core/videobuf2-dma-sg.c +++ b/drivers/media/v4l2-core/videobuf2-dma-sg.c @@ -38,6 +38,7 @@ struct vb2_dma_sg_buf { struct device *dev; void *vaddr; struct page **pages; + struct frame_vector *vec; int offset; enum dma_data_direction dma_dir; struct sg_table sg_table; @@ -51,7 +52,6 @@ struct vb2_dma_sg_buf { unsigned int num_pages; atomic_t refcount; struct vb2_vmarea_handler handler; - struct vm_area_struct *vma; struct dma_buf_attachment *db_attach; }; @@ -224,25 +224,17 @@ static void vb2_dma_sg_finish(void *buf_priv) dma_sync_sg_for_cpu(buf->dev, sgt->sgl, sgt->nents, buf->dma_dir); } -static inline int vma_is_io(struct vm_area_struct *vma) -{ - return !!(vma->vm_flags & (VM_IO | VM_PFNMAP)); -} - static void *vb2_dma_sg_get_userptr(void *alloc_ctx, unsigned long vaddr, unsigned long size, enum dma_data_direction dma_dir) { struct vb2_dma_sg_conf *conf = alloc_ctx; struct vb2_dma_sg_buf *buf; - unsigned long first, last; - int num_pages_from_user; - struct vm_area_struct *vma; struct sg_table *sgt; DEFINE_DMA_ATTRS(attrs); + struct frame_vector *vec; dma_set_attr(DMA_ATTR_SKIP_CPU_SYNC, &attrs); - buf = kzalloc(sizeof *buf, GFP_KERNEL); if (!buf) return NULL; @@ -253,63 +245,19 @@ static void *vb2_dma_sg_get_userptr(void *alloc_ctx, unsigned long vaddr, buf->offset = vaddr & ~PAGE_MASK; buf->size = size; buf->dma_sgt = &buf->sg_table; + vec = vb2_create_framevec(vaddr, size, buf->dma_dir == DMA_FROM_DEVICE); + if (IS_ERR(vec)) + goto userptr_fail_pfnvec; + buf->vec = vec; - first = (vaddr & PAGE_MASK) >> PAGE_SHIFT; - last = ((vaddr + size - 1) & PAGE_MASK) >> PAGE_SHIFT; - buf->num_pages = last - first + 1; - - buf->pages = kzalloc(buf->num_pages * sizeof(struct page *), - GFP_KERNEL); - if (!buf->pages) - goto userptr_fail_alloc_pages; - - down_read(¤t->mm->mmap_sem); - vma = find_vma(current->mm, vaddr); - if (!vma) { - dprintk(1, "no vma for address %lu\n", vaddr); - goto userptr_fail_find_vma; - } - - if (vma->vm_end < vaddr + size) { - dprintk(1, "vma at %lu is too small for %lu bytes\n", - vaddr, size); - goto userptr_fail_find_vma; - } - - buf->vma = vb2_get_vma(vma); - if (!buf->vma) { - dprintk(1, "failed to copy vma\n"); - goto userptr_fail_find_vma; - } - - if (vma_is_io(buf->vma)) { - for (num_pages_from_user = 0; - num_pages_from_user < buf->num_pages; - ++num_pages_from_user, vaddr += PAGE_SIZE) { - unsigned long pfn; - - if (follow_pfn(vma, vaddr, &pfn)) { - dprintk(1, "no page for address %lu\n", vaddr); - break; - } - buf->pages[num_pages_from_user] = pfn_to_page(pfn); - } - } else - num_pages_from_user = get_user_pages(current, current->mm, - vaddr & PAGE_MASK, - buf->num_pages, - buf->dma_dir == DMA_FROM_DEVICE, - 1, /* force */ - buf->pages, - NULL); - up_read(¤t->mm->mmap_sem); - - if (num_pages_from_user != buf->num_pages) - goto userptr_fail_get_user_pages; + buf->pages = frame_vector_pages(vec); + if (IS_ERR(buf->pages)) + goto userptr_fail_sgtable; + buf->num_pages = frame_vector_count(vec); if (sg_alloc_table_from_pages(buf->dma_sgt, buf->pages, buf->num_pages, buf->offset, size, 0)) - goto userptr_fail_alloc_table_from_pages; + goto userptr_fail_sgtable; sgt = &buf->sg_table; /* @@ -323,19 +271,9 @@ static void *vb2_dma_sg_get_userptr(void *alloc_ctx, unsigned long vaddr, userptr_fail_map: sg_free_table(&buf->sg_table); -userptr_fail_alloc_table_from_pages: -userptr_fail_get_user_pages: - dprintk(1, "get_user_pages requested/got: %d/%d]\n", - buf->num_pages, num_pages_from_user); - if (!vma_is_io(buf->vma)) - while (--num_pages_from_user >= 0) - put_page(buf->pages[num_pages_from_user]); - down_read(¤t->mm->mmap_sem); - vb2_put_vma(buf->vma); -userptr_fail_find_vma: - up_read(¤t->mm->mmap_sem); - kfree(buf->pages); -userptr_fail_alloc_pages: +userptr_fail_sgtable: + vb2_destroy_framevec(vec); +userptr_fail_pfnvec: kfree(buf); return NULL; } @@ -362,13 +300,8 @@ static void vb2_dma_sg_put_userptr(void *buf_priv) while (--i >= 0) { if (buf->dma_dir == DMA_FROM_DEVICE) set_page_dirty_lock(buf->pages[i]); - if (!vma_is_io(buf->vma)) - put_page(buf->pages[i]); } - kfree(buf->pages); - down_read(¤t->mm->mmap_sem); - vb2_put_vma(buf->vma); - up_read(¤t->mm->mmap_sem); + vb2_destroy_framevec(buf->vec); kfree(buf); } -- 2.1.4 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org