From nobody Mon Dec 1 22:36:55 2025 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 82A7027FD43; Fri, 28 Nov 2025 18:52:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764355980; cv=none; b=H6ggSujpZnKWklM+mbDBPmnahN7ZbqH5QwDvUF5vOaaa6Dx/SVpUcXwxay4e6d7N0Jh9gb+8tdpfZrJEkFAilUwB3VvdOjqk6nCbkLGzxPRsP5qo69pEr4dCc0oPdL8DHJDND6alDhOW0pI/neDxtTOs4hSHMh8GjYON/UpTmdQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764355980; c=relaxed/simple; bh=sQcBV/ZWlVLGeAwivyndjv3Kv+k/mZS823qVLbIeFmg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=caUX00xxbjLtPtz99LzSYogR8wzHsL9esNxsvB12m+ZNp0Mi5eotIZ5bPBBqz5vcYySTwh7FH0bQY3oq/l6whr8YdIytruuStbZGmC6rOcYOL/zMbjqTSXxGWRLwUgdMmu9mkbtWrIAvxSr3DclD7tXUBbP8ry3OKTn9Zb9ECu0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=ISd7qpI1; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="ISd7qpI1" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1764355976; bh=sQcBV/ZWlVLGeAwivyndjv3Kv+k/mZS823qVLbIeFmg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ISd7qpI1Tl97k9ger7HYWaa+AKgbhXqTP2zw1rBjR9ijaa6D2AKJapF7avFUm9K3U /+iDU2PcjvDIfdiFYTUMRLVtVwv+6cVb5ViJj+FIFOJtiRuGGh08wehNG3V5Jk+/9T CZ2td68j7wYggUOPxG9MV+Jl/hek4Gx+eiZH2+J2uDOV+OAmrcmFf30qavplF3IeSL 0d6adp5WzokdRqq19AvuGSvTaveZ7PzA2CZTGQnR09yLXccosVnW5absumt7Xpm7vW EZ/pxjVEaga2VTFCYsZ0hWCE8PWmalXzFbaKrhPfPiFABOxIIfMNEXiuNUgxuPC/EI O5Y5LdusZKYlA== Received: from debian-rockchip-rock5b-rk3588.. (unknown [IPv6:2a01:e0a:5e3:6100:2e0:4cff:fe03:d8c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: loicmolinari) by bali.collaboradmins.com (Postfix) with ESMTPSA id DFBE017E10F6; Fri, 28 Nov 2025 19:52:55 +0100 (CET) From: =?UTF-8?q?Lo=C3=AFc=20Molinari?= To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Boris Brezillon , Rob Herring , Steven Price , Liviu Dudau , Melissa Wen , =?UTF-8?q?Ma=C3=ADra=20Canal?= , Hugh Dickins , Baolin Wang , Andrew Morton , =?UTF-8?q?Lo=C3=AFc=20Molinari?= , Al Viro , =?UTF-8?q?Miko=C5=82aj=20Wasiak?= , Christian Brauner , Nitin Gote , Andi Shyti , Jonathan Corbet , Christopher Healy , Matthew Wilcox , Bagas Sanjaya Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, linux-mm@kvack.org, linux-doc@vger.kernel.org, kernel@collabora.com Subject: [PATCH v10 01/10] drm/shmem-helper: Simplify page offset calculation in fault handler Date: Fri, 28 Nov 2025 19:52:43 +0100 Message-ID: <20251128185252.3092-2-loic.molinari@collabora.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251128185252.3092-1-loic.molinari@collabora.com> References: <20251128185252.3092-1-loic.molinari@collabora.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable For a fault at address addr, the page offset is page_offset =3D (vmf->address - vma->vm_start) >> PAGE_SHIFT =3D ((addr & PAGE_MASK) - vma->vm_start) >> PAGE_SHIFT =3D (addr - vma->vm_start) >> PAGE_SHIFT Since the faulty logical page offset based on VMA is vmf->pgoff =3D vma->vm_pgoff + ((addr - vma->vm_start) >> PAGE_SHIFT) We can slightly simplify the calculation using page_offset =3D vmf->pgoff - vma->vm_pgoff Signed-off-by: Lo=C3=AFc Molinari Reviewed-by: Boris Brezillon --- drivers/gpu/drm/drm_gem_shmem_helper.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c b/drivers/gpu/drm/drm_g= em_shmem_helper.c index dc94a27710e5..be89be1c804c 100644 --- a/drivers/gpu/drm/drm_gem_shmem_helper.c +++ b/drivers/gpu/drm/drm_gem_shmem_helper.c @@ -577,8 +577,8 @@ static vm_fault_t drm_gem_shmem_fault(struct vm_fault *= vmf) struct page *page; pgoff_t page_offset; =20 - /* We don't use vmf->pgoff since that has the fake offset */ - page_offset =3D (vmf->address - vma->vm_start) >> PAGE_SHIFT; + /* Offset to faulty address in the VMA (without the fake offset). */ + page_offset =3D vmf->pgoff - vma->vm_pgoff; =20 dma_resv_lock(shmem->base.resv, NULL); =20 --=20 2.47.3 From nobody Mon Dec 1 22:36:55 2025 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7DAF32D028A; Fri, 28 Nov 2025 18:52:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764355982; cv=none; b=ix4BaTMCvVoLndsguZ2AdXrY4KBA40OIdSdd8BjG+cO5EL9S8tKUToNGiSsdxyxmRU3HY6LRCwuvmjTn4U8Ab4gS5npZ5SOnQ/eaOLDYXrWu0TrM2munTRsJrqXWu9Rz/nYwqgqskvVTj5MYAFNsrXiCj1QIp8qL3f855nZUd/0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764355982; c=relaxed/simple; bh=PO8gWy+x68NFPFgtgxVVBpssyG+zZ/+aShO0x1+KKAs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=LbdYQ16HY7zQgU4PgdIkYUAtM5v4rXEZWvRIVp9tM3OvIOmomplwin2ANXcXi5jvMmLObRheeCv8VxknmVsmLnHcXV1oF1hP5pkEEJkUFBy4O9wrcra8sr89z56M6dBE8852ooXmQnd0585xlIRB6FEyc9arOHuCTuIf9ybeOII= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=oADkikIm; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="oADkikIm" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1764355977; bh=PO8gWy+x68NFPFgtgxVVBpssyG+zZ/+aShO0x1+KKAs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oADkikIm+tNB++DIyc3gm46mNvrtmcw5jOQA4gm4Ok4xQu2/yhsrQiQY/XrlZZLr/ NnNbGS9U784YiFDFZje/cLi8Ce6ayHb9WbusJLlrt+3BNM/htKAbZR/9btYx2oqUze 7CxaTMCwc9bqrRYQkCsIiTO4RPHb4Q2/91N71nG7sdakSXbo1fdAeWzZBSRO3uuNXe hOiW+79f5Mk5T+uAAw2IMt2g3kK7IQwcJBtlsXhLIL15KMq/4fdTPYdOnNK9ruflBD uCT9LmCDEAaVQS6YdGv5Ib6vQ9qPDEfOFdjDVwiyKxO+8+LofbX8O/sGQNyVdPCgxH gkjR+dw+nq/8Q== Received: from debian-rockchip-rock5b-rk3588.. (unknown [IPv6:2a01:e0a:5e3:6100:2e0:4cff:fe03:d8c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: loicmolinari) by bali.collaboradmins.com (Postfix) with ESMTPSA id E526217E1146; Fri, 28 Nov 2025 19:52:56 +0100 (CET) From: =?UTF-8?q?Lo=C3=AFc=20Molinari?= To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Boris Brezillon , Rob Herring , Steven Price , Liviu Dudau , Melissa Wen , =?UTF-8?q?Ma=C3=ADra=20Canal?= , Hugh Dickins , Baolin Wang , Andrew Morton , =?UTF-8?q?Lo=C3=AFc=20Molinari?= , Al Viro , =?UTF-8?q?Miko=C5=82aj=20Wasiak?= , Christian Brauner , Nitin Gote , Andi Shyti , Jonathan Corbet , Christopher Healy , Matthew Wilcox , Bagas Sanjaya Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, linux-mm@kvack.org, linux-doc@vger.kernel.org, kernel@collabora.com Subject: [PATCH v10 02/10] drm/shmem-helper: Map huge pages in fault handler Date: Fri, 28 Nov 2025 19:52:44 +0100 Message-ID: <20251128185252.3092-3-loic.molinari@collabora.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251128185252.3092-1-loic.molinari@collabora.com> References: <20251128185252.3092-1-loic.molinari@collabora.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Attempt a PMD sized PFN insertion into the VMA if the faulty address of the fault handler is part of a huge page. On builds with CONFIG_TRANSPARENT_HUGEPAGE enabled, if the mmap() user address is PMD size aligned, if the GEM object is backed by shmem buffers on mountpoints setting the 'huge=3D' option and if the shmem backing store manages to allocate a huge folio, CPU mapping would then benefit from significantly increased memcpy() performance. When these conditions are met on a system with 2 MiB huge pages, an aligned copy of 2 MiB would raise a single page fault instead of 4096. v4: - implement map_pages instead of huge_fault v6: - get rid of map_pages handler for now (keep it for another series along with arm64 contpte support) Signed-off-by: Lo=C3=AFc Molinari Reviewed-by: Boris Brezillon --- drivers/gpu/drm/drm_gem_shmem_helper.c | 55 +++++++++++++++++++++----- 1 file changed, 46 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c b/drivers/gpu/drm/drm_g= em_shmem_helper.c index be89be1c804c..81f4ac7cb8f6 100644 --- a/drivers/gpu/drm/drm_gem_shmem_helper.c +++ b/drivers/gpu/drm/drm_gem_shmem_helper.c @@ -567,31 +567,68 @@ int drm_gem_shmem_dumb_create(struct drm_file *file, = struct drm_device *dev, } EXPORT_SYMBOL_GPL(drm_gem_shmem_dumb_create); =20 +static bool drm_gem_shmem_fault_is_valid(struct drm_gem_object *obj, + pgoff_t pgoff) +{ + struct drm_gem_shmem_object *shmem =3D to_drm_gem_shmem_obj(obj); + + if (drm_WARN_ON_ONCE(obj->dev, !shmem->pages) || + pgoff >=3D (obj->size >> PAGE_SHIFT) || + shmem->madv < 0) + return false; + + return true; +} + +static bool drm_gem_shmem_map_pmd(struct vm_fault *vmf, unsigned long addr, + struct page *page) +{ +#ifdef CONFIG_ARCH_SUPPORTS_PMD_PFNMAP + unsigned long pfn =3D page_to_pfn(page); + unsigned long paddr =3D pfn << PAGE_SHIFT; + bool aligned =3D (addr & ~PMD_MASK) =3D=3D (paddr & ~PMD_MASK); + + if (aligned && + pmd_none(*vmf->pmd) && + folio_test_pmd_mappable(page_folio(page))) { + pfn &=3D PMD_MASK >> PAGE_SHIFT; + if (vmf_insert_pfn_pmd(vmf, pfn, false) =3D=3D VM_FAULT_NOPAGE) + return true; + } +#endif + + return false; +} + static vm_fault_t drm_gem_shmem_fault(struct vm_fault *vmf) { struct vm_area_struct *vma =3D vmf->vma; struct drm_gem_object *obj =3D vma->vm_private_data; struct drm_gem_shmem_object *shmem =3D to_drm_gem_shmem_obj(obj); - loff_t num_pages =3D obj->size >> PAGE_SHIFT; - vm_fault_t ret; - struct page *page; + struct page **pages =3D shmem->pages; pgoff_t page_offset; + unsigned long pfn; + vm_fault_t ret; =20 /* Offset to faulty address in the VMA (without the fake offset). */ page_offset =3D vmf->pgoff - vma->vm_pgoff; =20 dma_resv_lock(shmem->base.resv, NULL); =20 - if (page_offset >=3D num_pages || - drm_WARN_ON_ONCE(obj->dev, !shmem->pages) || - shmem->madv < 0) { + if (unlikely(!drm_gem_shmem_fault_is_valid(obj, page_offset))) { ret =3D VM_FAULT_SIGBUS; - } else { - page =3D shmem->pages[page_offset]; + goto out; + } =20 - ret =3D vmf_insert_pfn(vma, vmf->address, page_to_pfn(page)); + if (drm_gem_shmem_map_pmd(vmf, vmf->address, pages[page_offset])) { + ret =3D VM_FAULT_NOPAGE; + goto out; } =20 + pfn =3D page_to_pfn(pages[page_offset]); + ret =3D vmf_insert_pfn(vma, vmf->address, pfn); + + out: dma_resv_unlock(shmem->base.resv); =20 return ret; --=20 2.47.3 From nobody Mon Dec 1 22:36:55 2025 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7BABD33290F; Fri, 28 Nov 2025 18:53:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764355983; cv=none; b=HkTMW16TAIpPH3AYB7fFmKitMtoXmo8eenSscMgwV9j1STU2eHopdxsAfJwVYAAjQl5BQkoEyRf6pn2nf07Pa+lV6TjN2koczI6zSt5L9I4R1Zk0mlwlW6g3kayQwc/LtXgvLz0J8/TEF7QSeR+2uczQ+5RLJCnFG7/WxgL4HJA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764355983; c=relaxed/simple; bh=AZPBvtxHWyMBJ+c9yjLF+vfmb2zrT3xATAWYqXkOzWQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=pFkmV9OjEN+XwLYkqdsq0I4oDuduMeOde3ZJ3QRGqGQ6+Pdk6YwK1OeGDojpECFnO1eH6gJk5D0PmIqIDhbT8L55NaboUEpdXh8bkjKNtFuIRJjg2qVVsEKVc1LQxIUtW47gERVL9ViJJZGpWzj6k6qMdRf4SM5sFesix8q0frs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=AKvAHURt; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="AKvAHURt" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1764355978; bh=AZPBvtxHWyMBJ+c9yjLF+vfmb2zrT3xATAWYqXkOzWQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=AKvAHURtN0xRE62XAY7hAyns8rVuuDRnwj5uc+mxXx39NsenrpeQrmev14tGoWc7S BWdeHaIg4o2KC23COF1upOVH7gO91ZEZBWubru0APa7ViDZkXUPyPFv65eDpBsY8Uq TDTvAu232v0ZGQN5RrCxhuVHm856xv/HpUcyyK3jf2jX/x0OKb1E4oy0pO57Cjk5Y4 LPk3iFto8dfm5RmBdgZnq/h2eJeg9ffc3jquiD3zpsc5Ax25eVzAvRrGjwAAg0JarI PqS/Xxx4m1ecRa94xsTuxfpNz+nKEqqC9GSY5EwA9McXOw2uZD/42H+QK/xvrdyOyI 6ZJXR2bxxMQzA== Received: from debian-rockchip-rock5b-rk3588.. (unknown [IPv6:2a01:e0a:5e3:6100:2e0:4cff:fe03:d8c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: loicmolinari) by bali.collaboradmins.com (Postfix) with ESMTPSA id E88D017E1299; Fri, 28 Nov 2025 19:52:57 +0100 (CET) From: =?UTF-8?q?Lo=C3=AFc=20Molinari?= To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Boris Brezillon , Rob Herring , Steven Price , Liviu Dudau , Melissa Wen , =?UTF-8?q?Ma=C3=ADra=20Canal?= , Hugh Dickins , Baolin Wang , Andrew Morton , =?UTF-8?q?Lo=C3=AFc=20Molinari?= , Al Viro , =?UTF-8?q?Miko=C5=82aj=20Wasiak?= , Christian Brauner , Nitin Gote , Andi Shyti , Jonathan Corbet , Christopher Healy , Matthew Wilcox , Bagas Sanjaya Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, linux-mm@kvack.org, linux-doc@vger.kernel.org, kernel@collabora.com Subject: [PATCH v10 03/10] drm/gem: Introduce drm_gem_get_unmapped_area() fop Date: Fri, 28 Nov 2025 19:52:45 +0100 Message-ID: <20251128185252.3092-4-loic.molinari@collabora.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251128185252.3092-1-loic.molinari@collabora.com> References: <20251128185252.3092-1-loic.molinari@collabora.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable mmap() calls on the DRM file pointer currently always end up using mm_get_unmapped_area() to get a free mapping region. On builds with CONFIG_TRANSPARENT_HUGEPAGE enabled, this isn't ideal for GEM objects backed by shmem buffers on mountpoints setting the 'huge=3D' option because it can't correctly figure out the potentially huge address alignment required. This commit introduces the drm_gem_get_unmapped_area() function which is meant to be used as a get_unmapped_area file operation on the DRM file pointer to lookup GEM objects based on their fake offsets and get a properly aligned region by calling shmem_get_unmapped_area() with the right file pointer. If a GEM object isn't available at the given offset or if the caller isn't granted access to it, the function falls back to mm_get_unmapped_area(). This also makes drm_gem_get_unmapped_area() part of the default GEM file operations so that all the DRM drivers can benefit from more efficient mappings thanks to the huge page fault handler introduced in previous commit 'drm/shmem-helper: Add huge page fault handler'. The shmem_get_unmapped_area() function needs to be exported so that it can be used from the DRM subsystem. v3: - include in drm_gem.c - forward to shmem layer in builds with CONFIG_TRANSPARENT_HUGEPAGE=3Dn v6: - use GPL variant to export drm_gem_get_unmapped_area() - don't export shmem_get_unmapped_area() anymore (use f_op instead) Signed-off-by: Lo=C3=AFc Molinari Reviewed-by: Boris Brezillon --- drivers/gpu/drm/drm_gem.c | 108 ++++++++++++++++++++++++++++++-------- include/drm/drm_gem.h | 4 ++ 2 files changed, 90 insertions(+), 22 deletions(-) diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index efc79bbf3c73..41d344c270a7 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -1177,36 +1178,27 @@ int drm_gem_mmap_obj(struct drm_gem_object *obj, un= signed long obj_size, } EXPORT_SYMBOL(drm_gem_mmap_obj); =20 -/** - * drm_gem_mmap - memory map routine for GEM objects - * @filp: DRM file pointer - * @vma: VMA for the area to be mapped - * - * If a driver supports GEM object mapping, mmap calls on the DRM file - * descriptor will end up here. - * - * Look up the GEM object based on the offset passed in (vma->vm_pgoff will - * contain the fake offset we created when the GTT map ioctl was called on - * the object) and map it with a call to drm_gem_mmap_obj(). - * - * If the caller is not granted access to the buffer object, the mmap will= fail - * with EACCES. Please see the vma manager for more information. +/* + * Look up a GEM object in offset space based on the exact start address. = The + * caller must be granted access to the object. Returns a GEM object on su= ccess + * or a negative error code on failure. The returned GEM object needs to be + * released with drm_gem_object_put(). */ -int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma) +static struct drm_gem_object * +drm_gem_object_lookup_from_offset(struct file *filp, unsigned long start, + unsigned long pages) { struct drm_file *priv =3D filp->private_data; struct drm_device *dev =3D priv->minor->dev; struct drm_gem_object *obj =3D NULL; struct drm_vma_offset_node *node; - int ret; =20 if (drm_dev_is_unplugged(dev)) - return -ENODEV; + return ERR_PTR(-ENODEV); =20 drm_vma_offset_lock_lookup(dev->vma_offset_manager); node =3D drm_vma_offset_exact_lookup_locked(dev->vma_offset_manager, - vma->vm_pgoff, - vma_pages(vma)); + start, pages); if (likely(node)) { obj =3D container_of(node, struct drm_gem_object, vma_node); /* @@ -1225,14 +1217,86 @@ int drm_gem_mmap(struct file *filp, struct vm_area_= struct *vma) drm_vma_offset_unlock_lookup(dev->vma_offset_manager); =20 if (!obj) - return -EINVAL; + return ERR_PTR(-EINVAL); =20 if (!drm_vma_node_is_allowed(node, priv)) { drm_gem_object_put(obj); - return -EACCES; + return ERR_PTR(-EACCES); } =20 - ret =3D drm_gem_mmap_obj(obj, drm_vma_node_size(node) << PAGE_SHIFT, + return obj; +} + +/** + * drm_gem_get_unmapped_area - get memory mapping region routine for GEM o= bjects + * @filp: DRM file pointer + * @uaddr: User address hint + * @len: Mapping length + * @pgoff: Offset (in pages) + * @flags: Mapping flags + * + * If a driver supports GEM object mapping, before ending up in drm_gem_mm= ap(), + * mmap calls on the DRM file descriptor will first try to find a free lin= ear + * address space large enough for a mapping. Since GEM objects are backed = by + * shmem buffers, this should preferably be handled by the shmem virtual m= emory + * filesystem which can appropriately align addresses to huge page sizes w= hen + * needed. + * + * Look up the GEM object based on the offset passed in (vma->vm_pgoff will + * contain the fake offset we created) and call shmem_get_unmapped_area() = with + * the right file pointer. + * + * If a GEM object is not available at the given offset or if the caller i= s not + * granted access to it, fall back to mm_get_unmapped_area(). + */ +unsigned long drm_gem_get_unmapped_area(struct file *filp, unsigned long u= addr, + unsigned long len, unsigned long pgoff, + unsigned long flags) +{ + struct drm_gem_object *obj; + unsigned long ret; + + obj =3D drm_gem_object_lookup_from_offset(filp, pgoff, len >> PAGE_SHIFT); + if (IS_ERR(obj) || !obj->filp || !obj->filp->f_op->get_unmapped_area) + return mm_get_unmapped_area(current->mm, filp, uaddr, len, 0, + flags); + + ret =3D obj->filp->f_op->get_unmapped_area(obj->filp, uaddr, len, 0, + flags); + + drm_gem_object_put(obj); + + return ret; +} +EXPORT_SYMBOL_GPL(drm_gem_get_unmapped_area); + +/** + * drm_gem_mmap - memory map routine for GEM objects + * @filp: DRM file pointer + * @vma: VMA for the area to be mapped + * + * If a driver supports GEM object mapping, mmap calls on the DRM file + * descriptor will end up here. + * + * Look up the GEM object based on the offset passed in (vma->vm_pgoff will + * contain the fake offset we created) and map it with a call to + * drm_gem_mmap_obj(). + * + * If the caller is not granted access to the buffer object, the mmap will= fail + * with EACCES. Please see the vma manager for more information. + */ +int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma) +{ + struct drm_gem_object *obj; + int ret; + + obj =3D drm_gem_object_lookup_from_offset(filp, vma->vm_pgoff, + vma_pages(vma)); + if (IS_ERR(obj)) + return PTR_ERR(obj); + + ret =3D drm_gem_mmap_obj(obj, + drm_vma_node_size(&obj->vma_node) << PAGE_SHIFT, vma); =20 drm_gem_object_put(obj); diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h index 8d48d2af2649..7c8bd67d087c 100644 --- a/include/drm/drm_gem.h +++ b/include/drm/drm_gem.h @@ -469,6 +469,7 @@ struct drm_gem_object { .poll =3D drm_poll,\ .read =3D drm_read,\ .llseek =3D noop_llseek,\ + .get_unmapped_area =3D drm_gem_get_unmapped_area,\ .mmap =3D drm_gem_mmap, \ .fop_flags =3D FOP_UNSIGNED_OFFSET =20 @@ -506,6 +507,9 @@ void drm_gem_vm_close(struct vm_area_struct *vma); int drm_gem_mmap_obj(struct drm_gem_object *obj, unsigned long obj_size, struct vm_area_struct *vma); int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma); +unsigned long drm_gem_get_unmapped_area(struct file *filp, unsigned long u= addr, + unsigned long len, unsigned long pgoff, + unsigned long flags); =20 /** * drm_gem_object_get - acquire a GEM buffer object reference --=20 2.47.3 From nobody Mon Dec 1 22:36:55 2025 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7B9D533290B; Fri, 28 Nov 2025 18:53:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764355983; cv=none; b=OtVMBwKU0dsfm+k/LI+nhUFmwx6z4aYgS5+vph6VpOD9zj5vs9LGmSUGOG5InxDdGxT8EIW6arjIH0gcPFKDvUZn0WQx+2sFOHvVlHM4UsowmrZ5nDp8pfwdp7SN8yfqLQcCLwWG1JGM2lmW0FpFjqBH3rdV5Xii5LiJV8ZXLfY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764355983; c=relaxed/simple; bh=866+Aonq+BZvoU+OJZH9iYpRtbV7q6pIVDG232Knc10=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=NYycw+Iru19hdMLa5QXTtlLhxmQhXp3qgHGDC+vqplzE2qLEblctyv6yXYgXqdNg8DYYThCwpBQxbMy8K/pDPV220I6jFYTNDKyrKQSl4MyfzyESpGqhc04HP1OdcyBmf/OIttCu+7zhklwnhXmgzBlecPF7c0IAUeIO49dlO68= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=i4SesXvD; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="i4SesXvD" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1764355979; bh=866+Aonq+BZvoU+OJZH9iYpRtbV7q6pIVDG232Knc10=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=i4SesXvDZUuSE4keRJRclM2c7nbFXzVAEq83Z2mde2p6QE4L+FuP7tX5yd6NZtDN/ XTx8Wbzr+CvguQsIFvluvncgpfgeED3ERt2YbAV8l7KGsXA6AEk1SxpM8hvWdyttUZ PJ8g5GdwigubG/8sdPd561U1cq/nz1IJ/HObPcAyY5efhfcc6qlcl6Q30dl8SPMAUk /PMv1bwq6JIXQGN8OTgznsGuBJ6lY2t439A/w5zd5ef6GtrZH3ZdYJBQVsNQ8LZRmu TqUGRjWwBoUmWxYacFWZq7RDSBEcBcj4tsP97duk4uLntxPkmGX6YC2s/iWq5nsS72 2vPciL4Ab5/xQ== Received: from debian-rockchip-rock5b-rk3588.. (unknown [IPv6:2a01:e0a:5e3:6100:2e0:4cff:fe03:d8c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: loicmolinari) by bali.collaboradmins.com (Postfix) with ESMTPSA id EC40517E13C1; Fri, 28 Nov 2025 19:52:58 +0100 (CET) From: =?UTF-8?q?Lo=C3=AFc=20Molinari?= To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Boris Brezillon , Rob Herring , Steven Price , Liviu Dudau , Melissa Wen , =?UTF-8?q?Ma=C3=ADra=20Canal?= , Hugh Dickins , Baolin Wang , Andrew Morton , =?UTF-8?q?Lo=C3=AFc=20Molinari?= , Al Viro , =?UTF-8?q?Miko=C5=82aj=20Wasiak?= , Christian Brauner , Nitin Gote , Andi Shyti , Jonathan Corbet , Christopher Healy , Matthew Wilcox , Bagas Sanjaya Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, linux-mm@kvack.org, linux-doc@vger.kernel.org, kernel@collabora.com Subject: [PATCH v10 04/10] drm/gem: Add huge tmpfs mountpoint helpers Date: Fri, 28 Nov 2025 19:52:46 +0100 Message-ID: <20251128185252.3092-5-loic.molinari@collabora.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251128185252.3092-1-loic.molinari@collabora.com> References: <20251128185252.3092-1-loic.molinari@collabora.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Add the drm_gem_huge_mnt_create() and drm_gem_get_huge_mnt() helpers to avoid code duplication in the i915, V3D, Panfrost and Panthor drivers. The former creates and mounts a dedicated huge tmpfs mountpoint, for the lifetime of a DRM device, used at GEM object initialization. The latter retrieves the dedicated huge tmpfs mountpoint used by a DRM device. The next commits will port drivers to these helpers. v3: - store huge tmpfs mountpoint in drm_device v4: - return 0 in builds with CONFIG_TRANSPARENT_HUGEPAGE=3Dn - return 0 when huge_mnt already exists - use new vfs_parse_fs_string() helper v5: - remove warning on !dev->huge_mnt and reset to NULL on free - inline drm_gem_huge_mnt_create() to remove func from text and avoid calls in builds with CONFIG_TRANSPARENT_HUGEPAGE=3Dn - compile out drm_device's huge_mnt field in builds with CONFIG_TRANSPARENT_HUGEPAGE=3Dn - add drm_gem_has_huge_mnt() helper v6: - move huge_mnt doc into ifdef'd section - either inline or export drm_gem_huge_mnt_create() v7: - include in drm_gem.h v9: - replace drm_gem_has_huge_mnt() by drm_gem_get_huge_mnt() Signed-off-by: Lo=C3=AFc Molinari Reviewed-by: Boris Brezillon Reviewed-by: Ma=C3=ADra Canal --- drivers/gpu/drm/drm_gem.c | 57 +++++++++++++++++++++++++++++++++++++++ include/drm/drm_device.h | 15 +++++++++++ include/drm/drm_gem.h | 33 +++++++++++++++++++++++ 3 files changed, 105 insertions(+) diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index 41d344c270a7..94e5e04865ba 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c @@ -29,6 +29,9 @@ #include #include #include +#ifdef CONFIG_TRANSPARENT_HUGEPAGE +#include +#endif #include #include #include @@ -82,6 +85,60 @@ * up at a later date, and as our interface with shmfs for memory allocati= on. */ =20 +#ifdef CONFIG_TRANSPARENT_HUGEPAGE +static void drm_gem_huge_mnt_free(struct drm_device *dev, void *data) +{ + kern_unmount(dev->huge_mnt); +} + +/** + * drm_gem_huge_mnt_create - Create, mount and use a huge tmpfs mountpoint + * @dev: DRM device a huge tmpfs mountpoint should be used with + * @value: huge tmpfs mount option value + * + * This function creates and mounts a dedicated huge tmpfs mountpoint for = the + * lifetime of the DRM device @dev which is used at GEM object initializat= ion + * with drm_gem_object_init(). + * + * The most common option value @value is "within_size" which only allocat= es + * huge pages if the page will be fully within the GEM object size. "alway= s", + * "advise" and "never" are supported too but the latter would just create= a + * mountpoint similar to the default one (`shm_mnt`). See shmemfs and + * Transparent Hugepage for more information. + * + * Returns: + * 0 on success or a negative error code on failure. + */ +int drm_gem_huge_mnt_create(struct drm_device *dev, const char *value) +{ + struct file_system_type *type; + struct fs_context *fc; + int ret; + + if (unlikely(drm_gem_get_huge_mnt(dev))) + return 0; + + type =3D get_fs_type("tmpfs"); + if (unlikely(!type)) + return -EOPNOTSUPP; + fc =3D fs_context_for_mount(type, SB_KERNMOUNT); + if (IS_ERR(fc)) + return PTR_ERR(fc); + ret =3D vfs_parse_fs_string(fc, "source", "tmpfs"); + if (unlikely(ret)) + return -ENOPARAM; + ret =3D vfs_parse_fs_string(fc, "huge", value); + if (unlikely(ret)) + return -ENOPARAM; + + dev->huge_mnt =3D fc_mount_longterm(fc); + put_fs_context(fc); + + return drmm_add_action_or_reset(dev, drm_gem_huge_mnt_free, NULL); +} +EXPORT_SYMBOL_GPL(drm_gem_huge_mnt_create); +#endif + static void drm_gem_init_release(struct drm_device *dev, void *ptr) { diff --git a/include/drm/drm_device.h b/include/drm/drm_device.h index 5af49c5c3778..7dc560ad14fc 100644 --- a/include/drm/drm_device.h +++ b/include/drm/drm_device.h @@ -3,6 +3,9 @@ =20 #include #include +#ifdef CONFIG_TRANSPARENT_HUGEPAGE +#include +#endif #include #include #include @@ -168,6 +171,18 @@ struct drm_device { */ struct drm_master *master; =20 +#ifdef CONFIG_TRANSPARENT_HUGEPAGE + /** + * @huge_mnt: + * + * Huge tmpfs mountpoint used at GEM object initialization + * drm_gem_object_init(). Drivers can call drm_gem_huge_mnt_create() to + * create a huge tmfps mountpoint. The default tmpfs mountpoint + * (`shm_mnt`) is used if NULL. + */ + struct vfsmount *huge_mnt; +#endif + /** * @driver_features: per-device driver features * diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h index 7c8bd67d087c..4e9ab5d294ac 100644 --- a/include/drm/drm_gem.h +++ b/include/drm/drm_gem.h @@ -40,6 +40,9 @@ #include #include =20 +#ifdef CONFIG_TRANSPARENT_HUGEPAGE +#include +#endif #include =20 struct iosys_map; @@ -492,6 +495,36 @@ struct drm_gem_object { DRM_GEM_FOPS,\ } =20 +#ifdef CONFIG_TRANSPARENT_HUGEPAGE +int drm_gem_huge_mnt_create(struct drm_device *dev, const char *value); +#else +static inline int drm_gem_huge_mnt_create(struct drm_device *dev, + const char *value) +{ + return 0; +} +#endif + +/** + * drm_gem_get_huge_mnt - Get the huge tmpfs mountpoint used by a DRM devi= ce + * @dev: DRM device + + * This function gets the huge tmpfs mountpoint used by DRM device @dev. A= huge + * tmpfs mountpoint is used after a successful call to drm_gem_huge_mnt_cr= eate() + * on builds with Transparent Hugepage enabled. + + * Returns: + * The huge tmpfs mountpoint in use, NULL otherwise. + */ +static inline struct vfsmount *drm_gem_get_huge_mnt(struct drm_device *dev) +{ +#ifdef CONFIG_TRANSPARENT_HUGEPAGE + return dev->huge_mnt; +#else + return NULL; +#endif +} + void drm_gem_object_release(struct drm_gem_object *obj); void drm_gem_object_free(struct kref *kref); int drm_gem_object_init(struct drm_device *dev, --=20 2.47.3 From nobody Mon Dec 1 22:36:55 2025 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7FC71333748; Fri, 28 Nov 2025 18:53:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764355984; cv=none; b=dnH+oRlYtPWe5PuLDMdt+zAQr/smsw0WeNUUFdlg83EALZ9UA2r/gQB+o947ZIpuVK8zjxQve/7J+/wHJvLX/Be4P0A71l1LHxM6FeI2LLTcAaCyUiaYDm3vzTxbRJNuBmWdKfbUFivqFmrWSiLa+pII3JifdQKPPsQvDU4qMik= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764355984; c=relaxed/simple; bh=F21lcLtx1NkP7OSa7ulUeqIgfho6clTQ3QePI0r5YA0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=bjapi3dP6TKt3vb96EGt5UDvRF0/Z9FD7iS88n+vwF8jzYoKNVwY6Mv9JafMks0y1jH9MgqX8tROtoFipQDiNomioe4sfZidRHPou2NK1jNkppRJhI3BlJwXweTXV3Ip6hmk1N50VjhqUri3Mx98PFh4j6Ps56RKPeGctlbc+9c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=ArCsQWHK; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="ArCsQWHK" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1764355980; bh=F21lcLtx1NkP7OSa7ulUeqIgfho6clTQ3QePI0r5YA0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ArCsQWHK7nbNMXtphbQOnBkwkSM/j/mbZRuNJTsC37rZcWSU3R+RfrWd8L0+481Zs MyvPAy3N+lIjuxSNqHhnXaAjH2xY4UCNyiocsqXpQSPeIuddCxFuugjeK6lIuh0i4v nrSHdFwcLsPYxN46pBb4PoD2GZX8bmEZFrRv5P6qzAz4e1UKwwAKmjz5b0eMFsnYlh +z+a6si7g0Nk0Nl2rjrXQ3yeCx3AhCP7Y3USlmw5PMb1ZF6yWdqPkv4UMeXk+k0v02 RAeCvuOB2z4bbpyMUIV3ZpFPaNmVfCtCLl7mzd/HavLIrFq5f41+7PDnDoIiSFJGvg GbsyB7hLWRHcA== Received: from debian-rockchip-rock5b-rk3588.. (unknown [IPv6:2a01:e0a:5e3:6100:2e0:4cff:fe03:d8c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: loicmolinari) by bali.collaboradmins.com (Postfix) with ESMTPSA id EFF2017E1423; Fri, 28 Nov 2025 19:52:59 +0100 (CET) From: =?UTF-8?q?Lo=C3=AFc=20Molinari?= To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Boris Brezillon , Rob Herring , Steven Price , Liviu Dudau , Melissa Wen , =?UTF-8?q?Ma=C3=ADra=20Canal?= , Hugh Dickins , Baolin Wang , Andrew Morton , =?UTF-8?q?Lo=C3=AFc=20Molinari?= , Al Viro , =?UTF-8?q?Miko=C5=82aj=20Wasiak?= , Christian Brauner , Nitin Gote , Andi Shyti , Jonathan Corbet , Christopher Healy , Matthew Wilcox , Bagas Sanjaya Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, linux-mm@kvack.org, linux-doc@vger.kernel.org, kernel@collabora.com Subject: [PATCH v10 05/10] drm/i915: Use huge tmpfs mountpoint helpers Date: Fri, 28 Nov 2025 19:52:47 +0100 Message-ID: <20251128185252.3092-6-loic.molinari@collabora.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251128185252.3092-1-loic.molinari@collabora.com> References: <20251128185252.3092-1-loic.molinari@collabora.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Make use of the new drm_gem_huge_mnt_create() and drm_gem_get_huge_mnt() helpers to avoid code duplication. Now that it's just a few lines long, the single function in i915_gemfs.c is moved into v3d_gem_shmem.c. v3: - use huge tmpfs mountpoint in drm_device - move i915_gemfs.c into i915_gem_shmem.c v4: - clean up mountpoint creation error handling v5: - use drm_gem_has_huge_mnt() helper v7: - include in i915_gem_shmem.c v8: - keep logging notice message with CONFIG_TRANSPARENT_HUGEPAGE=3Dn - don't access huge_mnt field with CONFIG_TRANSPARENT_HUGEPAGE=3Dn v9: - replace drm_gem_has_huge_mnt() by drm_gem_get_huge_mnt() - remove useless ternary op test in selftests/huge_pages.c Signed-off-by: Lo=C3=AFc Molinari --- drivers/gpu/drm/i915/Makefile | 3 +- drivers/gpu/drm/i915/gem/i915_gem_shmem.c | 48 +++++++++---- drivers/gpu/drm/i915/gem/i915_gemfs.c | 71 ------------------- drivers/gpu/drm/i915/gem/i915_gemfs.h | 14 ---- .../gpu/drm/i915/gem/selftests/huge_pages.c | 16 +++-- drivers/gpu/drm/i915/i915_drv.h | 5 -- 6 files changed, 47 insertions(+), 110 deletions(-) delete mode 100644 drivers/gpu/drm/i915/gem/i915_gemfs.c delete mode 100644 drivers/gpu/drm/i915/gem/i915_gemfs.h diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile index 84ec79b64960..b5a8c0a6b747 100644 --- a/drivers/gpu/drm/i915/Makefile +++ b/drivers/gpu/drm/i915/Makefile @@ -169,8 +169,7 @@ gem-y +=3D \ gem/i915_gem_ttm_move.o \ gem/i915_gem_ttm_pm.o \ gem/i915_gem_userptr.o \ - gem/i915_gem_wait.o \ - gem/i915_gemfs.o + gem/i915_gem_wait.o i915-y +=3D \ $(gem-y) \ i915_active.o \ diff --git a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c b/drivers/gpu/drm/i9= 15/gem/i915_gem_shmem.c index 26dda55a07ff..15c2c6fde2ac 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c @@ -9,14 +9,16 @@ #include =20 #include +#include +#include =20 #include "gem/i915_gem_region.h" #include "i915_drv.h" #include "i915_gem_object.h" #include "i915_gem_tiling.h" -#include "i915_gemfs.h" #include "i915_scatterlist.h" #include "i915_trace.h" +#include "i915_utils.h" =20 /* * Move folios to appropriate lru and release the batch, decrementing the @@ -497,6 +499,7 @@ static int __create_shmem(struct drm_i915_private *i915, resource_size_t size) { unsigned long flags =3D VM_NORESERVE; + struct vfsmount *huge_mnt; struct file *filp; =20 drm_gem_private_object_init(&i915->drm, obj, size); @@ -515,9 +518,9 @@ static int __create_shmem(struct drm_i915_private *i915, if (BITS_PER_LONG =3D=3D 64 && size > MAX_LFS_FILESIZE) return -E2BIG; =20 - if (i915->mm.gemfs) - filp =3D shmem_file_setup_with_mnt(i915->mm.gemfs, "i915", size, - flags); + huge_mnt =3D drm_gem_get_huge_mnt(&i915->drm); + if (huge_mnt) + filp =3D shmem_file_setup_with_mnt(huge_mnt, "i915", size, flags); else filp =3D shmem_file_setup("i915", size, flags); if (IS_ERR(filp)) @@ -644,21 +647,40 @@ i915_gem_object_create_shmem_from_data(struct drm_i91= 5_private *i915, =20 static int init_shmem(struct intel_memory_region *mem) { - i915_gemfs_init(mem->i915); - intel_memory_region_set_name(mem, "system"); + struct drm_i915_private *i915 =3D mem->i915; =20 - return 0; /* We have fallback to the kernel mnt if gemfs init failed. */ -} + /* + * By creating our own shmemfs mountpoint, we can pass in + * mount flags that better match our usecase. + * + * One example, although it is probably better with a per-file + * control, is selecting huge page allocations ("huge=3Dwithin_size"). + * However, we only do so on platforms which benefit from it, or to + * offset the overhead of iommu lookups, where with latter it is a net + * win even on platforms which would otherwise see some performance + * regressions such a slow reads issue on Broadwell and Skylake. + */ =20 -static int release_shmem(struct intel_memory_region *mem) -{ - i915_gemfs_fini(mem->i915); - return 0; + if (GRAPHICS_VER(i915) < 11 && !i915_vtd_active(i915)) + goto no_thp; + + drm_gem_huge_mnt_create(&i915->drm, "within_size"); + if (drm_gem_get_huge_mnt(&i915->drm)) + drm_info(&i915->drm, "Using Transparent Hugepages\n"); + else + drm_notice(&i915->drm, + "Transparent Hugepage support is recommended for optimal performance= %s\n", + GRAPHICS_VER(i915) >=3D 11 ? " on this platform!" : + " when IOMMU is enabled!"); + + no_thp: + intel_memory_region_set_name(mem, "system"); + + return 0; /* We have fallback to the kernel mnt if huge mnt failed. */ } =20 static const struct intel_memory_region_ops shmem_region_ops =3D { .init =3D init_shmem, - .release =3D release_shmem, .init_object =3D shmem_object_init, }; =20 diff --git a/drivers/gpu/drm/i915/gem/i915_gemfs.c b/drivers/gpu/drm/i915/g= em/i915_gemfs.c deleted file mode 100644 index 1f1290214031..000000000000 --- a/drivers/gpu/drm/i915/gem/i915_gemfs.c +++ /dev/null @@ -1,71 +0,0 @@ -// SPDX-License-Identifier: MIT -/* - * Copyright =C2=A9 2017 Intel Corporation - */ - -#include -#include -#include - -#include - -#include "i915_drv.h" -#include "i915_gemfs.h" -#include "i915_utils.h" - -void i915_gemfs_init(struct drm_i915_private *i915) -{ - struct file_system_type *type; - struct fs_context *fc; - struct vfsmount *gemfs; - int ret; - - /* - * By creating our own shmemfs mountpoint, we can pass in - * mount flags that better match our usecase. - * - * One example, although it is probably better with a per-file - * control, is selecting huge page allocations ("huge=3Dwithin_size"). - * However, we only do so on platforms which benefit from it, or to - * offset the overhead of iommu lookups, where with latter it is a net - * win even on platforms which would otherwise see some performance - * regressions such a slow reads issue on Broadwell and Skylake. - */ - - if (GRAPHICS_VER(i915) < 11 && !i915_vtd_active(i915)) - return; - - if (!IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE)) - goto err; - - type =3D get_fs_type("tmpfs"); - if (!type) - goto err; - - fc =3D fs_context_for_mount(type, SB_KERNMOUNT); - if (IS_ERR(fc)) - goto err; - ret =3D vfs_parse_fs_string(fc, "source", "tmpfs"); - if (!ret) - ret =3D vfs_parse_fs_string(fc, "huge", "within_size"); - if (!ret) - gemfs =3D fc_mount_longterm(fc); - put_fs_context(fc); - if (ret) - goto err; - - i915->mm.gemfs =3D gemfs; - drm_info(&i915->drm, "Using Transparent Hugepages\n"); - return; - -err: - drm_notice(&i915->drm, - "Transparent Hugepage support is recommended for optimal performance%= s\n", - GRAPHICS_VER(i915) >=3D 11 ? " on this platform!" : - " when IOMMU is enabled!"); -} - -void i915_gemfs_fini(struct drm_i915_private *i915) -{ - kern_unmount(i915->mm.gemfs); -} diff --git a/drivers/gpu/drm/i915/gem/i915_gemfs.h b/drivers/gpu/drm/i915/g= em/i915_gemfs.h deleted file mode 100644 index 16d4333c9a4e..000000000000 --- a/drivers/gpu/drm/i915/gem/i915_gemfs.h +++ /dev/null @@ -1,14 +0,0 @@ -/* SPDX-License-Identifier: MIT */ -/* - * Copyright =C2=A9 2017 Intel Corporation - */ - -#ifndef __I915_GEMFS_H__ -#define __I915_GEMFS_H__ - -struct drm_i915_private; - -void i915_gemfs_init(struct drm_i915_private *i915); -void i915_gemfs_fini(struct drm_i915_private *i915); - -#endif diff --git a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c b/drivers/gpu/= drm/i915/gem/selftests/huge_pages.c index bd08605a1611..28aef75630a2 100644 --- a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c +++ b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c @@ -1316,7 +1316,7 @@ typedef struct drm_i915_gem_object * =20 static inline bool igt_can_allocate_thp(struct drm_i915_private *i915) { - return i915->mm.gemfs && has_transparent_hugepage(); + return !!drm_gem_get_huge_mnt(&i915->drm); } =20 static struct drm_i915_gem_object * @@ -1761,7 +1761,9 @@ static int igt_tmpfs_fallback(void *arg) struct drm_i915_private *i915 =3D arg; struct i915_address_space *vm; struct i915_gem_context *ctx; - struct vfsmount *gemfs =3D i915->mm.gemfs; +#ifdef CONFIG_TRANSPARENT_HUGEPAGE + struct vfsmount *huge_mnt =3D i915->drm.huge_mnt; +#endif struct drm_i915_gem_object *obj; struct i915_vma *vma; struct file *file; @@ -1782,10 +1784,12 @@ static int igt_tmpfs_fallback(void *arg) /* * Make sure that we don't burst into a ball of flames upon falling back * to tmpfs, which we rely on if on the off-chance we encounter a failure - * when setting up gemfs. + * when setting up a huge mountpoint. */ =20 - i915->mm.gemfs =3D NULL; +#ifdef CONFIG_TRANSPARENT_HUGEPAGE + i915->drm.huge_mnt =3D NULL; +#endif =20 obj =3D i915_gem_object_create_shmem(i915, PAGE_SIZE); if (IS_ERR(obj)) { @@ -1819,7 +1823,9 @@ static int igt_tmpfs_fallback(void *arg) out_put: i915_gem_object_put(obj); out_restore: - i915->mm.gemfs =3D gemfs; +#ifdef CONFIG_TRANSPARENT_HUGEPAGE + i915->drm.huge_mnt =3D huge_mnt; +#endif =20 i915_vm_put(vm); out: diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_dr= v.h index 95f9ddf22ce4..93a5af3de334 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -141,11 +141,6 @@ struct i915_gem_mm { */ atomic_t free_count; =20 - /** - * tmpfs instance used for shmem backed objects - */ - struct vfsmount *gemfs; - struct intel_memory_region *regions[INTEL_REGION_UNKNOWN]; =20 struct notifier_block oom_notifier; --=20 2.47.3 From nobody Mon Dec 1 22:36:55 2025 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 83C39334397; Fri, 28 Nov 2025 18:53:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764355985; cv=none; b=Z8Pxyal2jOVgGXQO17PriOOEyWlk0YjL3PtLlUHtR5AQ4qW1BUolm8/bn4VlN9LN6erbXbwIN7N7AFvhWtqCoUECGj9TG6vBnMdGr6w57F7kzKKvSO+kYk19deSnB1VqlM4jEvLDsUwagFsKMSzL7ypBeKJxahiEbo9I4J9Zu64= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764355985; c=relaxed/simple; bh=lWeRizCFAnoy9k3fq8zKRLrGIQ7rHu7NhvzcfhIg40g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=bbqiwh4pmBFZ2hkQe5qPLjvR/T037Ah6coBptuJZRC1xU7+vIM1JELVvGG0q5U34WeJnbMQZ701QZ8Cf/5x2doTNj66u61ljfwLg4j3Tl0C3NWJLhaa8zvcQniKBcdp/tMc/hTJocZKDOeN/sjXy2y2woZxn49oCpAt27anlpkY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=IhZLNL9S; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="IhZLNL9S" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1764355981; bh=lWeRizCFAnoy9k3fq8zKRLrGIQ7rHu7NhvzcfhIg40g=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=IhZLNL9StSduEJYCxG4MWB8MoB5AsHq4o0VM1BynHaim5ZOC6qC+3YZhAl8/jUcP0 1GmTGCweLcwcTSyEh/C/VUjyh/pc8M23b3Q78NaV6Kj/1w1wk7BSLYos4y8z2mW+eV 1rQ/g5cDTraSDZyC//3aEs+vm8ER2NlTb+kJXVSePEmRDBoqbIHsP/euMRi/bLS2cR qiWdrzXZr43j5RtSCJhHQb7U5jP69ocM/8gc+2Ux9+dTZZKvFD+5TfBsvXHiB8wxX5 582uAXk777Dfn6qqO3wyyI0ov8PIXhvTinHnjXf77euy8rJ5M4ynhILbSx93nMYqVW BBlE9fGi8G6Fg== Received: from debian-rockchip-rock5b-rk3588.. (unknown [IPv6:2a01:e0a:5e3:6100:2e0:4cff:fe03:d8c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: loicmolinari) by bali.collaboradmins.com (Postfix) with ESMTPSA id F1F3E17E13ED; Fri, 28 Nov 2025 19:53:00 +0100 (CET) From: =?UTF-8?q?Lo=C3=AFc=20Molinari?= To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Boris Brezillon , Rob Herring , Steven Price , Liviu Dudau , Melissa Wen , =?UTF-8?q?Ma=C3=ADra=20Canal?= , Hugh Dickins , Baolin Wang , Andrew Morton , =?UTF-8?q?Lo=C3=AFc=20Molinari?= , Al Viro , =?UTF-8?q?Miko=C5=82aj=20Wasiak?= , Christian Brauner , Nitin Gote , Andi Shyti , Jonathan Corbet , Christopher Healy , Matthew Wilcox , Bagas Sanjaya Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, linux-mm@kvack.org, linux-doc@vger.kernel.org, kernel@collabora.com Subject: [PATCH v10 06/10] drm/v3d: Use huge tmpfs mountpoint helpers Date: Fri, 28 Nov 2025 19:52:48 +0100 Message-ID: <20251128185252.3092-7-loic.molinari@collabora.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251128185252.3092-1-loic.molinari@collabora.com> References: <20251128185252.3092-1-loic.molinari@collabora.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Make use of the new drm_gem_huge_mnt_create() and drm_gem_get_huge_mnt() helpers to avoid code duplication. Now that it's just a few lines long, the single function in v3d_gemfs.c is moved into v3d_gem.c. v3: - use huge tmpfs mountpoint in drm_device - move v3d_gemfs.c into v3d_gem.c v4: - clean up mountpoint creation error handling v5: - fix CONFIG_TRANSPARENT_HUGEPAGE check - use drm_gem_has_huge_mnt() helper v8: - don't access huge_mnt field with CONFIG_TRANSPARENT_HUGEPAGE=3Dn v9: - replace drm_gem_has_huge_mnt() by drm_gem_get_huge_mnt() v10: - get rid of CONFIG_TRANSPARENT_HUGEPAGE ifdefs Signed-off-by: Lo=C3=AFc Molinari Reviewed-by: Boris Brezillon Reviewed-by: Ma=C3=ADra Canal --- drivers/gpu/drm/v3d/Makefile | 3 +- drivers/gpu/drm/v3d/v3d_bo.c | 5 ++- drivers/gpu/drm/v3d/v3d_drv.c | 2 +- drivers/gpu/drm/v3d/v3d_drv.h | 11 +----- drivers/gpu/drm/v3d/v3d_gem.c | 27 ++++++++++++-- drivers/gpu/drm/v3d/v3d_gemfs.c | 62 --------------------------------- 6 files changed, 30 insertions(+), 80 deletions(-) delete mode 100644 drivers/gpu/drm/v3d/v3d_gemfs.c diff --git a/drivers/gpu/drm/v3d/Makefile b/drivers/gpu/drm/v3d/Makefile index fcf710926057..b7d673f1153b 100644 --- a/drivers/gpu/drm/v3d/Makefile +++ b/drivers/gpu/drm/v3d/Makefile @@ -13,8 +13,7 @@ v3d-y :=3D \ v3d_trace_points.o \ v3d_sched.o \ v3d_sysfs.o \ - v3d_submit.o \ - v3d_gemfs.o + v3d_submit.o =20 v3d-$(CONFIG_DEBUG_FS) +=3D v3d_debugfs.o =20 diff --git a/drivers/gpu/drm/v3d/v3d_bo.c b/drivers/gpu/drm/v3d/v3d_bo.c index d9547f5117b9..3ee8d9c36d92 100644 --- a/drivers/gpu/drm/v3d/v3d_bo.c +++ b/drivers/gpu/drm/v3d/v3d_bo.c @@ -114,7 +114,7 @@ v3d_bo_create_finish(struct drm_gem_object *obj) if (IS_ERR(sgt)) return PTR_ERR(sgt); =20 - if (!v3d->gemfs) + if (!drm_gem_get_huge_mnt(obj->dev)) align =3D SZ_4K; else if (obj->size >=3D SZ_1M) align =3D SZ_1M; @@ -150,12 +150,11 @@ struct v3d_bo *v3d_bo_create(struct drm_device *dev, = struct drm_file *file_priv, size_t unaligned_size) { struct drm_gem_shmem_object *shmem_obj; - struct v3d_dev *v3d =3D to_v3d_dev(dev); struct v3d_bo *bo; int ret; =20 shmem_obj =3D drm_gem_shmem_create_with_mnt(dev, unaligned_size, - v3d->gemfs); + drm_gem_get_huge_mnt(dev)); if (IS_ERR(shmem_obj)) return ERR_CAST(shmem_obj); bo =3D to_v3d_bo(&shmem_obj->base); diff --git a/drivers/gpu/drm/v3d/v3d_drv.c b/drivers/gpu/drm/v3d/v3d_drv.c index e8a46c8bad8a..8faa9382846f 100644 --- a/drivers/gpu/drm/v3d/v3d_drv.c +++ b/drivers/gpu/drm/v3d/v3d_drv.c @@ -107,7 +107,7 @@ static int v3d_get_param_ioctl(struct drm_device *dev, = void *data, args->value =3D v3d->perfmon_info.max_counters; return 0; case DRM_V3D_PARAM_SUPPORTS_SUPER_PAGES: - args->value =3D !!v3d->gemfs; + args->value =3D !!drm_gem_get_huge_mnt(dev); return 0; case DRM_V3D_PARAM_GLOBAL_RESET_COUNTER: mutex_lock(&v3d->reset_lock); diff --git a/drivers/gpu/drm/v3d/v3d_drv.h b/drivers/gpu/drm/v3d/v3d_drv.h index 1884686985b8..99a39329bb85 100644 --- a/drivers/gpu/drm/v3d/v3d_drv.h +++ b/drivers/gpu/drm/v3d/v3d_drv.h @@ -158,11 +158,6 @@ struct v3d_dev { struct drm_mm mm; spinlock_t mm_lock; =20 - /* - * tmpfs instance used for shmem backed objects - */ - struct vfsmount *gemfs; - struct work_struct overflow_mem_work; =20 struct v3d_queue_state queue[V3D_MAX_QUEUES]; @@ -569,6 +564,7 @@ extern const struct dma_fence_ops v3d_fence_ops; struct dma_fence *v3d_fence_create(struct v3d_dev *v3d, enum v3d_queue q); =20 /* v3d_gem.c */ +extern bool super_pages; int v3d_gem_init(struct drm_device *dev); void v3d_gem_destroy(struct drm_device *dev); void v3d_reset_sms(struct v3d_dev *v3d); @@ -576,11 +572,6 @@ void v3d_reset(struct v3d_dev *v3d); void v3d_invalidate_caches(struct v3d_dev *v3d); void v3d_clean_caches(struct v3d_dev *v3d); =20 -/* v3d_gemfs.c */ -extern bool super_pages; -void v3d_gemfs_init(struct v3d_dev *v3d); -void v3d_gemfs_fini(struct v3d_dev *v3d); - /* v3d_submit.c */ void v3d_job_cleanup(struct v3d_job *job); void v3d_job_put(struct v3d_job *job); diff --git a/drivers/gpu/drm/v3d/v3d_gem.c b/drivers/gpu/drm/v3d/v3d_gem.c index 5a180dc6c452..62532a89dd14 100644 --- a/drivers/gpu/drm/v3d/v3d_gem.c +++ b/drivers/gpu/drm/v3d/v3d_gem.c @@ -259,6 +259,30 @@ v3d_invalidate_caches(struct v3d_dev *v3d) v3d_invalidate_slices(v3d, 0); } =20 +static void +v3d_huge_mnt_init(struct v3d_dev *v3d) +{ + int err =3D 0; + + /* + * By using a huge shmemfs mountpoint when the user wants to + * enable Super Pages, we can pass in mount flags that better + * match our usecase. + */ + + if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) && super_pages) + err =3D drm_gem_huge_mnt_create(&v3d->drm, "within_size"); + + if (drm_gem_get_huge_mnt(&v3d->drm)) + drm_info(&v3d->drm, "Using Transparent Hugepages\n"); + else if (err) + drm_warn(&v3d->drm, "Can't use Transparent Hugepages (%d)\n", + err); + else + drm_notice(&v3d->drm, + "Transparent Hugepage support is recommended for optimal performance= on this platform!\n"); +} + int v3d_gem_init(struct drm_device *dev) { @@ -310,7 +334,7 @@ v3d_gem_init(struct drm_device *dev) v3d_init_hw_state(v3d); v3d_mmu_set_page_table(v3d); =20 - v3d_gemfs_init(v3d); + v3d_huge_mnt_init(v3d); =20 ret =3D v3d_sched_init(v3d); if (ret) { @@ -330,7 +354,6 @@ v3d_gem_destroy(struct drm_device *dev) enum v3d_queue q; =20 v3d_sched_fini(v3d); - v3d_gemfs_fini(v3d); =20 /* Waiting for jobs to finish would need to be done before * unregistering V3D. diff --git a/drivers/gpu/drm/v3d/v3d_gemfs.c b/drivers/gpu/drm/v3d/v3d_gemf= s.c deleted file mode 100644 index bf351fc0d488..000000000000 --- a/drivers/gpu/drm/v3d/v3d_gemfs.c +++ /dev/null @@ -1,62 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* Copyright (C) 2024 Raspberry Pi */ - -#include -#include -#include - -#include - -#include "v3d_drv.h" - -void v3d_gemfs_init(struct v3d_dev *v3d) -{ - struct file_system_type *type; - struct fs_context *fc; - struct vfsmount *gemfs; - int ret; - - /* - * By creating our own shmemfs mountpoint, we can pass in - * mount flags that better match our usecase. However, we - * only do so on platforms which benefit from it. - */ - if (!IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE)) - goto err; - - /* The user doesn't want to enable Super Pages */ - if (!super_pages) - goto err; - - type =3D get_fs_type("tmpfs"); - if (!type) - goto err; - - fc =3D fs_context_for_mount(type, SB_KERNMOUNT); - if (IS_ERR(fc)) - goto err; - ret =3D vfs_parse_fs_string(fc, "source", "tmpfs"); - if (!ret) - ret =3D vfs_parse_fs_string(fc, "huge", "within_size"); - if (!ret) - gemfs =3D fc_mount_longterm(fc); - put_fs_context(fc); - if (ret) - goto err; - - v3d->gemfs =3D gemfs; - drm_info(&v3d->drm, "Using Transparent Hugepages\n"); - - return; - -err: - v3d->gemfs =3D NULL; - drm_notice(&v3d->drm, - "Transparent Hugepage support is recommended for optimal performance = on this platform!\n"); -} - -void v3d_gemfs_fini(struct v3d_dev *v3d) -{ - if (v3d->gemfs) - kern_unmount(v3d->gemfs); -} --=20 2.47.3 From nobody Mon Dec 1 22:36:55 2025 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8A195334C03; Fri, 28 Nov 2025 18:53:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764355987; cv=none; b=FaDIw3hDr7OXHinO6bYMvd36WPLS9nsG2EqFqYqBBHt8SckiKUOQkLnhWDjRgGfDNzJyARuSwG8k9b/EZn6yocef3YZyUS2IzFqITjlWp0+VNLAHXjhdZb+szP3SrFiyU1NZ45jYCVi7lGhkLaLvdToFM8gtZZkPoqY9jQVpRuQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764355987; c=relaxed/simple; bh=aqgHWs6PVS5pm9CGbwvq8LKKb1IeG9wPYVrDgsd8LGo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Dqyq792L0e1One0Aj/Qa8W50B7zCzi64CgC3AVigMsMNY3XllMuZSOql1EFgGdq5d14ygGfJqSzxVkmmBVL84yHeEAgMTakjCouYxjkZdUqowfOlDUOueZ0fsleobbLOmg4nqOZJWRtXld0GINSUUm9/qa3XpQrWpgI26wQ27Ts= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=Djlm9gP5; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="Djlm9gP5" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1764355982; bh=aqgHWs6PVS5pm9CGbwvq8LKKb1IeG9wPYVrDgsd8LGo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Djlm9gP5gwSN3e5Qbd3i9uXdUgiueEKh06U1/3VfYYjv9DvQwoxp9V84AknIzzPj6 iJMeOk54qFrzczYZW8L/PNUjKxWF97Cmw0FM1T31OPwmJ1RwpcfqZBrnYxbEEoMHUl 0trAcnf5L+HwSi5Cbogn/xzjPLYmUKt1cccuQNggG54V4KgAh5AuOTHPn33vc9zh3G YY7MrecX9mQmy17uzy2dUCDJAtdUTTvlt/Wjwk2dugdDf01srS1VgqX49ke+rfAAG6 niQ8qOVqIvc3dfKDP6DhS2Je5kA6OCKBcPtlfAVnTYDVFcGGaPsFMmkHJchVXZKwKX cJl061qgeogNg== Received: from debian-rockchip-rock5b-rk3588.. (unknown [IPv6:2a01:e0a:5e3:6100:2e0:4cff:fe03:d8c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: loicmolinari) by bali.collaboradmins.com (Postfix) with ESMTPSA id 07E9B17E12C5; Fri, 28 Nov 2025 19:53:02 +0100 (CET) From: =?UTF-8?q?Lo=C3=AFc=20Molinari?= To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Boris Brezillon , Rob Herring , Steven Price , Liviu Dudau , Melissa Wen , =?UTF-8?q?Ma=C3=ADra=20Canal?= , Hugh Dickins , Baolin Wang , Andrew Morton , =?UTF-8?q?Lo=C3=AFc=20Molinari?= , Al Viro , =?UTF-8?q?Miko=C5=82aj=20Wasiak?= , Christian Brauner , Nitin Gote , Andi Shyti , Jonathan Corbet , Christopher Healy , Matthew Wilcox , Bagas Sanjaya Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, linux-mm@kvack.org, linux-doc@vger.kernel.org, kernel@collabora.com Subject: [PATCH v10 07/10] drm/gem: Get rid of *_with_mnt helpers Date: Fri, 28 Nov 2025 19:52:49 +0100 Message-ID: <20251128185252.3092-8-loic.molinari@collabora.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251128185252.3092-1-loic.molinari@collabora.com> References: <20251128185252.3092-1-loic.molinari@collabora.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable drm_gem_object_init_with_mnt() and drm_gem_shmem_create_with_mnt() can be removed now that the drivers use the new drm_gem_huge_mnt_create() and drm_gem_get_huge_mnt() helpers. v5: - use drm_gem_has_huge_mnt() helper - compile out shmem_file_setup_with_mnt() call in builds with CONFIG_TRANSPARENT_HUGEPAGE=3Dn v9: - replace drm_gem_has_huge_mnt() with drm_gem_get_huge_mnt() Signed-off-by: Lo=C3=AFc Molinari Reviewed-by: Boris Brezillon --- drivers/gpu/drm/drm_gem.c | 37 +++++++------------------ drivers/gpu/drm/drm_gem_shmem_helper.c | 38 ++++++-------------------- drivers/gpu/drm/v3d/v3d_bo.c | 3 +- include/drm/drm_gem.h | 3 -- include/drm/drm_gem_shmem_helper.h | 3 -- 5 files changed, 19 insertions(+), 65 deletions(-) diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index 94e5e04865ba..a7c79f640e7b 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c @@ -171,29 +171,28 @@ drm_gem_init(struct drm_device *dev) } =20 /** - * drm_gem_object_init_with_mnt - initialize an allocated shmem-backed GEM - * object in a given shmfs mountpoint + * drm_gem_object_init - initialize an allocated shmem-backed GEM object * * @dev: drm_device the object should be initialized for * @obj: drm_gem_object to initialize * @size: object size - * @gemfs: tmpfs mount where the GEM object will be created. If NULL, use - * the usual tmpfs mountpoint (`shm_mnt`). * * Initialize an already allocated GEM object of the specified size with - * shmfs backing store. + * shmfs backing store. A huge mountpoint can be used by calling + * drm_gem_huge_mnt_create() beforehand. */ -int drm_gem_object_init_with_mnt(struct drm_device *dev, - struct drm_gem_object *obj, size_t size, - struct vfsmount *gemfs) +int drm_gem_object_init(struct drm_device *dev, struct drm_gem_object *obj, + size_t size) { + struct vfsmount *huge_mnt; struct file *filp; =20 drm_gem_private_object_init(dev, obj, size); =20 - if (gemfs) - filp =3D shmem_file_setup_with_mnt(gemfs, "drm mm object", size, - VM_NORESERVE); + huge_mnt =3D drm_gem_get_huge_mnt(dev); + if (huge_mnt) + filp =3D shmem_file_setup_with_mnt(huge_mnt, "drm mm object", + size, VM_NORESERVE); else filp =3D shmem_file_setup("drm mm object", size, VM_NORESERVE); =20 @@ -204,22 +203,6 @@ int drm_gem_object_init_with_mnt(struct drm_device *de= v, =20 return 0; } -EXPORT_SYMBOL(drm_gem_object_init_with_mnt); - -/** - * drm_gem_object_init - initialize an allocated shmem-backed GEM object - * @dev: drm_device the object should be initialized for - * @obj: drm_gem_object to initialize - * @size: object size - * - * Initialize an already allocated GEM object of the specified size with - * shmfs backing store. - */ -int drm_gem_object_init(struct drm_device *dev, struct drm_gem_object *obj, - size_t size) -{ - return drm_gem_object_init_with_mnt(dev, obj, size, NULL); -} EXPORT_SYMBOL(drm_gem_object_init); =20 /** diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c b/drivers/gpu/drm/drm_g= em_shmem_helper.c index 81f4ac7cb8f6..43a80f3fcfd9 100644 --- a/drivers/gpu/drm/drm_gem_shmem_helper.c +++ b/drivers/gpu/drm/drm_gem_shmem_helper.c @@ -50,7 +50,7 @@ static const struct drm_gem_object_funcs drm_gem_shmem_fu= ncs =3D { }; =20 static int __drm_gem_shmem_init(struct drm_device *dev, struct drm_gem_shm= em_object *shmem, - size_t size, bool private, struct vfsmount *gemfs) + size_t size, bool private) { struct drm_gem_object *obj =3D &shmem->base; int ret =3D 0; @@ -62,7 +62,7 @@ static int __drm_gem_shmem_init(struct drm_device *dev, s= truct drm_gem_shmem_obj drm_gem_private_object_init(dev, obj, size); shmem->map_wc =3D false; /* dma-buf mappings use always writecombine */ } else { - ret =3D drm_gem_object_init_with_mnt(dev, obj, size, gemfs); + ret =3D drm_gem_object_init(dev, obj, size); } if (ret) { drm_gem_private_object_fini(obj); @@ -103,13 +103,12 @@ static int __drm_gem_shmem_init(struct drm_device *de= v, struct drm_gem_shmem_obj */ int drm_gem_shmem_init(struct drm_device *dev, struct drm_gem_shmem_object= *shmem, size_t size) { - return __drm_gem_shmem_init(dev, shmem, size, false, NULL); + return __drm_gem_shmem_init(dev, shmem, size, false); } EXPORT_SYMBOL_GPL(drm_gem_shmem_init); =20 static struct drm_gem_shmem_object * -__drm_gem_shmem_create(struct drm_device *dev, size_t size, bool private, - struct vfsmount *gemfs) +__drm_gem_shmem_create(struct drm_device *dev, size_t size, bool private) { struct drm_gem_shmem_object *shmem; struct drm_gem_object *obj; @@ -129,7 +128,7 @@ __drm_gem_shmem_create(struct drm_device *dev, size_t s= ize, bool private, obj =3D &shmem->base; } =20 - ret =3D __drm_gem_shmem_init(dev, shmem, size, private, gemfs); + ret =3D __drm_gem_shmem_init(dev, shmem, size, private); if (ret) { kfree(obj); return ERR_PTR(ret); @@ -150,31 +149,10 @@ __drm_gem_shmem_create(struct drm_device *dev, size_t= size, bool private, */ struct drm_gem_shmem_object *drm_gem_shmem_create(struct drm_device *dev, = size_t size) { - return __drm_gem_shmem_create(dev, size, false, NULL); + return __drm_gem_shmem_create(dev, size, false); } EXPORT_SYMBOL_GPL(drm_gem_shmem_create); =20 -/** - * drm_gem_shmem_create_with_mnt - Allocate an object with the given size = in a - * given mountpoint - * @dev: DRM device - * @size: Size of the object to allocate - * @gemfs: tmpfs mount where the GEM object will be created - * - * This function creates a shmem GEM object in a given tmpfs mountpoint. - * - * Returns: - * A struct drm_gem_shmem_object * on success or an ERR_PTR()-encoded nega= tive - * error code on failure. - */ -struct drm_gem_shmem_object *drm_gem_shmem_create_with_mnt(struct drm_devi= ce *dev, - size_t size, - struct vfsmount *gemfs) -{ - return __drm_gem_shmem_create(dev, size, false, gemfs); -} -EXPORT_SYMBOL_GPL(drm_gem_shmem_create_with_mnt); - /** * drm_gem_shmem_release - Release resources associated with a shmem GEM o= bject. * @shmem: shmem GEM object @@ -861,7 +839,7 @@ drm_gem_shmem_prime_import_sg_table(struct drm_device *= dev, size_t size =3D PAGE_ALIGN(attach->dmabuf->size); struct drm_gem_shmem_object *shmem; =20 - shmem =3D __drm_gem_shmem_create(dev, size, true, NULL); + shmem =3D __drm_gem_shmem_create(dev, size, true); if (IS_ERR(shmem)) return ERR_CAST(shmem); =20 @@ -909,7 +887,7 @@ struct drm_gem_object *drm_gem_shmem_prime_import_no_ma= p(struct drm_device *dev, =20 size =3D PAGE_ALIGN(attach->dmabuf->size); =20 - shmem =3D __drm_gem_shmem_create(dev, size, true, NULL); + shmem =3D __drm_gem_shmem_create(dev, size, true); if (IS_ERR(shmem)) { ret =3D PTR_ERR(shmem); goto fail_detach; diff --git a/drivers/gpu/drm/v3d/v3d_bo.c b/drivers/gpu/drm/v3d/v3d_bo.c index 3ee8d9c36d92..c4316b768b3d 100644 --- a/drivers/gpu/drm/v3d/v3d_bo.c +++ b/drivers/gpu/drm/v3d/v3d_bo.c @@ -153,8 +153,7 @@ struct v3d_bo *v3d_bo_create(struct drm_device *dev, st= ruct drm_file *file_priv, struct v3d_bo *bo; int ret; =20 - shmem_obj =3D drm_gem_shmem_create_with_mnt(dev, unaligned_size, - drm_gem_get_huge_mnt(dev)); + shmem_obj =3D drm_gem_shmem_create(dev, unaligned_size); if (IS_ERR(shmem_obj)) return ERR_CAST(shmem_obj); bo =3D to_v3d_bo(&shmem_obj->base); diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h index 4e9ab5d294ac..3ecab9cf625f 100644 --- a/include/drm/drm_gem.h +++ b/include/drm/drm_gem.h @@ -529,9 +529,6 @@ void drm_gem_object_release(struct drm_gem_object *obj); void drm_gem_object_free(struct kref *kref); int drm_gem_object_init(struct drm_device *dev, struct drm_gem_object *obj, size_t size); -int drm_gem_object_init_with_mnt(struct drm_device *dev, - struct drm_gem_object *obj, size_t size, - struct vfsmount *gemfs); void drm_gem_private_object_init(struct drm_device *dev, struct drm_gem_object *obj, size_t size); void drm_gem_private_object_fini(struct drm_gem_object *obj); diff --git a/include/drm/drm_gem_shmem_helper.h b/include/drm/drm_gem_shmem= _helper.h index 589f7bfe7506..6b6478f5ca24 100644 --- a/include/drm/drm_gem_shmem_helper.h +++ b/include/drm/drm_gem_shmem_helper.h @@ -109,9 +109,6 @@ struct drm_gem_shmem_object { =20 int drm_gem_shmem_init(struct drm_device *dev, struct drm_gem_shmem_object= *shmem, size_t size); struct drm_gem_shmem_object *drm_gem_shmem_create(struct drm_device *dev, = size_t size); -struct drm_gem_shmem_object *drm_gem_shmem_create_with_mnt(struct drm_devi= ce *dev, - size_t size, - struct vfsmount *gemfs); void drm_gem_shmem_release(struct drm_gem_shmem_object *shmem); void drm_gem_shmem_free(struct drm_gem_shmem_object *shmem); =20 --=20 2.47.3 From nobody Mon Dec 1 22:36:55 2025 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8A20F334C06; Fri, 28 Nov 2025 18:53:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764355987; cv=none; b=r9OWmVx6MXOHAiAcScXjJlZ6Xt/YxvOWqqLHn7T9ZGAakSo0MJ86TKbhVHhZKjV/vtwoGMp/HcpkL2H4QJgur3t0+UmEEZRcN6TWe63CN4HGrQOHwoW7UGzgJmjETQtQV+bzuE9O6rnPuX1WV+PQW0Rxfq45FyMgm1k1za0GBBc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764355987; c=relaxed/simple; bh=rZghyx94iYUUgXSZnWKsyKkGP7PLMHmFoXccUZ/6idM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=pFELQprE8h9p9u4DuFKVdrxz89PMp2WQtDg0ZD2+QwY+Ait3NvrY1y82WibFrD1QR+1EdRTmcIcTTCqZWln/wFf3ALZHGcXtDyMz41db9KFFgINe1GohnC8VpRxoW09PlE9wWDTBhMehA5/FP9lcnpJnrtoSK9H2bLQN+T0bfhs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=JDmoFm9s; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="JDmoFm9s" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1764355983; bh=rZghyx94iYUUgXSZnWKsyKkGP7PLMHmFoXccUZ/6idM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=JDmoFm9s0cnW9OJRzi6TevGx3Zhdu/qpHdHHwBI4VprYsYPm8D7/LGKH6UEa7V4du t9H9XpZL2kjcozBu0W1Dc5JdpRXUGvEhIaQnEfKkJYgh9+q7GInfIplzu26PrGC14V Xu408hLFiD0y7YwXkMxFI5XYdo7ErFMHwMq/RgayWfJgDRVOE3aTOZdGVfg6XAMB/T NLUJTgEpYVMfHmsYZ3/mYYIUptsZ0zNq3CftndMWEH+LPfF5SDVf3tqpRdm7Lm48cx qgpSouWEOzXnkl4PVPrWunXnVFFCY/M4VwTMsOPoJPKcEufy1oBT7XRg3Q8hsVUHFt zYQegedr+pW0A== Received: from debian-rockchip-rock5b-rk3588.. (unknown [IPv6:2a01:e0a:5e3:6100:2e0:4cff:fe03:d8c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: loicmolinari) by bali.collaboradmins.com (Postfix) with ESMTPSA id 0C03D17E156E; Fri, 28 Nov 2025 19:53:03 +0100 (CET) From: =?UTF-8?q?Lo=C3=AFc=20Molinari?= To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Boris Brezillon , Rob Herring , Steven Price , Liviu Dudau , Melissa Wen , =?UTF-8?q?Ma=C3=ADra=20Canal?= , Hugh Dickins , Baolin Wang , Andrew Morton , =?UTF-8?q?Lo=C3=AFc=20Molinari?= , Al Viro , =?UTF-8?q?Miko=C5=82aj=20Wasiak?= , Christian Brauner , Nitin Gote , Andi Shyti , Jonathan Corbet , Christopher Healy , Matthew Wilcox , Bagas Sanjaya Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, linux-mm@kvack.org, linux-doc@vger.kernel.org, kernel@collabora.com Subject: [PATCH v10 08/10] drm/panthor: Introduce huge tmpfs mountpoint option Date: Fri, 28 Nov 2025 19:52:50 +0100 Message-ID: <20251128185252.3092-9-loic.molinari@collabora.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251128185252.3092-1-loic.molinari@collabora.com> References: <20251128185252.3092-1-loic.molinari@collabora.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Introduce the 'panthor.transparent_hugepage' boolean module parameter (false by default). When the parameter is set to true, a new tmpfs mountpoint is created and mounted using the 'huge=3Dwithin_size' option. It's then used at GEM object creation instead of the default 'shm_mnt' mountpoint in order to enable Transparent Hugepage (THP) for the object (without having to rely on a system wide parameter). v3: - use huge tmpfs mountpoint in drm_device v4: - fix builds with CONFIG_TRANSPARENT_HUGEPAGE=3Dn - clean up mountpoint creation error handling - print negative error value v5: - use drm_gem_has_huge_tmp() helper - get rid of CONFIG_TRANSPARENT_HUGEPAGE ifdefs v9: - replace drm_gem_has_huge_tmp() by drm_gem_get_huge_tmp() Signed-off-by: Lo=C3=AFc Molinari Reviewed-by: Boris Brezillon --- drivers/gpu/drm/panthor/panthor_device.c | 3 +++ drivers/gpu/drm/panthor/panthor_drv.c | 7 +++++++ drivers/gpu/drm/panthor/panthor_drv.h | 9 +++++++++ drivers/gpu/drm/panthor/panthor_gem.c | 18 ++++++++++++++++++ drivers/gpu/drm/panthor/panthor_gem.h | 2 ++ 5 files changed, 39 insertions(+) create mode 100644 drivers/gpu/drm/panthor/panthor_drv.h diff --git a/drivers/gpu/drm/panthor/panthor_device.c b/drivers/gpu/drm/pan= thor/panthor_device.c index e133b1e0ad6d..2979ee0e52c2 100644 --- a/drivers/gpu/drm/panthor/panthor_device.c +++ b/drivers/gpu/drm/panthor/panthor_device.c @@ -18,6 +18,7 @@ #include "panthor_devfreq.h" #include "panthor_device.h" #include "panthor_fw.h" +#include "panthor_gem.h" #include "panthor_gpu.h" #include "panthor_hw.h" #include "panthor_mmu.h" @@ -294,6 +295,8 @@ int panthor_device_init(struct panthor_device *ptdev) if (ret) goto err_unplug_fw; =20 + panthor_gem_init(ptdev); + /* ~3 frames */ pm_runtime_set_autosuspend_delay(ptdev->base.dev, 50); pm_runtime_use_autosuspend(ptdev->base.dev); diff --git a/drivers/gpu/drm/panthor/panthor_drv.c b/drivers/gpu/drm/pantho= r/panthor_drv.c index d1d4c50da5bf..55dbda6dbf9c 100644 --- a/drivers/gpu/drm/panthor/panthor_drv.c +++ b/drivers/gpu/drm/panthor/panthor_drv.c @@ -1559,6 +1559,7 @@ static const struct file_operations panthor_drm_drive= r_fops =3D { .read =3D drm_read, .llseek =3D noop_llseek, .mmap =3D panthor_mmap, + .get_unmapped_area =3D drm_gem_get_unmapped_area, .show_fdinfo =3D drm_show_fdinfo, .fop_flags =3D FOP_UNSIGNED_OFFSET, }; @@ -1626,6 +1627,12 @@ static const struct drm_driver panthor_drm_driver = =3D { #endif }; =20 +#ifdef CONFIG_TRANSPARENT_HUGEPAGE +bool panthor_transparent_hugepage; +module_param_named(transparent_hugepage, panthor_transparent_hugepage, boo= l, 0400); +MODULE_PARM_DESC(transparent_hugepage, "Use a dedicated tmpfs mount point = with Transparent Hugepage enabled (false =3D default)"); +#endif + static int panthor_probe(struct platform_device *pdev) { struct panthor_device *ptdev; diff --git a/drivers/gpu/drm/panthor/panthor_drv.h b/drivers/gpu/drm/pantho= r/panthor_drv.h new file mode 100644 index 000000000000..79dccd289881 --- /dev/null +++ b/drivers/gpu/drm/panthor/panthor_drv.h @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: GPL-2.0 or MIT +/* Copyright 2025 Amazon.com, Inc. or its affiliates */ + +#ifndef __PANTHOR_DRV_H__ +#define __PANTHOR_DRV_H__ + +extern bool panthor_transparent_hugepage; + +#endif diff --git a/drivers/gpu/drm/panthor/panthor_gem.c b/drivers/gpu/drm/pantho= r/panthor_gem.c index 10d255cccc09..7ae07a9bc996 100644 --- a/drivers/gpu/drm/panthor/panthor_gem.c +++ b/drivers/gpu/drm/panthor/panthor_gem.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 or MIT /* Copyright 2019 Linaro, Ltd, Rob Herring */ /* Copyright 2023 Collabora ltd. */ +/* Copyright 2025 Amazon.com, Inc. or its affiliates */ =20 #include #include @@ -12,10 +13,27 @@ #include =20 #include "panthor_device.h" +#include "panthor_drv.h" #include "panthor_fw.h" #include "panthor_gem.h" #include "panthor_mmu.h" =20 +void panthor_gem_init(struct panthor_device *ptdev) +{ + int err; + + if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) && + !panthor_transparent_hugepage) + return; + + err =3D drm_gem_huge_mnt_create(&ptdev->base, "within_size"); + if (drm_gem_get_huge_mnt(&ptdev->base)) + drm_info(&ptdev->base, "Using Transparent Hugepage\n"); + else if (err) + drm_warn(&ptdev->base, "Can't use Transparent Hugepage (%d)\n", + err); +} + #ifdef CONFIG_DEBUG_FS static void panthor_gem_debugfs_bo_init(struct panthor_gem_object *bo) { diff --git a/drivers/gpu/drm/panthor/panthor_gem.h b/drivers/gpu/drm/pantho= r/panthor_gem.h index 80c6e24112d0..2eefe9104e5e 100644 --- a/drivers/gpu/drm/panthor/panthor_gem.h +++ b/drivers/gpu/drm/panthor/panthor_gem.h @@ -136,6 +136,8 @@ struct panthor_gem_object *to_panthor_bo(struct drm_gem= _object *obj) return container_of(to_drm_gem_shmem_obj(obj), struct panthor_gem_object,= base); } =20 +void panthor_gem_init(struct panthor_device *ptdev); + struct drm_gem_object *panthor_gem_create_object(struct drm_device *ddev, = size_t size); =20 int --=20 2.47.3 From nobody Mon Dec 1 22:36:55 2025 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9657A33509A; Fri, 28 Nov 2025 18:53:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764355989; cv=none; b=OTFu6KmJ319sbkT97uT7zEXWBzvGjBT4VcYnL67IhHtqBP+pNthZ3K4jYJAbocW/uopQ8a3yM3mmHaOCS1n9T59ffnvQOPecTuuzy59JawDuWO37Gyw2zf/sTMoj/jFLqmQ9pgdLmi6r2hLUHAqYYw7R06MwcO3eeGgv1VD8VOU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764355989; c=relaxed/simple; bh=j71+p9YAh5QPiawZ9VZM73M2pNS6NNm74Zwt268TaXE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=pJxXuiEF3v/BWf1WTbbxauKApTmE9TaRT7aj4wmMqoGMb51rhtItPwk9FvvViWt2b0qu9KhzsJpPAZ9A6qODNOqfrL5OWN2sJ1P7s46rPKi7fYVXz8Y/WZq/H1mWecW7Ka/dooHFF+xusoIVBmfYkbHD15Tl9Jn04M2LWglxXrY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=gsLQ9dQa; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="gsLQ9dQa" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1764355984; bh=j71+p9YAh5QPiawZ9VZM73M2pNS6NNm74Zwt268TaXE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gsLQ9dQaVhez5PL7+FLh3wuYV359noD9/dcixSCZyyysdcPraJXeZt5TQpjWLdam2 AGDAqGg6NkYNx4ExwLGV6RR0i5RBcig3mieRftYDP+JQr7ldOJi6a5Cz0D+uuKgxGB NvQDvPuBeVDTXJXT8ooGG+QhdCbyfaWOp+LQ15+wH+mxv3BqZxtTyQQx/J9ykjF/oP 4LFo8QNxe9sVd8Q09mfzzAgQxkuJkuBhDTLP6EcbN76kIvXzWw/ukJXI0AIufY6awG pK53lOP/uwlZRnFaD3Wrz/2MAe+JlN2WNbBIn2lNhYXw9gVHf9QpS9LXWT42M7xD/R 3Kb8gi9H5yFqQ== Received: from debian-rockchip-rock5b-rk3588.. (unknown [IPv6:2a01:e0a:5e3:6100:2e0:4cff:fe03:d8c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: loicmolinari) by bali.collaboradmins.com (Postfix) with ESMTPSA id 0EA8917E10F6; Fri, 28 Nov 2025 19:53:04 +0100 (CET) From: =?UTF-8?q?Lo=C3=AFc=20Molinari?= To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Boris Brezillon , Rob Herring , Steven Price , Liviu Dudau , Melissa Wen , =?UTF-8?q?Ma=C3=ADra=20Canal?= , Hugh Dickins , Baolin Wang , Andrew Morton , =?UTF-8?q?Lo=C3=AFc=20Molinari?= , Al Viro , =?UTF-8?q?Miko=C5=82aj=20Wasiak?= , Christian Brauner , Nitin Gote , Andi Shyti , Jonathan Corbet , Christopher Healy , Matthew Wilcox , Bagas Sanjaya Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, linux-mm@kvack.org, linux-doc@vger.kernel.org, kernel@collabora.com Subject: [PATCH v10 09/10] drm/panfrost: Introduce huge tmpfs mountpoint option Date: Fri, 28 Nov 2025 19:52:51 +0100 Message-ID: <20251128185252.3092-10-loic.molinari@collabora.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251128185252.3092-1-loic.molinari@collabora.com> References: <20251128185252.3092-1-loic.molinari@collabora.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Introduce the 'panfrost.transparent_hugepage' boolean module parameter (false by default). When the parameter is set to true, a new tmpfs mountpoint is created and mounted using the 'huge=3Dwithin_size' option. It's then used at GEM object creation instead of the default 'shm_mnt' mountpoint in order to enable Transparent Hugepage (THP) for the object (without having to rely on a system wide parameter). v3: - use huge tmpfs mountpoint in drm_device v4: - fix builds with CONFIG_TRANSPARENT_HUGEPAGE=3Dn - clean up mountpoint creation error handling - print negative error value v5: - use drm_gem_has_huge_tmp() helper - get rid of CONFIG_TRANSPARENT_HUGEPAGE ifdefs v9: - replace drm_gem_has_huge_tmp() by drm_gem_get_huge_tmp() Signed-off-by: Lo=C3=AFc Molinari Reviewed-by: Boris Brezillon --- drivers/gpu/drm/panfrost/panfrost_device.c | 3 +++ drivers/gpu/drm/panfrost/panfrost_drv.c | 6 ++++++ drivers/gpu/drm/panfrost/panfrost_drv.h | 9 +++++++++ drivers/gpu/drm/panfrost/panfrost_gem.c | 18 ++++++++++++++++++ drivers/gpu/drm/panfrost/panfrost_gem.h | 2 ++ 5 files changed, 38 insertions(+) create mode 100644 drivers/gpu/drm/panfrost/panfrost_drv.h diff --git a/drivers/gpu/drm/panfrost/panfrost_device.c b/drivers/gpu/drm/p= anfrost/panfrost_device.c index c61b97af120c..dedc13e56631 100644 --- a/drivers/gpu/drm/panfrost/panfrost_device.c +++ b/drivers/gpu/drm/panfrost/panfrost_device.c @@ -12,6 +12,7 @@ #include "panfrost_device.h" #include "panfrost_devfreq.h" #include "panfrost_features.h" +#include "panfrost_gem.h" #include "panfrost_issues.h" #include "panfrost_gpu.h" #include "panfrost_job.h" @@ -267,6 +268,8 @@ int panfrost_device_init(struct panfrost_device *pfdev) if (err) goto out_job; =20 + panfrost_gem_init(pfdev); + return 0; out_job: panfrost_jm_fini(pfdev); diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panf= rost/panfrost_drv.c index 7d8c7c337606..7f59568faa05 100644 --- a/drivers/gpu/drm/panfrost/panfrost_drv.c +++ b/drivers/gpu/drm/panfrost/panfrost_drv.c @@ -858,6 +858,12 @@ static const struct drm_driver panfrost_drm_driver =3D= { #endif }; =20 +#ifdef CONFIG_TRANSPARENT_HUGEPAGE +bool panfrost_transparent_hugepage; +module_param_named(transparent_hugepage, panfrost_transparent_hugepage, bo= ol, 0400); +MODULE_PARM_DESC(transparent_hugepage, "Use a dedicated tmpfs mount point = with Transparent Hugepage enabled (false =3D default)"); +#endif + static int panfrost_probe(struct platform_device *pdev) { struct panfrost_device *pfdev; diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.h b/drivers/gpu/drm/panf= rost/panfrost_drv.h new file mode 100644 index 000000000000..edeb093eb6da --- /dev/null +++ b/drivers/gpu/drm/panfrost/panfrost_drv.h @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: GPL-2.0 or MIT +/* Copyright 2025 Amazon.com, Inc. or its affiliates */ + +#ifndef __PANFROST_DRV_H__ +#define __PANFROST_DRV_H__ + +extern bool panfrost_transparent_hugepage; + +#endif diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.c b/drivers/gpu/drm/panf= rost/panfrost_gem.c index 8041b65c6609..c1688a542ec2 100644 --- a/drivers/gpu/drm/panfrost/panfrost_gem.c +++ b/drivers/gpu/drm/panfrost/panfrost_gem.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 /* Copyright 2019 Linaro, Ltd, Rob Herring */ +/* Copyright 2025 Amazon.com, Inc. or its affiliates */ =20 #include #include @@ -10,9 +11,26 @@ #include #include #include "panfrost_device.h" +#include "panfrost_drv.h" #include "panfrost_gem.h" #include "panfrost_mmu.h" =20 +void panfrost_gem_init(struct panfrost_device *pfdev) +{ + int err; + + if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) && + !panfrost_transparent_hugepage) + return; + + err =3D drm_gem_huge_mnt_create(&pfdev->base, "within_size"); + if (drm_gem_get_huge_mnt(&pfdev->base)) + drm_info(&pfdev->base, "Using Transparent Hugepage\n"); + else if (err) + drm_warn(&pfdev->base, "Can't use Transparent Hugepage (%d)\n", + err); +} + #ifdef CONFIG_DEBUG_FS static void panfrost_gem_debugfs_bo_add(struct panfrost_device *pfdev, struct panfrost_gem_object *bo) diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.h b/drivers/gpu/drm/panf= rost/panfrost_gem.h index 8de3e76f2717..1a62529ff06f 100644 --- a/drivers/gpu/drm/panfrost/panfrost_gem.h +++ b/drivers/gpu/drm/panfrost/panfrost_gem.h @@ -124,6 +124,8 @@ drm_mm_node_to_panfrost_mapping(struct drm_mm_node *nod= e) return container_of(node, struct panfrost_gem_mapping, mmnode); } =20 +void panfrost_gem_init(struct panfrost_device *pfdev); + struct drm_gem_object *panfrost_gem_create_object(struct drm_device *dev, = size_t size); =20 struct drm_gem_object * --=20 2.47.3 From nobody Mon Dec 1 22:36:55 2025 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 54A5333508A; Fri, 28 Nov 2025 18:53:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764355989; cv=none; b=FnGlaOHBrXoq3wTcGwVa3KIQCSdTiJ7HZ5chmTt9nOohG/x5mx87NSnPvx+3LA+hF2jm8GohRyXWmx6pCO8SpZSPKkeFj+LojD2J8RFcSiyEBf6p9VWjt5iMRspkHeNbvcIuI5q0v0OsHyCky0M7MiYwyro4sRKHWoDr8iR0Eos= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764355989; c=relaxed/simple; bh=40WG8/2e61IMWsDRpUFUHulUyBgQPDILQimEoI6b3o0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=a2pkiSaccTyez2TkoLw6N8VwRU5xjKP4RUlXUCfetPnaTSruQl9ly+DpAKkdgrmgGPCo9n401ZQgaGUuao9w2TJWRJtlpICQQ3UfzOti4a1dbt1CoxxqxvfaIZjIb08oiqCAG7V+oe7k0q/dnr4MFxGnsRCpnNPoPQI4gtaFO7g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=iiuP44ez; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="iiuP44ez" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1764355985; bh=40WG8/2e61IMWsDRpUFUHulUyBgQPDILQimEoI6b3o0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=iiuP44ezth3Y2JRlmZ1rSE+K74/8kwjO/TPviOWbw1FSgy5A9odQ4CmhNAS5FVvQq UDUaAtfuZSRBLv9FRfg1M15w3uCVYBCbZp0VhNqgFw1Smij4a4R0cxQ2SZPoqyVLjs AicmW2MlD5NO/bI58Q1fdMnkdKQD81oGc+uqKsSy2v6JMGfPxWJu30MP+o9FCc+8bj MqE4JUcRg56N4kiMmPZFPZ1kcn4TdiLtIetYmohoFTLM7HszF2ESw4xMNCkK066M3E ekn+f5BdBYQCBcxHmdv8/kuL5yYEWyY8TAOYBqrsD84n1ISi9RjJnAxjxKgCzWmRZt rwpbMBoLk7bYw== Received: from debian-rockchip-rock5b-rk3588.. (unknown [IPv6:2a01:e0a:5e3:6100:2e0:4cff:fe03:d8c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: loicmolinari) by bali.collaboradmins.com (Postfix) with ESMTPSA id 10AC217E1423; Fri, 28 Nov 2025 19:53:05 +0100 (CET) From: =?UTF-8?q?Lo=C3=AFc=20Molinari?= To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Boris Brezillon , Rob Herring , Steven Price , Liviu Dudau , Melissa Wen , =?UTF-8?q?Ma=C3=ADra=20Canal?= , Hugh Dickins , Baolin Wang , Andrew Morton , =?UTF-8?q?Lo=C3=AFc=20Molinari?= , Al Viro , =?UTF-8?q?Miko=C5=82aj=20Wasiak?= , Christian Brauner , Nitin Gote , Andi Shyti , Jonathan Corbet , Christopher Healy , Matthew Wilcox , Bagas Sanjaya Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, linux-mm@kvack.org, linux-doc@vger.kernel.org, kernel@collabora.com Subject: [PATCH v10 10/10] Documentation/gpu/drm-mm: Add THP paragraph to GEM mapping section Date: Fri, 28 Nov 2025 19:52:52 +0100 Message-ID: <20251128185252.3092-11-loic.molinari@collabora.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251128185252.3092-1-loic.molinari@collabora.com> References: <20251128185252.3092-1-loic.molinari@collabora.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Add a paragraph to the GEM objects mapping section explaining how transparent huge pages are handled by GEM. v4: - fix wording after huge_pages handler removal v6: - fix wording after map_pages handler removal Signed-off-by: Lo=C3=AFc Molinari Reviewed-by: Bagas Sanjaya Reviewed-by: Boris Brezillon --- Documentation/gpu/drm-mm.rst | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/Documentation/gpu/drm-mm.rst b/Documentation/gpu/drm-mm.rst index d55751cad67c..d69eab0b4093 100644 --- a/Documentation/gpu/drm-mm.rst +++ b/Documentation/gpu/drm-mm.rst @@ -290,15 +290,27 @@ The open and close operations must update the GEM obj= ect reference count. Drivers can use the drm_gem_vm_open() and drm_gem_vm_close() helper functions directly as open and close handlers. =20 -The fault operation handler is responsible for mapping individual pages -to userspace when a page fault occurs. Depending on the memory -allocation scheme, drivers can allocate pages at fault time, or can -decide to allocate memory for the GEM object at the time the object is -created. +The fault operation handler is responsible for mapping pages to +userspace when a page fault occurs. Depending on the memory allocation +scheme, drivers can allocate pages at fault time, or can decide to +allocate memory for the GEM object at the time the object is created. =20 Drivers that want to map the GEM object upfront instead of handling page faults can implement their own mmap file operation handler. =20 +In order to reduce page table overhead, if the internal shmem mountpoint +"shm_mnt" is configured to use transparent huge pages (for builds with +CONFIG_TRANSPARENT_HUGEPAGE enabled) and if the shmem backing store +managed to allocate a huge page for a faulty address, the fault handler +will first attempt to insert that huge page into the VMA before falling +back to individual page insertion. mmap() user address alignment for GEM +objects is handled by providing a custom get_unmapped_area file +operation which forwards to the shmem backing store. For most drivers, +which don't create a huge mountpoint by default or through a module +parameter, transparent huge pages can be enabled by either setting the +"transparent_hugepage_shmem" kernel parameter or the +"/sys/kernel/mm/transparent_hugepage/shmem_enabled" sysfs knob. + For platforms without MMU the GEM core provides a helper method drm_gem_dma_get_unmapped_area(). The mmap() routines will call this to get= a proposed address for the mapping. --=20 2.47.3