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.9 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=unavailable 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 C88B0C17441 for ; Tue, 12 Nov 2019 00:09:26 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 8B15B20840 for ; Tue, 12 Nov 2019 00:09:26 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=nvidia.com header.i=@nvidia.com header.b="M2l68GlZ" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727593AbfKLAJF (ORCPT ); Mon, 11 Nov 2019 19:09:05 -0500 Received: from hqemgate15.nvidia.com ([216.228.121.64]:16736 "EHLO hqemgate15.nvidia.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727497AbfKLAH0 (ORCPT ); Mon, 11 Nov 2019 19:07:26 -0500 Received: from hqpgpgate102.nvidia.com (Not Verified[216.228.121.13]) by hqemgate15.nvidia.com (using TLS: TLSv1.2, DES-CBC3-SHA) id ; Mon, 11 Nov 2019 16:06:20 -0800 Received: from hqmail.nvidia.com ([172.20.161.6]) by hqpgpgate102.nvidia.com (PGP Universal service); Mon, 11 Nov 2019 16:07:22 -0800 X-PGP-Universal: processed; by hqpgpgate102.nvidia.com on Mon, 11 Nov 2019 16:07:22 -0800 Received: from HQMAIL111.nvidia.com (172.20.187.18) by HQMAIL101.nvidia.com (172.20.187.10) with Microsoft SMTP Server (TLS) id 15.0.1473.3; Tue, 12 Nov 2019 00:07:22 +0000 Received: from rnnvemgw01.nvidia.com (10.128.109.123) by HQMAIL111.nvidia.com (172.20.187.18) with Microsoft SMTP Server (TLS) id 15.0.1473.3 via Frontend Transport; Tue, 12 Nov 2019 00:07:21 +0000 Received: from blueforge.nvidia.com (Not Verified[10.110.48.28]) by rnnvemgw01.nvidia.com with Trustwave SEG (v7,5,8,10121) id ; Mon, 11 Nov 2019 16:07:21 -0800 From: John Hubbard To: Andrew Morton CC: Al Viro , Alex Williamson , Benjamin Herrenschmidt , =?UTF-8?q?Bj=C3=B6rn=20T=C3=B6pel?= , Christoph Hellwig , Dan Williams , Daniel Vetter , Dave Chinner , David Airlie , "David S . Miller" , Ira Weiny , Jan Kara , Jason Gunthorpe , Jens Axboe , Jonathan Corbet , =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= , Magnus Karlsson , Mauro Carvalho Chehab , Michael Ellerman , Michal Hocko , Mike Kravetz , Paul Mackerras , Shuah Khan , Vlastimil Babka , , , , , , , , , , , , , LKML , John Hubbard Subject: [PATCH v3 16/23] mm/gup: track FOLL_PIN pages Date: Mon, 11 Nov 2019 16:06:53 -0800 Message-ID: <20191112000700.3455038-17-jhubbard@nvidia.com> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191112000700.3455038-1-jhubbard@nvidia.com> References: <20191112000700.3455038-1-jhubbard@nvidia.com> MIME-Version: 1.0 X-NVConfidentiality: public Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nvidia.com; s=n1; t=1573517180; bh=dYDsBNoCc3j3xBsicl5hq4Ee4AWgl5sCKuYiruAHrxc=; h=X-PGP-Universal:From:To:CC:Subject:Date:Message-ID:X-Mailer: In-Reply-To:References:MIME-Version:X-NVConfidentiality: Content-Type:Content-Transfer-Encoding; b=M2l68GlZ9tIDizsrkHmX0+ursgAdXLIpV7hz5cIywJAQQiCT2xsasfKUOi6L0NM2k OyHFbk547fCcgBYtF/ed1W6GZqddTKvvW0PcCitDxGl3Grj3m8XgsXrzx+s5CcLfGt KheQPIg2O7ieSielszOPk24j7W/l9wqHdJzwzCvVtl/O0qoSKf0KkxMC34EYmd37Aq W0HeiQBNspe+YT6lvjINxNnmInTDOLmH+ZvAnT0SLMC1wvnNozW+6dF60WakZIql2m jnWOeyn9i6VNFcpB18R2lYFT93VVTf0W+yFydT0p5tYBsE3VpXnz6jQjGBW0bITkWZ 9u3r4hhLDDIgQ== Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org Add tracking of pages that were pinned via FOLL_PIN. As mentioned in the FOLL_PIN documentation, callers who effectively set FOLL_PIN are required to ultimately free such pages via put_user_page(). The effect is similar to FOLL_GET, and may be thought of as "FOLL_GET for DIO and/or RDMA use". Pages that have been pinned via FOLL_PIN are identifiable via a new function call: bool page_dma_pinned(struct page *page); What to do in response to encountering such a page, is left to later patchsets. There is discussion about this in [1]. This also changes a BUG_ON(), to a WARN_ON(), in follow_page_mask(). Suggested-by: Jan Kara Suggested-by: J=C3=A9r=C3=B4me Glisse Signed-off-by: John Hubbard --- include/linux/mm.h | 75 ++++++++++++---- include/linux/mmzone.h | 2 + include/linux/page_ref.h | 10 +++ mm/gup.c | 190 +++++++++++++++++++++++++++++++++------ mm/huge_memory.c | 54 ++++++++++- mm/hugetlb.c | 39 +++++++- mm/vmstat.c | 2 + 7 files changed, 322 insertions(+), 50 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index 11e0086d64a4..19b3fa68a4da 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1054,6 +1054,8 @@ static inline __must_check bool try_get_page(struct p= age *page) return true; } =20 +__must_check bool user_page_ref_inc(struct page *page); + static inline void put_page(struct page *page) { page =3D compound_head(page); @@ -1071,31 +1073,70 @@ static inline void put_page(struct page *page) __put_page(page); } =20 -/** - * put_user_page() - release a gup-pinned page - * @page: pointer to page to be released +/* + * GUP_PIN_COUNTING_BIAS, and the associated functions that use it, overlo= ad + * the page's refcount so that two separate items are tracked: the origina= l page + * reference count, and also a new count of how many get_user_pages() call= s were + * made against the page. ("gup-pinned" is another term for the latter). + * + * With this scheme, get_user_pages() becomes special: such pages are mark= ed + * as distinct from normal pages. As such, the new put_user_page() call (a= nd + * its variants) must be used in order to release gup-pinned pages. + * + * Choice of value: * - * Pages that were pinned via get_user_pages*() must be released via - * either put_user_page(), or one of the put_user_pages*() routines - * below. This is so that eventually, pages that are pinned via - * get_user_pages*() can be separately tracked and uniquely handled. In - * particular, interactions with RDMA and filesystems need special - * handling. + * By making GUP_PIN_COUNTING_BIAS a power of two, debugging of page refer= ence + * counts with respect to get_user_pages() and put_user_page() becomes sim= pler, + * due to the fact that adding an even power of two to the page refcount h= as + * the effect of using only the upper N bits, for the code that counts up = using + * the bias value. This means that the lower bits are left for the exclusi= ve + * use of the original code that increments and decrements by one (or at l= east, + * by much smaller values than the bias value). * - * put_user_page() and put_page() are not interchangeable, despite this ea= rly - * implementation that makes them look the same. put_user_page() calls mus= t - * be perfectly matched up with get_user_page() calls. + * Of course, once the lower bits overflow into the upper bits (and this i= s + * OK, because subtraction recovers the original values), then visual insp= ection + * no longer suffices to directly view the separate counts. However, for n= ormal + * applications that don't have huge page reference counts, this won't be = an + * issue. + * + * Locking: the lockless algorithm described in page_cache_get_speculative= () + * and page_cache_gup_pin_speculative() provides safe operation for + * get_user_pages and page_mkclean and other calls that race to set up pag= e + * table entries. */ -static inline void put_user_page(struct page *page) -{ - put_page(page); -} +#define GUP_PIN_COUNTING_BIAS (1UL << 10) =20 +void put_user_page(struct page *page); void put_user_pages_dirty_lock(struct page **pages, unsigned long npages, bool make_dirty); - void put_user_pages(struct page **pages, unsigned long npages); =20 +/** + * page_dma_pinned() - report if a page is pinned for DMA. + * + * This function checks if a page has been pinned via a call to + * pin_user_pages*() or pin_longterm_pages*(). + * + * The return value is partially fuzzy: false is not fuzzy, because it mea= ns + * "definitely not pinned for DMA", but true means "probably pinned for DM= A, but + * possibly a false positive due to having at least GUP_PIN_COUNTING_BIAS = worth + * of normal page references". + * + * False positives are OK, because: a) it's unlikely for a page to get tha= t many + * refcounts, and b) all the callers of this routine are expected to be ab= le to + * deal gracefully with a false positive. + * + * For more information, please see Documentation/vm/pin_user_pages.rst. + * + * @page: pointer to page to be queried. + * @Return: True, if it is likely that the page has been "dma-pinned". + * False, if the page is definitely not dma-pinned. + */ +static inline bool page_dma_pinned(struct page *page) +{ + return (page_ref_count(compound_head(page))) >=3D GUP_PIN_COUNTING_BIAS; +} + #if defined(CONFIG_SPARSEMEM) && !defined(CONFIG_SPARSEMEM_VMEMMAP) #define SECTION_IN_PAGE_FLAGS #endif diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index bda20282746b..0485cba38d23 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -244,6 +244,8 @@ enum node_stat_item { NR_DIRTIED, /* page dirtyings since bootup */ NR_WRITTEN, /* page writings since bootup */ NR_KERNEL_MISC_RECLAIMABLE, /* reclaimable non-slab kernel pages */ + NR_FOLL_PIN_REQUESTED, /* via: pin_user_page(), gup flag: FOLL_PIN */ + NR_FOLL_PIN_RETURNED, /* pages returned via put_user_page() */ NR_VM_NODE_STAT_ITEMS }; =20 diff --git a/include/linux/page_ref.h b/include/linux/page_ref.h index 14d14beb1f7f..b9cbe553d1e7 100644 --- a/include/linux/page_ref.h +++ b/include/linux/page_ref.h @@ -102,6 +102,16 @@ static inline void page_ref_sub(struct page *page, int= nr) __page_ref_mod(page, -nr); } =20 +static inline int page_ref_sub_return(struct page *page, int nr) +{ + int ret =3D atomic_sub_return(nr, &page->_refcount); + + if (page_ref_tracepoint_active(__tracepoint_page_ref_mod)) + __page_ref_mod(page, -nr); + + return ret; +} + static inline void page_ref_inc(struct page *page) { atomic_inc(&page->_refcount); diff --git a/mm/gup.c b/mm/gup.c index ea31810da828..fc164c2ee6b5 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -44,6 +44,95 @@ static inline struct page *try_get_compound_head(struct = page *page, int refs) return head; } =20 +#ifdef CONFIG_DEBUG_VM +static inline void __update_proc_vmstat(struct page *page, + enum node_stat_item item, int count) +{ + mod_node_page_state(page_pgdat(page), item, count); +} +#else +static inline void __update_proc_vmstat(struct page *page, + enum node_stat_item item, int count) +{ +} +#endif + +/** + * user_page_ref_inc() - mark a page as being used by get_user_pages(FOLL_= PIN). + * + * @page: pointer to page to be marked + * @Return: true for success, false for failure + */ +__must_check bool user_page_ref_inc(struct page *page) +{ + page =3D try_get_compound_head(page, GUP_PIN_COUNTING_BIAS); + if (!page) + return false; + + __update_proc_vmstat(page, NR_FOLL_PIN_REQUESTED, 1); + return true; +} + +#ifdef CONFIG_DEV_PAGEMAP_OPS +static bool __put_devmap_managed_user_page(struct page *page) +{ + bool is_devmap =3D page_is_devmap_managed(page); + + if (is_devmap) { + int count =3D page_ref_sub_return(page, GUP_PIN_COUNTING_BIAS); + + __update_proc_vmstat(page, NR_FOLL_PIN_RETURNED, 1); + /* + * devmap page refcounts are 1-based, rather than 0-based: if + * refcount is 1, then the page is free and the refcount is + * stable because nobody holds a reference on the page. + */ + if (count =3D=3D 1) + free_devmap_managed_page(page); + else if (!count) + __put_page(page); + } + + return is_devmap; +} +#else +static bool __put_devmap_managed_user_page(struct page *page) +{ + return false; +} +#endif /* CONFIG_DEV_PAGEMAP_OPS */ + +/** + * put_user_page() - release a gup-pinned page + * @page: pointer to page to be released + * + * Pages that were pinned via get_user_pages*() must be released via + * either put_user_page(), or one of the put_user_pages*() routines + * below. This is so that eventually, pages that are pinned via + * get_user_pages*() can be separately tracked and uniquely handled. In + * particular, interactions with RDMA and filesystems need special + * handling. + */ +void put_user_page(struct page *page) +{ + page =3D compound_head(page); + + /* + * For devmap managed pages we need to catch refcount transition from + * GUP_PIN_COUNTING_BIAS to 1, when refcount reach one it means the + * page is free and we need to inform the device driver through + * callback. See include/linux/memremap.h and HMM for details. + */ + if (__put_devmap_managed_user_page(page)) + return; + + if (page_ref_sub_and_test(page, GUP_PIN_COUNTING_BIAS)) + __put_page(page); + + __update_proc_vmstat(page, NR_FOLL_PIN_RETURNED, 1); +} +EXPORT_SYMBOL(put_user_page); + /** * put_user_pages_dirty_lock() - release and optionally dirty gup-pinned p= ages * @pages: array of pages to be maybe marked dirty, and definitely releas= ed. @@ -230,10 +319,11 @@ static struct page *follow_page_pte(struct vm_area_st= ruct *vma, } =20 page =3D vm_normal_page(vma, address, pte); - if (!page && pte_devmap(pte) && (flags & FOLL_GET)) { + if (!page && pte_devmap(pte) && (flags & (FOLL_GET | FOLL_PIN))) { /* - * Only return device mapping pages in the FOLL_GET case since - * they are only valid while holding the pgmap reference. + * Only return device mapping pages in the FOLL_GET or FOLL_PIN + * case since they are only valid while holding the pgmap + * reference. */ *pgmap =3D get_dev_pagemap(pte_pfn(pte), *pgmap); if (*pgmap) @@ -276,6 +366,11 @@ static struct page *follow_page_pte(struct vm_area_str= uct *vma, page =3D ERR_PTR(-ENOMEM); goto out; } + } else if (flags & FOLL_PIN) { + if (unlikely(!user_page_ref_inc(page))) { + page =3D ERR_PTR(-ENOMEM); + goto out; + } } if (flags & FOLL_TOUCH) { if ((flags & FOLL_WRITE) && @@ -537,8 +632,8 @@ static struct page *follow_page_mask(struct vm_area_str= uct *vma, /* make this handle hugepd */ page =3D follow_huge_addr(mm, address, flags & FOLL_WRITE); if (!IS_ERR(page)) { - BUG_ON(flags & FOLL_GET); - return page; + WARN_ON_ONCE(flags & (FOLL_GET | FOLL_PIN)); + return NULL; } =20 pgd =3D pgd_offset(mm, address); @@ -1830,13 +1925,17 @@ static inline pte_t gup_get_pte(pte_t *ptep) #endif /* CONFIG_GUP_GET_PTE_LOW_HIGH */ =20 static void __maybe_unused undo_dev_pagemap(int *nr, int nr_start, + unsigned int flags, struct page **pages) { while ((*nr) - nr_start) { struct page *page =3D pages[--(*nr)]; =20 ClearPageReferenced(page); - put_page(page); + if (flags & FOLL_PIN) + put_user_page(page); + else + put_page(page); } } =20 @@ -1869,7 +1968,7 @@ static int gup_pte_range(pmd_t pmd, unsigned long add= r, unsigned long end, =20 pgmap =3D get_dev_pagemap(pte_pfn(pte), pgmap); if (unlikely(!pgmap)) { - undo_dev_pagemap(nr, nr_start, pages); + undo_dev_pagemap(nr, nr_start, flags, pages); goto pte_unmap; } } else if (pte_special(pte)) @@ -1878,9 +1977,15 @@ static int gup_pte_range(pmd_t pmd, unsigned long ad= dr, unsigned long end, VM_BUG_ON(!pfn_valid(pte_pfn(pte))); page =3D pte_page(pte); =20 - head =3D try_get_compound_head(page, 1); - if (!head) - goto pte_unmap; + if (flags & FOLL_PIN) { + head =3D page; + if (unlikely(!user_page_ref_inc(head))) + goto pte_unmap; + } else { + head =3D try_get_compound_head(page, 1); + if (!head) + goto pte_unmap; + } =20 if (unlikely(pte_val(pte) !=3D pte_val(*ptep))) { put_page(head); @@ -1934,12 +2039,20 @@ static int __gup_device_huge(unsigned long pfn, uns= igned long addr, =20 pgmap =3D get_dev_pagemap(pfn, pgmap); if (unlikely(!pgmap)) { - undo_dev_pagemap(nr, nr_start, pages); + undo_dev_pagemap(nr, nr_start, flags, pages); return 0; } SetPageReferenced(page); pages[*nr] =3D page; - get_page(page); + + if (flags & FOLL_PIN) { + if (unlikely(!user_page_ref_inc(page))) { + undo_dev_pagemap(nr, nr_start, flags, pages); + return 0; + } + } else + get_page(page); + (*nr)++; pfn++; } while (addr +=3D PAGE_SIZE, addr !=3D end); @@ -1961,7 +2074,7 @@ static int __gup_device_huge_pmd(pmd_t orig, pmd_t *p= mdp, unsigned long addr, return 0; =20 if (unlikely(pmd_val(orig) !=3D pmd_val(*pmdp))) { - undo_dev_pagemap(nr, nr_start, pages); + undo_dev_pagemap(nr, nr_start, flags, pages); return 0; } return 1; @@ -1979,7 +2092,7 @@ static int __gup_device_huge_pud(pud_t orig, pud_t *p= udp, unsigned long addr, return 0; =20 if (unlikely(pud_val(orig) !=3D pud_val(*pudp))) { - undo_dev_pagemap(nr, nr_start, pages); + undo_dev_pagemap(nr, nr_start, flags, pages); return 0; } return 1; @@ -2063,9 +2176,16 @@ static int gup_hugepte(pte_t *ptep, unsigned long sz= , unsigned long addr, page =3D head + ((addr & (sz-1)) >> PAGE_SHIFT); refs =3D __record_subpages(page, addr, end, pages, *nr); =20 - head =3D try_get_compound_head(head, refs); - if (!head) - return 0; + if (flags & FOLL_PIN) { + head =3D page; + if (unlikely(!user_page_ref_inc(head))) + return 0; + head =3D page; + } else { + head =3D try_get_compound_head(head, refs); + if (!head) + return 0; + } =20 if (unlikely(pte_val(pte) !=3D pte_val(*ptep))) { put_compound_head(head, refs); @@ -2122,9 +2242,15 @@ static int gup_huge_pmd(pmd_t orig, pmd_t *pmdp, uns= igned long addr, page =3D pmd_page(orig) + ((addr & ~PMD_MASK) >> PAGE_SHIFT); refs =3D __record_subpages(page, addr, end, pages, *nr); =20 - head =3D try_get_compound_head(pmd_page(orig), refs); - if (!head) - return 0; + if (flags & FOLL_PIN) { + head =3D page; + if (unlikely(!user_page_ref_inc(head))) + return 0; + } else { + head =3D try_get_compound_head(pmd_page(orig), refs); + if (!head) + return 0; + } =20 if (unlikely(pmd_val(orig) !=3D pmd_val(*pmdp))) { put_compound_head(head, refs); @@ -2155,9 +2281,15 @@ static int gup_huge_pud(pud_t orig, pud_t *pudp, uns= igned long addr, page =3D pud_page(orig) + ((addr & ~PUD_MASK) >> PAGE_SHIFT); refs =3D __record_subpages(page, addr, end, pages, *nr); =20 - head =3D try_get_compound_head(pud_page(orig), refs); - if (!head) - return 0; + if (flags & FOLL_PIN) { + head =3D page; + if (unlikely(!user_page_ref_inc(head))) + return 0; + } else { + head =3D try_get_compound_head(pud_page(orig), refs); + if (!head) + return 0; + } =20 if (unlikely(pud_val(orig) !=3D pud_val(*pudp))) { put_compound_head(head, refs); @@ -2183,9 +2315,15 @@ static int gup_huge_pgd(pgd_t orig, pgd_t *pgdp, uns= igned long addr, page =3D pgd_page(orig) + ((addr & ~PGDIR_MASK) >> PAGE_SHIFT); refs =3D __record_subpages(page, addr, end, pages, *nr); =20 - head =3D try_get_compound_head(pgd_page(orig), refs); - if (!head) - return 0; + if (flags & FOLL_PIN) { + head =3D page; + if (unlikely(!user_page_ref_inc(head))) + return 0; + } else { + head =3D try_get_compound_head(pgd_page(orig), refs); + if (!head) + return 0; + } =20 if (unlikely(pgd_val(orig) !=3D pgd_val(*pgdp))) { put_compound_head(head, refs); diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 13cc93785006..4010c269e9e5 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -945,6 +945,11 @@ struct page *follow_devmap_pmd(struct vm_area_struct *= vma, unsigned long addr, */ WARN_ONCE(flags & FOLL_COW, "mm: In follow_devmap_pmd with FOLL_COW set")= ; =20 + /* FOLL_GET and FOLL_PIN are mutually exclusive. */ + if (WARN_ON_ONCE((flags & (FOLL_PIN | FOLL_GET)) =3D=3D + (FOLL_PIN | FOLL_GET))) + return NULL; + if (flags & FOLL_WRITE && !pmd_write(*pmd)) return NULL; =20 @@ -960,7 +965,7 @@ struct page *follow_devmap_pmd(struct vm_area_struct *v= ma, unsigned long addr, * device mapped pages can only be returned if the * caller will manage the page reference count. */ - if (!(flags & FOLL_GET)) + if (!(flags & (FOLL_GET | FOLL_PIN))) return ERR_PTR(-EEXIST); =20 pfn +=3D (addr & ~PMD_MASK) >> PAGE_SHIFT; @@ -968,7 +973,18 @@ struct page *follow_devmap_pmd(struct vm_area_struct *= vma, unsigned long addr, if (!*pgmap) return ERR_PTR(-EFAULT); page =3D pfn_to_page(pfn); - get_page(page); + + if (flags & FOLL_GET) + get_page(page); + else if (flags & FOLL_PIN) { + /* + * user_page_ref_inc() is not actually expected to fail here + * because we hold the pmd lock so no one can unmap the pmd and + * free the page that it points to. + */ + if (unlikely(!user_page_ref_inc(page))) + page =3D ERR_PTR(-EFAULT); + } =20 return page; } @@ -1088,6 +1104,11 @@ struct page *follow_devmap_pud(struct vm_area_struct= *vma, unsigned long addr, if (flags & FOLL_WRITE && !pud_write(*pud)) return NULL; =20 + /* FOLL_GET and FOLL_PIN are mutually exclusive. */ + if (WARN_ON_ONCE((flags & (FOLL_PIN | FOLL_GET)) =3D=3D + (FOLL_PIN | FOLL_GET))) + return NULL; + if (pud_present(*pud) && pud_devmap(*pud)) /* pass */; else @@ -1099,8 +1120,10 @@ struct page *follow_devmap_pud(struct vm_area_struct= *vma, unsigned long addr, /* * device mapped pages can only be returned if the * caller will manage the page reference count. + * + * At least one of FOLL_GET | FOLL_PIN must be set, so assert that here: */ - if (!(flags & FOLL_GET)) + if (!(flags & (FOLL_GET | FOLL_PIN))) return ERR_PTR(-EEXIST); =20 pfn +=3D (addr & ~PUD_MASK) >> PAGE_SHIFT; @@ -1108,7 +1131,18 @@ struct page *follow_devmap_pud(struct vm_area_struct= *vma, unsigned long addr, if (!*pgmap) return ERR_PTR(-EFAULT); page =3D pfn_to_page(pfn); - get_page(page); + + if (flags & FOLL_GET) + get_page(page); + else if (flags & FOLL_PIN) { + /* + * user_page_ref_inc() is not actually expected to fail here + * because we hold the pud lock so no one can unmap the pud and + * free the page that it points to. + */ + if (unlikely(!user_page_ref_inc(page))) + page =3D ERR_PTR(-EFAULT); + } =20 return page; } @@ -1522,8 +1556,20 @@ struct page *follow_trans_huge_pmd(struct vm_area_st= ruct *vma, skip_mlock: page +=3D (addr & ~HPAGE_PMD_MASK) >> PAGE_SHIFT; VM_BUG_ON_PAGE(!PageCompound(page) && !is_zone_device_page(page), page); + if (flags & FOLL_GET) get_page(page); + else if (flags & FOLL_PIN) { + /* + * user_page_ref_inc() is not actually expected to fail here + * because we hold the pmd lock so no one can unmap the pmd and + * free the page that it points to. + */ + if (unlikely(!user_page_ref_inc(page))) { + WARN_ON_ONCE(1); + page =3D NULL; + } + } =20 out: return page; diff --git a/mm/hugetlb.c b/mm/hugetlb.c index b45a95363a84..5ee80eea25e5 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -4462,7 +4462,22 @@ long follow_hugetlb_page(struct mm_struct *mm, struc= t vm_area_struct *vma, same_page: if (pages) { pages[i] =3D mem_map_offset(page, pfn_offset); - get_page(pages[i]); + + if (flags & FOLL_GET) + get_page(pages[i]); + else if (flags & FOLL_PIN) { + /* + * user_page_ref_inc() is not actually expected + * to fail here because we hold the ptl. + */ + if (unlikely(!user_page_ref_inc(pages[i]))) { + spin_unlock(ptl); + remainder =3D 0; + err =3D -ENOMEM; + WARN_ON_ONCE(1); + break; + } + } } =20 if (vmas) @@ -5022,6 +5037,12 @@ follow_huge_pmd(struct mm_struct *mm, unsigned long = address, struct page *page =3D NULL; spinlock_t *ptl; pte_t pte; + + /* FOLL_GET and FOLL_PIN are mutually exclusive. */ + if (WARN_ON_ONCE((flags & (FOLL_PIN | FOLL_GET)) =3D=3D + (FOLL_PIN | FOLL_GET))) + return NULL; + retry: ptl =3D pmd_lockptr(mm, pmd); spin_lock(ptl); @@ -5034,8 +5055,20 @@ follow_huge_pmd(struct mm_struct *mm, unsigned long = address, pte =3D huge_ptep_get((pte_t *)pmd); if (pte_present(pte)) { page =3D pmd_page(*pmd) + ((address & ~PMD_MASK) >> PAGE_SHIFT); + if (flags & FOLL_GET) get_page(page); + else if (flags & FOLL_PIN) { + /* + * user_page_ref_inc() is not actually expected to fail + * here because we hold the ptl. + */ + if (unlikely(!user_page_ref_inc(page))) { + WARN_ON_ONCE(1); + page =3D NULL; + goto out; + } + } } else { if (is_hugetlb_entry_migration(pte)) { spin_unlock(ptl); @@ -5056,7 +5089,7 @@ struct page * __weak follow_huge_pud(struct mm_struct *mm, unsigned long address, pud_t *pud, int flags) { - if (flags & FOLL_GET) + if (flags & (FOLL_GET | FOLL_PIN)) return NULL; =20 return pte_page(*(pte_t *)pud) + ((address & ~PUD_MASK) >> PAGE_SHIFT); @@ -5065,7 +5098,7 @@ follow_huge_pud(struct mm_struct *mm, unsigned long a= ddress, struct page * __weak follow_huge_pgd(struct mm_struct *mm, unsigned long address, pgd_t *pgd, i= nt flags) { - if (flags & FOLL_GET) + if (flags & (FOLL_GET | FOLL_PIN)) return NULL; =20 return pte_page(*(pte_t *)pgd) + ((address & ~PGDIR_MASK) >> PAGE_SHIFT); diff --git a/mm/vmstat.c b/mm/vmstat.c index a8222041bd44..fdad40ccde7b 100644 --- a/mm/vmstat.c +++ b/mm/vmstat.c @@ -1167,6 +1167,8 @@ const char * const vmstat_text[] =3D { "nr_dirtied", "nr_written", "nr_kernel_misc_reclaimable", + "nr_foll_pin_requested", + "nr_foll_pin_returned", =20 /* enum writeback_stat_item counters */ "nr_dirty_threshold", --=20 2.24.0 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.6 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable 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 67FCDC43331 for ; Tue, 12 Nov 2019 00:50:50 +0000 (UTC) Received: from lists.ozlabs.org (lists.ozlabs.org [203.11.71.2]) (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 DE781206A5 for ; Tue, 12 Nov 2019 00:50:49 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=nvidia.com header.i=@nvidia.com header.b="M2l68GlZ" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org DE781206A5 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=nvidia.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=linuxppc-dev-bounces+linuxppc-dev=archiver.kernel.org@lists.ozlabs.org Received: from bilbo.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 47Bq121TtpzF4kj for ; Tue, 12 Nov 2019 11:50:46 +1100 (AEDT) Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nvidia.com (client-ip=216.228.121.64; helo=hqemgate15.nvidia.com; envelope-from=jhubbard@nvidia.com; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=nvidia.com Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=nvidia.com header.i=@nvidia.com header.b="M2l68GlZ"; dkim-atps=neutral Received: from hqemgate15.nvidia.com (hqemgate15.nvidia.com [216.228.121.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47Bp3812v4zF4M9 for ; Tue, 12 Nov 2019 11:07:31 +1100 (AEDT) Received: from hqpgpgate102.nvidia.com (Not Verified[216.228.121.13]) by hqemgate15.nvidia.com (using TLS: TLSv1.2, DES-CBC3-SHA) id ; Mon, 11 Nov 2019 16:06:20 -0800 Received: from hqmail.nvidia.com ([172.20.161.6]) by hqpgpgate102.nvidia.com (PGP Universal service); Mon, 11 Nov 2019 16:07:22 -0800 X-PGP-Universal: processed; by hqpgpgate102.nvidia.com on Mon, 11 Nov 2019 16:07:22 -0800 Received: from HQMAIL111.nvidia.com (172.20.187.18) by HQMAIL101.nvidia.com (172.20.187.10) with Microsoft SMTP Server (TLS) id 15.0.1473.3; Tue, 12 Nov 2019 00:07:22 +0000 Received: from rnnvemgw01.nvidia.com (10.128.109.123) by HQMAIL111.nvidia.com (172.20.187.18) with Microsoft SMTP Server (TLS) id 15.0.1473.3 via Frontend Transport; Tue, 12 Nov 2019 00:07:21 +0000 Received: from blueforge.nvidia.com (Not Verified[10.110.48.28]) by rnnvemgw01.nvidia.com with Trustwave SEG (v7, 5, 8, 10121) id ; Mon, 11 Nov 2019 16:07:21 -0800 From: John Hubbard To: Andrew Morton Subject: [PATCH v3 16/23] mm/gup: track FOLL_PIN pages Date: Mon, 11 Nov 2019 16:06:53 -0800 Message-ID: <20191112000700.3455038-17-jhubbard@nvidia.com> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191112000700.3455038-1-jhubbard@nvidia.com> References: <20191112000700.3455038-1-jhubbard@nvidia.com> MIME-Version: 1.0 X-NVConfidentiality: public Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nvidia.com; s=n1; t=1573517180; bh=dYDsBNoCc3j3xBsicl5hq4Ee4AWgl5sCKuYiruAHrxc=; h=X-PGP-Universal:From:To:CC:Subject:Date:Message-ID:X-Mailer: In-Reply-To:References:MIME-Version:X-NVConfidentiality: Content-Type:Content-Transfer-Encoding; b=M2l68GlZ9tIDizsrkHmX0+ursgAdXLIpV7hz5cIywJAQQiCT2xsasfKUOi6L0NM2k OyHFbk547fCcgBYtF/ed1W6GZqddTKvvW0PcCitDxGl3Grj3m8XgsXrzx+s5CcLfGt KheQPIg2O7ieSielszOPk24j7W/l9wqHdJzwzCvVtl/O0qoSKf0KkxMC34EYmd37Aq W0HeiQBNspe+YT6lvjINxNnmInTDOLmH+ZvAnT0SLMC1wvnNozW+6dF60WakZIql2m jnWOeyn9i6VNFcpB18R2lYFT93VVTf0W+yFydT0p5tYBsE3VpXnz6jQjGBW0bITkWZ 9u3r4hhLDDIgQ== X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Michal Hocko , Jan Kara , kvm@vger.kernel.org, linux-doc@vger.kernel.org, David Airlie , Dave Chinner , dri-devel@lists.freedesktop.org, LKML , linux-mm@kvack.org, Paul Mackerras , linux-kselftest@vger.kernel.org, Ira Weiny , Jonathan Corbet , linux-rdma@vger.kernel.org, Christoph Hellwig , Jason Gunthorpe , Vlastimil Babka , =?UTF-8?q?Bj=C3=B6rn=20T=C3=B6pel?= , linux-media@vger.kernel.org, Shuah Khan , John Hubbard , linux-block@vger.kernel.org, =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= , Al Viro , Dan Williams , Mauro Carvalho Chehab , Magnus Karlsson , Jens Axboe , netdev@vger.kernel.org, Alex Williamson , Daniel Vetter , linux-fsdevel@vger.kernel.org, bpf@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, "David S . Miller" , Mike Kravetz Errors-To: linuxppc-dev-bounces+linuxppc-dev=archiver.kernel.org@lists.ozlabs.org Sender: "Linuxppc-dev" Add tracking of pages that were pinned via FOLL_PIN. As mentioned in the FOLL_PIN documentation, callers who effectively set FOLL_PIN are required to ultimately free such pages via put_user_page(). The effect is similar to FOLL_GET, and may be thought of as "FOLL_GET for DIO and/or RDMA use". Pages that have been pinned via FOLL_PIN are identifiable via a new function call: bool page_dma_pinned(struct page *page); What to do in response to encountering such a page, is left to later patchsets. There is discussion about this in [1]. This also changes a BUG_ON(), to a WARN_ON(), in follow_page_mask(). Suggested-by: Jan Kara Suggested-by: J=C3=A9r=C3=B4me Glisse Signed-off-by: John Hubbard --- include/linux/mm.h | 75 ++++++++++++---- include/linux/mmzone.h | 2 + include/linux/page_ref.h | 10 +++ mm/gup.c | 190 +++++++++++++++++++++++++++++++++------ mm/huge_memory.c | 54 ++++++++++- mm/hugetlb.c | 39 +++++++- mm/vmstat.c | 2 + 7 files changed, 322 insertions(+), 50 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index 11e0086d64a4..19b3fa68a4da 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1054,6 +1054,8 @@ static inline __must_check bool try_get_page(struct p= age *page) return true; } =20 +__must_check bool user_page_ref_inc(struct page *page); + static inline void put_page(struct page *page) { page =3D compound_head(page); @@ -1071,31 +1073,70 @@ static inline void put_page(struct page *page) __put_page(page); } =20 -/** - * put_user_page() - release a gup-pinned page - * @page: pointer to page to be released +/* + * GUP_PIN_COUNTING_BIAS, and the associated functions that use it, overlo= ad + * the page's refcount so that two separate items are tracked: the origina= l page + * reference count, and also a new count of how many get_user_pages() call= s were + * made against the page. ("gup-pinned" is another term for the latter). + * + * With this scheme, get_user_pages() becomes special: such pages are mark= ed + * as distinct from normal pages. As such, the new put_user_page() call (a= nd + * its variants) must be used in order to release gup-pinned pages. + * + * Choice of value: * - * Pages that were pinned via get_user_pages*() must be released via - * either put_user_page(), or one of the put_user_pages*() routines - * below. This is so that eventually, pages that are pinned via - * get_user_pages*() can be separately tracked and uniquely handled. In - * particular, interactions with RDMA and filesystems need special - * handling. + * By making GUP_PIN_COUNTING_BIAS a power of two, debugging of page refer= ence + * counts with respect to get_user_pages() and put_user_page() becomes sim= pler, + * due to the fact that adding an even power of two to the page refcount h= as + * the effect of using only the upper N bits, for the code that counts up = using + * the bias value. This means that the lower bits are left for the exclusi= ve + * use of the original code that increments and decrements by one (or at l= east, + * by much smaller values than the bias value). * - * put_user_page() and put_page() are not interchangeable, despite this ea= rly - * implementation that makes them look the same. put_user_page() calls mus= t - * be perfectly matched up with get_user_page() calls. + * Of course, once the lower bits overflow into the upper bits (and this i= s + * OK, because subtraction recovers the original values), then visual insp= ection + * no longer suffices to directly view the separate counts. However, for n= ormal + * applications that don't have huge page reference counts, this won't be = an + * issue. + * + * Locking: the lockless algorithm described in page_cache_get_speculative= () + * and page_cache_gup_pin_speculative() provides safe operation for + * get_user_pages and page_mkclean and other calls that race to set up pag= e + * table entries. */ -static inline void put_user_page(struct page *page) -{ - put_page(page); -} +#define GUP_PIN_COUNTING_BIAS (1UL << 10) =20 +void put_user_page(struct page *page); void put_user_pages_dirty_lock(struct page **pages, unsigned long npages, bool make_dirty); - void put_user_pages(struct page **pages, unsigned long npages); =20 +/** + * page_dma_pinned() - report if a page is pinned for DMA. + * + * This function checks if a page has been pinned via a call to + * pin_user_pages*() or pin_longterm_pages*(). + * + * The return value is partially fuzzy: false is not fuzzy, because it mea= ns + * "definitely not pinned for DMA", but true means "probably pinned for DM= A, but + * possibly a false positive due to having at least GUP_PIN_COUNTING_BIAS = worth + * of normal page references". + * + * False positives are OK, because: a) it's unlikely for a page to get tha= t many + * refcounts, and b) all the callers of this routine are expected to be ab= le to + * deal gracefully with a false positive. + * + * For more information, please see Documentation/vm/pin_user_pages.rst. + * + * @page: pointer to page to be queried. + * @Return: True, if it is likely that the page has been "dma-pinned". + * False, if the page is definitely not dma-pinned. + */ +static inline bool page_dma_pinned(struct page *page) +{ + return (page_ref_count(compound_head(page))) >=3D GUP_PIN_COUNTING_BIAS; +} + #if defined(CONFIG_SPARSEMEM) && !defined(CONFIG_SPARSEMEM_VMEMMAP) #define SECTION_IN_PAGE_FLAGS #endif diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index bda20282746b..0485cba38d23 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -244,6 +244,8 @@ enum node_stat_item { NR_DIRTIED, /* page dirtyings since bootup */ NR_WRITTEN, /* page writings since bootup */ NR_KERNEL_MISC_RECLAIMABLE, /* reclaimable non-slab kernel pages */ + NR_FOLL_PIN_REQUESTED, /* via: pin_user_page(), gup flag: FOLL_PIN */ + NR_FOLL_PIN_RETURNED, /* pages returned via put_user_page() */ NR_VM_NODE_STAT_ITEMS }; =20 diff --git a/include/linux/page_ref.h b/include/linux/page_ref.h index 14d14beb1f7f..b9cbe553d1e7 100644 --- a/include/linux/page_ref.h +++ b/include/linux/page_ref.h @@ -102,6 +102,16 @@ static inline void page_ref_sub(struct page *page, int= nr) __page_ref_mod(page, -nr); } =20 +static inline int page_ref_sub_return(struct page *page, int nr) +{ + int ret =3D atomic_sub_return(nr, &page->_refcount); + + if (page_ref_tracepoint_active(__tracepoint_page_ref_mod)) + __page_ref_mod(page, -nr); + + return ret; +} + static inline void page_ref_inc(struct page *page) { atomic_inc(&page->_refcount); diff --git a/mm/gup.c b/mm/gup.c index ea31810da828..fc164c2ee6b5 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -44,6 +44,95 @@ static inline struct page *try_get_compound_head(struct = page *page, int refs) return head; } =20 +#ifdef CONFIG_DEBUG_VM +static inline void __update_proc_vmstat(struct page *page, + enum node_stat_item item, int count) +{ + mod_node_page_state(page_pgdat(page), item, count); +} +#else +static inline void __update_proc_vmstat(struct page *page, + enum node_stat_item item, int count) +{ +} +#endif + +/** + * user_page_ref_inc() - mark a page as being used by get_user_pages(FOLL_= PIN). + * + * @page: pointer to page to be marked + * @Return: true for success, false for failure + */ +__must_check bool user_page_ref_inc(struct page *page) +{ + page =3D try_get_compound_head(page, GUP_PIN_COUNTING_BIAS); + if (!page) + return false; + + __update_proc_vmstat(page, NR_FOLL_PIN_REQUESTED, 1); + return true; +} + +#ifdef CONFIG_DEV_PAGEMAP_OPS +static bool __put_devmap_managed_user_page(struct page *page) +{ + bool is_devmap =3D page_is_devmap_managed(page); + + if (is_devmap) { + int count =3D page_ref_sub_return(page, GUP_PIN_COUNTING_BIAS); + + __update_proc_vmstat(page, NR_FOLL_PIN_RETURNED, 1); + /* + * devmap page refcounts are 1-based, rather than 0-based: if + * refcount is 1, then the page is free and the refcount is + * stable because nobody holds a reference on the page. + */ + if (count =3D=3D 1) + free_devmap_managed_page(page); + else if (!count) + __put_page(page); + } + + return is_devmap; +} +#else +static bool __put_devmap_managed_user_page(struct page *page) +{ + return false; +} +#endif /* CONFIG_DEV_PAGEMAP_OPS */ + +/** + * put_user_page() - release a gup-pinned page + * @page: pointer to page to be released + * + * Pages that were pinned via get_user_pages*() must be released via + * either put_user_page(), or one of the put_user_pages*() routines + * below. This is so that eventually, pages that are pinned via + * get_user_pages*() can be separately tracked and uniquely handled. In + * particular, interactions with RDMA and filesystems need special + * handling. + */ +void put_user_page(struct page *page) +{ + page =3D compound_head(page); + + /* + * For devmap managed pages we need to catch refcount transition from + * GUP_PIN_COUNTING_BIAS to 1, when refcount reach one it means the + * page is free and we need to inform the device driver through + * callback. See include/linux/memremap.h and HMM for details. + */ + if (__put_devmap_managed_user_page(page)) + return; + + if (page_ref_sub_and_test(page, GUP_PIN_COUNTING_BIAS)) + __put_page(page); + + __update_proc_vmstat(page, NR_FOLL_PIN_RETURNED, 1); +} +EXPORT_SYMBOL(put_user_page); + /** * put_user_pages_dirty_lock() - release and optionally dirty gup-pinned p= ages * @pages: array of pages to be maybe marked dirty, and definitely releas= ed. @@ -230,10 +319,11 @@ static struct page *follow_page_pte(struct vm_area_st= ruct *vma, } =20 page =3D vm_normal_page(vma, address, pte); - if (!page && pte_devmap(pte) && (flags & FOLL_GET)) { + if (!page && pte_devmap(pte) && (flags & (FOLL_GET | FOLL_PIN))) { /* - * Only return device mapping pages in the FOLL_GET case since - * they are only valid while holding the pgmap reference. + * Only return device mapping pages in the FOLL_GET or FOLL_PIN + * case since they are only valid while holding the pgmap + * reference. */ *pgmap =3D get_dev_pagemap(pte_pfn(pte), *pgmap); if (*pgmap) @@ -276,6 +366,11 @@ static struct page *follow_page_pte(struct vm_area_str= uct *vma, page =3D ERR_PTR(-ENOMEM); goto out; } + } else if (flags & FOLL_PIN) { + if (unlikely(!user_page_ref_inc(page))) { + page =3D ERR_PTR(-ENOMEM); + goto out; + } } if (flags & FOLL_TOUCH) { if ((flags & FOLL_WRITE) && @@ -537,8 +632,8 @@ static struct page *follow_page_mask(struct vm_area_str= uct *vma, /* make this handle hugepd */ page =3D follow_huge_addr(mm, address, flags & FOLL_WRITE); if (!IS_ERR(page)) { - BUG_ON(flags & FOLL_GET); - return page; + WARN_ON_ONCE(flags & (FOLL_GET | FOLL_PIN)); + return NULL; } =20 pgd =3D pgd_offset(mm, address); @@ -1830,13 +1925,17 @@ static inline pte_t gup_get_pte(pte_t *ptep) #endif /* CONFIG_GUP_GET_PTE_LOW_HIGH */ =20 static void __maybe_unused undo_dev_pagemap(int *nr, int nr_start, + unsigned int flags, struct page **pages) { while ((*nr) - nr_start) { struct page *page =3D pages[--(*nr)]; =20 ClearPageReferenced(page); - put_page(page); + if (flags & FOLL_PIN) + put_user_page(page); + else + put_page(page); } } =20 @@ -1869,7 +1968,7 @@ static int gup_pte_range(pmd_t pmd, unsigned long add= r, unsigned long end, =20 pgmap =3D get_dev_pagemap(pte_pfn(pte), pgmap); if (unlikely(!pgmap)) { - undo_dev_pagemap(nr, nr_start, pages); + undo_dev_pagemap(nr, nr_start, flags, pages); goto pte_unmap; } } else if (pte_special(pte)) @@ -1878,9 +1977,15 @@ static int gup_pte_range(pmd_t pmd, unsigned long ad= dr, unsigned long end, VM_BUG_ON(!pfn_valid(pte_pfn(pte))); page =3D pte_page(pte); =20 - head =3D try_get_compound_head(page, 1); - if (!head) - goto pte_unmap; + if (flags & FOLL_PIN) { + head =3D page; + if (unlikely(!user_page_ref_inc(head))) + goto pte_unmap; + } else { + head =3D try_get_compound_head(page, 1); + if (!head) + goto pte_unmap; + } =20 if (unlikely(pte_val(pte) !=3D pte_val(*ptep))) { put_page(head); @@ -1934,12 +2039,20 @@ static int __gup_device_huge(unsigned long pfn, uns= igned long addr, =20 pgmap =3D get_dev_pagemap(pfn, pgmap); if (unlikely(!pgmap)) { - undo_dev_pagemap(nr, nr_start, pages); + undo_dev_pagemap(nr, nr_start, flags, pages); return 0; } SetPageReferenced(page); pages[*nr] =3D page; - get_page(page); + + if (flags & FOLL_PIN) { + if (unlikely(!user_page_ref_inc(page))) { + undo_dev_pagemap(nr, nr_start, flags, pages); + return 0; + } + } else + get_page(page); + (*nr)++; pfn++; } while (addr +=3D PAGE_SIZE, addr !=3D end); @@ -1961,7 +2074,7 @@ static int __gup_device_huge_pmd(pmd_t orig, pmd_t *p= mdp, unsigned long addr, return 0; =20 if (unlikely(pmd_val(orig) !=3D pmd_val(*pmdp))) { - undo_dev_pagemap(nr, nr_start, pages); + undo_dev_pagemap(nr, nr_start, flags, pages); return 0; } return 1; @@ -1979,7 +2092,7 @@ static int __gup_device_huge_pud(pud_t orig, pud_t *p= udp, unsigned long addr, return 0; =20 if (unlikely(pud_val(orig) !=3D pud_val(*pudp))) { - undo_dev_pagemap(nr, nr_start, pages); + undo_dev_pagemap(nr, nr_start, flags, pages); return 0; } return 1; @@ -2063,9 +2176,16 @@ static int gup_hugepte(pte_t *ptep, unsigned long sz= , unsigned long addr, page =3D head + ((addr & (sz-1)) >> PAGE_SHIFT); refs =3D __record_subpages(page, addr, end, pages, *nr); =20 - head =3D try_get_compound_head(head, refs); - if (!head) - return 0; + if (flags & FOLL_PIN) { + head =3D page; + if (unlikely(!user_page_ref_inc(head))) + return 0; + head =3D page; + } else { + head =3D try_get_compound_head(head, refs); + if (!head) + return 0; + } =20 if (unlikely(pte_val(pte) !=3D pte_val(*ptep))) { put_compound_head(head, refs); @@ -2122,9 +2242,15 @@ static int gup_huge_pmd(pmd_t orig, pmd_t *pmdp, uns= igned long addr, page =3D pmd_page(orig) + ((addr & ~PMD_MASK) >> PAGE_SHIFT); refs =3D __record_subpages(page, addr, end, pages, *nr); =20 - head =3D try_get_compound_head(pmd_page(orig), refs); - if (!head) - return 0; + if (flags & FOLL_PIN) { + head =3D page; + if (unlikely(!user_page_ref_inc(head))) + return 0; + } else { + head =3D try_get_compound_head(pmd_page(orig), refs); + if (!head) + return 0; + } =20 if (unlikely(pmd_val(orig) !=3D pmd_val(*pmdp))) { put_compound_head(head, refs); @@ -2155,9 +2281,15 @@ static int gup_huge_pud(pud_t orig, pud_t *pudp, uns= igned long addr, page =3D pud_page(orig) + ((addr & ~PUD_MASK) >> PAGE_SHIFT); refs =3D __record_subpages(page, addr, end, pages, *nr); =20 - head =3D try_get_compound_head(pud_page(orig), refs); - if (!head) - return 0; + if (flags & FOLL_PIN) { + head =3D page; + if (unlikely(!user_page_ref_inc(head))) + return 0; + } else { + head =3D try_get_compound_head(pud_page(orig), refs); + if (!head) + return 0; + } =20 if (unlikely(pud_val(orig) !=3D pud_val(*pudp))) { put_compound_head(head, refs); @@ -2183,9 +2315,15 @@ static int gup_huge_pgd(pgd_t orig, pgd_t *pgdp, uns= igned long addr, page =3D pgd_page(orig) + ((addr & ~PGDIR_MASK) >> PAGE_SHIFT); refs =3D __record_subpages(page, addr, end, pages, *nr); =20 - head =3D try_get_compound_head(pgd_page(orig), refs); - if (!head) - return 0; + if (flags & FOLL_PIN) { + head =3D page; + if (unlikely(!user_page_ref_inc(head))) + return 0; + } else { + head =3D try_get_compound_head(pgd_page(orig), refs); + if (!head) + return 0; + } =20 if (unlikely(pgd_val(orig) !=3D pgd_val(*pgdp))) { put_compound_head(head, refs); diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 13cc93785006..4010c269e9e5 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -945,6 +945,11 @@ struct page *follow_devmap_pmd(struct vm_area_struct *= vma, unsigned long addr, */ WARN_ONCE(flags & FOLL_COW, "mm: In follow_devmap_pmd with FOLL_COW set")= ; =20 + /* FOLL_GET and FOLL_PIN are mutually exclusive. */ + if (WARN_ON_ONCE((flags & (FOLL_PIN | FOLL_GET)) =3D=3D + (FOLL_PIN | FOLL_GET))) + return NULL; + if (flags & FOLL_WRITE && !pmd_write(*pmd)) return NULL; =20 @@ -960,7 +965,7 @@ struct page *follow_devmap_pmd(struct vm_area_struct *v= ma, unsigned long addr, * device mapped pages can only be returned if the * caller will manage the page reference count. */ - if (!(flags & FOLL_GET)) + if (!(flags & (FOLL_GET | FOLL_PIN))) return ERR_PTR(-EEXIST); =20 pfn +=3D (addr & ~PMD_MASK) >> PAGE_SHIFT; @@ -968,7 +973,18 @@ struct page *follow_devmap_pmd(struct vm_area_struct *= vma, unsigned long addr, if (!*pgmap) return ERR_PTR(-EFAULT); page =3D pfn_to_page(pfn); - get_page(page); + + if (flags & FOLL_GET) + get_page(page); + else if (flags & FOLL_PIN) { + /* + * user_page_ref_inc() is not actually expected to fail here + * because we hold the pmd lock so no one can unmap the pmd and + * free the page that it points to. + */ + if (unlikely(!user_page_ref_inc(page))) + page =3D ERR_PTR(-EFAULT); + } =20 return page; } @@ -1088,6 +1104,11 @@ struct page *follow_devmap_pud(struct vm_area_struct= *vma, unsigned long addr, if (flags & FOLL_WRITE && !pud_write(*pud)) return NULL; =20 + /* FOLL_GET and FOLL_PIN are mutually exclusive. */ + if (WARN_ON_ONCE((flags & (FOLL_PIN | FOLL_GET)) =3D=3D + (FOLL_PIN | FOLL_GET))) + return NULL; + if (pud_present(*pud) && pud_devmap(*pud)) /* pass */; else @@ -1099,8 +1120,10 @@ struct page *follow_devmap_pud(struct vm_area_struct= *vma, unsigned long addr, /* * device mapped pages can only be returned if the * caller will manage the page reference count. + * + * At least one of FOLL_GET | FOLL_PIN must be set, so assert that here: */ - if (!(flags & FOLL_GET)) + if (!(flags & (FOLL_GET | FOLL_PIN))) return ERR_PTR(-EEXIST); =20 pfn +=3D (addr & ~PUD_MASK) >> PAGE_SHIFT; @@ -1108,7 +1131,18 @@ struct page *follow_devmap_pud(struct vm_area_struct= *vma, unsigned long addr, if (!*pgmap) return ERR_PTR(-EFAULT); page =3D pfn_to_page(pfn); - get_page(page); + + if (flags & FOLL_GET) + get_page(page); + else if (flags & FOLL_PIN) { + /* + * user_page_ref_inc() is not actually expected to fail here + * because we hold the pud lock so no one can unmap the pud and + * free the page that it points to. + */ + if (unlikely(!user_page_ref_inc(page))) + page =3D ERR_PTR(-EFAULT); + } =20 return page; } @@ -1522,8 +1556,20 @@ struct page *follow_trans_huge_pmd(struct vm_area_st= ruct *vma, skip_mlock: page +=3D (addr & ~HPAGE_PMD_MASK) >> PAGE_SHIFT; VM_BUG_ON_PAGE(!PageCompound(page) && !is_zone_device_page(page), page); + if (flags & FOLL_GET) get_page(page); + else if (flags & FOLL_PIN) { + /* + * user_page_ref_inc() is not actually expected to fail here + * because we hold the pmd lock so no one can unmap the pmd and + * free the page that it points to. + */ + if (unlikely(!user_page_ref_inc(page))) { + WARN_ON_ONCE(1); + page =3D NULL; + } + } =20 out: return page; diff --git a/mm/hugetlb.c b/mm/hugetlb.c index b45a95363a84..5ee80eea25e5 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -4462,7 +4462,22 @@ long follow_hugetlb_page(struct mm_struct *mm, struc= t vm_area_struct *vma, same_page: if (pages) { pages[i] =3D mem_map_offset(page, pfn_offset); - get_page(pages[i]); + + if (flags & FOLL_GET) + get_page(pages[i]); + else if (flags & FOLL_PIN) { + /* + * user_page_ref_inc() is not actually expected + * to fail here because we hold the ptl. + */ + if (unlikely(!user_page_ref_inc(pages[i]))) { + spin_unlock(ptl); + remainder =3D 0; + err =3D -ENOMEM; + WARN_ON_ONCE(1); + break; + } + } } =20 if (vmas) @@ -5022,6 +5037,12 @@ follow_huge_pmd(struct mm_struct *mm, unsigned long = address, struct page *page =3D NULL; spinlock_t *ptl; pte_t pte; + + /* FOLL_GET and FOLL_PIN are mutually exclusive. */ + if (WARN_ON_ONCE((flags & (FOLL_PIN | FOLL_GET)) =3D=3D + (FOLL_PIN | FOLL_GET))) + return NULL; + retry: ptl =3D pmd_lockptr(mm, pmd); spin_lock(ptl); @@ -5034,8 +5055,20 @@ follow_huge_pmd(struct mm_struct *mm, unsigned long = address, pte =3D huge_ptep_get((pte_t *)pmd); if (pte_present(pte)) { page =3D pmd_page(*pmd) + ((address & ~PMD_MASK) >> PAGE_SHIFT); + if (flags & FOLL_GET) get_page(page); + else if (flags & FOLL_PIN) { + /* + * user_page_ref_inc() is not actually expected to fail + * here because we hold the ptl. + */ + if (unlikely(!user_page_ref_inc(page))) { + WARN_ON_ONCE(1); + page =3D NULL; + goto out; + } + } } else { if (is_hugetlb_entry_migration(pte)) { spin_unlock(ptl); @@ -5056,7 +5089,7 @@ struct page * __weak follow_huge_pud(struct mm_struct *mm, unsigned long address, pud_t *pud, int flags) { - if (flags & FOLL_GET) + if (flags & (FOLL_GET | FOLL_PIN)) return NULL; =20 return pte_page(*(pte_t *)pud) + ((address & ~PUD_MASK) >> PAGE_SHIFT); @@ -5065,7 +5098,7 @@ follow_huge_pud(struct mm_struct *mm, unsigned long a= ddress, struct page * __weak follow_huge_pgd(struct mm_struct *mm, unsigned long address, pgd_t *pgd, i= nt flags) { - if (flags & FOLL_GET) + if (flags & (FOLL_GET | FOLL_PIN)) return NULL; =20 return pte_page(*(pte_t *)pgd) + ((address & ~PGDIR_MASK) >> PAGE_SHIFT); diff --git a/mm/vmstat.c b/mm/vmstat.c index a8222041bd44..fdad40ccde7b 100644 --- a/mm/vmstat.c +++ b/mm/vmstat.c @@ -1167,6 +1167,8 @@ const char * const vmstat_text[] =3D { "nr_dirtied", "nr_written", "nr_kernel_misc_reclaimable", + "nr_foll_pin_requested", + "nr_foll_pin_returned", =20 /* enum writeback_stat_item counters */ "nr_dirty_threshold", --=20 2.24.0 From mboxrd@z Thu Jan 1 00:00:00 1970 From: John Hubbard Subject: [PATCH v3 16/23] mm/gup: track FOLL_PIN pages Date: Mon, 11 Nov 2019 16:06:53 -0800 Message-ID: <20191112000700.3455038-17-jhubbard@nvidia.com> References: <20191112000700.3455038-1-jhubbard@nvidia.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from hqemgate15.nvidia.com (hqemgate15.nvidia.com [216.228.121.64]) by gabe.freedesktop.org (Postfix) with ESMTPS id 5933C6EA0E for ; Tue, 12 Nov 2019 00:07:23 +0000 (UTC) In-Reply-To: <20191112000700.3455038-1-jhubbard@nvidia.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Andrew Morton Cc: Michal Hocko , Jan Kara , kvm@vger.kernel.org, linux-doc@vger.kernel.org, David Airlie , Dave Chinner , dri-devel@lists.freedesktop.org, LKML , linux-mm@kvack.org, Paul Mackerras , linux-kselftest@vger.kernel.org, Ira Weiny , Jonathan Corbet , linux-rdma@vger.kernel.org, Michael Ellerman , Christoph Hellwig , Jason Gunthorpe , Vlastimil Babka , =?UTF-8?q?Bj=C3=B6rn=20T=C3=B6pel?= , linux-media@vger.kernel.org, Shuah Khan , John Hubbard , linux-block@vger.kernel.org, =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= , Al Viro , Dan Williams List-Id: dri-devel@lists.freedesktop.org QWRkIHRyYWNraW5nIG9mIHBhZ2VzIHRoYXQgd2VyZSBwaW5uZWQgdmlhIEZPTExfUElOLgoKQXMg bWVudGlvbmVkIGluIHRoZSBGT0xMX1BJTiBkb2N1bWVudGF0aW9uLCBjYWxsZXJzIHdobyBlZmZl Y3RpdmVseSBzZXQKRk9MTF9QSU4gYXJlIHJlcXVpcmVkIHRvIHVsdGltYXRlbHkgZnJlZSBzdWNo IHBhZ2VzIHZpYSBwdXRfdXNlcl9wYWdlKCkuClRoZSBlZmZlY3QgaXMgc2ltaWxhciB0byBGT0xM X0dFVCwgYW5kIG1heSBiZSB0aG91Z2h0IG9mIGFzICJGT0xMX0dFVApmb3IgRElPIGFuZC9vciBS RE1BIHVzZSIuCgpQYWdlcyB0aGF0IGhhdmUgYmVlbiBwaW5uZWQgdmlhIEZPTExfUElOIGFyZSBp ZGVudGlmaWFibGUgdmlhIGEKbmV3IGZ1bmN0aW9uIGNhbGw6CgogICBib29sIHBhZ2VfZG1hX3Bp bm5lZChzdHJ1Y3QgcGFnZSAqcGFnZSk7CgpXaGF0IHRvIGRvIGluIHJlc3BvbnNlIHRvIGVuY291 bnRlcmluZyBzdWNoIGEgcGFnZSwgaXMgbGVmdCB0byBsYXRlcgpwYXRjaHNldHMuIFRoZXJlIGlz IGRpc2N1c3Npb24gYWJvdXQgdGhpcyBpbiBbMV0uCgpUaGlzIGFsc28gY2hhbmdlcyBhIEJVR19P TigpLCB0byBhIFdBUk5fT04oKSwgaW4gZm9sbG93X3BhZ2VfbWFzaygpLgoKU3VnZ2VzdGVkLWJ5 OiBKYW4gS2FyYSA8amFja0BzdXNlLmN6PgpTdWdnZXN0ZWQtYnk6IErDqXLDtG1lIEdsaXNzZSA8 amdsaXNzZUByZWRoYXQuY29tPgpTaWduZWQtb2ZmLWJ5OiBKb2huIEh1YmJhcmQgPGpodWJiYXJk QG52aWRpYS5jb20+Ci0tLQogaW5jbHVkZS9saW51eC9tbS5oICAgICAgIHwgIDc1ICsrKysrKysr KysrKy0tLS0KIGluY2x1ZGUvbGludXgvbW16b25lLmggICB8ICAgMiArCiBpbmNsdWRlL2xpbnV4 L3BhZ2VfcmVmLmggfCAgMTAgKysrCiBtbS9ndXAuYyAgICAgICAgICAgICAgICAgfCAxOTAgKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tCiBtbS9odWdlX21lbW9yeS5jICAg ICAgICAgfCAgNTQgKysrKysrKysrKy0KIG1tL2h1Z2V0bGIuYyAgICAgICAgICAgICB8ICAzOSAr KysrKysrLQogbW0vdm1zdGF0LmMgICAgICAgICAgICAgIHwgICAyICsKIDcgZmlsZXMgY2hhbmdl ZCwgMzIyIGluc2VydGlvbnMoKyksIDUwIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2luY2x1 ZGUvbGludXgvbW0uaCBiL2luY2x1ZGUvbGludXgvbW0uaAppbmRleCAxMWUwMDg2ZDY0YTQuLjE5 YjNmYTY4YTRkYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbS5oCisrKyBiL2luY2x1ZGUv bGludXgvbW0uaApAQCAtMTA1NCw2ICsxMDU0LDggQEAgc3RhdGljIGlubGluZSBfX211c3RfY2hl Y2sgYm9vbCB0cnlfZ2V0X3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCiAJcmV0dXJuIHRydWU7CiB9 CiAKK19fbXVzdF9jaGVjayBib29sIHVzZXJfcGFnZV9yZWZfaW5jKHN0cnVjdCBwYWdlICpwYWdl KTsKKwogc3RhdGljIGlubGluZSB2b2lkIHB1dF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQogewog CXBhZ2UgPSBjb21wb3VuZF9oZWFkKHBhZ2UpOwpAQCAtMTA3MSwzMSArMTA3Myw3MCBAQCBzdGF0 aWMgaW5saW5lIHZvaWQgcHV0X3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCiAJCV9fcHV0X3BhZ2Uo cGFnZSk7CiB9CiAKLS8qKgotICogcHV0X3VzZXJfcGFnZSgpIC0gcmVsZWFzZSBhIGd1cC1waW5u ZWQgcGFnZQotICogQHBhZ2U6ICAgICAgICAgICAgcG9pbnRlciB0byBwYWdlIHRvIGJlIHJlbGVh c2VkCisvKgorICogR1VQX1BJTl9DT1VOVElOR19CSUFTLCBhbmQgdGhlIGFzc29jaWF0ZWQgZnVu Y3Rpb25zIHRoYXQgdXNlIGl0LCBvdmVybG9hZAorICogdGhlIHBhZ2UncyByZWZjb3VudCBzbyB0 aGF0IHR3byBzZXBhcmF0ZSBpdGVtcyBhcmUgdHJhY2tlZDogdGhlIG9yaWdpbmFsIHBhZ2UKKyAq IHJlZmVyZW5jZSBjb3VudCwgYW5kIGFsc28gYSBuZXcgY291bnQgb2YgaG93IG1hbnkgZ2V0X3Vz ZXJfcGFnZXMoKSBjYWxscyB3ZXJlCisgKiBtYWRlIGFnYWluc3QgdGhlIHBhZ2UuICgiZ3VwLXBp bm5lZCIgaXMgYW5vdGhlciB0ZXJtIGZvciB0aGUgbGF0dGVyKS4KKyAqCisgKiBXaXRoIHRoaXMg c2NoZW1lLCBnZXRfdXNlcl9wYWdlcygpIGJlY29tZXMgc3BlY2lhbDogc3VjaCBwYWdlcyBhcmUg bWFya2VkCisgKiBhcyBkaXN0aW5jdCBmcm9tIG5vcm1hbCBwYWdlcy4gQXMgc3VjaCwgdGhlIG5l dyBwdXRfdXNlcl9wYWdlKCkgY2FsbCAoYW5kCisgKiBpdHMgdmFyaWFudHMpIG11c3QgYmUgdXNl ZCBpbiBvcmRlciB0byByZWxlYXNlIGd1cC1waW5uZWQgcGFnZXMuCisgKgorICogQ2hvaWNlIG9m IHZhbHVlOgogICoKLSAqIFBhZ2VzIHRoYXQgd2VyZSBwaW5uZWQgdmlhIGdldF91c2VyX3BhZ2Vz KigpIG11c3QgYmUgcmVsZWFzZWQgdmlhCi0gKiBlaXRoZXIgcHV0X3VzZXJfcGFnZSgpLCBvciBv bmUgb2YgdGhlIHB1dF91c2VyX3BhZ2VzKigpIHJvdXRpbmVzCi0gKiBiZWxvdy4gVGhpcyBpcyBz byB0aGF0IGV2ZW50dWFsbHksIHBhZ2VzIHRoYXQgYXJlIHBpbm5lZCB2aWEKLSAqIGdldF91c2Vy X3BhZ2VzKigpIGNhbiBiZSBzZXBhcmF0ZWx5IHRyYWNrZWQgYW5kIHVuaXF1ZWx5IGhhbmRsZWQu IEluCi0gKiBwYXJ0aWN1bGFyLCBpbnRlcmFjdGlvbnMgd2l0aCBSRE1BIGFuZCBmaWxlc3lzdGVt cyBuZWVkIHNwZWNpYWwKLSAqIGhhbmRsaW5nLgorICogQnkgbWFraW5nIEdVUF9QSU5fQ09VTlRJ TkdfQklBUyBhIHBvd2VyIG9mIHR3bywgZGVidWdnaW5nIG9mIHBhZ2UgcmVmZXJlbmNlCisgKiBj b3VudHMgd2l0aCByZXNwZWN0IHRvIGdldF91c2VyX3BhZ2VzKCkgYW5kIHB1dF91c2VyX3BhZ2Uo KSBiZWNvbWVzIHNpbXBsZXIsCisgKiBkdWUgdG8gdGhlIGZhY3QgdGhhdCBhZGRpbmcgYW4gZXZl biBwb3dlciBvZiB0d28gdG8gdGhlIHBhZ2UgcmVmY291bnQgaGFzCisgKiB0aGUgZWZmZWN0IG9m IHVzaW5nIG9ubHkgdGhlIHVwcGVyIE4gYml0cywgZm9yIHRoZSBjb2RlIHRoYXQgY291bnRzIHVw IHVzaW5nCisgKiB0aGUgYmlhcyB2YWx1ZS4gVGhpcyBtZWFucyB0aGF0IHRoZSBsb3dlciBiaXRz IGFyZSBsZWZ0IGZvciB0aGUgZXhjbHVzaXZlCisgKiB1c2Ugb2YgdGhlIG9yaWdpbmFsIGNvZGUg dGhhdCBpbmNyZW1lbnRzIGFuZCBkZWNyZW1lbnRzIGJ5IG9uZSAob3IgYXQgbGVhc3QsCisgKiBi eSBtdWNoIHNtYWxsZXIgdmFsdWVzIHRoYW4gdGhlIGJpYXMgdmFsdWUpLgogICoKLSAqIHB1dF91 c2VyX3BhZ2UoKSBhbmQgcHV0X3BhZ2UoKSBhcmUgbm90IGludGVyY2hhbmdlYWJsZSwgZGVzcGl0 ZSB0aGlzIGVhcmx5Ci0gKiBpbXBsZW1lbnRhdGlvbiB0aGF0IG1ha2VzIHRoZW0gbG9vayB0aGUg c2FtZS4gcHV0X3VzZXJfcGFnZSgpIGNhbGxzIG11c3QKLSAqIGJlIHBlcmZlY3RseSBtYXRjaGVk IHVwIHdpdGggZ2V0X3VzZXJfcGFnZSgpIGNhbGxzLgorICogT2YgY291cnNlLCBvbmNlIHRoZSBs b3dlciBiaXRzIG92ZXJmbG93IGludG8gdGhlIHVwcGVyIGJpdHMgKGFuZCB0aGlzIGlzCisgKiBP SywgYmVjYXVzZSBzdWJ0cmFjdGlvbiByZWNvdmVycyB0aGUgb3JpZ2luYWwgdmFsdWVzKSwgdGhl biB2aXN1YWwgaW5zcGVjdGlvbgorICogbm8gbG9uZ2VyIHN1ZmZpY2VzIHRvIGRpcmVjdGx5IHZp ZXcgdGhlIHNlcGFyYXRlIGNvdW50cy4gSG93ZXZlciwgZm9yIG5vcm1hbAorICogYXBwbGljYXRp b25zIHRoYXQgZG9uJ3QgaGF2ZSBodWdlIHBhZ2UgcmVmZXJlbmNlIGNvdW50cywgdGhpcyB3b24n dCBiZSBhbgorICogaXNzdWUuCisgKgorICogTG9ja2luZzogdGhlIGxvY2tsZXNzIGFsZ29yaXRo bSBkZXNjcmliZWQgaW4gcGFnZV9jYWNoZV9nZXRfc3BlY3VsYXRpdmUoKQorICogYW5kIHBhZ2Vf Y2FjaGVfZ3VwX3Bpbl9zcGVjdWxhdGl2ZSgpIHByb3ZpZGVzIHNhZmUgb3BlcmF0aW9uIGZvcgor ICogZ2V0X3VzZXJfcGFnZXMgYW5kIHBhZ2VfbWtjbGVhbiBhbmQgb3RoZXIgY2FsbHMgdGhhdCBy YWNlIHRvIHNldCB1cCBwYWdlCisgKiB0YWJsZSBlbnRyaWVzLgogICovCi1zdGF0aWMgaW5saW5l IHZvaWQgcHV0X3VzZXJfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQlwdXRfcGFnZShwYWdl KTsKLX0KKyNkZWZpbmUgR1VQX1BJTl9DT1VOVElOR19CSUFTICgxVUwgPDwgMTApCiAKK3ZvaWQg cHV0X3VzZXJfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSk7CiB2b2lkIHB1dF91c2VyX3BhZ2VzX2Rp cnR5X2xvY2soc3RydWN0IHBhZ2UgKipwYWdlcywgdW5zaWduZWQgbG9uZyBucGFnZXMsCiAJCQkg ICAgICAgYm9vbCBtYWtlX2RpcnR5KTsKLQogdm9pZCBwdXRfdXNlcl9wYWdlcyhzdHJ1Y3QgcGFn ZSAqKnBhZ2VzLCB1bnNpZ25lZCBsb25nIG5wYWdlcyk7CiAKKy8qKgorICogcGFnZV9kbWFfcGlu bmVkKCkgLSByZXBvcnQgaWYgYSBwYWdlIGlzIHBpbm5lZCBmb3IgRE1BLgorICoKKyAqIFRoaXMg ZnVuY3Rpb24gY2hlY2tzIGlmIGEgcGFnZSBoYXMgYmVlbiBwaW5uZWQgdmlhIGEgY2FsbCB0bwor ICogcGluX3VzZXJfcGFnZXMqKCkgb3IgcGluX2xvbmd0ZXJtX3BhZ2VzKigpLgorICoKKyAqIFRo ZSByZXR1cm4gdmFsdWUgaXMgcGFydGlhbGx5IGZ1enp5OiBmYWxzZSBpcyBub3QgZnV6enksIGJl Y2F1c2UgaXQgbWVhbnMKKyAqICJkZWZpbml0ZWx5IG5vdCBwaW5uZWQgZm9yIERNQSIsIGJ1dCB0 cnVlIG1lYW5zICJwcm9iYWJseSBwaW5uZWQgZm9yIERNQSwgYnV0CisgKiBwb3NzaWJseSBhIGZh bHNlIHBvc2l0aXZlIGR1ZSB0byBoYXZpbmcgYXQgbGVhc3QgR1VQX1BJTl9DT1VOVElOR19CSUFT IHdvcnRoCisgKiBvZiBub3JtYWwgcGFnZSByZWZlcmVuY2VzIi4KKyAqCisgKiBGYWxzZSBwb3Np dGl2ZXMgYXJlIE9LLCBiZWNhdXNlOiBhKSBpdCdzIHVubGlrZWx5IGZvciBhIHBhZ2UgdG8gZ2V0 IHRoYXQgbWFueQorICogcmVmY291bnRzLCBhbmQgYikgYWxsIHRoZSBjYWxsZXJzIG9mIHRoaXMg cm91dGluZSBhcmUgZXhwZWN0ZWQgdG8gYmUgYWJsZSB0bworICogZGVhbCBncmFjZWZ1bGx5IHdp dGggYSBmYWxzZSBwb3NpdGl2ZS4KKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNl IHNlZSBEb2N1bWVudGF0aW9uL3ZtL3Bpbl91c2VyX3BhZ2VzLnJzdC4KKyAqCisgKiBAcGFnZToJ cG9pbnRlciB0byBwYWdlIHRvIGJlIHF1ZXJpZWQuCisgKiBAUmV0dXJuOglUcnVlLCBpZiBpdCBp cyBsaWtlbHkgdGhhdCB0aGUgcGFnZSBoYXMgYmVlbiAiZG1hLXBpbm5lZCIuCisgKgkJRmFsc2Us IGlmIHRoZSBwYWdlIGlzIGRlZmluaXRlbHkgbm90IGRtYS1waW5uZWQuCisgKi8KK3N0YXRpYyBp bmxpbmUgYm9vbCBwYWdlX2RtYV9waW5uZWQoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJu IChwYWdlX3JlZl9jb3VudChjb21wb3VuZF9oZWFkKHBhZ2UpKSkgPj0gR1VQX1BJTl9DT1VOVElO R19CSUFTOworfQorCiAjaWYgZGVmaW5lZChDT05GSUdfU1BBUlNFTUVNKSAmJiAhZGVmaW5lZChD T05GSUdfU1BBUlNFTUVNX1ZNRU1NQVApCiAjZGVmaW5lIFNFQ1RJT05fSU5fUEFHRV9GTEFHUwog I2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oIGIvaW5jbHVkZS9saW51 eC9tbXpvbmUuaAppbmRleCBiZGEyMDI4Mjc0NmIuLjA0ODVjYmEzOGQyMyAxMDA2NDQKLS0tIGEv aW5jbHVkZS9saW51eC9tbXpvbmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oCkBAIC0y NDQsNiArMjQ0LDggQEAgZW51bSBub2RlX3N0YXRfaXRlbSB7CiAJTlJfRElSVElFRCwJCS8qIHBh Z2UgZGlydHlpbmdzIHNpbmNlIGJvb3R1cCAqLwogCU5SX1dSSVRURU4sCQkvKiBwYWdlIHdyaXRp bmdzIHNpbmNlIGJvb3R1cCAqLwogCU5SX0tFUk5FTF9NSVNDX1JFQ0xBSU1BQkxFLAkvKiByZWNs YWltYWJsZSBub24tc2xhYiBrZXJuZWwgcGFnZXMgKi8KKwlOUl9GT0xMX1BJTl9SRVFVRVNURUQs CS8qIHZpYTogcGluX3VzZXJfcGFnZSgpLCBndXAgZmxhZzogRk9MTF9QSU4gKi8KKwlOUl9GT0xM X1BJTl9SRVRVUk5FRCwJLyogcGFnZXMgcmV0dXJuZWQgdmlhIHB1dF91c2VyX3BhZ2UoKSAqLwog CU5SX1ZNX05PREVfU1RBVF9JVEVNUwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9w YWdlX3JlZi5oIGIvaW5jbHVkZS9saW51eC9wYWdlX3JlZi5oCmluZGV4IDE0ZDE0YmViMWY3Zi4u YjljYmU1NTNkMWU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BhZ2VfcmVmLmgKKysrIGIv aW5jbHVkZS9saW51eC9wYWdlX3JlZi5oCkBAIC0xMDIsNiArMTAyLDE2IEBAIHN0YXRpYyBpbmxp bmUgdm9pZCBwYWdlX3JlZl9zdWIoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBucikKIAkJX19wYWdl X3JlZl9tb2QocGFnZSwgLW5yKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgcGFnZV9yZWZfc3Vi X3JldHVybihzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG5yKQoreworCWludCByZXQgPSBhdG9taWNf c3ViX3JldHVybihuciwgJnBhZ2UtPl9yZWZjb3VudCk7CisKKwlpZiAocGFnZV9yZWZfdHJhY2Vw b2ludF9hY3RpdmUoX190cmFjZXBvaW50X3BhZ2VfcmVmX21vZCkpCisJCV9fcGFnZV9yZWZfbW9k KHBhZ2UsIC1ucik7CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgcGFn ZV9yZWZfaW5jKHN0cnVjdCBwYWdlICpwYWdlKQogewogCWF0b21pY19pbmMoJnBhZ2UtPl9yZWZj b3VudCk7CmRpZmYgLS1naXQgYS9tbS9ndXAuYyBiL21tL2d1cC5jCmluZGV4IGVhMzE4MTBkYTgy OC4uZmMxNjRjMmVlNmI1IDEwMDY0NAotLS0gYS9tbS9ndXAuYworKysgYi9tbS9ndXAuYwpAQCAt NDQsNiArNDQsOTUgQEAgc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqdHJ5X2dldF9jb21wb3Vu ZF9oZWFkKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgcmVmcykKIAlyZXR1cm4gaGVhZDsKIH0KIAor I2lmZGVmIENPTkZJR19ERUJVR19WTQorc3RhdGljIGlubGluZSB2b2lkIF9fdXBkYXRlX3Byb2Nf dm1zdGF0KHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCQllbnVtIG5vZGVfc3RhdF9pdGVtIGl0ZW0s IGludCBjb3VudCkKK3sKKwltb2Rfbm9kZV9wYWdlX3N0YXRlKHBhZ2VfcGdkYXQocGFnZSksIGl0 ZW0sIGNvdW50KTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgX191cGRhdGVfcHJvY192 bXN0YXQoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJCWVudW0gbm9kZV9zdGF0X2l0ZW0gaXRlbSwg aW50IGNvdW50KQoreworfQorI2VuZGlmCisKKy8qKgorICogdXNlcl9wYWdlX3JlZl9pbmMoKSAt IG1hcmsgYSBwYWdlIGFzIGJlaW5nIHVzZWQgYnkgZ2V0X3VzZXJfcGFnZXMoRk9MTF9QSU4pLgor ICoKKyAqIEBwYWdlOglwb2ludGVyIHRvIHBhZ2UgdG8gYmUgbWFya2VkCisgKiBAUmV0dXJuOgl0 cnVlIGZvciBzdWNjZXNzLCBmYWxzZSBmb3IgZmFpbHVyZQorICovCitfX211c3RfY2hlY2sgYm9v bCB1c2VyX3BhZ2VfcmVmX2luYyhzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlwYWdlID0gdHJ5X2dl dF9jb21wb3VuZF9oZWFkKHBhZ2UsIEdVUF9QSU5fQ09VTlRJTkdfQklBUyk7CisJaWYgKCFwYWdl KQorCQlyZXR1cm4gZmFsc2U7CisKKwlfX3VwZGF0ZV9wcm9jX3Ztc3RhdChwYWdlLCBOUl9GT0xM X1BJTl9SRVFVRVNURUQsIDEpOworCXJldHVybiB0cnVlOworfQorCisjaWZkZWYgQ09ORklHX0RF Vl9QQUdFTUFQX09QUworc3RhdGljIGJvb2wgX19wdXRfZGV2bWFwX21hbmFnZWRfdXNlcl9wYWdl KHN0cnVjdCBwYWdlICpwYWdlKQoreworCWJvb2wgaXNfZGV2bWFwID0gcGFnZV9pc19kZXZtYXBf bWFuYWdlZChwYWdlKTsKKworCWlmIChpc19kZXZtYXApIHsKKwkJaW50IGNvdW50ID0gcGFnZV9y ZWZfc3ViX3JldHVybihwYWdlLCBHVVBfUElOX0NPVU5USU5HX0JJQVMpOworCisJCV9fdXBkYXRl X3Byb2Nfdm1zdGF0KHBhZ2UsIE5SX0ZPTExfUElOX1JFVFVSTkVELCAxKTsKKwkJLyoKKwkJICog ZGV2bWFwIHBhZ2UgcmVmY291bnRzIGFyZSAxLWJhc2VkLCByYXRoZXIgdGhhbiAwLWJhc2VkOiBp ZgorCQkgKiByZWZjb3VudCBpcyAxLCB0aGVuIHRoZSBwYWdlIGlzIGZyZWUgYW5kIHRoZSByZWZj b3VudCBpcworCQkgKiBzdGFibGUgYmVjYXVzZSBub2JvZHkgaG9sZHMgYSByZWZlcmVuY2Ugb24g dGhlIHBhZ2UuCisJCSAqLworCQlpZiAoY291bnQgPT0gMSkKKwkJCWZyZWVfZGV2bWFwX21hbmFn ZWRfcGFnZShwYWdlKTsKKwkJZWxzZSBpZiAoIWNvdW50KQorCQkJX19wdXRfcGFnZShwYWdlKTsK Kwl9CisKKwlyZXR1cm4gaXNfZGV2bWFwOworfQorI2Vsc2UKK3N0YXRpYyBib29sIF9fcHV0X2Rl dm1hcF9tYW5hZ2VkX3VzZXJfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gZmFs c2U7Cit9CisjZW5kaWYgLyogQ09ORklHX0RFVl9QQUdFTUFQX09QUyAqLworCisvKioKKyAqIHB1 dF91c2VyX3BhZ2UoKSAtIHJlbGVhc2UgYSBndXAtcGlubmVkIHBhZ2UKKyAqIEBwYWdlOiAgICAg ICAgICAgIHBvaW50ZXIgdG8gcGFnZSB0byBiZSByZWxlYXNlZAorICoKKyAqIFBhZ2VzIHRoYXQg d2VyZSBwaW5uZWQgdmlhIGdldF91c2VyX3BhZ2VzKigpIG11c3QgYmUgcmVsZWFzZWQgdmlhCisg KiBlaXRoZXIgcHV0X3VzZXJfcGFnZSgpLCBvciBvbmUgb2YgdGhlIHB1dF91c2VyX3BhZ2VzKigp IHJvdXRpbmVzCisgKiBiZWxvdy4gVGhpcyBpcyBzbyB0aGF0IGV2ZW50dWFsbHksIHBhZ2VzIHRo YXQgYXJlIHBpbm5lZCB2aWEKKyAqIGdldF91c2VyX3BhZ2VzKigpIGNhbiBiZSBzZXBhcmF0ZWx5 IHRyYWNrZWQgYW5kIHVuaXF1ZWx5IGhhbmRsZWQuIEluCisgKiBwYXJ0aWN1bGFyLCBpbnRlcmFj dGlvbnMgd2l0aCBSRE1BIGFuZCBmaWxlc3lzdGVtcyBuZWVkIHNwZWNpYWwKKyAqIGhhbmRsaW5n LgorICovCit2b2lkIHB1dF91c2VyX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcGFnZSA9 IGNvbXBvdW5kX2hlYWQocGFnZSk7CisKKwkvKgorCSAqIEZvciBkZXZtYXAgbWFuYWdlZCBwYWdl cyB3ZSBuZWVkIHRvIGNhdGNoIHJlZmNvdW50IHRyYW5zaXRpb24gZnJvbQorCSAqIEdVUF9QSU5f Q09VTlRJTkdfQklBUyB0byAxLCB3aGVuIHJlZmNvdW50IHJlYWNoIG9uZSBpdCBtZWFucyB0aGUK KwkgKiBwYWdlIGlzIGZyZWUgYW5kIHdlIG5lZWQgdG8gaW5mb3JtIHRoZSBkZXZpY2UgZHJpdmVy IHRocm91Z2gKKwkgKiBjYWxsYmFjay4gU2VlIGluY2x1ZGUvbGludXgvbWVtcmVtYXAuaCBhbmQg SE1NIGZvciBkZXRhaWxzLgorCSAqLworCWlmIChfX3B1dF9kZXZtYXBfbWFuYWdlZF91c2VyX3Bh Z2UocGFnZSkpCisJCXJldHVybjsKKworCWlmIChwYWdlX3JlZl9zdWJfYW5kX3Rlc3QocGFnZSwg R1VQX1BJTl9DT1VOVElOR19CSUFTKSkKKwkJX19wdXRfcGFnZShwYWdlKTsKKworCV9fdXBkYXRl X3Byb2Nfdm1zdGF0KHBhZ2UsIE5SX0ZPTExfUElOX1JFVFVSTkVELCAxKTsKK30KK0VYUE9SVF9T WU1CT0wocHV0X3VzZXJfcGFnZSk7CisKIC8qKgogICogcHV0X3VzZXJfcGFnZXNfZGlydHlfbG9j aygpIC0gcmVsZWFzZSBhbmQgb3B0aW9uYWxseSBkaXJ0eSBndXAtcGlubmVkIHBhZ2VzCiAgKiBA cGFnZXM6ICBhcnJheSBvZiBwYWdlcyB0byBiZSBtYXliZSBtYXJrZWQgZGlydHksIGFuZCBkZWZp bml0ZWx5IHJlbGVhc2VkLgpAQCAtMjMwLDEwICszMTksMTEgQEAgc3RhdGljIHN0cnVjdCBwYWdl ICpmb2xsb3dfcGFnZV9wdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJfQogCiAJcGFn ZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkcmVzcywgcHRlKTsKLQlpZiAoIXBhZ2UgJiYgcHRl X2Rldm1hcChwdGUpICYmIChmbGFncyAmIEZPTExfR0VUKSkgeworCWlmICghcGFnZSAmJiBwdGVf ZGV2bWFwKHB0ZSkgJiYgKGZsYWdzICYgKEZPTExfR0VUIHwgRk9MTF9QSU4pKSkgewogCQkvKgot CQkgKiBPbmx5IHJldHVybiBkZXZpY2UgbWFwcGluZyBwYWdlcyBpbiB0aGUgRk9MTF9HRVQgY2Fz ZSBzaW5jZQotCQkgKiB0aGV5IGFyZSBvbmx5IHZhbGlkIHdoaWxlIGhvbGRpbmcgdGhlIHBnbWFw IHJlZmVyZW5jZS4KKwkJICogT25seSByZXR1cm4gZGV2aWNlIG1hcHBpbmcgcGFnZXMgaW4gdGhl IEZPTExfR0VUIG9yIEZPTExfUElOCisJCSAqIGNhc2Ugc2luY2UgdGhleSBhcmUgb25seSB2YWxp ZCB3aGlsZSBob2xkaW5nIHRoZSBwZ21hcAorCQkgKiByZWZlcmVuY2UuCiAJCSAqLwogCQkqcGdt YXAgPSBnZXRfZGV2X3BhZ2VtYXAocHRlX3BmbihwdGUpLCAqcGdtYXApOwogCQlpZiAoKnBnbWFw KQpAQCAtMjc2LDYgKzM2NiwxMSBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wYWdlX3B0 ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCXBhZ2UgPSBFUlJfUFRSKC1FTk9NRU0p OwogCQkJZ290byBvdXQ7CiAJCX0KKwl9IGVsc2UgaWYgKGZsYWdzICYgRk9MTF9QSU4pIHsKKwkJ aWYgKHVubGlrZWx5KCF1c2VyX3BhZ2VfcmVmX2luYyhwYWdlKSkpIHsKKwkJCXBhZ2UgPSBFUlJf UFRSKC1FTk9NRU0pOworCQkJZ290byBvdXQ7CisJCX0KIAl9CiAJaWYgKGZsYWdzICYgRk9MTF9U T1VDSCkgewogCQlpZiAoKGZsYWdzICYgRk9MTF9XUklURSkgJiYKQEAgLTUzNyw4ICs2MzIsOCBA QCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wYWdlX21hc2soc3RydWN0IHZtX2FyZWFfc3Ry dWN0ICp2bWEsCiAJLyogbWFrZSB0aGlzIGhhbmRsZSBodWdlcGQgKi8KIAlwYWdlID0gZm9sbG93 X2h1Z2VfYWRkcihtbSwgYWRkcmVzcywgZmxhZ3MgJiBGT0xMX1dSSVRFKTsKIAlpZiAoIUlTX0VS UihwYWdlKSkgewotCQlCVUdfT04oZmxhZ3MgJiBGT0xMX0dFVCk7Ci0JCXJldHVybiBwYWdlOwor CQlXQVJOX09OX09OQ0UoZmxhZ3MgJiAoRk9MTF9HRVQgfCBGT0xMX1BJTikpOworCQlyZXR1cm4g TlVMTDsKIAl9CiAKIAlwZ2QgPSBwZ2Rfb2Zmc2V0KG1tLCBhZGRyZXNzKTsKQEAgLTE4MzAsMTMg KzE5MjUsMTcgQEAgc3RhdGljIGlubGluZSBwdGVfdCBndXBfZ2V0X3B0ZShwdGVfdCAqcHRlcCkK ICNlbmRpZiAvKiBDT05GSUdfR1VQX0dFVF9QVEVfTE9XX0hJR0ggKi8KIAogc3RhdGljIHZvaWQg X19tYXliZV91bnVzZWQgdW5kb19kZXZfcGFnZW1hcChpbnQgKm5yLCBpbnQgbnJfc3RhcnQsCisJ CQkJCSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsCiAJCQkJCSAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2Vz KQogewogCXdoaWxlICgoKm5yKSAtIG5yX3N0YXJ0KSB7CiAJCXN0cnVjdCBwYWdlICpwYWdlID0g cGFnZXNbLS0oKm5yKV07CiAKIAkJQ2xlYXJQYWdlUmVmZXJlbmNlZChwYWdlKTsKLQkJcHV0X3Bh Z2UocGFnZSk7CisJCWlmIChmbGFncyAmIEZPTExfUElOKQorCQkJcHV0X3VzZXJfcGFnZShwYWdl KTsKKwkJZWxzZQorCQkJcHV0X3BhZ2UocGFnZSk7CiAJfQogfQogCkBAIC0xODY5LDcgKzE5Njgs NyBAQCBzdGF0aWMgaW50IGd1cF9wdGVfcmFuZ2UocG1kX3QgcG1kLCB1bnNpZ25lZCBsb25nIGFk ZHIsIHVuc2lnbmVkIGxvbmcgZW5kLAogCiAJCQlwZ21hcCA9IGdldF9kZXZfcGFnZW1hcChwdGVf cGZuKHB0ZSksIHBnbWFwKTsKIAkJCWlmICh1bmxpa2VseSghcGdtYXApKSB7Ci0JCQkJdW5kb19k ZXZfcGFnZW1hcChuciwgbnJfc3RhcnQsIHBhZ2VzKTsKKwkJCQl1bmRvX2Rldl9wYWdlbWFwKG5y LCBucl9zdGFydCwgZmxhZ3MsIHBhZ2VzKTsKIAkJCQlnb3RvIHB0ZV91bm1hcDsKIAkJCX0KIAkJ fSBlbHNlIGlmIChwdGVfc3BlY2lhbChwdGUpKQpAQCAtMTg3OCw5ICsxOTc3LDE1IEBAIHN0YXRp YyBpbnQgZ3VwX3B0ZV9yYW5nZShwbWRfdCBwbWQsIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWdu ZWQgbG9uZyBlbmQsCiAJCVZNX0JVR19PTighcGZuX3ZhbGlkKHB0ZV9wZm4ocHRlKSkpOwogCQlw YWdlID0gcHRlX3BhZ2UocHRlKTsKIAotCQloZWFkID0gdHJ5X2dldF9jb21wb3VuZF9oZWFkKHBh Z2UsIDEpOwotCQlpZiAoIWhlYWQpCi0JCQlnb3RvIHB0ZV91bm1hcDsKKwkJaWYgKGZsYWdzICYg Rk9MTF9QSU4pIHsKKwkJCWhlYWQgPSBwYWdlOworCQkJaWYgKHVubGlrZWx5KCF1c2VyX3BhZ2Vf cmVmX2luYyhoZWFkKSkpCisJCQkJZ290byBwdGVfdW5tYXA7CisJCX0gZWxzZSB7CisJCQloZWFk ID0gdHJ5X2dldF9jb21wb3VuZF9oZWFkKHBhZ2UsIDEpOworCQkJaWYgKCFoZWFkKQorCQkJCWdv dG8gcHRlX3VubWFwOworCQl9CiAKIAkJaWYgKHVubGlrZWx5KHB0ZV92YWwocHRlKSAhPSBwdGVf dmFsKCpwdGVwKSkpIHsKIAkJCXB1dF9wYWdlKGhlYWQpOwpAQCAtMTkzNCwxMiArMjAzOSwyMCBA QCBzdGF0aWMgaW50IF9fZ3VwX2RldmljZV9odWdlKHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25l ZCBsb25nIGFkZHIsCiAKIAkJcGdtYXAgPSBnZXRfZGV2X3BhZ2VtYXAocGZuLCBwZ21hcCk7CiAJ CWlmICh1bmxpa2VseSghcGdtYXApKSB7Ci0JCQl1bmRvX2Rldl9wYWdlbWFwKG5yLCBucl9zdGFy dCwgcGFnZXMpOworCQkJdW5kb19kZXZfcGFnZW1hcChuciwgbnJfc3RhcnQsIGZsYWdzLCBwYWdl cyk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQlTZXRQYWdlUmVmZXJlbmNlZChwYWdlKTsKIAkJcGFn ZXNbKm5yXSA9IHBhZ2U7Ci0JCWdldF9wYWdlKHBhZ2UpOworCisJCWlmIChmbGFncyAmIEZPTExf UElOKSB7CisJCQlpZiAodW5saWtlbHkoIXVzZXJfcGFnZV9yZWZfaW5jKHBhZ2UpKSkgeworCQkJ CXVuZG9fZGV2X3BhZ2VtYXAobnIsIG5yX3N0YXJ0LCBmbGFncywgcGFnZXMpOworCQkJCXJldHVy biAwOworCQkJfQorCQl9IGVsc2UKKwkJCWdldF9wYWdlKHBhZ2UpOworCiAJCSgqbnIpKys7CiAJ CXBmbisrOwogCX0gd2hpbGUgKGFkZHIgKz0gUEFHRV9TSVpFLCBhZGRyICE9IGVuZCk7CkBAIC0x OTYxLDcgKzIwNzQsNyBAQCBzdGF0aWMgaW50IF9fZ3VwX2RldmljZV9odWdlX3BtZChwbWRfdCBv cmlnLCBwbWRfdCAqcG1kcCwgdW5zaWduZWQgbG9uZyBhZGRyLAogCQlyZXR1cm4gMDsKIAogCWlm ICh1bmxpa2VseShwbWRfdmFsKG9yaWcpICE9IHBtZF92YWwoKnBtZHApKSkgewotCQl1bmRvX2Rl dl9wYWdlbWFwKG5yLCBucl9zdGFydCwgcGFnZXMpOworCQl1bmRvX2Rldl9wYWdlbWFwKG5yLCBu cl9zdGFydCwgZmxhZ3MsIHBhZ2VzKTsKIAkJcmV0dXJuIDA7CiAJfQogCXJldHVybiAxOwpAQCAt MTk3OSw3ICsyMDkyLDcgQEAgc3RhdGljIGludCBfX2d1cF9kZXZpY2VfaHVnZV9wdWQocHVkX3Qg b3JpZywgcHVkX3QgKnB1ZHAsIHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJcmV0dXJuIDA7CiAKIAlp ZiAodW5saWtlbHkocHVkX3ZhbChvcmlnKSAhPSBwdWRfdmFsKCpwdWRwKSkpIHsKLQkJdW5kb19k ZXZfcGFnZW1hcChuciwgbnJfc3RhcnQsIHBhZ2VzKTsKKwkJdW5kb19kZXZfcGFnZW1hcChuciwg bnJfc3RhcnQsIGZsYWdzLCBwYWdlcyk7CiAJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gMTsKQEAg LTIwNjMsOSArMjE3NiwxNiBAQCBzdGF0aWMgaW50IGd1cF9odWdlcHRlKHB0ZV90ICpwdGVwLCB1 bnNpZ25lZCBsb25nIHN6LCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJcGFnZSA9IGhlYWQgKyAoKGFk ZHIgJiAoc3otMSkpID4+IFBBR0VfU0hJRlQpOwogCXJlZnMgPSBfX3JlY29yZF9zdWJwYWdlcyhw YWdlLCBhZGRyLCBlbmQsIHBhZ2VzLCAqbnIpOwogCi0JaGVhZCA9IHRyeV9nZXRfY29tcG91bmRf aGVhZChoZWFkLCByZWZzKTsKLQlpZiAoIWhlYWQpCi0JCXJldHVybiAwOworCWlmIChmbGFncyAm IEZPTExfUElOKSB7CisJCWhlYWQgPSBwYWdlOworCQlpZiAodW5saWtlbHkoIXVzZXJfcGFnZV9y ZWZfaW5jKGhlYWQpKSkKKwkJCXJldHVybiAwOworCQloZWFkID0gcGFnZTsKKwl9IGVsc2Ugewor CQloZWFkID0gdHJ5X2dldF9jb21wb3VuZF9oZWFkKGhlYWQsIHJlZnMpOworCQlpZiAoIWhlYWQp CisJCQlyZXR1cm4gMDsKKwl9CiAKIAlpZiAodW5saWtlbHkocHRlX3ZhbChwdGUpICE9IHB0ZV92 YWwoKnB0ZXApKSkgewogCQlwdXRfY29tcG91bmRfaGVhZChoZWFkLCByZWZzKTsKQEAgLTIxMjIs OSArMjI0MiwxNSBAQCBzdGF0aWMgaW50IGd1cF9odWdlX3BtZChwbWRfdCBvcmlnLCBwbWRfdCAq cG1kcCwgdW5zaWduZWQgbG9uZyBhZGRyLAogCXBhZ2UgPSBwbWRfcGFnZShvcmlnKSArICgoYWRk ciAmIH5QTURfTUFTSykgPj4gUEFHRV9TSElGVCk7CiAJcmVmcyA9IF9fcmVjb3JkX3N1YnBhZ2Vz KHBhZ2UsIGFkZHIsIGVuZCwgcGFnZXMsICpucik7CiAKLQloZWFkID0gdHJ5X2dldF9jb21wb3Vu ZF9oZWFkKHBtZF9wYWdlKG9yaWcpLCByZWZzKTsKLQlpZiAoIWhlYWQpCi0JCXJldHVybiAwOwor CWlmIChmbGFncyAmIEZPTExfUElOKSB7CisJCWhlYWQgPSBwYWdlOworCQlpZiAodW5saWtlbHko IXVzZXJfcGFnZV9yZWZfaW5jKGhlYWQpKSkKKwkJCXJldHVybiAwOworCX0gZWxzZSB7CisJCWhl YWQgPSB0cnlfZ2V0X2NvbXBvdW5kX2hlYWQocG1kX3BhZ2Uob3JpZyksIHJlZnMpOworCQlpZiAo IWhlYWQpCisJCQlyZXR1cm4gMDsKKwl9CiAKIAlpZiAodW5saWtlbHkocG1kX3ZhbChvcmlnKSAh PSBwbWRfdmFsKCpwbWRwKSkpIHsKIAkJcHV0X2NvbXBvdW5kX2hlYWQoaGVhZCwgcmVmcyk7CkBA IC0yMTU1LDkgKzIyODEsMTUgQEAgc3RhdGljIGludCBndXBfaHVnZV9wdWQocHVkX3Qgb3JpZywg cHVkX3QgKnB1ZHAsIHVuc2lnbmVkIGxvbmcgYWRkciwKIAlwYWdlID0gcHVkX3BhZ2Uob3JpZykg KyAoKGFkZHIgJiB+UFVEX01BU0spID4+IFBBR0VfU0hJRlQpOwogCXJlZnMgPSBfX3JlY29yZF9z dWJwYWdlcyhwYWdlLCBhZGRyLCBlbmQsIHBhZ2VzLCAqbnIpOwogCi0JaGVhZCA9IHRyeV9nZXRf Y29tcG91bmRfaGVhZChwdWRfcGFnZShvcmlnKSwgcmVmcyk7Ci0JaWYgKCFoZWFkKQotCQlyZXR1 cm4gMDsKKwlpZiAoZmxhZ3MgJiBGT0xMX1BJTikgeworCQloZWFkID0gcGFnZTsKKwkJaWYgKHVu bGlrZWx5KCF1c2VyX3BhZ2VfcmVmX2luYyhoZWFkKSkpCisJCQlyZXR1cm4gMDsKKwl9IGVsc2Ug eworCQloZWFkID0gdHJ5X2dldF9jb21wb3VuZF9oZWFkKHB1ZF9wYWdlKG9yaWcpLCByZWZzKTsK KwkJaWYgKCFoZWFkKQorCQkJcmV0dXJuIDA7CisJfQogCiAJaWYgKHVubGlrZWx5KHB1ZF92YWwo b3JpZykgIT0gcHVkX3ZhbCgqcHVkcCkpKSB7CiAJCXB1dF9jb21wb3VuZF9oZWFkKGhlYWQsIHJl ZnMpOwpAQCAtMjE4Myw5ICsyMzE1LDE1IEBAIHN0YXRpYyBpbnQgZ3VwX2h1Z2VfcGdkKHBnZF90 IG9yaWcsIHBnZF90ICpwZ2RwLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJcGFnZSA9IHBnZF9wYWdl KG9yaWcpICsgKChhZGRyICYgflBHRElSX01BU0spID4+IFBBR0VfU0hJRlQpOwogCXJlZnMgPSBf X3JlY29yZF9zdWJwYWdlcyhwYWdlLCBhZGRyLCBlbmQsIHBhZ2VzLCAqbnIpOwogCi0JaGVhZCA9 IHRyeV9nZXRfY29tcG91bmRfaGVhZChwZ2RfcGFnZShvcmlnKSwgcmVmcyk7Ci0JaWYgKCFoZWFk KQotCQlyZXR1cm4gMDsKKwlpZiAoZmxhZ3MgJiBGT0xMX1BJTikgeworCQloZWFkID0gcGFnZTsK KwkJaWYgKHVubGlrZWx5KCF1c2VyX3BhZ2VfcmVmX2luYyhoZWFkKSkpCisJCQlyZXR1cm4gMDsK Kwl9IGVsc2UgeworCQloZWFkID0gdHJ5X2dldF9jb21wb3VuZF9oZWFkKHBnZF9wYWdlKG9yaWcp LCByZWZzKTsKKwkJaWYgKCFoZWFkKQorCQkJcmV0dXJuIDA7CisJfQogCiAJaWYgKHVubGlrZWx5 KHBnZF92YWwob3JpZykgIT0gcGdkX3ZhbCgqcGdkcCkpKSB7CiAJCXB1dF9jb21wb3VuZF9oZWFk KGhlYWQsIHJlZnMpOwpkaWZmIC0tZ2l0IGEvbW0vaHVnZV9tZW1vcnkuYyBiL21tL2h1Z2VfbWVt b3J5LmMKaW5kZXggMTNjYzkzNzg1MDA2Li40MDEwYzI2OWU5ZTUgMTAwNjQ0Ci0tLSBhL21tL2h1 Z2VfbWVtb3J5LmMKKysrIGIvbW0vaHVnZV9tZW1vcnkuYwpAQCAtOTQ1LDYgKzk0NSwxMSBAQCBz dHJ1Y3QgcGFnZSAqZm9sbG93X2Rldm1hcF9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEs IHVuc2lnbmVkIGxvbmcgYWRkciwKIAkgKi8KIAlXQVJOX09OQ0UoZmxhZ3MgJiBGT0xMX0NPVywg Im1tOiBJbiBmb2xsb3dfZGV2bWFwX3BtZCB3aXRoIEZPTExfQ09XIHNldCIpOwogCisJLyogRk9M TF9HRVQgYW5kIEZPTExfUElOIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuICovCisJaWYgKFdBUk5f T05fT05DRSgoZmxhZ3MgJiAoRk9MTF9QSU4gfCBGT0xMX0dFVCkpID09CisJCQkgKEZPTExfUElO IHwgRk9MTF9HRVQpKSkKKwkJcmV0dXJuIE5VTEw7CisKIAlpZiAoZmxhZ3MgJiBGT0xMX1dSSVRF ICYmICFwbWRfd3JpdGUoKnBtZCkpCiAJCXJldHVybiBOVUxMOwogCkBAIC05NjAsNyArOTY1LDcg QEAgc3RydWN0IHBhZ2UgKmZvbGxvd19kZXZtYXBfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAq dm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJICogZGV2aWNlIG1hcHBlZCBwYWdlcyBjYW4gb25s eSBiZSByZXR1cm5lZCBpZiB0aGUKIAkgKiBjYWxsZXIgd2lsbCBtYW5hZ2UgdGhlIHBhZ2UgcmVm ZXJlbmNlIGNvdW50LgogCSAqLwotCWlmICghKGZsYWdzICYgRk9MTF9HRVQpKQorCWlmICghKGZs YWdzICYgKEZPTExfR0VUIHwgRk9MTF9QSU4pKSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVFWElTVCk7 CiAKIAlwZm4gKz0gKGFkZHIgJiB+UE1EX01BU0spID4+IFBBR0VfU0hJRlQ7CkBAIC05NjgsNyAr OTczLDE4IEBAIHN0cnVjdCBwYWdlICpmb2xsb3dfZGV2bWFwX3BtZChzdHJ1Y3Qgdm1fYXJlYV9z dHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCWlmICghKnBnbWFwKQogCQlyZXR1cm4g RVJSX1BUUigtRUZBVUxUKTsKIAlwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKLQlnZXRfcGFnZShw YWdlKTsKKworCWlmIChmbGFncyAmIEZPTExfR0VUKQorCQlnZXRfcGFnZShwYWdlKTsKKwllbHNl IGlmIChmbGFncyAmIEZPTExfUElOKSB7CisJCS8qCisJCSAqIHVzZXJfcGFnZV9yZWZfaW5jKCkg aXMgbm90IGFjdHVhbGx5IGV4cGVjdGVkIHRvIGZhaWwgaGVyZQorCQkgKiBiZWNhdXNlIHdlIGhv bGQgdGhlIHBtZCBsb2NrIHNvIG5vIG9uZSBjYW4gdW5tYXAgdGhlIHBtZCBhbmQKKwkJICogZnJl ZSB0aGUgcGFnZSB0aGF0IGl0IHBvaW50cyB0by4KKwkJICovCisJCWlmICh1bmxpa2VseSghdXNl cl9wYWdlX3JlZl9pbmMocGFnZSkpKQorCQkJcGFnZSA9IEVSUl9QVFIoLUVGQVVMVCk7CisJfQog CiAJcmV0dXJuIHBhZ2U7CiB9CkBAIC0xMDg4LDYgKzExMDQsMTEgQEAgc3RydWN0IHBhZ2UgKmZv bGxvd19kZXZtYXBfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25n IGFkZHIsCiAJaWYgKGZsYWdzICYgRk9MTF9XUklURSAmJiAhcHVkX3dyaXRlKCpwdWQpKQogCQly ZXR1cm4gTlVMTDsKIAorCS8qIEZPTExfR0VUIGFuZCBGT0xMX1BJTiBhcmUgbXV0dWFsbHkgZXhj bHVzaXZlLiAqLworCWlmIChXQVJOX09OX09OQ0UoKGZsYWdzICYgKEZPTExfUElOIHwgRk9MTF9H RVQpKSA9PQorCQkJIChGT0xMX1BJTiB8IEZPTExfR0VUKSkpCisJCXJldHVybiBOVUxMOworCiAJ aWYgKHB1ZF9wcmVzZW50KCpwdWQpICYmIHB1ZF9kZXZtYXAoKnB1ZCkpCiAJCS8qIHBhc3MgKi87 CiAJZWxzZQpAQCAtMTA5OSw4ICsxMTIwLDEwIEBAIHN0cnVjdCBwYWdlICpmb2xsb3dfZGV2bWFw X3B1ZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCS8q CiAJICogZGV2aWNlIG1hcHBlZCBwYWdlcyBjYW4gb25seSBiZSByZXR1cm5lZCBpZiB0aGUKIAkg KiBjYWxsZXIgd2lsbCBtYW5hZ2UgdGhlIHBhZ2UgcmVmZXJlbmNlIGNvdW50LgorCSAqCisJICog QXQgbGVhc3Qgb25lIG9mIEZPTExfR0VUIHwgRk9MTF9QSU4gbXVzdCBiZSBzZXQsIHNvIGFzc2Vy dCB0aGF0IGhlcmU6CiAJICovCi0JaWYgKCEoZmxhZ3MgJiBGT0xMX0dFVCkpCisJaWYgKCEoZmxh Z3MgJiAoRk9MTF9HRVQgfCBGT0xMX1BJTikpKQogCQlyZXR1cm4gRVJSX1BUUigtRUVYSVNUKTsK IAogCXBmbiArPSAoYWRkciAmIH5QVURfTUFTSykgPj4gUEFHRV9TSElGVDsKQEAgLTExMDgsNyAr MTEzMSwxOCBAQCBzdHJ1Y3QgcGFnZSAqZm9sbG93X2Rldm1hcF9wdWQoc3RydWN0IHZtX2FyZWFf c3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwKIAlpZiAoISpwZ21hcCkKIAkJcmV0dXJu IEVSUl9QVFIoLUVGQVVMVCk7CiAJcGFnZSA9IHBmbl90b19wYWdlKHBmbik7Ci0JZ2V0X3BhZ2Uo cGFnZSk7CisKKwlpZiAoZmxhZ3MgJiBGT0xMX0dFVCkKKwkJZ2V0X3BhZ2UocGFnZSk7CisJZWxz ZSBpZiAoZmxhZ3MgJiBGT0xMX1BJTikgeworCQkvKgorCQkgKiB1c2VyX3BhZ2VfcmVmX2luYygp IGlzIG5vdCBhY3R1YWxseSBleHBlY3RlZCB0byBmYWlsIGhlcmUKKwkJICogYmVjYXVzZSB3ZSBo b2xkIHRoZSBwdWQgbG9jayBzbyBubyBvbmUgY2FuIHVubWFwIHRoZSBwdWQgYW5kCisJCSAqIGZy ZWUgdGhlIHBhZ2UgdGhhdCBpdCBwb2ludHMgdG8uCisJCSAqLworCQlpZiAodW5saWtlbHkoIXVz ZXJfcGFnZV9yZWZfaW5jKHBhZ2UpKSkKKwkJCXBhZ2UgPSBFUlJfUFRSKC1FRkFVTFQpOworCX0K IAogCXJldHVybiBwYWdlOwogfQpAQCAtMTUyMiw4ICsxNTU2LDIwIEBAIHN0cnVjdCBwYWdlICpm b2xsb3dfdHJhbnNfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiBza2lwX21s b2NrOgogCXBhZ2UgKz0gKGFkZHIgJiB+SFBBR0VfUE1EX01BU0spID4+IFBBR0VfU0hJRlQ7CiAJ Vk1fQlVHX09OX1BBR0UoIVBhZ2VDb21wb3VuZChwYWdlKSAmJiAhaXNfem9uZV9kZXZpY2VfcGFn ZShwYWdlKSwgcGFnZSk7CisKIAlpZiAoZmxhZ3MgJiBGT0xMX0dFVCkKIAkJZ2V0X3BhZ2UocGFn ZSk7CisJZWxzZSBpZiAoZmxhZ3MgJiBGT0xMX1BJTikgeworCQkvKgorCQkgKiB1c2VyX3BhZ2Vf cmVmX2luYygpIGlzIG5vdCBhY3R1YWxseSBleHBlY3RlZCB0byBmYWlsIGhlcmUKKwkJICogYmVj YXVzZSB3ZSBob2xkIHRoZSBwbWQgbG9jayBzbyBubyBvbmUgY2FuIHVubWFwIHRoZSBwbWQgYW5k CisJCSAqIGZyZWUgdGhlIHBhZ2UgdGhhdCBpdCBwb2ludHMgdG8uCisJCSAqLworCQlpZiAodW5s aWtlbHkoIXVzZXJfcGFnZV9yZWZfaW5jKHBhZ2UpKSkgeworCQkJV0FSTl9PTl9PTkNFKDEpOwor CQkJcGFnZSA9IE5VTEw7CisJCX0KKwl9CiAKIG91dDoKIAlyZXR1cm4gcGFnZTsKZGlmZiAtLWdp dCBhL21tL2h1Z2V0bGIuYyBiL21tL2h1Z2V0bGIuYwppbmRleCBiNDVhOTUzNjNhODQuLjVlZTgw ZWVhMjVlNSAxMDA2NDQKLS0tIGEvbW0vaHVnZXRsYi5jCisrKyBiL21tL2h1Z2V0bGIuYwpAQCAt NDQ2Miw3ICs0NDYyLDIyIEBAIGxvbmcgZm9sbG93X2h1Z2V0bGJfcGFnZShzdHJ1Y3QgbW1fc3Ry dWN0ICptbSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiBzYW1lX3BhZ2U6CiAJCWlmIChw YWdlcykgewogCQkJcGFnZXNbaV0gPSBtZW1fbWFwX29mZnNldChwYWdlLCBwZm5fb2Zmc2V0KTsK LQkJCWdldF9wYWdlKHBhZ2VzW2ldKTsKKworCQkJaWYgKGZsYWdzICYgRk9MTF9HRVQpCisJCQkJ Z2V0X3BhZ2UocGFnZXNbaV0pOworCQkJZWxzZSBpZiAoZmxhZ3MgJiBGT0xMX1BJTikgeworCQkJ CS8qCisJCQkJICogdXNlcl9wYWdlX3JlZl9pbmMoKSBpcyBub3QgYWN0dWFsbHkgZXhwZWN0ZWQK KwkJCQkgKiB0byBmYWlsIGhlcmUgYmVjYXVzZSB3ZSBob2xkIHRoZSBwdGwuCisJCQkJICovCisJ CQkJaWYgKHVubGlrZWx5KCF1c2VyX3BhZ2VfcmVmX2luYyhwYWdlc1tpXSkpKSB7CisJCQkJCXNw aW5fdW5sb2NrKHB0bCk7CisJCQkJCXJlbWFpbmRlciA9IDA7CisJCQkJCWVyciA9IC1FTk9NRU07 CisJCQkJCVdBUk5fT05fT05DRSgxKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQogCQl9CiAK IAkJaWYgKHZtYXMpCkBAIC01MDIyLDYgKzUwMzcsMTIgQEAgZm9sbG93X2h1Z2VfcG1kKHN0cnVj dCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiAJc3RydWN0IHBhZ2UgKnBh Z2UgPSBOVUxMOwogCXNwaW5sb2NrX3QgKnB0bDsKIAlwdGVfdCBwdGU7CisKKwkvKiBGT0xMX0dF VCBhbmQgRk9MTF9QSU4gYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gKi8KKwlpZiAoV0FSTl9PTl9P TkNFKChmbGFncyAmIChGT0xMX1BJTiB8IEZPTExfR0VUKSkgPT0KKwkJCSAoRk9MTF9QSU4gfCBG T0xMX0dFVCkpKQorCQlyZXR1cm4gTlVMTDsKKwogcmV0cnk6CiAJcHRsID0gcG1kX2xvY2twdHIo bW0sIHBtZCk7CiAJc3Bpbl9sb2NrKHB0bCk7CkBAIC01MDM0LDggKzUwNTUsMjAgQEAgZm9sbG93 X2h1Z2VfcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiAJ cHRlID0gaHVnZV9wdGVwX2dldCgocHRlX3QgKilwbWQpOwogCWlmIChwdGVfcHJlc2VudChwdGUp KSB7CiAJCXBhZ2UgPSBwbWRfcGFnZSgqcG1kKSArICgoYWRkcmVzcyAmIH5QTURfTUFTSykgPj4g UEFHRV9TSElGVCk7CisKIAkJaWYgKGZsYWdzICYgRk9MTF9HRVQpCiAJCQlnZXRfcGFnZShwYWdl KTsKKwkJZWxzZSBpZiAoZmxhZ3MgJiBGT0xMX1BJTikgeworCQkJLyoKKwkJCSAqIHVzZXJfcGFn ZV9yZWZfaW5jKCkgaXMgbm90IGFjdHVhbGx5IGV4cGVjdGVkIHRvIGZhaWwKKwkJCSAqIGhlcmUg YmVjYXVzZSB3ZSBob2xkIHRoZSBwdGwuCisJCQkgKi8KKwkJCWlmICh1bmxpa2VseSghdXNlcl9w YWdlX3JlZl9pbmMocGFnZSkpKSB7CisJCQkJV0FSTl9PTl9PTkNFKDEpOworCQkJCXBhZ2UgPSBO VUxMOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CiAJfSBlbHNlIHsKIAkJaWYgKGlzX2h1Z2V0 bGJfZW50cnlfbWlncmF0aW9uKHB0ZSkpIHsKIAkJCXNwaW5fdW5sb2NrKHB0bCk7CkBAIC01MDU2 LDcgKzUwODksNyBAQCBzdHJ1Y3QgcGFnZSAqIF9fd2VhawogZm9sbG93X2h1Z2VfcHVkKHN0cnVj dCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiAJCXB1ZF90ICpwdWQsIGlu dCBmbGFncykKIHsKLQlpZiAoZmxhZ3MgJiBGT0xMX0dFVCkKKwlpZiAoZmxhZ3MgJiAoRk9MTF9H RVQgfCBGT0xMX1BJTikpCiAJCXJldHVybiBOVUxMOwogCiAJcmV0dXJuIHB0ZV9wYWdlKCoocHRl X3QgKilwdWQpICsgKChhZGRyZXNzICYgflBVRF9NQVNLKSA+PiBQQUdFX1NISUZUKTsKQEAgLTUw NjUsNyArNTA5OCw3IEBAIGZvbGxvd19odWdlX3B1ZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5z aWduZWQgbG9uZyBhZGRyZXNzLAogc3RydWN0IHBhZ2UgKiBfX3dlYWsKIGZvbGxvd19odWdlX3Bn ZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwZ2RfdCAqcGdk LCBpbnQgZmxhZ3MpCiB7Ci0JaWYgKGZsYWdzICYgRk9MTF9HRVQpCisJaWYgKGZsYWdzICYgKEZP TExfR0VUIHwgRk9MTF9QSU4pKQogCQlyZXR1cm4gTlVMTDsKIAogCXJldHVybiBwdGVfcGFnZSgq KHB0ZV90ICopcGdkKSArICgoYWRkcmVzcyAmIH5QR0RJUl9NQVNLKSA+PiBQQUdFX1NISUZUKTsK ZGlmZiAtLWdpdCBhL21tL3Ztc3RhdC5jIGIvbW0vdm1zdGF0LmMKaW5kZXggYTgyMjIwNDFiZDQ0 Li5mZGFkNDBjY2RlN2IgMTAwNjQ0Ci0tLSBhL21tL3Ztc3RhdC5jCisrKyBiL21tL3Ztc3RhdC5j CkBAIC0xMTY3LDYgKzExNjcsOCBAQCBjb25zdCBjaGFyICogY29uc3Qgdm1zdGF0X3RleHRbXSA9 IHsKIAkibnJfZGlydGllZCIsCiAJIm5yX3dyaXR0ZW4iLAogCSJucl9rZXJuZWxfbWlzY19yZWNs YWltYWJsZSIsCisJIm5yX2ZvbGxfcGluX3JlcXVlc3RlZCIsCisJIm5yX2ZvbGxfcGluX3JldHVy bmVkIiwKIAogCS8qIGVudW0gd3JpdGViYWNrX3N0YXRfaXRlbSBjb3VudGVycyAqLwogCSJucl9k aXJ0eV90aHJlc2hvbGQiLAotLSAKMi4yNC4wCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0 cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9s aXN0aW5mby9kcmktZGV2ZWw= 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, 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 22F26C17447 for ; Tue, 12 Nov 2019 00:07:54 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (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 0166E2184C for ; Tue, 12 Nov 2019 00:07:54 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 0166E2184C Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=nvidia.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 3362E89308; Tue, 12 Nov 2019 00:07:28 +0000 (UTC) Received: from hqemgate15.nvidia.com (hqemgate15.nvidia.com [216.228.121.64]) by gabe.freedesktop.org (Postfix) with ESMTPS id 5933C6EA0E for ; Tue, 12 Nov 2019 00:07:23 +0000 (UTC) Received: from hqpgpgate102.nvidia.com (Not Verified[216.228.121.13]) by hqemgate15.nvidia.com (using TLS: TLSv1.2, DES-CBC3-SHA) id ; Mon, 11 Nov 2019 16:06:20 -0800 Received: from hqmail.nvidia.com ([172.20.161.6]) by hqpgpgate102.nvidia.com (PGP Universal service); Mon, 11 Nov 2019 16:07:22 -0800 X-PGP-Universal: processed; by hqpgpgate102.nvidia.com on Mon, 11 Nov 2019 16:07:22 -0800 Received: from HQMAIL111.nvidia.com (172.20.187.18) by HQMAIL101.nvidia.com (172.20.187.10) with Microsoft SMTP Server (TLS) id 15.0.1473.3; Tue, 12 Nov 2019 00:07:22 +0000 Received: from rnnvemgw01.nvidia.com (10.128.109.123) by HQMAIL111.nvidia.com (172.20.187.18) with Microsoft SMTP Server (TLS) id 15.0.1473.3 via Frontend Transport; Tue, 12 Nov 2019 00:07:21 +0000 Received: from blueforge.nvidia.com (Not Verified[10.110.48.28]) by rnnvemgw01.nvidia.com with Trustwave SEG (v7, 5, 8, 10121) id ; Mon, 11 Nov 2019 16:07:21 -0800 From: John Hubbard To: Andrew Morton Subject: [PATCH v3 16/23] mm/gup: track FOLL_PIN pages Date: Mon, 11 Nov 2019 16:06:53 -0800 Message-ID: <20191112000700.3455038-17-jhubbard@nvidia.com> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191112000700.3455038-1-jhubbard@nvidia.com> References: <20191112000700.3455038-1-jhubbard@nvidia.com> MIME-Version: 1.0 X-NVConfidentiality: public X-Mailman-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nvidia.com; s=n1; t=1573517181; bh=dYDsBNoCc3j3xBsicl5hq4Ee4AWgl5sCKuYiruAHrxc=; h=X-PGP-Universal:From:To:CC:Subject:Date:Message-ID:X-Mailer: In-Reply-To:References:MIME-Version:X-NVConfidentiality: Content-Type:Content-Transfer-Encoding; b=chekNDUAbN97fey2fZhm0ywh1NaBJrB/ZYPw3zsegTkyXZQBf8UPXzPvy6nDWVMfC QQFoHPOU0G38NPynp0q7l9yDCXUinYmaV6t291jp3PMZ4zlp29abboMQ55UfT0dJWL UQniibEZecxFEt6H4ft7rGrgtzjzIlJnKasuyknr7CgyLRJ34/jb+61YSSbRNBbOVf GNlHLQZw+yIsk29D5P61T7+5vFDemuP5kIGWB5UqnlbNiXWJtNHesfxFAdCAEEk40C PN8YB7XsrtAqyC4jgGU8PBuM9qzztuOZjPZSXGvwHEwPaVtY5jSUbnh/kw9Re+ea3o aaQf9jKY5tzkQ== X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Michal Hocko , Jan Kara , kvm@vger.kernel.org, linux-doc@vger.kernel.org, David Airlie , Dave Chinner , dri-devel@lists.freedesktop.org, LKML , linux-mm@kvack.org, Paul Mackerras , linux-kselftest@vger.kernel.org, Ira Weiny , Jonathan Corbet , linux-rdma@vger.kernel.org, Michael Ellerman , Christoph Hellwig , Jason Gunthorpe , Vlastimil Babka , =?UTF-8?q?Bj=C3=B6rn=20T=C3=B6pel?= , linux-media@vger.kernel.org, Shuah Khan , John Hubbard , linux-block@vger.kernel.org, =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= , Al Viro , Dan Williams , Mauro Carvalho Chehab , Magnus Karlsson , Jens Axboe , netdev@vger.kernel.org, Alex Williamson , linux-fsdevel@vger.kernel.org, bpf@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, "David S . Miller" , Mike Kravetz Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Message-ID: <20191112000653.vvWMt-49cvxhenIS9efOaL4bI2nLauGrBJCS3nMAWjY@z> QWRkIHRyYWNraW5nIG9mIHBhZ2VzIHRoYXQgd2VyZSBwaW5uZWQgdmlhIEZPTExfUElOLgoKQXMg bWVudGlvbmVkIGluIHRoZSBGT0xMX1BJTiBkb2N1bWVudGF0aW9uLCBjYWxsZXJzIHdobyBlZmZl Y3RpdmVseSBzZXQKRk9MTF9QSU4gYXJlIHJlcXVpcmVkIHRvIHVsdGltYXRlbHkgZnJlZSBzdWNo IHBhZ2VzIHZpYSBwdXRfdXNlcl9wYWdlKCkuClRoZSBlZmZlY3QgaXMgc2ltaWxhciB0byBGT0xM X0dFVCwgYW5kIG1heSBiZSB0aG91Z2h0IG9mIGFzICJGT0xMX0dFVApmb3IgRElPIGFuZC9vciBS RE1BIHVzZSIuCgpQYWdlcyB0aGF0IGhhdmUgYmVlbiBwaW5uZWQgdmlhIEZPTExfUElOIGFyZSBp ZGVudGlmaWFibGUgdmlhIGEKbmV3IGZ1bmN0aW9uIGNhbGw6CgogICBib29sIHBhZ2VfZG1hX3Bp bm5lZChzdHJ1Y3QgcGFnZSAqcGFnZSk7CgpXaGF0IHRvIGRvIGluIHJlc3BvbnNlIHRvIGVuY291 bnRlcmluZyBzdWNoIGEgcGFnZSwgaXMgbGVmdCB0byBsYXRlcgpwYXRjaHNldHMuIFRoZXJlIGlz IGRpc2N1c3Npb24gYWJvdXQgdGhpcyBpbiBbMV0uCgpUaGlzIGFsc28gY2hhbmdlcyBhIEJVR19P TigpLCB0byBhIFdBUk5fT04oKSwgaW4gZm9sbG93X3BhZ2VfbWFzaygpLgoKU3VnZ2VzdGVkLWJ5 OiBKYW4gS2FyYSA8amFja0BzdXNlLmN6PgpTdWdnZXN0ZWQtYnk6IErDqXLDtG1lIEdsaXNzZSA8 amdsaXNzZUByZWRoYXQuY29tPgpTaWduZWQtb2ZmLWJ5OiBKb2huIEh1YmJhcmQgPGpodWJiYXJk QG52aWRpYS5jb20+Ci0tLQogaW5jbHVkZS9saW51eC9tbS5oICAgICAgIHwgIDc1ICsrKysrKysr KysrKy0tLS0KIGluY2x1ZGUvbGludXgvbW16b25lLmggICB8ICAgMiArCiBpbmNsdWRlL2xpbnV4 L3BhZ2VfcmVmLmggfCAgMTAgKysrCiBtbS9ndXAuYyAgICAgICAgICAgICAgICAgfCAxOTAgKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tCiBtbS9odWdlX21lbW9yeS5jICAg ICAgICAgfCAgNTQgKysrKysrKysrKy0KIG1tL2h1Z2V0bGIuYyAgICAgICAgICAgICB8ICAzOSAr KysrKysrLQogbW0vdm1zdGF0LmMgICAgICAgICAgICAgIHwgICAyICsKIDcgZmlsZXMgY2hhbmdl ZCwgMzIyIGluc2VydGlvbnMoKyksIDUwIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2luY2x1 ZGUvbGludXgvbW0uaCBiL2luY2x1ZGUvbGludXgvbW0uaAppbmRleCAxMWUwMDg2ZDY0YTQuLjE5 YjNmYTY4YTRkYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbS5oCisrKyBiL2luY2x1ZGUv bGludXgvbW0uaApAQCAtMTA1NCw2ICsxMDU0LDggQEAgc3RhdGljIGlubGluZSBfX211c3RfY2hl Y2sgYm9vbCB0cnlfZ2V0X3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCiAJcmV0dXJuIHRydWU7CiB9 CiAKK19fbXVzdF9jaGVjayBib29sIHVzZXJfcGFnZV9yZWZfaW5jKHN0cnVjdCBwYWdlICpwYWdl KTsKKwogc3RhdGljIGlubGluZSB2b2lkIHB1dF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQogewog CXBhZ2UgPSBjb21wb3VuZF9oZWFkKHBhZ2UpOwpAQCAtMTA3MSwzMSArMTA3Myw3MCBAQCBzdGF0 aWMgaW5saW5lIHZvaWQgcHV0X3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCiAJCV9fcHV0X3BhZ2Uo cGFnZSk7CiB9CiAKLS8qKgotICogcHV0X3VzZXJfcGFnZSgpIC0gcmVsZWFzZSBhIGd1cC1waW5u ZWQgcGFnZQotICogQHBhZ2U6ICAgICAgICAgICAgcG9pbnRlciB0byBwYWdlIHRvIGJlIHJlbGVh c2VkCisvKgorICogR1VQX1BJTl9DT1VOVElOR19CSUFTLCBhbmQgdGhlIGFzc29jaWF0ZWQgZnVu Y3Rpb25zIHRoYXQgdXNlIGl0LCBvdmVybG9hZAorICogdGhlIHBhZ2UncyByZWZjb3VudCBzbyB0 aGF0IHR3byBzZXBhcmF0ZSBpdGVtcyBhcmUgdHJhY2tlZDogdGhlIG9yaWdpbmFsIHBhZ2UKKyAq IHJlZmVyZW5jZSBjb3VudCwgYW5kIGFsc28gYSBuZXcgY291bnQgb2YgaG93IG1hbnkgZ2V0X3Vz ZXJfcGFnZXMoKSBjYWxscyB3ZXJlCisgKiBtYWRlIGFnYWluc3QgdGhlIHBhZ2UuICgiZ3VwLXBp bm5lZCIgaXMgYW5vdGhlciB0ZXJtIGZvciB0aGUgbGF0dGVyKS4KKyAqCisgKiBXaXRoIHRoaXMg c2NoZW1lLCBnZXRfdXNlcl9wYWdlcygpIGJlY29tZXMgc3BlY2lhbDogc3VjaCBwYWdlcyBhcmUg bWFya2VkCisgKiBhcyBkaXN0aW5jdCBmcm9tIG5vcm1hbCBwYWdlcy4gQXMgc3VjaCwgdGhlIG5l dyBwdXRfdXNlcl9wYWdlKCkgY2FsbCAoYW5kCisgKiBpdHMgdmFyaWFudHMpIG11c3QgYmUgdXNl ZCBpbiBvcmRlciB0byByZWxlYXNlIGd1cC1waW5uZWQgcGFnZXMuCisgKgorICogQ2hvaWNlIG9m IHZhbHVlOgogICoKLSAqIFBhZ2VzIHRoYXQgd2VyZSBwaW5uZWQgdmlhIGdldF91c2VyX3BhZ2Vz KigpIG11c3QgYmUgcmVsZWFzZWQgdmlhCi0gKiBlaXRoZXIgcHV0X3VzZXJfcGFnZSgpLCBvciBv bmUgb2YgdGhlIHB1dF91c2VyX3BhZ2VzKigpIHJvdXRpbmVzCi0gKiBiZWxvdy4gVGhpcyBpcyBz byB0aGF0IGV2ZW50dWFsbHksIHBhZ2VzIHRoYXQgYXJlIHBpbm5lZCB2aWEKLSAqIGdldF91c2Vy X3BhZ2VzKigpIGNhbiBiZSBzZXBhcmF0ZWx5IHRyYWNrZWQgYW5kIHVuaXF1ZWx5IGhhbmRsZWQu IEluCi0gKiBwYXJ0aWN1bGFyLCBpbnRlcmFjdGlvbnMgd2l0aCBSRE1BIGFuZCBmaWxlc3lzdGVt cyBuZWVkIHNwZWNpYWwKLSAqIGhhbmRsaW5nLgorICogQnkgbWFraW5nIEdVUF9QSU5fQ09VTlRJ TkdfQklBUyBhIHBvd2VyIG9mIHR3bywgZGVidWdnaW5nIG9mIHBhZ2UgcmVmZXJlbmNlCisgKiBj b3VudHMgd2l0aCByZXNwZWN0IHRvIGdldF91c2VyX3BhZ2VzKCkgYW5kIHB1dF91c2VyX3BhZ2Uo KSBiZWNvbWVzIHNpbXBsZXIsCisgKiBkdWUgdG8gdGhlIGZhY3QgdGhhdCBhZGRpbmcgYW4gZXZl biBwb3dlciBvZiB0d28gdG8gdGhlIHBhZ2UgcmVmY291bnQgaGFzCisgKiB0aGUgZWZmZWN0IG9m IHVzaW5nIG9ubHkgdGhlIHVwcGVyIE4gYml0cywgZm9yIHRoZSBjb2RlIHRoYXQgY291bnRzIHVw IHVzaW5nCisgKiB0aGUgYmlhcyB2YWx1ZS4gVGhpcyBtZWFucyB0aGF0IHRoZSBsb3dlciBiaXRz IGFyZSBsZWZ0IGZvciB0aGUgZXhjbHVzaXZlCisgKiB1c2Ugb2YgdGhlIG9yaWdpbmFsIGNvZGUg dGhhdCBpbmNyZW1lbnRzIGFuZCBkZWNyZW1lbnRzIGJ5IG9uZSAob3IgYXQgbGVhc3QsCisgKiBi eSBtdWNoIHNtYWxsZXIgdmFsdWVzIHRoYW4gdGhlIGJpYXMgdmFsdWUpLgogICoKLSAqIHB1dF91 c2VyX3BhZ2UoKSBhbmQgcHV0X3BhZ2UoKSBhcmUgbm90IGludGVyY2hhbmdlYWJsZSwgZGVzcGl0 ZSB0aGlzIGVhcmx5Ci0gKiBpbXBsZW1lbnRhdGlvbiB0aGF0IG1ha2VzIHRoZW0gbG9vayB0aGUg c2FtZS4gcHV0X3VzZXJfcGFnZSgpIGNhbGxzIG11c3QKLSAqIGJlIHBlcmZlY3RseSBtYXRjaGVk IHVwIHdpdGggZ2V0X3VzZXJfcGFnZSgpIGNhbGxzLgorICogT2YgY291cnNlLCBvbmNlIHRoZSBs b3dlciBiaXRzIG92ZXJmbG93IGludG8gdGhlIHVwcGVyIGJpdHMgKGFuZCB0aGlzIGlzCisgKiBP SywgYmVjYXVzZSBzdWJ0cmFjdGlvbiByZWNvdmVycyB0aGUgb3JpZ2luYWwgdmFsdWVzKSwgdGhl biB2aXN1YWwgaW5zcGVjdGlvbgorICogbm8gbG9uZ2VyIHN1ZmZpY2VzIHRvIGRpcmVjdGx5IHZp ZXcgdGhlIHNlcGFyYXRlIGNvdW50cy4gSG93ZXZlciwgZm9yIG5vcm1hbAorICogYXBwbGljYXRp b25zIHRoYXQgZG9uJ3QgaGF2ZSBodWdlIHBhZ2UgcmVmZXJlbmNlIGNvdW50cywgdGhpcyB3b24n dCBiZSBhbgorICogaXNzdWUuCisgKgorICogTG9ja2luZzogdGhlIGxvY2tsZXNzIGFsZ29yaXRo bSBkZXNjcmliZWQgaW4gcGFnZV9jYWNoZV9nZXRfc3BlY3VsYXRpdmUoKQorICogYW5kIHBhZ2Vf Y2FjaGVfZ3VwX3Bpbl9zcGVjdWxhdGl2ZSgpIHByb3ZpZGVzIHNhZmUgb3BlcmF0aW9uIGZvcgor ICogZ2V0X3VzZXJfcGFnZXMgYW5kIHBhZ2VfbWtjbGVhbiBhbmQgb3RoZXIgY2FsbHMgdGhhdCBy YWNlIHRvIHNldCB1cCBwYWdlCisgKiB0YWJsZSBlbnRyaWVzLgogICovCi1zdGF0aWMgaW5saW5l IHZvaWQgcHV0X3VzZXJfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQlwdXRfcGFnZShwYWdl KTsKLX0KKyNkZWZpbmUgR1VQX1BJTl9DT1VOVElOR19CSUFTICgxVUwgPDwgMTApCiAKK3ZvaWQg cHV0X3VzZXJfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSk7CiB2b2lkIHB1dF91c2VyX3BhZ2VzX2Rp cnR5X2xvY2soc3RydWN0IHBhZ2UgKipwYWdlcywgdW5zaWduZWQgbG9uZyBucGFnZXMsCiAJCQkg ICAgICAgYm9vbCBtYWtlX2RpcnR5KTsKLQogdm9pZCBwdXRfdXNlcl9wYWdlcyhzdHJ1Y3QgcGFn ZSAqKnBhZ2VzLCB1bnNpZ25lZCBsb25nIG5wYWdlcyk7CiAKKy8qKgorICogcGFnZV9kbWFfcGlu bmVkKCkgLSByZXBvcnQgaWYgYSBwYWdlIGlzIHBpbm5lZCBmb3IgRE1BLgorICoKKyAqIFRoaXMg ZnVuY3Rpb24gY2hlY2tzIGlmIGEgcGFnZSBoYXMgYmVlbiBwaW5uZWQgdmlhIGEgY2FsbCB0bwor ICogcGluX3VzZXJfcGFnZXMqKCkgb3IgcGluX2xvbmd0ZXJtX3BhZ2VzKigpLgorICoKKyAqIFRo ZSByZXR1cm4gdmFsdWUgaXMgcGFydGlhbGx5IGZ1enp5OiBmYWxzZSBpcyBub3QgZnV6enksIGJl Y2F1c2UgaXQgbWVhbnMKKyAqICJkZWZpbml0ZWx5IG5vdCBwaW5uZWQgZm9yIERNQSIsIGJ1dCB0 cnVlIG1lYW5zICJwcm9iYWJseSBwaW5uZWQgZm9yIERNQSwgYnV0CisgKiBwb3NzaWJseSBhIGZh bHNlIHBvc2l0aXZlIGR1ZSB0byBoYXZpbmcgYXQgbGVhc3QgR1VQX1BJTl9DT1VOVElOR19CSUFT IHdvcnRoCisgKiBvZiBub3JtYWwgcGFnZSByZWZlcmVuY2VzIi4KKyAqCisgKiBGYWxzZSBwb3Np dGl2ZXMgYXJlIE9LLCBiZWNhdXNlOiBhKSBpdCdzIHVubGlrZWx5IGZvciBhIHBhZ2UgdG8gZ2V0 IHRoYXQgbWFueQorICogcmVmY291bnRzLCBhbmQgYikgYWxsIHRoZSBjYWxsZXJzIG9mIHRoaXMg cm91dGluZSBhcmUgZXhwZWN0ZWQgdG8gYmUgYWJsZSB0bworICogZGVhbCBncmFjZWZ1bGx5IHdp dGggYSBmYWxzZSBwb3NpdGl2ZS4KKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNl IHNlZSBEb2N1bWVudGF0aW9uL3ZtL3Bpbl91c2VyX3BhZ2VzLnJzdC4KKyAqCisgKiBAcGFnZToJ cG9pbnRlciB0byBwYWdlIHRvIGJlIHF1ZXJpZWQuCisgKiBAUmV0dXJuOglUcnVlLCBpZiBpdCBp cyBsaWtlbHkgdGhhdCB0aGUgcGFnZSBoYXMgYmVlbiAiZG1hLXBpbm5lZCIuCisgKgkJRmFsc2Us IGlmIHRoZSBwYWdlIGlzIGRlZmluaXRlbHkgbm90IGRtYS1waW5uZWQuCisgKi8KK3N0YXRpYyBp bmxpbmUgYm9vbCBwYWdlX2RtYV9waW5uZWQoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJu IChwYWdlX3JlZl9jb3VudChjb21wb3VuZF9oZWFkKHBhZ2UpKSkgPj0gR1VQX1BJTl9DT1VOVElO R19CSUFTOworfQorCiAjaWYgZGVmaW5lZChDT05GSUdfU1BBUlNFTUVNKSAmJiAhZGVmaW5lZChD T05GSUdfU1BBUlNFTUVNX1ZNRU1NQVApCiAjZGVmaW5lIFNFQ1RJT05fSU5fUEFHRV9GTEFHUwog I2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oIGIvaW5jbHVkZS9saW51 eC9tbXpvbmUuaAppbmRleCBiZGEyMDI4Mjc0NmIuLjA0ODVjYmEzOGQyMyAxMDA2NDQKLS0tIGEv aW5jbHVkZS9saW51eC9tbXpvbmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oCkBAIC0y NDQsNiArMjQ0LDggQEAgZW51bSBub2RlX3N0YXRfaXRlbSB7CiAJTlJfRElSVElFRCwJCS8qIHBh Z2UgZGlydHlpbmdzIHNpbmNlIGJvb3R1cCAqLwogCU5SX1dSSVRURU4sCQkvKiBwYWdlIHdyaXRp bmdzIHNpbmNlIGJvb3R1cCAqLwogCU5SX0tFUk5FTF9NSVNDX1JFQ0xBSU1BQkxFLAkvKiByZWNs YWltYWJsZSBub24tc2xhYiBrZXJuZWwgcGFnZXMgKi8KKwlOUl9GT0xMX1BJTl9SRVFVRVNURUQs CS8qIHZpYTogcGluX3VzZXJfcGFnZSgpLCBndXAgZmxhZzogRk9MTF9QSU4gKi8KKwlOUl9GT0xM X1BJTl9SRVRVUk5FRCwJLyogcGFnZXMgcmV0dXJuZWQgdmlhIHB1dF91c2VyX3BhZ2UoKSAqLwog CU5SX1ZNX05PREVfU1RBVF9JVEVNUwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9w YWdlX3JlZi5oIGIvaW5jbHVkZS9saW51eC9wYWdlX3JlZi5oCmluZGV4IDE0ZDE0YmViMWY3Zi4u YjljYmU1NTNkMWU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BhZ2VfcmVmLmgKKysrIGIv aW5jbHVkZS9saW51eC9wYWdlX3JlZi5oCkBAIC0xMDIsNiArMTAyLDE2IEBAIHN0YXRpYyBpbmxp bmUgdm9pZCBwYWdlX3JlZl9zdWIoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBucikKIAkJX19wYWdl X3JlZl9tb2QocGFnZSwgLW5yKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgcGFnZV9yZWZfc3Vi X3JldHVybihzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG5yKQoreworCWludCByZXQgPSBhdG9taWNf c3ViX3JldHVybihuciwgJnBhZ2UtPl9yZWZjb3VudCk7CisKKwlpZiAocGFnZV9yZWZfdHJhY2Vw b2ludF9hY3RpdmUoX190cmFjZXBvaW50X3BhZ2VfcmVmX21vZCkpCisJCV9fcGFnZV9yZWZfbW9k KHBhZ2UsIC1ucik7CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgcGFn ZV9yZWZfaW5jKHN0cnVjdCBwYWdlICpwYWdlKQogewogCWF0b21pY19pbmMoJnBhZ2UtPl9yZWZj b3VudCk7CmRpZmYgLS1naXQgYS9tbS9ndXAuYyBiL21tL2d1cC5jCmluZGV4IGVhMzE4MTBkYTgy OC4uZmMxNjRjMmVlNmI1IDEwMDY0NAotLS0gYS9tbS9ndXAuYworKysgYi9tbS9ndXAuYwpAQCAt NDQsNiArNDQsOTUgQEAgc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqdHJ5X2dldF9jb21wb3Vu ZF9oZWFkKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgcmVmcykKIAlyZXR1cm4gaGVhZDsKIH0KIAor I2lmZGVmIENPTkZJR19ERUJVR19WTQorc3RhdGljIGlubGluZSB2b2lkIF9fdXBkYXRlX3Byb2Nf dm1zdGF0KHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCQllbnVtIG5vZGVfc3RhdF9pdGVtIGl0ZW0s IGludCBjb3VudCkKK3sKKwltb2Rfbm9kZV9wYWdlX3N0YXRlKHBhZ2VfcGdkYXQocGFnZSksIGl0 ZW0sIGNvdW50KTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgX191cGRhdGVfcHJvY192 bXN0YXQoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJCWVudW0gbm9kZV9zdGF0X2l0ZW0gaXRlbSwg aW50IGNvdW50KQoreworfQorI2VuZGlmCisKKy8qKgorICogdXNlcl9wYWdlX3JlZl9pbmMoKSAt IG1hcmsgYSBwYWdlIGFzIGJlaW5nIHVzZWQgYnkgZ2V0X3VzZXJfcGFnZXMoRk9MTF9QSU4pLgor ICoKKyAqIEBwYWdlOglwb2ludGVyIHRvIHBhZ2UgdG8gYmUgbWFya2VkCisgKiBAUmV0dXJuOgl0 cnVlIGZvciBzdWNjZXNzLCBmYWxzZSBmb3IgZmFpbHVyZQorICovCitfX211c3RfY2hlY2sgYm9v bCB1c2VyX3BhZ2VfcmVmX2luYyhzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlwYWdlID0gdHJ5X2dl dF9jb21wb3VuZF9oZWFkKHBhZ2UsIEdVUF9QSU5fQ09VTlRJTkdfQklBUyk7CisJaWYgKCFwYWdl KQorCQlyZXR1cm4gZmFsc2U7CisKKwlfX3VwZGF0ZV9wcm9jX3Ztc3RhdChwYWdlLCBOUl9GT0xM X1BJTl9SRVFVRVNURUQsIDEpOworCXJldHVybiB0cnVlOworfQorCisjaWZkZWYgQ09ORklHX0RF Vl9QQUdFTUFQX09QUworc3RhdGljIGJvb2wgX19wdXRfZGV2bWFwX21hbmFnZWRfdXNlcl9wYWdl KHN0cnVjdCBwYWdlICpwYWdlKQoreworCWJvb2wgaXNfZGV2bWFwID0gcGFnZV9pc19kZXZtYXBf bWFuYWdlZChwYWdlKTsKKworCWlmIChpc19kZXZtYXApIHsKKwkJaW50IGNvdW50ID0gcGFnZV9y ZWZfc3ViX3JldHVybihwYWdlLCBHVVBfUElOX0NPVU5USU5HX0JJQVMpOworCisJCV9fdXBkYXRl X3Byb2Nfdm1zdGF0KHBhZ2UsIE5SX0ZPTExfUElOX1JFVFVSTkVELCAxKTsKKwkJLyoKKwkJICog ZGV2bWFwIHBhZ2UgcmVmY291bnRzIGFyZSAxLWJhc2VkLCByYXRoZXIgdGhhbiAwLWJhc2VkOiBp ZgorCQkgKiByZWZjb3VudCBpcyAxLCB0aGVuIHRoZSBwYWdlIGlzIGZyZWUgYW5kIHRoZSByZWZj b3VudCBpcworCQkgKiBzdGFibGUgYmVjYXVzZSBub2JvZHkgaG9sZHMgYSByZWZlcmVuY2Ugb24g dGhlIHBhZ2UuCisJCSAqLworCQlpZiAoY291bnQgPT0gMSkKKwkJCWZyZWVfZGV2bWFwX21hbmFn ZWRfcGFnZShwYWdlKTsKKwkJZWxzZSBpZiAoIWNvdW50KQorCQkJX19wdXRfcGFnZShwYWdlKTsK Kwl9CisKKwlyZXR1cm4gaXNfZGV2bWFwOworfQorI2Vsc2UKK3N0YXRpYyBib29sIF9fcHV0X2Rl dm1hcF9tYW5hZ2VkX3VzZXJfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gZmFs c2U7Cit9CisjZW5kaWYgLyogQ09ORklHX0RFVl9QQUdFTUFQX09QUyAqLworCisvKioKKyAqIHB1 dF91c2VyX3BhZ2UoKSAtIHJlbGVhc2UgYSBndXAtcGlubmVkIHBhZ2UKKyAqIEBwYWdlOiAgICAg ICAgICAgIHBvaW50ZXIgdG8gcGFnZSB0byBiZSByZWxlYXNlZAorICoKKyAqIFBhZ2VzIHRoYXQg d2VyZSBwaW5uZWQgdmlhIGdldF91c2VyX3BhZ2VzKigpIG11c3QgYmUgcmVsZWFzZWQgdmlhCisg KiBlaXRoZXIgcHV0X3VzZXJfcGFnZSgpLCBvciBvbmUgb2YgdGhlIHB1dF91c2VyX3BhZ2VzKigp IHJvdXRpbmVzCisgKiBiZWxvdy4gVGhpcyBpcyBzbyB0aGF0IGV2ZW50dWFsbHksIHBhZ2VzIHRo YXQgYXJlIHBpbm5lZCB2aWEKKyAqIGdldF91c2VyX3BhZ2VzKigpIGNhbiBiZSBzZXBhcmF0ZWx5 IHRyYWNrZWQgYW5kIHVuaXF1ZWx5IGhhbmRsZWQuIEluCisgKiBwYXJ0aWN1bGFyLCBpbnRlcmFj dGlvbnMgd2l0aCBSRE1BIGFuZCBmaWxlc3lzdGVtcyBuZWVkIHNwZWNpYWwKKyAqIGhhbmRsaW5n LgorICovCit2b2lkIHB1dF91c2VyX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcGFnZSA9 IGNvbXBvdW5kX2hlYWQocGFnZSk7CisKKwkvKgorCSAqIEZvciBkZXZtYXAgbWFuYWdlZCBwYWdl cyB3ZSBuZWVkIHRvIGNhdGNoIHJlZmNvdW50IHRyYW5zaXRpb24gZnJvbQorCSAqIEdVUF9QSU5f Q09VTlRJTkdfQklBUyB0byAxLCB3aGVuIHJlZmNvdW50IHJlYWNoIG9uZSBpdCBtZWFucyB0aGUK KwkgKiBwYWdlIGlzIGZyZWUgYW5kIHdlIG5lZWQgdG8gaW5mb3JtIHRoZSBkZXZpY2UgZHJpdmVy IHRocm91Z2gKKwkgKiBjYWxsYmFjay4gU2VlIGluY2x1ZGUvbGludXgvbWVtcmVtYXAuaCBhbmQg SE1NIGZvciBkZXRhaWxzLgorCSAqLworCWlmIChfX3B1dF9kZXZtYXBfbWFuYWdlZF91c2VyX3Bh Z2UocGFnZSkpCisJCXJldHVybjsKKworCWlmIChwYWdlX3JlZl9zdWJfYW5kX3Rlc3QocGFnZSwg R1VQX1BJTl9DT1VOVElOR19CSUFTKSkKKwkJX19wdXRfcGFnZShwYWdlKTsKKworCV9fdXBkYXRl X3Byb2Nfdm1zdGF0KHBhZ2UsIE5SX0ZPTExfUElOX1JFVFVSTkVELCAxKTsKK30KK0VYUE9SVF9T WU1CT0wocHV0X3VzZXJfcGFnZSk7CisKIC8qKgogICogcHV0X3VzZXJfcGFnZXNfZGlydHlfbG9j aygpIC0gcmVsZWFzZSBhbmQgb3B0aW9uYWxseSBkaXJ0eSBndXAtcGlubmVkIHBhZ2VzCiAgKiBA cGFnZXM6ICBhcnJheSBvZiBwYWdlcyB0byBiZSBtYXliZSBtYXJrZWQgZGlydHksIGFuZCBkZWZp bml0ZWx5IHJlbGVhc2VkLgpAQCAtMjMwLDEwICszMTksMTEgQEAgc3RhdGljIHN0cnVjdCBwYWdl ICpmb2xsb3dfcGFnZV9wdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJfQogCiAJcGFn ZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkcmVzcywgcHRlKTsKLQlpZiAoIXBhZ2UgJiYgcHRl X2Rldm1hcChwdGUpICYmIChmbGFncyAmIEZPTExfR0VUKSkgeworCWlmICghcGFnZSAmJiBwdGVf ZGV2bWFwKHB0ZSkgJiYgKGZsYWdzICYgKEZPTExfR0VUIHwgRk9MTF9QSU4pKSkgewogCQkvKgot CQkgKiBPbmx5IHJldHVybiBkZXZpY2UgbWFwcGluZyBwYWdlcyBpbiB0aGUgRk9MTF9HRVQgY2Fz ZSBzaW5jZQotCQkgKiB0aGV5IGFyZSBvbmx5IHZhbGlkIHdoaWxlIGhvbGRpbmcgdGhlIHBnbWFw IHJlZmVyZW5jZS4KKwkJICogT25seSByZXR1cm4gZGV2aWNlIG1hcHBpbmcgcGFnZXMgaW4gdGhl IEZPTExfR0VUIG9yIEZPTExfUElOCisJCSAqIGNhc2Ugc2luY2UgdGhleSBhcmUgb25seSB2YWxp ZCB3aGlsZSBob2xkaW5nIHRoZSBwZ21hcAorCQkgKiByZWZlcmVuY2UuCiAJCSAqLwogCQkqcGdt YXAgPSBnZXRfZGV2X3BhZ2VtYXAocHRlX3BmbihwdGUpLCAqcGdtYXApOwogCQlpZiAoKnBnbWFw KQpAQCAtMjc2LDYgKzM2NiwxMSBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wYWdlX3B0 ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCXBhZ2UgPSBFUlJfUFRSKC1FTk9NRU0p OwogCQkJZ290byBvdXQ7CiAJCX0KKwl9IGVsc2UgaWYgKGZsYWdzICYgRk9MTF9QSU4pIHsKKwkJ aWYgKHVubGlrZWx5KCF1c2VyX3BhZ2VfcmVmX2luYyhwYWdlKSkpIHsKKwkJCXBhZ2UgPSBFUlJf UFRSKC1FTk9NRU0pOworCQkJZ290byBvdXQ7CisJCX0KIAl9CiAJaWYgKGZsYWdzICYgRk9MTF9U T1VDSCkgewogCQlpZiAoKGZsYWdzICYgRk9MTF9XUklURSkgJiYKQEAgLTUzNyw4ICs2MzIsOCBA QCBzdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wYWdlX21hc2soc3RydWN0IHZtX2FyZWFfc3Ry dWN0ICp2bWEsCiAJLyogbWFrZSB0aGlzIGhhbmRsZSBodWdlcGQgKi8KIAlwYWdlID0gZm9sbG93 X2h1Z2VfYWRkcihtbSwgYWRkcmVzcywgZmxhZ3MgJiBGT0xMX1dSSVRFKTsKIAlpZiAoIUlTX0VS UihwYWdlKSkgewotCQlCVUdfT04oZmxhZ3MgJiBGT0xMX0dFVCk7Ci0JCXJldHVybiBwYWdlOwor CQlXQVJOX09OX09OQ0UoZmxhZ3MgJiAoRk9MTF9HRVQgfCBGT0xMX1BJTikpOworCQlyZXR1cm4g TlVMTDsKIAl9CiAKIAlwZ2QgPSBwZ2Rfb2Zmc2V0KG1tLCBhZGRyZXNzKTsKQEAgLTE4MzAsMTMg KzE5MjUsMTcgQEAgc3RhdGljIGlubGluZSBwdGVfdCBndXBfZ2V0X3B0ZShwdGVfdCAqcHRlcCkK ICNlbmRpZiAvKiBDT05GSUdfR1VQX0dFVF9QVEVfTE9XX0hJR0ggKi8KIAogc3RhdGljIHZvaWQg X19tYXliZV91bnVzZWQgdW5kb19kZXZfcGFnZW1hcChpbnQgKm5yLCBpbnQgbnJfc3RhcnQsCisJ CQkJCSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsCiAJCQkJCSAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2Vz KQogewogCXdoaWxlICgoKm5yKSAtIG5yX3N0YXJ0KSB7CiAJCXN0cnVjdCBwYWdlICpwYWdlID0g cGFnZXNbLS0oKm5yKV07CiAKIAkJQ2xlYXJQYWdlUmVmZXJlbmNlZChwYWdlKTsKLQkJcHV0X3Bh Z2UocGFnZSk7CisJCWlmIChmbGFncyAmIEZPTExfUElOKQorCQkJcHV0X3VzZXJfcGFnZShwYWdl KTsKKwkJZWxzZQorCQkJcHV0X3BhZ2UocGFnZSk7CiAJfQogfQogCkBAIC0xODY5LDcgKzE5Njgs NyBAQCBzdGF0aWMgaW50IGd1cF9wdGVfcmFuZ2UocG1kX3QgcG1kLCB1bnNpZ25lZCBsb25nIGFk ZHIsIHVuc2lnbmVkIGxvbmcgZW5kLAogCiAJCQlwZ21hcCA9IGdldF9kZXZfcGFnZW1hcChwdGVf cGZuKHB0ZSksIHBnbWFwKTsKIAkJCWlmICh1bmxpa2VseSghcGdtYXApKSB7Ci0JCQkJdW5kb19k ZXZfcGFnZW1hcChuciwgbnJfc3RhcnQsIHBhZ2VzKTsKKwkJCQl1bmRvX2Rldl9wYWdlbWFwKG5y LCBucl9zdGFydCwgZmxhZ3MsIHBhZ2VzKTsKIAkJCQlnb3RvIHB0ZV91bm1hcDsKIAkJCX0KIAkJ fSBlbHNlIGlmIChwdGVfc3BlY2lhbChwdGUpKQpAQCAtMTg3OCw5ICsxOTc3LDE1IEBAIHN0YXRp YyBpbnQgZ3VwX3B0ZV9yYW5nZShwbWRfdCBwbWQsIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWdu ZWQgbG9uZyBlbmQsCiAJCVZNX0JVR19PTighcGZuX3ZhbGlkKHB0ZV9wZm4ocHRlKSkpOwogCQlw YWdlID0gcHRlX3BhZ2UocHRlKTsKIAotCQloZWFkID0gdHJ5X2dldF9jb21wb3VuZF9oZWFkKHBh Z2UsIDEpOwotCQlpZiAoIWhlYWQpCi0JCQlnb3RvIHB0ZV91bm1hcDsKKwkJaWYgKGZsYWdzICYg Rk9MTF9QSU4pIHsKKwkJCWhlYWQgPSBwYWdlOworCQkJaWYgKHVubGlrZWx5KCF1c2VyX3BhZ2Vf cmVmX2luYyhoZWFkKSkpCisJCQkJZ290byBwdGVfdW5tYXA7CisJCX0gZWxzZSB7CisJCQloZWFk ID0gdHJ5X2dldF9jb21wb3VuZF9oZWFkKHBhZ2UsIDEpOworCQkJaWYgKCFoZWFkKQorCQkJCWdv dG8gcHRlX3VubWFwOworCQl9CiAKIAkJaWYgKHVubGlrZWx5KHB0ZV92YWwocHRlKSAhPSBwdGVf dmFsKCpwdGVwKSkpIHsKIAkJCXB1dF9wYWdlKGhlYWQpOwpAQCAtMTkzNCwxMiArMjAzOSwyMCBA QCBzdGF0aWMgaW50IF9fZ3VwX2RldmljZV9odWdlKHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25l ZCBsb25nIGFkZHIsCiAKIAkJcGdtYXAgPSBnZXRfZGV2X3BhZ2VtYXAocGZuLCBwZ21hcCk7CiAJ CWlmICh1bmxpa2VseSghcGdtYXApKSB7Ci0JCQl1bmRvX2Rldl9wYWdlbWFwKG5yLCBucl9zdGFy dCwgcGFnZXMpOworCQkJdW5kb19kZXZfcGFnZW1hcChuciwgbnJfc3RhcnQsIGZsYWdzLCBwYWdl cyk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQlTZXRQYWdlUmVmZXJlbmNlZChwYWdlKTsKIAkJcGFn ZXNbKm5yXSA9IHBhZ2U7Ci0JCWdldF9wYWdlKHBhZ2UpOworCisJCWlmIChmbGFncyAmIEZPTExf UElOKSB7CisJCQlpZiAodW5saWtlbHkoIXVzZXJfcGFnZV9yZWZfaW5jKHBhZ2UpKSkgeworCQkJ CXVuZG9fZGV2X3BhZ2VtYXAobnIsIG5yX3N0YXJ0LCBmbGFncywgcGFnZXMpOworCQkJCXJldHVy biAwOworCQkJfQorCQl9IGVsc2UKKwkJCWdldF9wYWdlKHBhZ2UpOworCiAJCSgqbnIpKys7CiAJ CXBmbisrOwogCX0gd2hpbGUgKGFkZHIgKz0gUEFHRV9TSVpFLCBhZGRyICE9IGVuZCk7CkBAIC0x OTYxLDcgKzIwNzQsNyBAQCBzdGF0aWMgaW50IF9fZ3VwX2RldmljZV9odWdlX3BtZChwbWRfdCBv cmlnLCBwbWRfdCAqcG1kcCwgdW5zaWduZWQgbG9uZyBhZGRyLAogCQlyZXR1cm4gMDsKIAogCWlm ICh1bmxpa2VseShwbWRfdmFsKG9yaWcpICE9IHBtZF92YWwoKnBtZHApKSkgewotCQl1bmRvX2Rl dl9wYWdlbWFwKG5yLCBucl9zdGFydCwgcGFnZXMpOworCQl1bmRvX2Rldl9wYWdlbWFwKG5yLCBu cl9zdGFydCwgZmxhZ3MsIHBhZ2VzKTsKIAkJcmV0dXJuIDA7CiAJfQogCXJldHVybiAxOwpAQCAt MTk3OSw3ICsyMDkyLDcgQEAgc3RhdGljIGludCBfX2d1cF9kZXZpY2VfaHVnZV9wdWQocHVkX3Qg b3JpZywgcHVkX3QgKnB1ZHAsIHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJcmV0dXJuIDA7CiAKIAlp ZiAodW5saWtlbHkocHVkX3ZhbChvcmlnKSAhPSBwdWRfdmFsKCpwdWRwKSkpIHsKLQkJdW5kb19k ZXZfcGFnZW1hcChuciwgbnJfc3RhcnQsIHBhZ2VzKTsKKwkJdW5kb19kZXZfcGFnZW1hcChuciwg bnJfc3RhcnQsIGZsYWdzLCBwYWdlcyk7CiAJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gMTsKQEAg LTIwNjMsOSArMjE3NiwxNiBAQCBzdGF0aWMgaW50IGd1cF9odWdlcHRlKHB0ZV90ICpwdGVwLCB1 bnNpZ25lZCBsb25nIHN6LCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJcGFnZSA9IGhlYWQgKyAoKGFk ZHIgJiAoc3otMSkpID4+IFBBR0VfU0hJRlQpOwogCXJlZnMgPSBfX3JlY29yZF9zdWJwYWdlcyhw YWdlLCBhZGRyLCBlbmQsIHBhZ2VzLCAqbnIpOwogCi0JaGVhZCA9IHRyeV9nZXRfY29tcG91bmRf aGVhZChoZWFkLCByZWZzKTsKLQlpZiAoIWhlYWQpCi0JCXJldHVybiAwOworCWlmIChmbGFncyAm IEZPTExfUElOKSB7CisJCWhlYWQgPSBwYWdlOworCQlpZiAodW5saWtlbHkoIXVzZXJfcGFnZV9y ZWZfaW5jKGhlYWQpKSkKKwkJCXJldHVybiAwOworCQloZWFkID0gcGFnZTsKKwl9IGVsc2Ugewor CQloZWFkID0gdHJ5X2dldF9jb21wb3VuZF9oZWFkKGhlYWQsIHJlZnMpOworCQlpZiAoIWhlYWQp CisJCQlyZXR1cm4gMDsKKwl9CiAKIAlpZiAodW5saWtlbHkocHRlX3ZhbChwdGUpICE9IHB0ZV92 YWwoKnB0ZXApKSkgewogCQlwdXRfY29tcG91bmRfaGVhZChoZWFkLCByZWZzKTsKQEAgLTIxMjIs OSArMjI0MiwxNSBAQCBzdGF0aWMgaW50IGd1cF9odWdlX3BtZChwbWRfdCBvcmlnLCBwbWRfdCAq cG1kcCwgdW5zaWduZWQgbG9uZyBhZGRyLAogCXBhZ2UgPSBwbWRfcGFnZShvcmlnKSArICgoYWRk ciAmIH5QTURfTUFTSykgPj4gUEFHRV9TSElGVCk7CiAJcmVmcyA9IF9fcmVjb3JkX3N1YnBhZ2Vz KHBhZ2UsIGFkZHIsIGVuZCwgcGFnZXMsICpucik7CiAKLQloZWFkID0gdHJ5X2dldF9jb21wb3Vu ZF9oZWFkKHBtZF9wYWdlKG9yaWcpLCByZWZzKTsKLQlpZiAoIWhlYWQpCi0JCXJldHVybiAwOwor CWlmIChmbGFncyAmIEZPTExfUElOKSB7CisJCWhlYWQgPSBwYWdlOworCQlpZiAodW5saWtlbHko IXVzZXJfcGFnZV9yZWZfaW5jKGhlYWQpKSkKKwkJCXJldHVybiAwOworCX0gZWxzZSB7CisJCWhl YWQgPSB0cnlfZ2V0X2NvbXBvdW5kX2hlYWQocG1kX3BhZ2Uob3JpZyksIHJlZnMpOworCQlpZiAo IWhlYWQpCisJCQlyZXR1cm4gMDsKKwl9CiAKIAlpZiAodW5saWtlbHkocG1kX3ZhbChvcmlnKSAh PSBwbWRfdmFsKCpwbWRwKSkpIHsKIAkJcHV0X2NvbXBvdW5kX2hlYWQoaGVhZCwgcmVmcyk7CkBA IC0yMTU1LDkgKzIyODEsMTUgQEAgc3RhdGljIGludCBndXBfaHVnZV9wdWQocHVkX3Qgb3JpZywg cHVkX3QgKnB1ZHAsIHVuc2lnbmVkIGxvbmcgYWRkciwKIAlwYWdlID0gcHVkX3BhZ2Uob3JpZykg KyAoKGFkZHIgJiB+UFVEX01BU0spID4+IFBBR0VfU0hJRlQpOwogCXJlZnMgPSBfX3JlY29yZF9z dWJwYWdlcyhwYWdlLCBhZGRyLCBlbmQsIHBhZ2VzLCAqbnIpOwogCi0JaGVhZCA9IHRyeV9nZXRf Y29tcG91bmRfaGVhZChwdWRfcGFnZShvcmlnKSwgcmVmcyk7Ci0JaWYgKCFoZWFkKQotCQlyZXR1 cm4gMDsKKwlpZiAoZmxhZ3MgJiBGT0xMX1BJTikgeworCQloZWFkID0gcGFnZTsKKwkJaWYgKHVu bGlrZWx5KCF1c2VyX3BhZ2VfcmVmX2luYyhoZWFkKSkpCisJCQlyZXR1cm4gMDsKKwl9IGVsc2Ug eworCQloZWFkID0gdHJ5X2dldF9jb21wb3VuZF9oZWFkKHB1ZF9wYWdlKG9yaWcpLCByZWZzKTsK KwkJaWYgKCFoZWFkKQorCQkJcmV0dXJuIDA7CisJfQogCiAJaWYgKHVubGlrZWx5KHB1ZF92YWwo b3JpZykgIT0gcHVkX3ZhbCgqcHVkcCkpKSB7CiAJCXB1dF9jb21wb3VuZF9oZWFkKGhlYWQsIHJl ZnMpOwpAQCAtMjE4Myw5ICsyMzE1LDE1IEBAIHN0YXRpYyBpbnQgZ3VwX2h1Z2VfcGdkKHBnZF90 IG9yaWcsIHBnZF90ICpwZ2RwLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJcGFnZSA9IHBnZF9wYWdl KG9yaWcpICsgKChhZGRyICYgflBHRElSX01BU0spID4+IFBBR0VfU0hJRlQpOwogCXJlZnMgPSBf X3JlY29yZF9zdWJwYWdlcyhwYWdlLCBhZGRyLCBlbmQsIHBhZ2VzLCAqbnIpOwogCi0JaGVhZCA9 IHRyeV9nZXRfY29tcG91bmRfaGVhZChwZ2RfcGFnZShvcmlnKSwgcmVmcyk7Ci0JaWYgKCFoZWFk KQotCQlyZXR1cm4gMDsKKwlpZiAoZmxhZ3MgJiBGT0xMX1BJTikgeworCQloZWFkID0gcGFnZTsK KwkJaWYgKHVubGlrZWx5KCF1c2VyX3BhZ2VfcmVmX2luYyhoZWFkKSkpCisJCQlyZXR1cm4gMDsK Kwl9IGVsc2UgeworCQloZWFkID0gdHJ5X2dldF9jb21wb3VuZF9oZWFkKHBnZF9wYWdlKG9yaWcp LCByZWZzKTsKKwkJaWYgKCFoZWFkKQorCQkJcmV0dXJuIDA7CisJfQogCiAJaWYgKHVubGlrZWx5 KHBnZF92YWwob3JpZykgIT0gcGdkX3ZhbCgqcGdkcCkpKSB7CiAJCXB1dF9jb21wb3VuZF9oZWFk KGhlYWQsIHJlZnMpOwpkaWZmIC0tZ2l0IGEvbW0vaHVnZV9tZW1vcnkuYyBiL21tL2h1Z2VfbWVt b3J5LmMKaW5kZXggMTNjYzkzNzg1MDA2Li40MDEwYzI2OWU5ZTUgMTAwNjQ0Ci0tLSBhL21tL2h1 Z2VfbWVtb3J5LmMKKysrIGIvbW0vaHVnZV9tZW1vcnkuYwpAQCAtOTQ1LDYgKzk0NSwxMSBAQCBz dHJ1Y3QgcGFnZSAqZm9sbG93X2Rldm1hcF9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEs IHVuc2lnbmVkIGxvbmcgYWRkciwKIAkgKi8KIAlXQVJOX09OQ0UoZmxhZ3MgJiBGT0xMX0NPVywg Im1tOiBJbiBmb2xsb3dfZGV2bWFwX3BtZCB3aXRoIEZPTExfQ09XIHNldCIpOwogCisJLyogRk9M TF9HRVQgYW5kIEZPTExfUElOIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuICovCisJaWYgKFdBUk5f T05fT05DRSgoZmxhZ3MgJiAoRk9MTF9QSU4gfCBGT0xMX0dFVCkpID09CisJCQkgKEZPTExfUElO IHwgRk9MTF9HRVQpKSkKKwkJcmV0dXJuIE5VTEw7CisKIAlpZiAoZmxhZ3MgJiBGT0xMX1dSSVRF ICYmICFwbWRfd3JpdGUoKnBtZCkpCiAJCXJldHVybiBOVUxMOwogCkBAIC05NjAsNyArOTY1LDcg QEAgc3RydWN0IHBhZ2UgKmZvbGxvd19kZXZtYXBfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAq dm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJICogZGV2aWNlIG1hcHBlZCBwYWdlcyBjYW4gb25s eSBiZSByZXR1cm5lZCBpZiB0aGUKIAkgKiBjYWxsZXIgd2lsbCBtYW5hZ2UgdGhlIHBhZ2UgcmVm ZXJlbmNlIGNvdW50LgogCSAqLwotCWlmICghKGZsYWdzICYgRk9MTF9HRVQpKQorCWlmICghKGZs YWdzICYgKEZPTExfR0VUIHwgRk9MTF9QSU4pKSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVFWElTVCk7 CiAKIAlwZm4gKz0gKGFkZHIgJiB+UE1EX01BU0spID4+IFBBR0VfU0hJRlQ7CkBAIC05NjgsNyAr OTczLDE4IEBAIHN0cnVjdCBwYWdlICpmb2xsb3dfZGV2bWFwX3BtZChzdHJ1Y3Qgdm1fYXJlYV9z dHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCWlmICghKnBnbWFwKQogCQlyZXR1cm4g RVJSX1BUUigtRUZBVUxUKTsKIAlwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKLQlnZXRfcGFnZShw YWdlKTsKKworCWlmIChmbGFncyAmIEZPTExfR0VUKQorCQlnZXRfcGFnZShwYWdlKTsKKwllbHNl IGlmIChmbGFncyAmIEZPTExfUElOKSB7CisJCS8qCisJCSAqIHVzZXJfcGFnZV9yZWZfaW5jKCkg aXMgbm90IGFjdHVhbGx5IGV4cGVjdGVkIHRvIGZhaWwgaGVyZQorCQkgKiBiZWNhdXNlIHdlIGhv bGQgdGhlIHBtZCBsb2NrIHNvIG5vIG9uZSBjYW4gdW5tYXAgdGhlIHBtZCBhbmQKKwkJICogZnJl ZSB0aGUgcGFnZSB0aGF0IGl0IHBvaW50cyB0by4KKwkJICovCisJCWlmICh1bmxpa2VseSghdXNl cl9wYWdlX3JlZl9pbmMocGFnZSkpKQorCQkJcGFnZSA9IEVSUl9QVFIoLUVGQVVMVCk7CisJfQog CiAJcmV0dXJuIHBhZ2U7CiB9CkBAIC0xMDg4LDYgKzExMDQsMTEgQEAgc3RydWN0IHBhZ2UgKmZv bGxvd19kZXZtYXBfcHVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25n IGFkZHIsCiAJaWYgKGZsYWdzICYgRk9MTF9XUklURSAmJiAhcHVkX3dyaXRlKCpwdWQpKQogCQly ZXR1cm4gTlVMTDsKIAorCS8qIEZPTExfR0VUIGFuZCBGT0xMX1BJTiBhcmUgbXV0dWFsbHkgZXhj bHVzaXZlLiAqLworCWlmIChXQVJOX09OX09OQ0UoKGZsYWdzICYgKEZPTExfUElOIHwgRk9MTF9H RVQpKSA9PQorCQkJIChGT0xMX1BJTiB8IEZPTExfR0VUKSkpCisJCXJldHVybiBOVUxMOworCiAJ aWYgKHB1ZF9wcmVzZW50KCpwdWQpICYmIHB1ZF9kZXZtYXAoKnB1ZCkpCiAJCS8qIHBhc3MgKi87 CiAJZWxzZQpAQCAtMTA5OSw4ICsxMTIwLDEwIEBAIHN0cnVjdCBwYWdlICpmb2xsb3dfZGV2bWFw X3B1ZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCS8q CiAJICogZGV2aWNlIG1hcHBlZCBwYWdlcyBjYW4gb25seSBiZSByZXR1cm5lZCBpZiB0aGUKIAkg KiBjYWxsZXIgd2lsbCBtYW5hZ2UgdGhlIHBhZ2UgcmVmZXJlbmNlIGNvdW50LgorCSAqCisJICog QXQgbGVhc3Qgb25lIG9mIEZPTExfR0VUIHwgRk9MTF9QSU4gbXVzdCBiZSBzZXQsIHNvIGFzc2Vy dCB0aGF0IGhlcmU6CiAJICovCi0JaWYgKCEoZmxhZ3MgJiBGT0xMX0dFVCkpCisJaWYgKCEoZmxh Z3MgJiAoRk9MTF9HRVQgfCBGT0xMX1BJTikpKQogCQlyZXR1cm4gRVJSX1BUUigtRUVYSVNUKTsK IAogCXBmbiArPSAoYWRkciAmIH5QVURfTUFTSykgPj4gUEFHRV9TSElGVDsKQEAgLTExMDgsNyAr MTEzMSwxOCBAQCBzdHJ1Y3QgcGFnZSAqZm9sbG93X2Rldm1hcF9wdWQoc3RydWN0IHZtX2FyZWFf c3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwKIAlpZiAoISpwZ21hcCkKIAkJcmV0dXJu IEVSUl9QVFIoLUVGQVVMVCk7CiAJcGFnZSA9IHBmbl90b19wYWdlKHBmbik7Ci0JZ2V0X3BhZ2Uo cGFnZSk7CisKKwlpZiAoZmxhZ3MgJiBGT0xMX0dFVCkKKwkJZ2V0X3BhZ2UocGFnZSk7CisJZWxz ZSBpZiAoZmxhZ3MgJiBGT0xMX1BJTikgeworCQkvKgorCQkgKiB1c2VyX3BhZ2VfcmVmX2luYygp IGlzIG5vdCBhY3R1YWxseSBleHBlY3RlZCB0byBmYWlsIGhlcmUKKwkJICogYmVjYXVzZSB3ZSBo b2xkIHRoZSBwdWQgbG9jayBzbyBubyBvbmUgY2FuIHVubWFwIHRoZSBwdWQgYW5kCisJCSAqIGZy ZWUgdGhlIHBhZ2UgdGhhdCBpdCBwb2ludHMgdG8uCisJCSAqLworCQlpZiAodW5saWtlbHkoIXVz ZXJfcGFnZV9yZWZfaW5jKHBhZ2UpKSkKKwkJCXBhZ2UgPSBFUlJfUFRSKC1FRkFVTFQpOworCX0K IAogCXJldHVybiBwYWdlOwogfQpAQCAtMTUyMiw4ICsxNTU2LDIwIEBAIHN0cnVjdCBwYWdlICpm b2xsb3dfdHJhbnNfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiBza2lwX21s b2NrOgogCXBhZ2UgKz0gKGFkZHIgJiB+SFBBR0VfUE1EX01BU0spID4+IFBBR0VfU0hJRlQ7CiAJ Vk1fQlVHX09OX1BBR0UoIVBhZ2VDb21wb3VuZChwYWdlKSAmJiAhaXNfem9uZV9kZXZpY2VfcGFn ZShwYWdlKSwgcGFnZSk7CisKIAlpZiAoZmxhZ3MgJiBGT0xMX0dFVCkKIAkJZ2V0X3BhZ2UocGFn ZSk7CisJZWxzZSBpZiAoZmxhZ3MgJiBGT0xMX1BJTikgeworCQkvKgorCQkgKiB1c2VyX3BhZ2Vf cmVmX2luYygpIGlzIG5vdCBhY3R1YWxseSBleHBlY3RlZCB0byBmYWlsIGhlcmUKKwkJICogYmVj YXVzZSB3ZSBob2xkIHRoZSBwbWQgbG9jayBzbyBubyBvbmUgY2FuIHVubWFwIHRoZSBwbWQgYW5k CisJCSAqIGZyZWUgdGhlIHBhZ2UgdGhhdCBpdCBwb2ludHMgdG8uCisJCSAqLworCQlpZiAodW5s aWtlbHkoIXVzZXJfcGFnZV9yZWZfaW5jKHBhZ2UpKSkgeworCQkJV0FSTl9PTl9PTkNFKDEpOwor CQkJcGFnZSA9IE5VTEw7CisJCX0KKwl9CiAKIG91dDoKIAlyZXR1cm4gcGFnZTsKZGlmZiAtLWdp dCBhL21tL2h1Z2V0bGIuYyBiL21tL2h1Z2V0bGIuYwppbmRleCBiNDVhOTUzNjNhODQuLjVlZTgw ZWVhMjVlNSAxMDA2NDQKLS0tIGEvbW0vaHVnZXRsYi5jCisrKyBiL21tL2h1Z2V0bGIuYwpAQCAt NDQ2Miw3ICs0NDYyLDIyIEBAIGxvbmcgZm9sbG93X2h1Z2V0bGJfcGFnZShzdHJ1Y3QgbW1fc3Ry dWN0ICptbSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiBzYW1lX3BhZ2U6CiAJCWlmIChw YWdlcykgewogCQkJcGFnZXNbaV0gPSBtZW1fbWFwX29mZnNldChwYWdlLCBwZm5fb2Zmc2V0KTsK LQkJCWdldF9wYWdlKHBhZ2VzW2ldKTsKKworCQkJaWYgKGZsYWdzICYgRk9MTF9HRVQpCisJCQkJ Z2V0X3BhZ2UocGFnZXNbaV0pOworCQkJZWxzZSBpZiAoZmxhZ3MgJiBGT0xMX1BJTikgeworCQkJ CS8qCisJCQkJICogdXNlcl9wYWdlX3JlZl9pbmMoKSBpcyBub3QgYWN0dWFsbHkgZXhwZWN0ZWQK KwkJCQkgKiB0byBmYWlsIGhlcmUgYmVjYXVzZSB3ZSBob2xkIHRoZSBwdGwuCisJCQkJICovCisJ CQkJaWYgKHVubGlrZWx5KCF1c2VyX3BhZ2VfcmVmX2luYyhwYWdlc1tpXSkpKSB7CisJCQkJCXNw aW5fdW5sb2NrKHB0bCk7CisJCQkJCXJlbWFpbmRlciA9IDA7CisJCQkJCWVyciA9IC1FTk9NRU07 CisJCQkJCVdBUk5fT05fT05DRSgxKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQogCQl9CiAK IAkJaWYgKHZtYXMpCkBAIC01MDIyLDYgKzUwMzcsMTIgQEAgZm9sbG93X2h1Z2VfcG1kKHN0cnVj dCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiAJc3RydWN0IHBhZ2UgKnBh Z2UgPSBOVUxMOwogCXNwaW5sb2NrX3QgKnB0bDsKIAlwdGVfdCBwdGU7CisKKwkvKiBGT0xMX0dF VCBhbmQgRk9MTF9QSU4gYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gKi8KKwlpZiAoV0FSTl9PTl9P TkNFKChmbGFncyAmIChGT0xMX1BJTiB8IEZPTExfR0VUKSkgPT0KKwkJCSAoRk9MTF9QSU4gfCBG T0xMX0dFVCkpKQorCQlyZXR1cm4gTlVMTDsKKwogcmV0cnk6CiAJcHRsID0gcG1kX2xvY2twdHIo bW0sIHBtZCk7CiAJc3Bpbl9sb2NrKHB0bCk7CkBAIC01MDM0LDggKzUwNTUsMjAgQEAgZm9sbG93 X2h1Z2VfcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiAJ cHRlID0gaHVnZV9wdGVwX2dldCgocHRlX3QgKilwbWQpOwogCWlmIChwdGVfcHJlc2VudChwdGUp KSB7CiAJCXBhZ2UgPSBwbWRfcGFnZSgqcG1kKSArICgoYWRkcmVzcyAmIH5QTURfTUFTSykgPj4g UEFHRV9TSElGVCk7CisKIAkJaWYgKGZsYWdzICYgRk9MTF9HRVQpCiAJCQlnZXRfcGFnZShwYWdl KTsKKwkJZWxzZSBpZiAoZmxhZ3MgJiBGT0xMX1BJTikgeworCQkJLyoKKwkJCSAqIHVzZXJfcGFn ZV9yZWZfaW5jKCkgaXMgbm90IGFjdHVhbGx5IGV4cGVjdGVkIHRvIGZhaWwKKwkJCSAqIGhlcmUg YmVjYXVzZSB3ZSBob2xkIHRoZSBwdGwuCisJCQkgKi8KKwkJCWlmICh1bmxpa2VseSghdXNlcl9w YWdlX3JlZl9pbmMocGFnZSkpKSB7CisJCQkJV0FSTl9PTl9PTkNFKDEpOworCQkJCXBhZ2UgPSBO VUxMOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CiAJfSBlbHNlIHsKIAkJaWYgKGlzX2h1Z2V0 bGJfZW50cnlfbWlncmF0aW9uKHB0ZSkpIHsKIAkJCXNwaW5fdW5sb2NrKHB0bCk7CkBAIC01MDU2 LDcgKzUwODksNyBAQCBzdHJ1Y3QgcGFnZSAqIF9fd2VhawogZm9sbG93X2h1Z2VfcHVkKHN0cnVj dCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiAJCXB1ZF90ICpwdWQsIGlu dCBmbGFncykKIHsKLQlpZiAoZmxhZ3MgJiBGT0xMX0dFVCkKKwlpZiAoZmxhZ3MgJiAoRk9MTF9H RVQgfCBGT0xMX1BJTikpCiAJCXJldHVybiBOVUxMOwogCiAJcmV0dXJuIHB0ZV9wYWdlKCoocHRl X3QgKilwdWQpICsgKChhZGRyZXNzICYgflBVRF9NQVNLKSA+PiBQQUdFX1NISUZUKTsKQEAgLTUw NjUsNyArNTA5OCw3IEBAIGZvbGxvd19odWdlX3B1ZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5z aWduZWQgbG9uZyBhZGRyZXNzLAogc3RydWN0IHBhZ2UgKiBfX3dlYWsKIGZvbGxvd19odWdlX3Bn ZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwZ2RfdCAqcGdk LCBpbnQgZmxhZ3MpCiB7Ci0JaWYgKGZsYWdzICYgRk9MTF9HRVQpCisJaWYgKGZsYWdzICYgKEZP TExfR0VUIHwgRk9MTF9QSU4pKQogCQlyZXR1cm4gTlVMTDsKIAogCXJldHVybiBwdGVfcGFnZSgq KHB0ZV90ICopcGdkKSArICgoYWRkcmVzcyAmIH5QR0RJUl9NQVNLKSA+PiBQQUdFX1NISUZUKTsK ZGlmZiAtLWdpdCBhL21tL3Ztc3RhdC5jIGIvbW0vdm1zdGF0LmMKaW5kZXggYTgyMjIwNDFiZDQ0 Li5mZGFkNDBjY2RlN2IgMTAwNjQ0Ci0tLSBhL21tL3Ztc3RhdC5jCisrKyBiL21tL3Ztc3RhdC5j CkBAIC0xMTY3LDYgKzExNjcsOCBAQCBjb25zdCBjaGFyICogY29uc3Qgdm1zdGF0X3RleHRbXSA9 IHsKIAkibnJfZGlydGllZCIsCiAJIm5yX3dyaXR0ZW4iLAogCSJucl9rZXJuZWxfbWlzY19yZWNs YWltYWJsZSIsCisJIm5yX2ZvbGxfcGluX3JlcXVlc3RlZCIsCisJIm5yX2ZvbGxfcGluX3JldHVy bmVkIiwKIAogCS8qIGVudW0gd3JpdGViYWNrX3N0YXRfaXRlbSBjb3VudGVycyAqLwogCSJucl9k aXJ0eV90aHJlc2hvbGQiLAotLSAKMi4yNC4wCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0 cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9s aXN0aW5mby9kcmktZGV2ZWw=