From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from cantor2.suse.de ([195.135.220.15]:59440 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S964835AbbEFH2Z (ORCPT ); Wed, 6 May 2015 03:28:25 -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 4/9] vb2: Provide helpers for mapping virtual addresses Date: Wed, 6 May 2015 09:28:11 +0200 Message-Id: <1430897296-5469-5-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: Provide simple helper functions to map virtual address range into an array of pfns / pages. Acked-by: Marek Szyprowski Tested-by: Marek Szyprowski Signed-off-by: Jan Kara --- drivers/media/v4l2-core/videobuf2-memops.c | 58 ++++++++++++++++++++++++++++++ include/media/videobuf2-memops.h | 5 +++ 2 files changed, 63 insertions(+) diff --git a/drivers/media/v4l2-core/videobuf2-memops.c b/drivers/media/v4l2-core/videobuf2-memops.c index 81c1ad8b2cf1..0ec186d41b9b 100644 --- a/drivers/media/v4l2-core/videobuf2-memops.c +++ b/drivers/media/v4l2-core/videobuf2-memops.c @@ -137,6 +137,64 @@ int vb2_get_contig_userptr(unsigned long vaddr, unsigned long size, EXPORT_SYMBOL_GPL(vb2_get_contig_userptr); /** + * vb2_create_framevec() - map virtual addresses to pfns + * @start: Virtual user address where we start mapping + * @length: Length of a range to map + * @write: Should we map for writing into the area + * + * This function allocates and fills in a vector with pfns corresponding to + * virtual address range passed in arguments. If pfns have corresponding pages, + * page references are also grabbed to pin pages in memory. The function + * returns pointer to the vector on success and error pointer in case of + * failure. Returned vector needs to be freed via vb2_destroy_pfnvec(). + */ +struct frame_vector *vb2_create_framevec(unsigned long start, + unsigned long length, + bool write) +{ + int ret; + unsigned long first, last; + unsigned long nr; + struct frame_vector *vec; + + first = start >> PAGE_SHIFT; + last = (start + length - 1) >> PAGE_SHIFT; + nr = last - first + 1; + vec = frame_vector_create(nr); + if (!vec) + return ERR_PTR(-ENOMEM); + ret = get_vaddr_frames(start, nr, write, 1, vec); + if (ret < 0) + goto out_destroy; + /* We accept only complete set of PFNs */ + if (ret != nr) { + ret = -EFAULT; + goto out_release; + } + return vec; +out_release: + put_vaddr_frames(vec); +out_destroy: + frame_vector_destroy(vec); + return ERR_PTR(ret); +} +EXPORT_SYMBOL(vb2_create_framevec); + +/** + * vb2_destroy_framevec() - release vector of mapped pfns + * @vec: vector of pfns / pages to release + * + * This releases references to all pages in the vector @vec (if corresponding + * pfns are backed by pages) and frees the passed vector. + */ +void vb2_destroy_framevec(struct frame_vector *vec) +{ + put_vaddr_frames(vec); + frame_vector_destroy(vec); +} +EXPORT_SYMBOL(vb2_destroy_framevec); + +/** * vb2_common_vm_open() - increase refcount of the vma * @vma: virtual memory region for the mapping * diff --git a/include/media/videobuf2-memops.h b/include/media/videobuf2-memops.h index f05444ca8c0c..2f0564ff5f31 100644 --- a/include/media/videobuf2-memops.h +++ b/include/media/videobuf2-memops.h @@ -15,6 +15,7 @@ #define _MEDIA_VIDEOBUF2_MEMOPS_H #include +#include /** * vb2_vmarea_handler - common vma refcount tracking handler @@ -36,5 +37,9 @@ int vb2_get_contig_userptr(unsigned long vaddr, unsigned long size, struct vm_area_struct *vb2_get_vma(struct vm_area_struct *vma); void vb2_put_vma(struct vm_area_struct *vma); +struct frame_vector *vb2_create_framevec(unsigned long start, + unsigned long length, + bool write); +void vb2_destroy_framevec(struct frame_vector *vec); #endif -- 2.1.4 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jan Kara Subject: [PATCH 4/9] vb2: Provide helpers for mapping virtual addresses Date: Wed, 6 May 2015 09:28:11 +0200 Message-ID: <1430897296-5469-5-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 UHJvdmlkZSBzaW1wbGUgaGVscGVyIGZ1bmN0aW9ucyB0byBtYXAgdmlydHVhbCBhZGRyZXNzIHJh bmdlIGludG8gYW4KYXJyYXkgb2YgcGZucyAvIHBhZ2VzLgoKQWNrZWQtYnk6IE1hcmVrIFN6eXBy b3dza2kgPG0uc3p5cHJvd3NraUBzYW1zdW5nLmNvbT4KVGVzdGVkLWJ5OiBNYXJlayBTenlwcm93 c2tpIDxtLnN6eXByb3dza2lAc2Ftc3VuZy5jb20+ClNpZ25lZC1vZmYtYnk6IEphbiBLYXJhIDxq YWNrQHN1c2UuY3o+Ci0tLQogZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdmlkZW9idWYyLW1lbW9w cy5jIHwgNTggKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBpbmNsdWRlL21lZGlhL3Zp ZGVvYnVmMi1tZW1vcHMuaCAgICAgICAgICAgfCAgNSArKysKIDIgZmlsZXMgY2hhbmdlZCwgNjMg aW5zZXJ0aW9ucygrKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3ZpZGVv YnVmMi1tZW1vcHMuYyBiL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3ZpZGVvYnVmMi1tZW1vcHMu YwppbmRleCA4MWMxYWQ4YjJjZjEuLjBlYzE4NmQ0MWI5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9t ZWRpYS92NGwyLWNvcmUvdmlkZW9idWYyLW1lbW9wcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdjRs Mi1jb3JlL3ZpZGVvYnVmMi1tZW1vcHMuYwpAQCAtMTM3LDYgKzEzNyw2NCBAQCBpbnQgdmIyX2dl dF9jb250aWdfdXNlcnB0cih1bnNpZ25lZCBsb25nIHZhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUs CiBFWFBPUlRfU1lNQk9MX0dQTCh2YjJfZ2V0X2NvbnRpZ191c2VycHRyKTsKIAogLyoqCisgKiB2 YjJfY3JlYXRlX2ZyYW1ldmVjKCkgLSBtYXAgdmlydHVhbCBhZGRyZXNzZXMgdG8gcGZucworICog QHN0YXJ0OglWaXJ0dWFsIHVzZXIgYWRkcmVzcyB3aGVyZSB3ZSBzdGFydCBtYXBwaW5nCisgKiBA bGVuZ3RoOglMZW5ndGggb2YgYSByYW5nZSB0byBtYXAKKyAqIEB3cml0ZToJU2hvdWxkIHdlIG1h cCBmb3Igd3JpdGluZyBpbnRvIHRoZSBhcmVhCisgKgorICogVGhpcyBmdW5jdGlvbiBhbGxvY2F0 ZXMgYW5kIGZpbGxzIGluIGEgdmVjdG9yIHdpdGggcGZucyBjb3JyZXNwb25kaW5nIHRvCisgKiB2 aXJ0dWFsIGFkZHJlc3MgcmFuZ2UgcGFzc2VkIGluIGFyZ3VtZW50cy4gSWYgcGZucyBoYXZlIGNv cnJlc3BvbmRpbmcgcGFnZXMsCisgKiBwYWdlIHJlZmVyZW5jZXMgYXJlIGFsc28gZ3JhYmJlZCB0 byBwaW4gcGFnZXMgaW4gbWVtb3J5LiBUaGUgZnVuY3Rpb24KKyAqIHJldHVybnMgcG9pbnRlciB0 byB0aGUgdmVjdG9yIG9uIHN1Y2Nlc3MgYW5kIGVycm9yIHBvaW50ZXIgaW4gY2FzZSBvZgorICog ZmFpbHVyZS4gUmV0dXJuZWQgdmVjdG9yIG5lZWRzIHRvIGJlIGZyZWVkIHZpYSB2YjJfZGVzdHJv eV9wZm52ZWMoKS4KKyAqLworc3RydWN0IGZyYW1lX3ZlY3RvciAqdmIyX2NyZWF0ZV9mcmFtZXZl Yyh1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJCQkgdW5zaWduZWQgbG9uZyBsZW5ndGgsCisJCQkJ CSBib29sIHdyaXRlKQoreworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBmaXJzdCwgbGFzdDsK Kwl1bnNpZ25lZCBsb25nIG5yOworCXN0cnVjdCBmcmFtZV92ZWN0b3IgKnZlYzsKKworCWZpcnN0 ID0gc3RhcnQgPj4gUEFHRV9TSElGVDsKKwlsYXN0ID0gKHN0YXJ0ICsgbGVuZ3RoIC0gMSkgPj4g UEFHRV9TSElGVDsKKwluciA9IGxhc3QgLSBmaXJzdCArIDE7CisJdmVjID0gZnJhbWVfdmVjdG9y X2NyZWF0ZShucik7CisJaWYgKCF2ZWMpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCXJl dCA9IGdldF92YWRkcl9mcmFtZXMoc3RhcnQsIG5yLCB3cml0ZSwgMSwgdmVjKTsKKwlpZiAocmV0 IDwgMCkKKwkJZ290byBvdXRfZGVzdHJveTsKKwkvKiBXZSBhY2NlcHQgb25seSBjb21wbGV0ZSBz ZXQgb2YgUEZOcyAqLworCWlmIChyZXQgIT0gbnIpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290 byBvdXRfcmVsZWFzZTsKKwl9CisJcmV0dXJuIHZlYzsKK291dF9yZWxlYXNlOgorCXB1dF92YWRk cl9mcmFtZXModmVjKTsKK291dF9kZXN0cm95OgorCWZyYW1lX3ZlY3Rvcl9kZXN0cm95KHZlYyk7 CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KK0VYUE9SVF9TWU1CT0wodmIyX2NyZWF0ZV9mcmFt ZXZlYyk7CisKKy8qKgorICogdmIyX2Rlc3Ryb3lfZnJhbWV2ZWMoKSAtIHJlbGVhc2UgdmVjdG9y IG9mIG1hcHBlZCBwZm5zCisgKiBAdmVjOgl2ZWN0b3Igb2YgcGZucyAvIHBhZ2VzIHRvIHJlbGVh c2UKKyAqCisgKiBUaGlzIHJlbGVhc2VzIHJlZmVyZW5jZXMgdG8gYWxsIHBhZ2VzIGluIHRoZSB2 ZWN0b3IgQHZlYyAoaWYgY29ycmVzcG9uZGluZworICogcGZucyBhcmUgYmFja2VkIGJ5IHBhZ2Vz KSBhbmQgZnJlZXMgdGhlIHBhc3NlZCB2ZWN0b3IuCisgKi8KK3ZvaWQgdmIyX2Rlc3Ryb3lfZnJh bWV2ZWMoc3RydWN0IGZyYW1lX3ZlY3RvciAqdmVjKQoreworCXB1dF92YWRkcl9mcmFtZXModmVj KTsKKwlmcmFtZV92ZWN0b3JfZGVzdHJveSh2ZWMpOworfQorRVhQT1JUX1NZTUJPTCh2YjJfZGVz dHJveV9mcmFtZXZlYyk7CisKKy8qKgogICogdmIyX2NvbW1vbl92bV9vcGVuKCkgLSBpbmNyZWFz ZSByZWZjb3VudCBvZiB0aGUgdm1hCiAgKiBAdm1hOgl2aXJ0dWFsIG1lbW9yeSByZWdpb24gZm9y IHRoZSBtYXBwaW5nCiAgKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92aWRlb2J1ZjItbWVt b3BzLmggYi9pbmNsdWRlL21lZGlhL3ZpZGVvYnVmMi1tZW1vcHMuaAppbmRleCBmMDU0NDRjYThj MGMuLjJmMDU2NGZmNWYzMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92aWRlb2J1ZjItbWVt b3BzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS92aWRlb2J1ZjItbWVtb3BzLmgKQEAgLTE1LDYgKzE1 LDcgQEAKICNkZWZpbmUgX01FRElBX1ZJREVPQlVGMl9NRU1PUFNfSAogCiAjaW5jbHVkZSA8bWVk aWEvdmlkZW9idWYyLWNvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgogCiAvKioKICAqIHZi Ml92bWFyZWFfaGFuZGxlciAtIGNvbW1vbiB2bWEgcmVmY291bnQgdHJhY2tpbmcgaGFuZGxlcgpA QCAtMzYsNSArMzcsOSBAQCBpbnQgdmIyX2dldF9jb250aWdfdXNlcnB0cih1bnNpZ25lZCBsb25n IHZhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCiBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZiMl9n ZXRfdm1hKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKIHZvaWQgdmIyX3B1dF92bWEoc3Ry dWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwogCitzdHJ1Y3QgZnJhbWVfdmVjdG9yICp2YjJfY3Jl YXRlX2ZyYW1ldmVjKHVuc2lnbmVkIGxvbmcgc3RhcnQsCisJCQkJCSB1bnNpZ25lZCBsb25nIGxl bmd0aCwKKwkJCQkJIGJvb2wgd3JpdGUpOwordm9pZCB2YjJfZGVzdHJveV9mcmFtZXZlYyhzdHJ1 Y3QgZnJhbWVfdmVjdG9yICp2ZWMpOwogCiAjZW5kaWYKLS0gCjIuMS40CgpfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0 CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9w Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wg0-f54.google.com (mail-wg0-f54.google.com [74.125.82.54]) by kanga.kvack.org (Postfix) with ESMTP id A82966B0075 for ; Wed, 6 May 2015 03:28:30 -0400 (EDT) Received: by wgiu9 with SMTP id u9so1705056wgi.3 for ; Wed, 06 May 2015 00:28:30 -0700 (PDT) Received: from mx2.suse.de (cantor2.suse.de. [195.135.220.15]) by mx.google.com with ESMTPS id ej3si351233wib.116.2015.05.06.00.28.24 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 06 May 2015 00:28:25 -0700 (PDT) From: Jan Kara Subject: [PATCH 4/9] vb2: Provide helpers for mapping virtual addresses Date: Wed, 6 May 2015 09:28:11 +0200 Message-Id: <1430897296-5469-5-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 Provide simple helper functions to map virtual address range into an array of pfns / pages. Acked-by: Marek Szyprowski Tested-by: Marek Szyprowski Signed-off-by: Jan Kara --- drivers/media/v4l2-core/videobuf2-memops.c | 58 ++++++++++++++++++++++++++++++ include/media/videobuf2-memops.h | 5 +++ 2 files changed, 63 insertions(+) diff --git a/drivers/media/v4l2-core/videobuf2-memops.c b/drivers/media/v4l2-core/videobuf2-memops.c index 81c1ad8b2cf1..0ec186d41b9b 100644 --- a/drivers/media/v4l2-core/videobuf2-memops.c +++ b/drivers/media/v4l2-core/videobuf2-memops.c @@ -137,6 +137,64 @@ int vb2_get_contig_userptr(unsigned long vaddr, unsigned long size, EXPORT_SYMBOL_GPL(vb2_get_contig_userptr); /** + * vb2_create_framevec() - map virtual addresses to pfns + * @start: Virtual user address where we start mapping + * @length: Length of a range to map + * @write: Should we map for writing into the area + * + * This function allocates and fills in a vector with pfns corresponding to + * virtual address range passed in arguments. If pfns have corresponding pages, + * page references are also grabbed to pin pages in memory. The function + * returns pointer to the vector on success and error pointer in case of + * failure. Returned vector needs to be freed via vb2_destroy_pfnvec(). + */ +struct frame_vector *vb2_create_framevec(unsigned long start, + unsigned long length, + bool write) +{ + int ret; + unsigned long first, last; + unsigned long nr; + struct frame_vector *vec; + + first = start >> PAGE_SHIFT; + last = (start + length - 1) >> PAGE_SHIFT; + nr = last - first + 1; + vec = frame_vector_create(nr); + if (!vec) + return ERR_PTR(-ENOMEM); + ret = get_vaddr_frames(start, nr, write, 1, vec); + if (ret < 0) + goto out_destroy; + /* We accept only complete set of PFNs */ + if (ret != nr) { + ret = -EFAULT; + goto out_release; + } + return vec; +out_release: + put_vaddr_frames(vec); +out_destroy: + frame_vector_destroy(vec); + return ERR_PTR(ret); +} +EXPORT_SYMBOL(vb2_create_framevec); + +/** + * vb2_destroy_framevec() - release vector of mapped pfns + * @vec: vector of pfns / pages to release + * + * This releases references to all pages in the vector @vec (if corresponding + * pfns are backed by pages) and frees the passed vector. + */ +void vb2_destroy_framevec(struct frame_vector *vec) +{ + put_vaddr_frames(vec); + frame_vector_destroy(vec); +} +EXPORT_SYMBOL(vb2_destroy_framevec); + +/** * vb2_common_vm_open() - increase refcount of the vma * @vma: virtual memory region for the mapping * diff --git a/include/media/videobuf2-memops.h b/include/media/videobuf2-memops.h index f05444ca8c0c..2f0564ff5f31 100644 --- a/include/media/videobuf2-memops.h +++ b/include/media/videobuf2-memops.h @@ -15,6 +15,7 @@ #define _MEDIA_VIDEOBUF2_MEMOPS_H #include +#include /** * vb2_vmarea_handler - common vma refcount tracking handler @@ -36,5 +37,9 @@ int vb2_get_contig_userptr(unsigned long vaddr, unsigned long size, struct vm_area_struct *vb2_get_vma(struct vm_area_struct *vma); void vb2_put_vma(struct vm_area_struct *vma); +struct frame_vector *vb2_create_framevec(unsigned long start, + unsigned long length, + bool write); +void vb2_destroy_framevec(struct frame_vector *vec); #endif -- 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