From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from cantor2.suse.de ([195.135.220.15]:43238 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754187AbbCQL5C (ORCPT ); Tue, 17 Mar 2015 07:57:02 -0400 From: Jan Kara To: linux-media@vger.kernel.org Cc: Hans Verkuil , Mauro Carvalho Chehab , linux-mm@kvack.org, dri-devel@lists.freedesktop.org, David Airlie , Jan Kara Subject: [PATCH 5/9] media: vb2: Convert vb2_dma_sg_get_userptr() to use pinned pfns Date: Tue, 17 Mar 2015 12:56:35 +0100 Message-Id: <1426593399-6549-6-git-send-email-jack@suse.cz> In-Reply-To: <1426593399-6549-1-git-send-email-jack@suse.cz> References: <1426593399-6549-1-git-send-email-jack@suse.cz> Sender: linux-media-owner@vger.kernel.org List-ID: 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 71510e4f7d7c..cc82c30d02cf 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 pinned_pfns *pfns; 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 pinned_pfns *pfns; 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; + pfns = vb2_create_pfnvec(vaddr, size, buf->dma_dir == DMA_FROM_DEVICE); + if (IS_ERR(pfns)) + goto userptr_fail_pfnvec; + buf->pfns = pfns; - 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; + if (pfns_vector_to_pages(pfns)) + goto userptr_fail_sgtable; + buf->pages = pfns_vector_pages(pfns); + buf->num_pages = pfns_vector_count(pfns); 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_pfnvec(pfns); +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_pfnvec(buf->pfns); kfree(buf); } -- 2.1.4 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-we0-f179.google.com (mail-we0-f179.google.com [74.125.82.179]) by kanga.kvack.org (Postfix) with ESMTP id 13705900016 for ; Tue, 17 Mar 2015 07:57:24 -0400 (EDT) Received: by webcq43 with SMTP id cq43so5727177web.2 for ; Tue, 17 Mar 2015 04:57:23 -0700 (PDT) Received: from mx2.suse.de (cantor2.suse.de. [195.135.220.15]) by mx.google.com with ESMTPS id cq1si2869811wib.21.2015.03.17.04.57.01 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 17 Mar 2015 04:57:02 -0700 (PDT) From: Jan Kara Subject: [PATCH 5/9] media: vb2: Convert vb2_dma_sg_get_userptr() to use pinned pfns Date: Tue, 17 Mar 2015 12:56:35 +0100 Message-Id: <1426593399-6549-6-git-send-email-jack@suse.cz> In-Reply-To: <1426593399-6549-1-git-send-email-jack@suse.cz> References: <1426593399-6549-1-git-send-email-jack@suse.cz> Sender: owner-linux-mm@kvack.org List-ID: To: linux-media@vger.kernel.org Cc: Hans Verkuil , Mauro Carvalho Chehab , linux-mm@kvack.org, dri-devel@lists.freedesktop.org, David Airlie , Jan Kara 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 71510e4f7d7c..cc82c30d02cf 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 pinned_pfns *pfns; 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 pinned_pfns *pfns; 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; + pfns = vb2_create_pfnvec(vaddr, size, buf->dma_dir == DMA_FROM_DEVICE); + if (IS_ERR(pfns)) + goto userptr_fail_pfnvec; + buf->pfns = pfns; - 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; + if (pfns_vector_to_pages(pfns)) + goto userptr_fail_sgtable; + buf->pages = pfns_vector_pages(pfns); + buf->num_pages = pfns_vector_count(pfns); 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_pfnvec(pfns); +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_pfnvec(buf->pfns); 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 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 pinned pfns Date: Tue, 17 Mar 2015 12:56:35 +0100 Message-ID: <1426593399-6549-6-git-send-email-jack@suse.cz> References: <1426593399-6549-1-git-send-email-jack@suse.cz> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by gabe.freedesktop.org (Postfix) with ESMTP id C8AA26E692 for ; Tue, 17 Mar 2015 04:57:01 -0700 (PDT) In-Reply-To: <1426593399-6549-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-media@vger.kernel.org Cc: Jan Kara , Mauro Carvalho Chehab , dri-devel@lists.freedesktop.org, linux-mm@kvack.org, Hans Verkuil List-Id: dri-devel@lists.freedesktop.org U2lnbmVkLW9mZi1ieTogSmFuIEthcmEgPGphY2tAc3VzZS5jej4KLS0tCiBkcml2ZXJzL21lZGlh L3Y0bDItY29yZS92aWRlb2J1ZjItZG1hLXNnLmMgfCA5NyArKysrKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCAxNSBpbnNlcnRpb25zKCspLCA4MiBkZWxldGlvbnMo LSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92aWRlb2J1ZjItZG1hLXNn LmMgYi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92aWRlb2J1ZjItZG1hLXNnLmMKaW5kZXggNzE1 MTBlNGY3ZDdjLi5jYzgyYzMwZDAyY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdjRsMi1j b3JlL3ZpZGVvYnVmMi1kbWEtc2cuYworKysgYi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92aWRl b2J1ZjItZG1hLXNnLmMKQEAgLTM4LDYgKzM4LDcgQEAgc3RydWN0IHZiMl9kbWFfc2dfYnVmIHsK IAlzdHJ1Y3QgZGV2aWNlCQkJKmRldjsKIAl2b2lkCQkJCSp2YWRkcjsKIAlzdHJ1Y3QgcGFnZQkJ CSoqcGFnZXM7CisJc3RydWN0IHBpbm5lZF9wZm5zCQkqcGZuczsKIAlpbnQJCQkJb2Zmc2V0Owog CWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uCQlkbWFfZGlyOwogCXN0cnVjdCBzZ190YWJsZQkJCXNn X3RhYmxlOwpAQCAtNTEsNyArNTIsNiBAQCBzdHJ1Y3QgdmIyX2RtYV9zZ19idWYgewogCXVuc2ln bmVkIGludAkJCW51bV9wYWdlczsKIAlhdG9taWNfdAkJCXJlZmNvdW50OwogCXN0cnVjdCB2YjJf dm1hcmVhX2hhbmRsZXIJaGFuZGxlcjsKLQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QJCSp2bWE7CiAK IAlzdHJ1Y3QgZG1hX2J1Zl9hdHRhY2htZW50CSpkYl9hdHRhY2g7CiB9OwpAQCAtMjI0LDI1ICsy MjQsMTcgQEAgc3RhdGljIHZvaWQgdmIyX2RtYV9zZ19maW5pc2godm9pZCAqYnVmX3ByaXYpCiAJ ZG1hX3N5bmNfc2dfZm9yX2NwdShidWYtPmRldiwgc2d0LT5zZ2wsIHNndC0+bmVudHMsIGJ1Zi0+ ZG1hX2Rpcik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHZtYV9pc19pbyhzdHJ1Y3Qgdm1fYXJl YV9zdHJ1Y3QgKnZtYSkKLXsKLQlyZXR1cm4gISEodm1hLT52bV9mbGFncyAmIChWTV9JTyB8IFZN X1BGTk1BUCkpOwotfQotCiBzdGF0aWMgdm9pZCAqdmIyX2RtYV9zZ19nZXRfdXNlcnB0cih2b2lk ICphbGxvY19jdHgsIHVuc2lnbmVkIGxvbmcgdmFkZHIsCiAJCQkJICAgIHVuc2lnbmVkIGxvbmcg c2l6ZSwKIAkJCQkgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZG1hX2RpcikKIHsKIAlzdHJ1 Y3QgdmIyX2RtYV9zZ19jb25mICpjb25mID0gYWxsb2NfY3R4OwogCXN0cnVjdCB2YjJfZG1hX3Nn X2J1ZiAqYnVmOwotCXVuc2lnbmVkIGxvbmcgZmlyc3QsIGxhc3Q7Ci0JaW50IG51bV9wYWdlc19m cm9tX3VzZXI7Ci0Jc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiAJc3RydWN0IHNnX3RhYmxl ICpzZ3Q7CiAJREVGSU5FX0RNQV9BVFRSUyhhdHRycyk7CisJc3RydWN0IHBpbm5lZF9wZm5zICpw Zm5zOwogCiAJZG1hX3NldF9hdHRyKERNQV9BVFRSX1NLSVBfQ1BVX1NZTkMsICZhdHRycyk7Ci0K IAlidWYgPSBremFsbG9jKHNpemVvZiAqYnVmLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZikKIAkJ cmV0dXJuIE5VTEw7CkBAIC0yNTMsNjMgKzI0NSwxOSBAQCBzdGF0aWMgdm9pZCAqdmIyX2RtYV9z Z19nZXRfdXNlcnB0cih2b2lkICphbGxvY19jdHgsIHVuc2lnbmVkIGxvbmcgdmFkZHIsCiAJYnVm LT5vZmZzZXQgPSB2YWRkciAmIH5QQUdFX01BU0s7CiAJYnVmLT5zaXplID0gc2l6ZTsKIAlidWYt PmRtYV9zZ3QgPSAmYnVmLT5zZ190YWJsZTsKKwlwZm5zID0gdmIyX2NyZWF0ZV9wZm52ZWModmFk ZHIsIHNpemUsIGJ1Zi0+ZG1hX2RpciA9PSBETUFfRlJPTV9ERVZJQ0UpOworCWlmIChJU19FUlIo cGZucykpCisJCWdvdG8gdXNlcnB0cl9mYWlsX3BmbnZlYzsKKwlidWYtPnBmbnMgPSBwZm5zOwog Ci0JZmlyc3QgPSAodmFkZHIgICAgICAgICAgICYgUEFHRV9NQVNLKSA+PiBQQUdFX1NISUZUOwot CWxhc3QgID0gKCh2YWRkciArIHNpemUgLSAxKSAmIFBBR0VfTUFTSykgPj4gUEFHRV9TSElGVDsK LQlidWYtPm51bV9wYWdlcyA9IGxhc3QgLSBmaXJzdCArIDE7Ci0KLQlidWYtPnBhZ2VzID0ga3ph bGxvYyhidWYtPm51bV9wYWdlcyAqIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSwKLQkJCSAgICAgR0ZQ X0tFUk5FTCk7Ci0JaWYgKCFidWYtPnBhZ2VzKQotCQlnb3RvIHVzZXJwdHJfZmFpbF9hbGxvY19w YWdlczsKLQotCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQl2bWEgPSBmaW5k X3ZtYShjdXJyZW50LT5tbSwgdmFkZHIpOwotCWlmICghdm1hKSB7Ci0JCWRwcmludGsoMSwgIm5v IHZtYSBmb3IgYWRkcmVzcyAlbHVcbiIsIHZhZGRyKTsKLQkJZ290byB1c2VycHRyX2ZhaWxfZmlu ZF92bWE7Ci0JfQotCi0JaWYgKHZtYS0+dm1fZW5kIDwgdmFkZHIgKyBzaXplKSB7Ci0JCWRwcmlu dGsoMSwgInZtYSBhdCAlbHUgaXMgdG9vIHNtYWxsIGZvciAlbHUgYnl0ZXNcbiIsCi0JCQl2YWRk ciwgc2l6ZSk7Ci0JCWdvdG8gdXNlcnB0cl9mYWlsX2ZpbmRfdm1hOwotCX0KLQotCWJ1Zi0+dm1h ID0gdmIyX2dldF92bWEodm1hKTsKLQlpZiAoIWJ1Zi0+dm1hKSB7Ci0JCWRwcmludGsoMSwgImZh aWxlZCB0byBjb3B5IHZtYVxuIik7Ci0JCWdvdG8gdXNlcnB0cl9mYWlsX2ZpbmRfdm1hOwotCX0K LQotCWlmICh2bWFfaXNfaW8oYnVmLT52bWEpKSB7Ci0JCWZvciAobnVtX3BhZ2VzX2Zyb21fdXNl ciA9IDA7Ci0JCSAgICAgbnVtX3BhZ2VzX2Zyb21fdXNlciA8IGJ1Zi0+bnVtX3BhZ2VzOwotCQkg ICAgICsrbnVtX3BhZ2VzX2Zyb21fdXNlciwgdmFkZHIgKz0gUEFHRV9TSVpFKSB7Ci0JCQl1bnNp Z25lZCBsb25nIHBmbjsKLQotCQkJaWYgKGZvbGxvd19wZm4odm1hLCB2YWRkciwgJnBmbikpIHsK LQkJCQlkcHJpbnRrKDEsICJubyBwYWdlIGZvciBhZGRyZXNzICVsdVxuIiwgdmFkZHIpOwotCQkJ CWJyZWFrOwotCQkJfQotCQkJYnVmLT5wYWdlc1tudW1fcGFnZXNfZnJvbV91c2VyXSA9IHBmbl90 b19wYWdlKHBmbik7Ci0JCX0KLQl9IGVsc2UKLQkJbnVtX3BhZ2VzX2Zyb21fdXNlciA9IGdldF91 c2VyX3BhZ2VzKGN1cnJlbnQsIGN1cnJlbnQtPm1tLAotCQkJCQkgICAgIHZhZGRyICYgUEFHRV9N QVNLLAotCQkJCQkgICAgIGJ1Zi0+bnVtX3BhZ2VzLAotCQkJCQkgICAgIGJ1Zi0+ZG1hX2RpciA9 PSBETUFfRlJPTV9ERVZJQ0UsCi0JCQkJCSAgICAgMSwgLyogZm9yY2UgKi8KLQkJCQkJICAgICBi dWYtPnBhZ2VzLAotCQkJCQkgICAgIE5VTEwpOwotCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFw X3NlbSk7Ci0KLQlpZiAobnVtX3BhZ2VzX2Zyb21fdXNlciAhPSBidWYtPm51bV9wYWdlcykKLQkJ Z290byB1c2VycHRyX2ZhaWxfZ2V0X3VzZXJfcGFnZXM7CisJaWYgKHBmbnNfdmVjdG9yX3RvX3Bh Z2VzKHBmbnMpKQorCQlnb3RvIHVzZXJwdHJfZmFpbF9zZ3RhYmxlOworCWJ1Zi0+cGFnZXMgPSBw Zm5zX3ZlY3Rvcl9wYWdlcyhwZm5zKTsKKwlidWYtPm51bV9wYWdlcyA9IHBmbnNfdmVjdG9yX2Nv dW50KHBmbnMpOwogCiAJaWYgKHNnX2FsbG9jX3RhYmxlX2Zyb21fcGFnZXMoYnVmLT5kbWFfc2d0 LCBidWYtPnBhZ2VzLAogCQkJYnVmLT5udW1fcGFnZXMsIGJ1Zi0+b2Zmc2V0LCBzaXplLCAwKSkK LQkJZ290byB1c2VycHRyX2ZhaWxfYWxsb2NfdGFibGVfZnJvbV9wYWdlczsKKwkJZ290byB1c2Vy cHRyX2ZhaWxfc2d0YWJsZTsKIAogCXNndCA9ICZidWYtPnNnX3RhYmxlOwogCS8qCkBAIC0zMjMs MTkgKzI3MSw5IEBAIHN0YXRpYyB2b2lkICp2YjJfZG1hX3NnX2dldF91c2VycHRyKHZvaWQgKmFs bG9jX2N0eCwgdW5zaWduZWQgbG9uZyB2YWRkciwKIAogdXNlcnB0cl9mYWlsX21hcDoKIAlzZ19m cmVlX3RhYmxlKCZidWYtPnNnX3RhYmxlKTsKLXVzZXJwdHJfZmFpbF9hbGxvY190YWJsZV9mcm9t X3BhZ2VzOgotdXNlcnB0cl9mYWlsX2dldF91c2VyX3BhZ2VzOgotCWRwcmludGsoMSwgImdldF91 c2VyX3BhZ2VzIHJlcXVlc3RlZC9nb3Q6ICVkLyVkXVxuIiwKLQkJYnVmLT5udW1fcGFnZXMsIG51 bV9wYWdlc19mcm9tX3VzZXIpOwotCWlmICghdm1hX2lzX2lvKGJ1Zi0+dm1hKSkKLQkJd2hpbGUg KC0tbnVtX3BhZ2VzX2Zyb21fdXNlciA+PSAwKQotCQkJcHV0X3BhZ2UoYnVmLT5wYWdlc1tudW1f cGFnZXNfZnJvbV91c2VyXSk7Ci0JZG93bl9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwot CXZiMl9wdXRfdm1hKGJ1Zi0+dm1hKTsKLXVzZXJwdHJfZmFpbF9maW5kX3ZtYToKLQl1cF9yZWFk KCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCWtmcmVlKGJ1Zi0+cGFnZXMpOwotdXNlcnB0cl9m YWlsX2FsbG9jX3BhZ2VzOgordXNlcnB0cl9mYWlsX3NndGFibGU6CisJdmIyX2Rlc3Ryb3lfcGZu dmVjKHBmbnMpOwordXNlcnB0cl9mYWlsX3BmbnZlYzoKIAlrZnJlZShidWYpOwogCXJldHVybiBO VUxMOwogfQpAQCAtMzYyLDEzICszMDAsOCBAQCBzdGF0aWMgdm9pZCB2YjJfZG1hX3NnX3B1dF91 c2VycHRyKHZvaWQgKmJ1Zl9wcml2KQogCXdoaWxlICgtLWkgPj0gMCkgewogCQlpZiAoYnVmLT5k bWFfZGlyID09IERNQV9GUk9NX0RFVklDRSkKIAkJCXNldF9wYWdlX2RpcnR5X2xvY2soYnVmLT5w YWdlc1tpXSk7Ci0JCWlmICghdm1hX2lzX2lvKGJ1Zi0+dm1hKSkKLQkJCXB1dF9wYWdlKGJ1Zi0+ cGFnZXNbaV0pOwogCX0KLQlrZnJlZShidWYtPnBhZ2VzKTsKLQlkb3duX3JlYWQoJmN1cnJlbnQt Pm1tLT5tbWFwX3NlbSk7Ci0JdmIyX3B1dF92bWEoYnVmLT52bWEpOwotCXVwX3JlYWQoJmN1cnJl bnQtPm1tLT5tbWFwX3NlbSk7CisJdmIyX2Rlc3Ryb3lfcGZudmVjKGJ1Zi0+cGZucyk7CiAJa2Zy ZWUoYnVmKTsKIH0KIAotLSAKMi4xLjQKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZy ZWVkZXNrdG9wLm9yZwpodHRwOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGlu Zm8vZHJpLWRldmVsCg==