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=-12.5 required=3.0 tests=BAYES_00,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=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 3B7EDC47428 for ; Fri, 2 Oct 2020 12:22:32 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id D376620719 for ; Fri, 2 Oct 2020 12:22:31 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="riy56kys" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D376620719 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=lst.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id AE36D900002; Fri, 2 Oct 2020 08:22:30 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id A92A06B0073; Fri, 2 Oct 2020 08:22:30 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 959B9900002; Fri, 2 Oct 2020 08:22:30 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0201.hostedemail.com [216.40.44.201]) by kanga.kvack.org (Postfix) with ESMTP id 6860A6B0072 for ; Fri, 2 Oct 2020 08:22:30 -0400 (EDT) Received: from smtpin06.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay01.hostedemail.com (Postfix) with ESMTP id 046B6180AD802 for ; Fri, 2 Oct 2020 12:22:30 +0000 (UTC) X-FDA: 77326898460.06.sense72_1a0633b271a4 Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin06.hostedemail.com (Postfix) with ESMTP id B309A10052192 for ; Fri, 2 Oct 2020 12:22:29 +0000 (UTC) X-HE-Tag: sense72_1a0633b271a4 X-Filterd-Recvd-Size: 5622 Received: from casper.infradead.org (casper.infradead.org [90.155.50.34]) by imf03.hostedemail.com (Postfix) with ESMTP for ; Fri, 2 Oct 2020 12:22:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description; bh=FBifTnPA+3ODKD/Pp+vW9/Ge5GD+C3AXZd2dc0iyUCM=; b=riy56kysOqQh/DlF7h2scz8Jav gYCGSV9Rki8rEaoHZeb0dw7qkEwaXSa+0I7OSnnE/Znap8oXVn6s8jjDKj3VD413tpKR7jV94w4Vv wiJyRh3kWoEK0eiAOTZMsMcDCgSl562tViz0ZtRC9AGolzXvuqMB9he9OPqNj4mLVentg5PxKKhEs ka0sldyW2JLFmlL3TGfidtPEmKqjQMKOKf2rLW9mjfed47D8kwh/cBml+fvSLs8iyakhkadcfWTJd +eagdYTFhGw/m3lNBTCXmCo0dPSXkOIuHmGz+Qa9Sj4iV4tBdMCAQGIcAzH8QtTWayFDdGiPSv42L JsKV5Z9g==; Received: from [2001:4bb8:180:7b62:f738:1861:1acc:15c8] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1kOK4k-0003Lh-1o; Fri, 02 Oct 2020 12:22:14 +0000 From: Christoph Hellwig To: Andrew Morton Cc: Peter Zijlstra , Boris Ostrovsky , Juergen Gross , Stefano Stabellini , Jani Nikula , Joonas Lahtinen , Tvrtko Ursulin , Chris Wilson , Matthew Auld , Rodrigo Vivi , Minchan Kim , Matthew Wilcox , Nitin Gupta , x86@kernel.org, xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org, intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-mm@kvack.org, Tvrtko Ursulin Subject: [PATCH 06/11] drm/i915: use vmap in shmem_pin_map Date: Fri, 2 Oct 2020 14:21:59 +0200 Message-Id: <20201002122204.1534411-7-hch@lst.de> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201002122204.1534411-1-hch@lst.de> References: <20201002122204.1534411-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html Content-Transfer-Encoding: quoted-printable X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: shmem_pin_map somewhat awkwardly reimplements vmap using alloc_vm_area and manual pte setup. The only practical difference is that alloc_vm_area prefeaults the vmalloc area PTEs, which doesn't seem to be required here (and could be added to vmap using a flag if actually required). Switch to use vmap, and use vfree to free both the vmalloc mapping and the page array, as well as dropping the references to each page. Signed-off-by: Christoph Hellwig Reviewed-by: Tvrtko Ursulin --- drivers/gpu/drm/i915/gt/shmem_utils.c | 76 +++++++-------------------- 1 file changed, 18 insertions(+), 58 deletions(-) diff --git a/drivers/gpu/drm/i915/gt/shmem_utils.c b/drivers/gpu/drm/i915= /gt/shmem_utils.c index 43c7acbdc79dea..f011ea42487e11 100644 --- a/drivers/gpu/drm/i915/gt/shmem_utils.c +++ b/drivers/gpu/drm/i915/gt/shmem_utils.c @@ -49,80 +49,40 @@ struct file *shmem_create_from_object(struct drm_i915= _gem_object *obj) return file; } =20 -static size_t shmem_npte(struct file *file) -{ - return file->f_mapping->host->i_size >> PAGE_SHIFT; -} - -static void __shmem_unpin_map(struct file *file, void *ptr, size_t n_pte= ) -{ - unsigned long pfn; - - vunmap(ptr); - - for (pfn =3D 0; pfn < n_pte; pfn++) { - struct page *page; - - page =3D shmem_read_mapping_page_gfp(file->f_mapping, pfn, - GFP_KERNEL); - if (!WARN_ON(IS_ERR(page))) { - put_page(page); - put_page(page); - } - } -} - void *shmem_pin_map(struct file *file) { - const size_t n_pte =3D shmem_npte(file); - pte_t *stack[32], **ptes, **mem; - struct vm_struct *area; - unsigned long pfn; - - mem =3D stack; - if (n_pte > ARRAY_SIZE(stack)) { - mem =3D kvmalloc_array(n_pte, sizeof(*mem), GFP_KERNEL); - if (!mem) - return NULL; - } + struct page **pages; + size_t n_pages, i; + void *vaddr; =20 - area =3D alloc_vm_area(n_pte << PAGE_SHIFT, mem); - if (!area) { - if (mem !=3D stack) - kvfree(mem); + n_pages =3D file->f_mapping->host->i_size >> PAGE_SHIFT; + pages =3D kvmalloc_array(n_pages, sizeof(*pages), GFP_KERNEL); + if (!pages) return NULL; - } =20 - ptes =3D mem; - for (pfn =3D 0; pfn < n_pte; pfn++) { - struct page *page; - - page =3D shmem_read_mapping_page_gfp(file->f_mapping, pfn, - GFP_KERNEL); - if (IS_ERR(page)) + for (i =3D 0; i < n_pages; i++) { + pages[i] =3D shmem_read_mapping_page_gfp(file->f_mapping, i, + GFP_KERNEL); + if (IS_ERR(pages[i])) goto err_page; - - **ptes++ =3D mk_pte(page, PAGE_KERNEL); } =20 - if (mem !=3D stack) - kvfree(mem); - + vaddr =3D vmap(pages, n_pages, VM_MAP_PUT_PAGES, PAGE_KERNEL); + if (!vaddr) + goto err_page; mapping_set_unevictable(file->f_mapping); - return area->addr; - + return vaddr; err_page: - if (mem !=3D stack) - kvfree(mem); - - __shmem_unpin_map(file, area->addr, pfn); + while (--i >=3D 0) + put_page(pages[i]); + kvfree(pages); return NULL; } =20 void shmem_unpin_map(struct file *file, void *ptr) { mapping_clear_unevictable(file->f_mapping); - __shmem_unpin_map(file, ptr, shmem_npte(file)); + vfree(ptr); } =20 static int __shmem_rw(struct file *file, loff_t off, --=20 2.28.0