From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1CE01C5DF61 for ; Thu, 7 Nov 2019 11:15:55 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id D5A0F21882 for ; Thu, 7 Nov 2019 11:15:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388417AbfKGLPx (ORCPT ); Thu, 7 Nov 2019 06:15:53 -0500 Received: from mx2.suse.de ([195.135.220.15]:39060 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727528AbfKGLPu (ORCPT ); Thu, 7 Nov 2019 06:15:50 -0500 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id A1728B3C0; Thu, 7 Nov 2019 11:15:48 +0000 (UTC) From: Juergen Gross To: xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org Cc: Juergen Gross , Boris Ostrovsky , Stefano Stabellini Subject: [PATCH v2 1/2] xen/gntdev: replace global limit of mapped pages by limit per call Date: Thu, 7 Nov 2019 12:15:45 +0100 Message-Id: <20191107111546.26579-2-jgross@suse.com> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20191107111546.26579-1-jgross@suse.com> References: <20191107111546.26579-1-jgross@suse.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Today there is a global limit of pages mapped via /dev/xen/gntdev set to 1 million pages per default. There is no reason why that limit is existing, as total number of grant mappings is limited by the hypervisor anyway and preferring kernel mappings over userspace ones doesn't make sense. It should be noted that the gntdev device is usable by root only. Additionally checking of that limit is fragile, as the number of pages to map via one call is specified in a 32-bit unsigned variable which isn't tested to stay within reasonable limits (the only test is the value to be <= zero, which basically excludes only calls without any mapping requested). So trying to map e.g. 0xffff0000 pages while already nearly 1000000 pages are mapped will effectively lower the global number of mapped pages such that a parallel call mapping a reasonable amount of pages can succeed in spite of the global limit being violated. So drop the global limit and introduce per call limit instead. This per call limit (default: 65536 grant mappings) protects against allocating insane large arrays in the kernel for doing a hypercall which will fail anyway in case a user is e.g. trying to map billions of pages. Signed-off-by: Juergen Gross Reviewed-by: Oleksandr Andrushchenko --- drivers/xen/gntdev-common.h | 2 +- drivers/xen/gntdev-dmabuf.c | 11 +++-------- drivers/xen/gntdev.c | 24 +++++++----------------- 3 files changed, 11 insertions(+), 26 deletions(-) diff --git a/drivers/xen/gntdev-common.h b/drivers/xen/gntdev-common.h index 2f8b949c3eeb..0e5d4660e7b8 100644 --- a/drivers/xen/gntdev-common.h +++ b/drivers/xen/gntdev-common.h @@ -87,7 +87,7 @@ void gntdev_add_map(struct gntdev_priv *priv, struct gntdev_grant_map *add); void gntdev_put_map(struct gntdev_priv *priv, struct gntdev_grant_map *map); -bool gntdev_account_mapped_pages(int count); +bool gntdev_test_page_count(unsigned int count); int gntdev_map_grant_pages(struct gntdev_grant_map *map); diff --git a/drivers/xen/gntdev-dmabuf.c b/drivers/xen/gntdev-dmabuf.c index 2c4f324f8626..63f0857bf62d 100644 --- a/drivers/xen/gntdev-dmabuf.c +++ b/drivers/xen/gntdev-dmabuf.c @@ -446,7 +446,7 @@ dmabuf_exp_alloc_backing_storage(struct gntdev_priv *priv, int dmabuf_flags, { struct gntdev_grant_map *map; - if (unlikely(count <= 0)) + if (unlikely(gntdev_test_page_count(count))) return ERR_PTR(-EINVAL); if ((dmabuf_flags & GNTDEV_DMA_FLAG_WC) && @@ -459,11 +459,6 @@ dmabuf_exp_alloc_backing_storage(struct gntdev_priv *priv, int dmabuf_flags, if (!map) return ERR_PTR(-ENOMEM); - if (unlikely(gntdev_account_mapped_pages(count))) { - pr_debug("can't map %d pages: over limit\n", count); - gntdev_put_map(NULL, map); - return ERR_PTR(-ENOMEM); - } return map; } @@ -771,7 +766,7 @@ long gntdev_ioctl_dmabuf_exp_from_refs(struct gntdev_priv *priv, int use_ptemod, if (copy_from_user(&op, u, sizeof(op)) != 0) return -EFAULT; - if (unlikely(op.count <= 0)) + if (unlikely(gntdev_test_page_count(op.count))) return -EINVAL; refs = kcalloc(op.count, sizeof(*refs), GFP_KERNEL); @@ -818,7 +813,7 @@ long gntdev_ioctl_dmabuf_imp_to_refs(struct gntdev_priv *priv, if (copy_from_user(&op, u, sizeof(op)) != 0) return -EFAULT; - if (unlikely(op.count <= 0)) + if (unlikely(gntdev_test_page_count(op.count))) return -EINVAL; gntdev_dmabuf = dmabuf_imp_to_refs(priv->dmabuf_priv, diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c index 81401f386c9c..0578d369e537 100644 --- a/drivers/xen/gntdev.c +++ b/drivers/xen/gntdev.c @@ -55,12 +55,10 @@ MODULE_AUTHOR("Derek G. Murray , " "Gerd Hoffmann "); MODULE_DESCRIPTION("User-space granted page access driver"); -static int limit = 1024*1024; -module_param(limit, int, 0644); -MODULE_PARM_DESC(limit, "Maximum number of grants that may be mapped by " - "the gntdev device"); - -static atomic_t pages_mapped = ATOMIC_INIT(0); +static unsigned int limit = 64*1024; +module_param(limit, uint, 0644); +MODULE_PARM_DESC(limit, + "Maximum number of grants that may be mapped by one mapping request"); static int use_ptemod; #define populate_freeable_maps use_ptemod @@ -72,9 +70,9 @@ static struct miscdevice gntdev_miscdev; /* ------------------------------------------------------------------ */ -bool gntdev_account_mapped_pages(int count) +bool gntdev_test_page_count(unsigned int count) { - return atomic_add_return(count, &pages_mapped) > limit; + return !count || count > limit; } static void gntdev_print_maps(struct gntdev_priv *priv, @@ -242,8 +240,6 @@ void gntdev_put_map(struct gntdev_priv *priv, struct gntdev_grant_map *map) if (!refcount_dec_and_test(&map->users)) return; - atomic_sub(map->count, &pages_mapped); - if (map->notify.flags & UNMAP_NOTIFY_SEND_EVENT) { notify_remote_via_evtchn(map->notify.event); evtchn_put(map->notify.event); @@ -668,7 +664,7 @@ static long gntdev_ioctl_map_grant_ref(struct gntdev_priv *priv, if (copy_from_user(&op, u, sizeof(op)) != 0) return -EFAULT; pr_debug("priv %p, add %d\n", priv, op.count); - if (unlikely(op.count <= 0)) + if (unlikely(gntdev_test_page_count(op.count))) return -EINVAL; err = -ENOMEM; @@ -676,12 +672,6 @@ static long gntdev_ioctl_map_grant_ref(struct gntdev_priv *priv, if (!map) return err; - if (unlikely(gntdev_account_mapped_pages(op.count))) { - pr_debug("can't map: over limit\n"); - gntdev_put_map(NULL, map); - return err; - } - if (copy_from_user(map->grants, &u->refs, sizeof(map->grants[0]) * op.count) != 0) { gntdev_put_map(NULL, map); -- 2.16.4 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D4581C5DF61 for ; Thu, 7 Nov 2019 11:16:24 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id B0ACA2187F for ; Thu, 7 Nov 2019 11:16:24 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B0ACA2187F Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1iSflZ-0001WG-6k; Thu, 07 Nov 2019 11:15:53 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1iSflY-0001Vq-0r for xen-devel@lists.xenproject.org; Thu, 07 Nov 2019 11:15:52 +0000 X-Inumbo-ID: f3cc88ac-014f-11ea-b678-bc764e2007e4 Received: from mx1.suse.de (unknown [195.135.220.15]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id f3cc88ac-014f-11ea-b678-bc764e2007e4; Thu, 07 Nov 2019 11:15:49 +0000 (UTC) X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id A1728B3C0; Thu, 7 Nov 2019 11:15:48 +0000 (UTC) From: Juergen Gross To: xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org Date: Thu, 7 Nov 2019 12:15:45 +0100 Message-Id: <20191107111546.26579-2-jgross@suse.com> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20191107111546.26579-1-jgross@suse.com> References: <20191107111546.26579-1-jgross@suse.com> Subject: [Xen-devel] [PATCH v2 1/2] xen/gntdev: replace global limit of mapped pages by limit per call X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Juergen Gross , Boris Ostrovsky , Stefano Stabellini MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" VG9kYXkgdGhlcmUgaXMgYSBnbG9iYWwgbGltaXQgb2YgcGFnZXMgbWFwcGVkIHZpYSAvZGV2L3hl bi9nbnRkZXYgc2V0CnRvIDEgbWlsbGlvbiBwYWdlcyBwZXIgZGVmYXVsdC4gVGhlcmUgaXMgbm8g cmVhc29uIHdoeSB0aGF0IGxpbWl0IGlzCmV4aXN0aW5nLCBhcyB0b3RhbCBudW1iZXIgb2YgZ3Jh bnQgbWFwcGluZ3MgaXMgbGltaXRlZCBieSB0aGUKaHlwZXJ2aXNvciBhbnl3YXkgYW5kIHByZWZl cnJpbmcga2VybmVsIG1hcHBpbmdzIG92ZXIgdXNlcnNwYWNlIG9uZXMKZG9lc24ndCBtYWtlIHNl bnNlLiBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGUgZ250ZGV2IGRldmljZSBpcwp1c2FibGUg Ynkgcm9vdCBvbmx5LgoKQWRkaXRpb25hbGx5IGNoZWNraW5nIG9mIHRoYXQgbGltaXQgaXMgZnJh Z2lsZSwgYXMgdGhlIG51bWJlciBvZiBwYWdlcwp0byBtYXAgdmlhIG9uZSBjYWxsIGlzIHNwZWNp ZmllZCBpbiBhIDMyLWJpdCB1bnNpZ25lZCB2YXJpYWJsZSB3aGljaAppc24ndCB0ZXN0ZWQgdG8g c3RheSB3aXRoaW4gcmVhc29uYWJsZSBsaW1pdHMgKHRoZSBvbmx5IHRlc3QgaXMgdGhlCnZhbHVl IHRvIGJlIDw9IHplcm8sIHdoaWNoIGJhc2ljYWxseSBleGNsdWRlcyBvbmx5IGNhbGxzIHdpdGhv dXQgYW55Cm1hcHBpbmcgcmVxdWVzdGVkKS4gU28gdHJ5aW5nIHRvIG1hcCBlLmcuIDB4ZmZmZjAw MDAgcGFnZXMgd2hpbGUKYWxyZWFkeSBuZWFybHkgMTAwMDAwMCBwYWdlcyBhcmUgbWFwcGVkIHdp bGwgZWZmZWN0aXZlbHkgbG93ZXIgdGhlCmdsb2JhbCBudW1iZXIgb2YgbWFwcGVkIHBhZ2VzIHN1 Y2ggdGhhdCBhIHBhcmFsbGVsIGNhbGwgbWFwcGluZyBhCnJlYXNvbmFibGUgYW1vdW50IG9mIHBh Z2VzIGNhbiBzdWNjZWVkIGluIHNwaXRlIG9mIHRoZSBnbG9iYWwgbGltaXQKYmVpbmcgdmlvbGF0 ZWQuCgpTbyBkcm9wIHRoZSBnbG9iYWwgbGltaXQgYW5kIGludHJvZHVjZSBwZXIgY2FsbCBsaW1p dCBpbnN0ZWFkLiBUaGlzCnBlciBjYWxsIGxpbWl0IChkZWZhdWx0OiA2NTUzNiBncmFudCBtYXBw aW5ncykgcHJvdGVjdHMgYWdhaW5zdAphbGxvY2F0aW5nIGluc2FuZSBsYXJnZSBhcnJheXMgaW4g dGhlIGtlcm5lbCBmb3IgZG9pbmcgYSBoeXBlcmNhbGwKd2hpY2ggd2lsbCBmYWlsIGFueXdheSBp biBjYXNlIGEgdXNlciBpcyBlLmcuIHRyeWluZyB0byBtYXAgYmlsbGlvbnMKb2YgcGFnZXMuCgpT aWduZWQtb2ZmLWJ5OiBKdWVyZ2VuIEdyb3NzIDxqZ3Jvc3NAc3VzZS5jb20+ClJldmlld2VkLWJ5 OiBPbGVrc2FuZHIgQW5kcnVzaGNoZW5rbyA8b2xla3NhbmRyX2FuZHJ1c2hjaGVua29AZXBhbS5j b20+Ci0tLQogZHJpdmVycy94ZW4vZ250ZGV2LWNvbW1vbi5oIHwgIDIgKy0KIGRyaXZlcnMveGVu L2dudGRldi1kbWFidWYuYyB8IDExICsrKy0tLS0tLS0tCiBkcml2ZXJzL3hlbi9nbnRkZXYuYyAg ICAgICAgfCAyNCArKysrKysrLS0tLS0tLS0tLS0tLS0tLS0KIDMgZmlsZXMgY2hhbmdlZCwgMTEg aW5zZXJ0aW9ucygrKSwgMjYgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4v Z250ZGV2LWNvbW1vbi5oIGIvZHJpdmVycy94ZW4vZ250ZGV2LWNvbW1vbi5oCmluZGV4IDJmOGI5 NDljM2VlYi4uMGU1ZDQ2NjBlN2I4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9nbnRkZXYtY29t bW9uLmgKKysrIGIvZHJpdmVycy94ZW4vZ250ZGV2LWNvbW1vbi5oCkBAIC04Nyw3ICs4Nyw3IEBA IHZvaWQgZ250ZGV2X2FkZF9tYXAoc3RydWN0IGdudGRldl9wcml2ICpwcml2LCBzdHJ1Y3QgZ250 ZGV2X2dyYW50X21hcCAqYWRkKTsKIAogdm9pZCBnbnRkZXZfcHV0X21hcChzdHJ1Y3QgZ250ZGV2 X3ByaXYgKnByaXYsIHN0cnVjdCBnbnRkZXZfZ3JhbnRfbWFwICptYXApOwogCi1ib29sIGdudGRl dl9hY2NvdW50X21hcHBlZF9wYWdlcyhpbnQgY291bnQpOworYm9vbCBnbnRkZXZfdGVzdF9wYWdl X2NvdW50KHVuc2lnbmVkIGludCBjb3VudCk7CiAKIGludCBnbnRkZXZfbWFwX2dyYW50X3BhZ2Vz KHN0cnVjdCBnbnRkZXZfZ3JhbnRfbWFwICptYXApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3hl bi9nbnRkZXYtZG1hYnVmLmMgYi9kcml2ZXJzL3hlbi9nbnRkZXYtZG1hYnVmLmMKaW5kZXggMmM0 ZjMyNGY4NjI2Li42M2YwODU3YmY2MmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL2dudGRldi1k bWFidWYuYworKysgYi9kcml2ZXJzL3hlbi9nbnRkZXYtZG1hYnVmLmMKQEAgLTQ0Niw3ICs0NDYs NyBAQCBkbWFidWZfZXhwX2FsbG9jX2JhY2tpbmdfc3RvcmFnZShzdHJ1Y3QgZ250ZGV2X3ByaXYg KnByaXYsIGludCBkbWFidWZfZmxhZ3MsCiB7CiAJc3RydWN0IGdudGRldl9ncmFudF9tYXAgKm1h cDsKIAotCWlmICh1bmxpa2VseShjb3VudCA8PSAwKSkKKwlpZiAodW5saWtlbHkoZ250ZGV2X3Rl c3RfcGFnZV9jb3VudChjb3VudCkpKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAogCWlm ICgoZG1hYnVmX2ZsYWdzICYgR05UREVWX0RNQV9GTEFHX1dDKSAmJgpAQCAtNDU5LDExICs0NTks NiBAQCBkbWFidWZfZXhwX2FsbG9jX2JhY2tpbmdfc3RvcmFnZShzdHJ1Y3QgZ250ZGV2X3ByaXYg KnByaXYsIGludCBkbWFidWZfZmxhZ3MsCiAJaWYgKCFtYXApCiAJCXJldHVybiBFUlJfUFRSKC1F Tk9NRU0pOwogCi0JaWYgKHVubGlrZWx5KGdudGRldl9hY2NvdW50X21hcHBlZF9wYWdlcyhjb3Vu dCkpKSB7Ci0JCXByX2RlYnVnKCJjYW4ndCBtYXAgJWQgcGFnZXM6IG92ZXIgbGltaXRcbiIsIGNv dW50KTsKLQkJZ250ZGV2X3B1dF9tYXAoTlVMTCwgbWFwKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVO T01FTSk7Ci0JfQogCXJldHVybiBtYXA7CiB9CiAKQEAgLTc3MSw3ICs3NjYsNyBAQCBsb25nIGdu dGRldl9pb2N0bF9kbWFidWZfZXhwX2Zyb21fcmVmcyhzdHJ1Y3QgZ250ZGV2X3ByaXYgKnByaXYs IGludCB1c2VfcHRlbW9kLAogCWlmIChjb3B5X2Zyb21fdXNlcigmb3AsIHUsIHNpemVvZihvcCkp ICE9IDApCiAJCXJldHVybiAtRUZBVUxUOwogCi0JaWYgKHVubGlrZWx5KG9wLmNvdW50IDw9IDAp KQorCWlmICh1bmxpa2VseShnbnRkZXZfdGVzdF9wYWdlX2NvdW50KG9wLmNvdW50KSkpCiAJCXJl dHVybiAtRUlOVkFMOwogCiAJcmVmcyA9IGtjYWxsb2Mob3AuY291bnQsIHNpemVvZigqcmVmcyks IEdGUF9LRVJORUwpOwpAQCAtODE4LDcgKzgxMyw3IEBAIGxvbmcgZ250ZGV2X2lvY3RsX2RtYWJ1 Zl9pbXBfdG9fcmVmcyhzdHJ1Y3QgZ250ZGV2X3ByaXYgKnByaXYsCiAJaWYgKGNvcHlfZnJvbV91 c2VyKCZvcCwgdSwgc2l6ZW9mKG9wKSkgIT0gMCkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlpZiAo dW5saWtlbHkob3AuY291bnQgPD0gMCkpCisJaWYgKHVubGlrZWx5KGdudGRldl90ZXN0X3BhZ2Vf Y291bnQob3AuY291bnQpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlnbnRkZXZfZG1hYnVmID0g ZG1hYnVmX2ltcF90b19yZWZzKHByaXYtPmRtYWJ1Zl9wcml2LApkaWZmIC0tZ2l0IGEvZHJpdmVy cy94ZW4vZ250ZGV2LmMgYi9kcml2ZXJzL3hlbi9nbnRkZXYuYwppbmRleCA4MTQwMWYzODZjOWMu LjA1NzhkMzY5ZTUzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vZ250ZGV2LmMKKysrIGIvZHJp dmVycy94ZW4vZ250ZGV2LmMKQEAgLTU1LDEyICs1NSwxMCBAQCBNT0RVTEVfQVVUSE9SKCJEZXJl ayBHLiBNdXJyYXkgPERlcmVrLk11cnJheUBjbC5jYW0uYWMudWs+LCAiCiAJICAgICAgIkdlcmQg SG9mZm1hbm4gPGtyYXhlbEByZWRoYXQuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJVc2Vy LXNwYWNlIGdyYW50ZWQgcGFnZSBhY2Nlc3MgZHJpdmVyIik7CiAKLXN0YXRpYyBpbnQgbGltaXQg PSAxMDI0KjEwMjQ7Ci1tb2R1bGVfcGFyYW0obGltaXQsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFS TV9ERVNDKGxpbWl0LCAiTWF4aW11bSBudW1iZXIgb2YgZ3JhbnRzIHRoYXQgbWF5IGJlIG1hcHBl ZCBieSAiCi0JCSJ0aGUgZ250ZGV2IGRldmljZSIpOwotCi1zdGF0aWMgYXRvbWljX3QgcGFnZXNf bWFwcGVkID0gQVRPTUlDX0lOSVQoMCk7CitzdGF0aWMgdW5zaWduZWQgaW50IGxpbWl0ID0gNjQq MTAyNDsKK21vZHVsZV9wYXJhbShsaW1pdCwgdWludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVND KGxpbWl0LAorCSJNYXhpbXVtIG51bWJlciBvZiBncmFudHMgdGhhdCBtYXkgYmUgbWFwcGVkIGJ5 IG9uZSBtYXBwaW5nIHJlcXVlc3QiKTsKIAogc3RhdGljIGludCB1c2VfcHRlbW9kOwogI2RlZmlu ZSBwb3B1bGF0ZV9mcmVlYWJsZV9tYXBzIHVzZV9wdGVtb2QKQEAgLTcyLDkgKzcwLDkgQEAgc3Rh dGljIHN0cnVjdCBtaXNjZGV2aWNlIGdudGRldl9taXNjZGV2OwogCiAvKiAtLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8K IAotYm9vbCBnbnRkZXZfYWNjb3VudF9tYXBwZWRfcGFnZXMoaW50IGNvdW50KQorYm9vbCBnbnRk ZXZfdGVzdF9wYWdlX2NvdW50KHVuc2lnbmVkIGludCBjb3VudCkKIHsKLQlyZXR1cm4gYXRvbWlj X2FkZF9yZXR1cm4oY291bnQsICZwYWdlc19tYXBwZWQpID4gbGltaXQ7CisJcmV0dXJuICFjb3Vu dCB8fCBjb3VudCA+IGxpbWl0OwogfQogCiBzdGF0aWMgdm9pZCBnbnRkZXZfcHJpbnRfbWFwcyhz dHJ1Y3QgZ250ZGV2X3ByaXYgKnByaXYsCkBAIC0yNDIsOCArMjQwLDYgQEAgdm9pZCBnbnRkZXZf cHV0X21hcChzdHJ1Y3QgZ250ZGV2X3ByaXYgKnByaXYsIHN0cnVjdCBnbnRkZXZfZ3JhbnRfbWFw ICptYXApCiAJaWYgKCFyZWZjb3VudF9kZWNfYW5kX3Rlc3QoJm1hcC0+dXNlcnMpKQogCQlyZXR1 cm47CiAKLQlhdG9taWNfc3ViKG1hcC0+Y291bnQsICZwYWdlc19tYXBwZWQpOwotCiAJaWYgKG1h cC0+bm90aWZ5LmZsYWdzICYgVU5NQVBfTk9USUZZX1NFTkRfRVZFTlQpIHsKIAkJbm90aWZ5X3Jl bW90ZV92aWFfZXZ0Y2huKG1hcC0+bm90aWZ5LmV2ZW50KTsKIAkJZXZ0Y2huX3B1dChtYXAtPm5v dGlmeS5ldmVudCk7CkBAIC02NjgsNyArNjY0LDcgQEAgc3RhdGljIGxvbmcgZ250ZGV2X2lvY3Rs X21hcF9ncmFudF9yZWYoc3RydWN0IGdudGRldl9wcml2ICpwcml2LAogCWlmIChjb3B5X2Zyb21f dXNlcigmb3AsIHUsIHNpemVvZihvcCkpICE9IDApCiAJCXJldHVybiAtRUZBVUxUOwogCXByX2Rl YnVnKCJwcml2ICVwLCBhZGQgJWRcbiIsIHByaXYsIG9wLmNvdW50KTsKLQlpZiAodW5saWtlbHko b3AuY291bnQgPD0gMCkpCisJaWYgKHVubGlrZWx5KGdudGRldl90ZXN0X3BhZ2VfY291bnQob3Au Y291bnQpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAllcnIgPSAtRU5PTUVNOwpAQCAtNjc2LDEy ICs2NzIsNiBAQCBzdGF0aWMgbG9uZyBnbnRkZXZfaW9jdGxfbWFwX2dyYW50X3JlZihzdHJ1Y3Qg Z250ZGV2X3ByaXYgKnByaXYsCiAJaWYgKCFtYXApCiAJCXJldHVybiBlcnI7CiAKLQlpZiAodW5s aWtlbHkoZ250ZGV2X2FjY291bnRfbWFwcGVkX3BhZ2VzKG9wLmNvdW50KSkpIHsKLQkJcHJfZGVi dWcoImNhbid0IG1hcDogb3ZlciBsaW1pdFxuIik7Ci0JCWdudGRldl9wdXRfbWFwKE5VTEwsIG1h cCk7Ci0JCXJldHVybiBlcnI7Ci0JfQotCiAJaWYgKGNvcHlfZnJvbV91c2VyKG1hcC0+Z3JhbnRz LCAmdS0+cmVmcywKIAkJCSAgIHNpemVvZihtYXAtPmdyYW50c1swXSkgKiBvcC5jb3VudCkgIT0g MCkgewogCQlnbnRkZXZfcHV0X21hcChOVUxMLCBtYXApOwotLSAKMi4xNi40CgoKX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVsIG1haWxpbmcg bGlzdApYZW4tZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcKaHR0cHM6Ly9saXN0cy54ZW5wcm9q ZWN0Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL3hlbi1kZXZlbA==