From nobody Thu Oct 2 00:50:48 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 895BA2566D2 for ; Mon, 29 Sep 2025 20:04:39 +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=1759176281; cv=none; b=dqWkas65wO+u+dpnkYQ/PDjgctaqYDHPgXb/j4V5xKPZn4DaIMSORcVzVQNpRCI9gqCPu3sOMlnB0wbKlGf4yUT0eb3Lv6jJ3RJ21eShKcdQtJO9nG8NMVG++Pp9GYXyo+Kqn7aKItMw3G1VIa6lFJKMOMXtkkHA2OiUg6HRn00= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759176281; c=relaxed/simple; bh=zMJh3TcnbKaM5I5mBMtrtGSYfeXLiD7daPO84ZxJf8A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=JX79BYw7SwT+MjhgOdMXelxJUeM6PsornbYnw02UUc+e61NCiBRK+HNQBwAT7D5xfaXExVny4BD4CAGKenDwkptaykYBHzbZ6526DDQN5HXNnxG+koKeAgceCLk/e1pN6LvJlNzMXfcl83xcU8gLt7qKIAYFf1TAUtGn2SdA/ZI= 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=HqXNU8qB; 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="HqXNU8qB" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1759176277; bh=zMJh3TcnbKaM5I5mBMtrtGSYfeXLiD7daPO84ZxJf8A=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HqXNU8qBxp/P4cl8VHPxMF9qVf0ye+FXHG+PQWej38gDvvYWv16Jp9L/yW0kpjXgt s7XiOvEFal9TD3wnWg3eCwJxxb8YEuT93dYd+FEfnFhp2YZjpGbqe76I5FstyN0Z2y c7h+jqIRhyLc8SSYCLhg6M9dPguxQcXzF2FWAT8YUeLDrMavo8hFyzSW+WkQKsuw1Q bTZr4gc90xhlpGpF3nl7E+tKozFQrxJkoauhrZz7GnU5BZPzAqz3PlDjRtoXBF8K5K fXycVmtE+4SKOTyDO0wVp6ZCFnNIqej9SM+YhFXABQyTJVeudq6pB46SnDuawUaD/z l5ipz6pm3UWIA== Received: from debian-rockchip-rock5b-rk3588.. (unknown [IPv6:2a01:e0a:5e3:6100:826d:bc07:e98c:84a]) (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 01B0417E0AC3; Mon, 29 Sep 2025 22:04:36 +0200 (CEST) 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 Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, linux-mm@kvack.org, kernel@collabora.com Subject: [PATCH 1/8] drm/shmem-helper: Add huge page fault handler Date: Mon, 29 Sep 2025 22:03:09 +0200 Message-ID: <20250929200316.18417-2-loic.molinari@collabora.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20250929200316.18417-1-loic.molinari@collabora.com> References: <20250929200316.18417-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 This gives the mm subsystem the ability to propose the insertion of PUD or PMD-sized mappings for the faulting addresses. On builds with CONFIG_TRANSPARENT_HUGEPAGE enabled, if the mmap() user address is aligned to a huge page size, if the GEM object is backed by shmem buffers on mount points setting the 'huge=3D' option and if the shmem backing store manages to allocate a huge folio, the CPU mapping will 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. v2: - set ret to VM_FAULT_FALLBACK in default switch statement - ifdef out paddr declaration - improve commit message Signed-off-by: Lo=C3=AFc Molinari Reviewed-by: Boris Brezillon --- drivers/gpu/drm/drm_gem_shmem_helper.c | 56 ++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c b/drivers/gpu/drm/drm_g= em_shmem_helper.c index 50594cf8e17c..22c4b09e10a3 100644 --- a/drivers/gpu/drm/drm_gem_shmem_helper.c +++ b/drivers/gpu/drm/drm_gem_shmem_helper.c @@ -573,7 +573,8 @@ int drm_gem_shmem_dumb_create(struct drm_file *file, st= ruct drm_device *dev, } EXPORT_SYMBOL_GPL(drm_gem_shmem_dumb_create); =20 -static vm_fault_t drm_gem_shmem_fault(struct vm_fault *vmf) +static vm_fault_t drm_gem_shmem_huge_fault(struct vm_fault *vmf, + unsigned int order) { struct vm_area_struct *vma =3D vmf->vma; struct drm_gem_object *obj =3D vma->vm_private_data; @@ -582,6 +583,10 @@ static vm_fault_t drm_gem_shmem_fault(struct vm_fault = *vmf) vm_fault_t ret; struct page *page; pgoff_t page_offset; + unsigned long pfn; +#if defined(CONFIG_ARCH_SUPPORTS_PMD_PFNMAP) || defined(CONFIG_ARCH_SUPPOR= TS_PUD_PFNMAP) + unsigned long paddr; +#endif =20 /* We don't use vmf->pgoff since that has the fake offset */ page_offset =3D (vmf->address - vma->vm_start) >> PAGE_SHIFT; @@ -592,17 +597,57 @@ static vm_fault_t drm_gem_shmem_fault(struct vm_fault= *vmf) drm_WARN_ON_ONCE(obj->dev, !shmem->pages) || shmem->madv < 0) { 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)); + page =3D shmem->pages[page_offset]; + pfn =3D page_to_pfn(page); + + switch (order) { + case 0: + ret =3D vmf_insert_pfn(vma, vmf->address, pfn); + break; + +#ifdef CONFIG_ARCH_SUPPORTS_PMD_PFNMAP + case PMD_ORDER: + paddr =3D pfn << PAGE_SHIFT; + if (((vmf->address & ~PMD_MASK) =3D=3D (paddr & ~PMD_MASK)) && + (folio_order(page_folio(page)) =3D=3D PMD_ORDER)) + ret =3D vmf_insert_pfn_pmd( + vmf, pfn & (PMD_MASK >> PAGE_SHIFT), false); + else + ret =3D VM_FAULT_FALLBACK; + break; +#endif + +#ifdef CONFIG_ARCH_SUPPORTS_PUD_PFNMAP + case PUD_ORDER: + paddr =3D pfn << PAGE_SHIFT; + if (((vmf->address & ~PUD_MASK) =3D=3D (paddr & ~PUD_MASK)) && + (folio_order(page_folio(page)) =3D=3D PUD_ORDER)) + ret =3D vmf_insert_pfn_pud( + vmf, pfn & (PUD_MASK >> PAGE_SHIFT), false); + else + ret =3D VM_FAULT_FALLBACK; + break; +#endif + + default: + ret =3D VM_FAULT_FALLBACK; + break; } =20 + out: dma_resv_unlock(shmem->base.resv); =20 return ret; } =20 +static vm_fault_t drm_gem_shmem_fault(struct vm_fault *vmf) +{ + return drm_gem_shmem_huge_fault(vmf, 0); +} + static void drm_gem_shmem_vm_open(struct vm_area_struct *vma) { struct drm_gem_object *obj =3D vma->vm_private_data; @@ -639,6 +684,9 @@ static void drm_gem_shmem_vm_close(struct vm_area_struc= t *vma) =20 const struct vm_operations_struct drm_gem_shmem_vm_ops =3D { .fault =3D drm_gem_shmem_fault, +#if defined(CONFIG_ARCH_SUPPORTS_PMD_PFNMAP) || defined(CONFIG_ARCH_SUPPOR= TS_PUD_PFNMAP) + .huge_fault =3D drm_gem_shmem_huge_fault, +#endif .open =3D drm_gem_shmem_vm_open, .close =3D drm_gem_shmem_vm_close, }; --=20 2.47.3 From nobody Thu Oct 2 00:50:48 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 DE6F525784E for ; Mon, 29 Sep 2025 20:04:41 +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=1759176284; cv=none; b=j6l+ElSDP6Ppk6vTHrm4b45fjfyVQbYdnRdURlW/fIXOrFo+2KNie3TdT/vwq4zELGozGzOXIhBwCqwoD8LzuyPYjQh3S0R4LQPG2rzuLcgrowR4U+kk/C38yiKPSMKwu6PTGpgMpfvA+CUTagiJYRag5SNSkCQfN5KB4aKpWfg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759176284; c=relaxed/simple; bh=ZhOASKWOW7ymaXmTPQsalimKlt/dPd4xHjyRCEjgNMU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=CqISzpV2SSUO3e0uRJsuWoLRFO+dbcneOsLebbMlPjuEjq90eySsMhTadqxdS4yUH19W0zpNrYPA1SrLUB3xqD3sGr7rPGxI2iPVYVCm5GxCRulXSQ4hnq3hkrZMlROj67aA2SkJ+qcs7n323OE/xRbOWzBJ0btRINxgp8cIOU0= 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=QQ7JpXEC; 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="QQ7JpXEC" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1759176280; bh=ZhOASKWOW7ymaXmTPQsalimKlt/dPd4xHjyRCEjgNMU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QQ7JpXECvSwPbpvSsWjdPDpPDPcvc928v6WIwF8e3MZPINFwDgRl8fPLtBrrg42xl s9XPFqyPNObtJIrhqKHki6RWtZccH6pgNGonXeDB2BR2ISUsJJrOtoeMk3WQwXo6LT OQ4NK2Qr+QaQr0CiGeV6FTcOyUAqWZgdHW4DuGcS/dR7kye2N4d3k2N3VFrHAKdx8W mwQqYqGeNyPcfgGcSUU7aIeD6/zzB0Hk74xgOwSfhmYT1nJTDKwc1WqYIuRn6pNllv LDu271ycHN4wsrtVpGpQ6HDwLL92oAqG4c52hZWWZ8ARFKKBc7oh+ZhIxuoz6z7PEE OtOUOSo7LsxCg== Received: from debian-rockchip-rock5b-rk3588.. (unknown [IPv6:2a01:e0a:5e3:6100:826d:bc07:e98c:84a]) (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 5DADE17E13C1; Mon, 29 Sep 2025 22:04:39 +0200 (CEST) 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 Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, linux-mm@kvack.org, kernel@collabora.com Subject: [PATCH 2/8] drm/gem: Introduce drm_gem_get_unmapped_area() fop Date: Mon, 29 Sep 2025 22:03:10 +0200 Message-ID: <20250929200316.18417-3-loic.molinari@collabora.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20250929200316.18417-1-loic.molinari@collabora.com> References: <20250929200316.18417-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 mount points 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. Signed-off-by: Lo=C3=AFc Molinari --- drivers/gpu/drm/drm_gem.c | 110 ++++++++++++++++++++++++++++++-------- include/drm/drm_gem.h | 4 ++ mm/shmem.c | 1 + 3 files changed, 93 insertions(+), 22 deletions(-) diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index cbeb76b2124f..d027db462c2d 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c @@ -1187,36 +1187,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); /* @@ -1235,14 +1226,89 @@ 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) +{ +#ifdef CONFIG_TRANSPARENT_HUGEPAGE + 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)) + return mm_get_unmapped_area(current->mm, filp, uaddr, len, 0, + flags); + + ret =3D shmem_get_unmapped_area(obj->filp, uaddr, len, 0, flags); + + drm_gem_object_put(obj); + + return ret; +#else + return mm_get_unmapped_area(current->mm, filp, uaddr, len, 0, flags); +#endif +} +EXPORT_SYMBOL(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 diff --git a/mm/shmem.c b/mm/shmem.c index e2c76a30802b..b2f41b430daa 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -2915,6 +2915,7 @@ unsigned long shmem_get_unmapped_area(struct file *fi= le, return addr; return inflated_addr; } +EXPORT_SYMBOL_GPL(shmem_get_unmapped_area); =20 #ifdef CONFIG_NUMA static int shmem_set_policy(struct vm_area_struct *vma, struct mempolicy *= mpol) --=20 2.47.3 From nobody Thu Oct 2 00:50:48 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 2C32225A62E for ; Mon, 29 Sep 2025 20:04:43 +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=1759176286; cv=none; b=tHNS4+dMGyvB+mYX1R8JaFp8g5Z2UfcNaUojaXWAzHtWAVJs2Lf9/EORsj97MX8uQ3ZnxtNKKEIaOEcLgKA3E8RAPil71wTUEhXBqHbLAnk85WtOzu2+M0Lw0u89Uv5KzO05FOi7LZPPTSMJ35JT43oK0VoqZoOOdm+/cunylmg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759176286; c=relaxed/simple; bh=a1OTsZzaI6EEmq0fje1Ikud5+W73fZPK2sKTjtGd50M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=YHr0X91MV4S92XZfI42vWzuxDRvnImcNxK+4G2TK5fjHA/hwN0Nx8lwvtEBGhuWQ/Jo58ksth8DxOVm9FpjViZBn8FSBzFDS8i7D0S3RhW7mVozrAU9zPfLy+S1zFYAud97YHWBHTROtJFSfPkzhYNNUrUTUkKj9SLIi5o3K+zA= 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=NsPTtOcO; 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="NsPTtOcO" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1759176282; bh=a1OTsZzaI6EEmq0fje1Ikud5+W73fZPK2sKTjtGd50M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NsPTtOcOEHo6cW63wk9JJipS+qzyQ8sHXNj879h5rkribjPEw84HRvxMqHaQ05b+w J4gu/pYX19JDrTPCdtYdGgBhCljDur2Y0f87EiLvGPFbW+2WgHVFyVGVO74UcWa68m DMHCvcE6aHxYRJzvDjzd6sDC9hBILg5/ODsLdhO4QW9vsz0uji7XZDaPQgKKYtYXIe Lbj1KfzaJkRMDrFWJIE3j89nZHkePNMj9Gy2mZjK1DgSJhXGyfA2j42ErLmYiTQ+uY b3qbqt8R1+dcN0/jlJzVu74LmXZq3eID+eqlVqXYDERTBJmBMQ9sx1o+Pe5UtDOB11 EAdeyoJizW/2g== Received: from debian-rockchip-rock5b-rk3588.. (unknown [IPv6:2a01:e0a:5e3:6100:826d:bc07:e98c:84a]) (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 B4B2A17E13D8; Mon, 29 Sep 2025 22:04:41 +0200 (CEST) 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 Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, linux-mm@kvack.org, kernel@collabora.com Subject: [PATCH 3/8] drm/shmem-helper: Add huge tmpfs mount point helpers Date: Mon, 29 Sep 2025 22:03:11 +0200 Message-ID: <20250929200316.18417-4-loic.molinari@collabora.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20250929200316.18417-1-loic.molinari@collabora.com> References: <20250929200316.18417-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_shmem_helper_huge_mnt_create() and drm_gem_shmem_helper_huge_mnt_free() helpers to avoid code duplication in the i915 and v3d drivers (and soon panfrost/panthor). Signed-off-by: Lo=C3=AFc Molinari --- drivers/gpu/drm/drm_gem_shmem_helper.c | 56 ++++++++++++++++++++++++++ include/drm/drm_gem_shmem_helper.h | 14 +++++++ 2 files changed, 70 insertions(+) diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c b/drivers/gpu/drm/drm_g= em_shmem_helper.c index 22c4b09e10a3..808721b8be3e 100644 --- a/drivers/gpu/drm/drm_gem_shmem_helper.c +++ b/drivers/gpu/drm/drm_gem_shmem_helper.c @@ -5,7 +5,9 @@ =20 #include #include +#include #include +#include #include #include #include @@ -36,6 +38,60 @@ MODULE_IMPORT_NS("DMA_BUF"); * drm_gem_shmem_vmap()). These helpers perform the necessary type convers= ion. */ =20 +static int drm_gem_shmem_add_fc_param(struct fs_context *fc, const char *k= ey, + const char *value) +{ + return vfs_parse_fs_string(fc, key, value, strlen(value)); +} + +/** + * drm_gem_shmem_huge_mnt_create - Create a huge tmpfs mountpoint + * @value: huge tmpfs mount option value + * + * This function creates and mounts an internal huge tmpfs mountpoint for = use + * with the drm_gem_shmem_create_with_mnt() function. + * + * The most common option value is "within_size" which only allocates huge= pages + * if the page will be fully within the GEM object size. "always", "advise= " and + * "never" are supported too but the latter would just create a mountpoint + * similar to default "shm_mnt" one. See shmemfs and Transparent Hugepage = for + * more information. + * + * Returns: + * A struct vfsmount * on success or an ERR_PTR()-encoded negative error c= ode on + * failure. + */ +struct vfsmount *drm_gem_shmem_huge_mnt_create(const char *value) +{ + struct file_system_type *type; + struct fs_context *fc; + struct vfsmount *mnt; + int ret; + + if (!IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE)) + return ERR_PTR(-EOPNOTSUPP); + + type =3D get_fs_type("tmpfs"); + if (!type) + return ERR_PTR(-EOPNOTSUPP); + + fc =3D fs_context_for_mount(type, SB_KERNMOUNT); + if (IS_ERR(fc)) + return ERR_CAST(fc); + ret =3D drm_gem_shmem_add_fc_param(fc, "source", "tmpfs"); + if (ret) + return ERR_PTR(-ENOPARAM); + ret =3D drm_gem_shmem_add_fc_param(fc, "huge", value); + if (ret) + return ERR_PTR(-ENOPARAM); + + mnt =3D fc_mount_longterm(fc); + put_fs_context(fc); + + return mnt; +} +EXPORT_SYMBOL_GPL(drm_gem_shmem_huge_mnt_create); + static const struct drm_gem_object_funcs drm_gem_shmem_funcs =3D { .free =3D drm_gem_shmem_object_free, .print_info =3D drm_gem_shmem_object_print_info, diff --git a/include/drm/drm_gem_shmem_helper.h b/include/drm/drm_gem_shmem= _helper.h index 589f7bfe7506..5e153fb63f38 100644 --- a/include/drm/drm_gem_shmem_helper.h +++ b/include/drm/drm_gem_shmem_helper.h @@ -107,6 +107,20 @@ struct drm_gem_shmem_object { #define to_drm_gem_shmem_obj(obj) \ container_of(obj, struct drm_gem_shmem_object, base) =20 +struct vfsmount *drm_gem_shmem_huge_mnt_create(const char *value); + +/** + * drm_gem_shmem_huge_mnt_free - Release a huge tmpfs mountpoint. + * @mnt: struct vfsmount * to release + * + * This function unmounts and releases an internal huge tmpfs mountpoint. = If + * @mnt is NULL, no operation is performed. + */ +static inline void drm_gem_shmem_huge_mnt_free(struct vfsmount *mnt) +{ + kern_unmount(mnt); +} + 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, --=20 2.47.3 From nobody Thu Oct 2 00:50:48 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 990D5262FD0 for ; Mon, 29 Sep 2025 20:04:46 +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=1759176288; cv=none; b=XIvr211Rc7R25K9cuux2z5zoez77F1BqX2/Th92XNYTSRx/ID1YBxka8ndz6BTQn/QIxN4o67G27xl3//Shq15mf187F1BCr5+DdxyTvKGmXapdOv27LgTw5aT2ubxvn0mmba5gXC4dOhyvXkDI8e3L4l5yZ3QD4W+TE96DobKw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759176288; c=relaxed/simple; bh=C8A0EwhcfuuAx55XHopx7Qq6/pw64JlfGfx0Qq2YB1E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=jxdMwDyj0Ndqa4tPHZ2POC/9nue4t6B+nh214Xtaw7ZvDO9A2bugHhUazczoISHZSiofSpjkq5bMqPzFY2Okzy12KL4fzOVFrgFsf6M9q6muzVH7vRWgAEGeOeimiLjqt3MvpHIhsiLpj6+ZUJJNfCnQ3s1O2AVJ8pk+DYhOqsQ= 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=Q7z+zCtl; 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="Q7z+zCtl" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1759176285; bh=C8A0EwhcfuuAx55XHopx7Qq6/pw64JlfGfx0Qq2YB1E=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Q7z+zCtlSgOSfIU3O3rBHAbr/TNn4/JCyAo+kwFkcyU4Y3JXDJgNeh+KhSRxppLs3 hwnh3qKVnUUoBe1CmbidWRp+9v1f6Orh7T7sOH7q7C7E0CydoRKa809oBV70+WvYuN Dn/OfwDTGPWn6UMxDf/7iX1OzdD9kjkhSjlXDOqX16JxOsCMQhw7GXkDsWfw/ovy7t +QpPvT/eao3Xaq3V6yLgtCzt0uU+A8bjbj6RZg886mqgEwZT0KN6cuh0dzblyHSTRG 0ExGK0id0KStgofh9LxeEGimxShRT+xc5RXZzvIheDAapQjje/ZVhrikL+ScVikRbd nzdC2ccadCCGQ== Received: from debian-rockchip-rock5b-rk3588.. (unknown [IPv6:2a01:e0a:5e3:6100:826d:bc07:e98c:84a]) (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 3BE2A17E1465; Mon, 29 Sep 2025 22:04:44 +0200 (CEST) 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 Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, linux-mm@kvack.org, kernel@collabora.com Subject: [PATCH 4/8] drm/i915: Use huge tmpfs mount point helpers Date: Mon, 29 Sep 2025 22:03:12 +0200 Message-ID: <20250929200316.18417-5-loic.molinari@collabora.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20250929200316.18417-1-loic.molinari@collabora.com> References: <20250929200316.18417-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_shmem_huge_mnt_create() and drm_gem_shmem_huge_mnt_free() helpers to avoid code duplication. Signed-off-by: Lo=C3=AFc Molinari --- drivers/gpu/drm/i915/gem/i915_gemfs.c | 33 +++------------------------ 1 file changed, 3 insertions(+), 30 deletions(-) diff --git a/drivers/gpu/drm/i915/gem/i915_gemfs.c b/drivers/gpu/drm/i915/g= em/i915_gemfs.c index a09e2eb47175..70563a6a0b81 100644 --- a/drivers/gpu/drm/i915/gem/i915_gemfs.c +++ b/drivers/gpu/drm/i915/gem/i915_gemfs.c @@ -3,25 +3,13 @@ * Copyright =C2=A9 2017 Intel Corporation */ =20 -#include -#include -#include - #include "i915_drv.h" #include "i915_gemfs.h" #include "i915_utils.h" =20 -static int add_param(struct fs_context *fc, const char *key, const char *v= al) -{ - return vfs_parse_fs_string(fc, key, val, strlen(val)); -} - void i915_gemfs_init(struct drm_i915_private *i915) { - struct file_system_type *type; - struct fs_context *fc; struct vfsmount *gemfs; - int ret; =20 /* * By creating our own shmemfs mountpoint, we can pass in @@ -38,23 +26,8 @@ void i915_gemfs_init(struct drm_i915_private *i915) if (GRAPHICS_VER(i915) < 11 && !i915_vtd_active(i915)) return; =20 - 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 add_param(fc, "source", "tmpfs"); - if (!ret) - ret =3D add_param(fc, "huge", "within_size"); - if (!ret) - gemfs =3D fc_mount_longterm(fc); - put_fs_context(fc); - if (ret) + gemfs =3D drm_gem_shmem_huge_mnt_create("within_size"); + if (IS_ERR(gemfs)) goto err; =20 i915->mm.gemfs =3D gemfs; @@ -70,5 +43,5 @@ void i915_gemfs_init(struct drm_i915_private *i915) =20 void i915_gemfs_fini(struct drm_i915_private *i915) { - kern_unmount(i915->mm.gemfs); + drm_gem_shmem_huge_mnt_free(i915->mm.gemfs); } --=20 2.47.3 From nobody Thu Oct 2 00:50:48 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 751BD26B2D5 for ; Mon, 29 Sep 2025 20:04:49 +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=1759176291; cv=none; b=Q/PpSqtQ3+ktylmH6C81QDwWTw5tzF/z07YTqOSn+DqvjoCP2wereNgT2vI5S+TrGJdwM7QqpG0o30a8KtUMuDIlUDToo7c/CLYVZoY9ndGZ40AIoS/YiIeeyREvXWfSQ4CMLf2HXyAT71GmXC/W9/V2pVp01V2sq78ji2QA7jo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759176291; c=relaxed/simple; bh=8a0+2vCJjyXNTtdJZlFvg8lNK8djtqhRGCpzH9ay818=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=b1aN9q+duh9V1gi4oJdVhC6mhu9jdmzB8Y7n8OtUXir4v0HyxIi+CmEPctw84wxA09WM8uaZ+u79iMA8JALq53VH8ZhZ2fecVT2JLlTSrafO7s4ZlI//Vf1nYhiqJrVM+e+V0rHv3HO+lCeUgSkBgQ9aPUxMUWFydvB0Vyw5ixU= 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=FaSddbAa; 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="FaSddbAa" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1759176287; bh=8a0+2vCJjyXNTtdJZlFvg8lNK8djtqhRGCpzH9ay818=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FaSddbAanvCPQ3ohMTVyKMYG4OP06ihGPZDgza9EwKFh7wuuRinArtJpx2ua/06cr brl58VRNx3tPr4j7uDQg6pRbbmVPjtgVfrGXpg9vMNtA9loeitCpQAqSYcsILQzGUn UHVdX77Slebrdm3ybibqtfEbGGz+PZrLrSJVKABMIwtoE1WBRmf+mBEqP4YnJJAdU9 /6gV5hEADEX3xkIYZ/IV2mXJzjvdaYxs3OtC2wabBY/PRjIPPUZaR9ae4QU3URLwlz L6nZTLMlQVxby2Ft49+qz4n1ZdN1pVGMASTObXiEINLy+beXm2Zhl8cqjH3Psys3Ob EsPLr8wt/Gpcg== Received: from debian-rockchip-rock5b-rk3588.. (unknown [IPv6:2a01:e0a:5e3:6100:826d:bc07:e98c:84a]) (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 100FE17E02B0; Mon, 29 Sep 2025 22:04:47 +0200 (CEST) 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 Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, linux-mm@kvack.org, kernel@collabora.com Subject: [PATCH 5/8] drm/v3d: Use huge tmpfs mount point helpers Date: Mon, 29 Sep 2025 22:03:13 +0200 Message-ID: <20250929200316.18417-6-loic.molinari@collabora.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20250929200316.18417-1-loic.molinari@collabora.com> References: <20250929200316.18417-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_shmem_huge_mnt_create() and drm_gem_shmem_huge_mnt_free() helpers to avoid code duplication. drm_gem_shmem_huge_mnt_free() handles NULL pointers. Signed-off-by: Lo=C3=AFc Molinari --- drivers/gpu/drm/v3d/v3d_gemfs.c | 31 +++---------------------------- 1 file changed, 3 insertions(+), 28 deletions(-) diff --git a/drivers/gpu/drm/v3d/v3d_gemfs.c b/drivers/gpu/drm/v3d/v3d_gemf= s.c index 8ec6ed82b3d9..f54705dba217 100644 --- a/drivers/gpu/drm/v3d/v3d_gemfs.c +++ b/drivers/gpu/drm/v3d/v3d_gemfs.c @@ -1,23 +1,11 @@ // SPDX-License-Identifier: GPL-2.0+ /* Copyright (C) 2024 Raspberry Pi */ =20 -#include -#include -#include - #include "v3d_drv.h" =20 -static int add_param(struct fs_context *fc, const char *key, const char *v= al) -{ - return vfs_parse_fs_string(fc, key, val, strlen(val)); -} - void v3d_gemfs_init(struct v3d_dev *v3d) { - struct file_system_type *type; - struct fs_context *fc; struct vfsmount *gemfs; - int ret; =20 /* * By creating our own shmemfs mountpoint, we can pass in @@ -31,20 +19,8 @@ void v3d_gemfs_init(struct v3d_dev *v3d) if (!super_pages) goto err; =20 - 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 add_param(fc, "source", "tmpfs"); - if (!ret) - ret =3D add_param(fc, "huge", "within_size"); - if (!ret) - gemfs =3D fc_mount_longterm(fc); - put_fs_context(fc); - if (ret) + gemfs =3D drm_gem_shmem_huge_mnt_create("within_size"); + if (IS_ERR(gemfs)) goto err; =20 v3d->gemfs =3D gemfs; @@ -60,6 +36,5 @@ void v3d_gemfs_init(struct v3d_dev *v3d) =20 void v3d_gemfs_fini(struct v3d_dev *v3d) { - if (v3d->gemfs) - kern_unmount(v3d->gemfs); + drm_gem_shmem_huge_mnt_free(v3d->gemfs); } --=20 2.47.3 From nobody Thu Oct 2 00:50:48 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 E961926B74D for ; Mon, 29 Sep 2025 20:04:51 +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=1759176293; cv=none; b=LtYnSe3SVnhy8OJcXnQ0XPwuaEyy1DuSnPDrAV0iRrJliq+Y5y+pO2a4VLkjptizweKSURW0hK1iLhHvs82YErHznNTjBIsNX2TkgjACUIo90B4TapwZBbeeVs04roqGA3NMI9OvD2N4TxygRrjP6jDOs4MFYFY8fjJy+ZPBA2c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759176293; c=relaxed/simple; bh=q/cLnX6T/zKGoOmaRFeLoOBAUyb5A+C4olkKKEQG25I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=WmK8WcBhPsUhPtueUll/hTCFlz7phhtZzBgSP1nOz7krjF/eeGjeNN3XsCOrXPNMVjW+lBQEEsC+9efUXCa9t6IHYtuHmLeVbTE7K8YeZDiwsuczYdiqlymEqAcH2z3oGbT1H43NG6TTcv4P3JoJaRf0WCgBY7f9NIHAe3dwwCU= 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=bS7Fd34L; 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="bS7Fd34L" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1759176290; bh=q/cLnX6T/zKGoOmaRFeLoOBAUyb5A+C4olkKKEQG25I=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bS7Fd34LgkadzAhRnQOjrTixvSu46UulYXMbwibGAXHRgJSG6/cTaGQLtYP4RaDaX Q5N8rg666xDlo5JOZw/WJumJlQU8mQDJPM5bVK4L5ihM3QMbe8ZDplCNCg9a5JBY02 gLXaoVnqqpUF27OuHLFVbWjfnUhmvwBuOlHhOTpvYe6KVbTQzuQE5aEpqmYBRYo9e0 CbGzdUaClhbye64P592jAFA+MD+iivmwI5GnWgCrczwJY2WvGfrioyjYaUUipUIO9E vE5p6NpyeLBe5rakX8RGfg19dlU7XFCnq5K3lHz8Og3XkjA2Kl+WLfBO7VLI3E4hAi tuIGCWcgNjp5w== Received: from debian-rockchip-rock5b-rk3588.. (unknown [IPv6:2a01:e0a:5e3:6100:826d:bc07:e98c:84a]) (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 985E117E0AC3; Mon, 29 Sep 2025 22:04:49 +0200 (CEST) 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 Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, linux-mm@kvack.org, kernel@collabora.com Subject: [PATCH 6/8] drm/panthor: Introduce huge tmpfs mount point option Date: Mon, 29 Sep 2025 22:03:14 +0200 Message-ID: <20250929200316.18417-7-loic.molinari@collabora.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20250929200316.18417-1-loic.molinari@collabora.com> References: <20250929200316.18417-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 mount point is created and mounted using the 'huge=3Dwithin_size' option. It's then used at GEM object creation instead of the default 'shm_mnt' mount point in order to enable Transparent Hugepage (THP) for the object (without having to rely on a system wide parameter). Signed-off-by: Lo=C3=AFc Molinari --- drivers/gpu/drm/panthor/panthor_device.c | 4 ++++ drivers/gpu/drm/panthor/panthor_device.h | 3 +++ drivers/gpu/drm/panthor/panthor_drv.c | 7 ++++++ drivers/gpu/drm/panthor/panthor_drv.h | 11 +++++++++ drivers/gpu/drm/panthor/panthor_gem.c | 30 +++++++++++++++++++++++- drivers/gpu/drm/panthor/panthor_gem.h | 3 +++ 6 files changed, 57 insertions(+), 1 deletion(-) 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 81df49880bd8..4f254b574287 100644 --- a/drivers/gpu/drm/panthor/panthor_device.c +++ b/drivers/gpu/drm/panthor/panthor_device.c @@ -17,6 +17,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" @@ -98,6 +99,7 @@ void panthor_device_unplug(struct panthor_device *ptdev) /* Now, try to cleanly shutdown the GPU before the device resources * get reclaimed. */ + panthor_gem_fini(ptdev); panthor_sched_unplug(ptdev); panthor_fw_unplug(ptdev); panthor_mmu_unplug(ptdev); @@ -269,6 +271,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_device.h b/drivers/gpu/drm/pan= thor/panthor_device.h index 4fc7cf2aeed5..54ca61567426 100644 --- a/drivers/gpu/drm/panthor/panthor_device.h +++ b/drivers/gpu/drm/panthor/panthor_device.h @@ -135,6 +135,9 @@ struct panthor_device { /** @devfreq: Device frequency scaling management data. */ struct panthor_devfreq *devfreq; =20 + /** @huge_mnt: tmpfs mount point with Transparent Hugepage enabled. */ + struct vfsmount *huge_mnt; + /** @unplug: Device unplug related fields. */ struct { /** @lock: Lock used to serialize unplug operations. */ diff --git a/drivers/gpu/drm/panthor/panthor_drv.c b/drivers/gpu/drm/pantho= r/panthor_drv.c index fdbe89ef7f43..a2be3b904ca2 100644 --- a/drivers/gpu/drm/panthor/panthor_drv.c +++ b/drivers/gpu/drm/panthor/panthor_drv.c @@ -1556,6 +1556,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, }; @@ -1623,6 +1624,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..27fe9b6f77bd --- /dev/null +++ b/drivers/gpu/drm/panthor/panthor_drv.h @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: GPL-2.0 or MIT +/* Copyright 2025 Amazon.com, Inc. or its affiliates */ + +#ifndef __PANTHOR_DRV_H__ +#define __PANTHOR_DRV_H__ + +#ifdef CONFIG_TRANSPARENT_HUGEPAGE +extern bool panthor_transparent_hugepage; +#endif + +#endif diff --git a/drivers/gpu/drm/panthor/panthor_gem.c b/drivers/gpu/drm/pantho= r/panthor_gem.c index 156c7a0b62a2..16916e0b6d89 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 @@ -11,10 +12,35 @@ #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) +{ + struct vfsmount *huge_mnt; + + if (!panthor_transparent_hugepage) + return; + + huge_mnt =3D drm_gem_shmem_huge_mnt_create("within_size"); + if (IS_ERR(huge_mnt)) { + drm_warn(&ptdev->base, "Can't use Transparent Hugepage (%ld)\n", + PTR_ERR(huge_mnt)); + return; + } + + ptdev->huge_mnt =3D huge_mnt; + + drm_info(&ptdev->base, "Using Transparent Hugepage\n"); +} + +void panthor_gem_fini(struct panthor_device *ptdev) +{ + drm_gem_shmem_huge_mnt_free(ptdev->huge_mnt); +} + #ifdef CONFIG_DEBUG_FS static void panthor_gem_debugfs_bo_init(struct panthor_gem_object *bo) { @@ -270,10 +296,12 @@ panthor_gem_create_with_handle(struct drm_file *file, u64 *size, u32 flags, u32 *handle) { int ret; + struct panthor_device *ptdev =3D + container_of(ddev, struct panthor_device, base); struct drm_gem_shmem_object *shmem; struct panthor_gem_object *bo; =20 - shmem =3D drm_gem_shmem_create(ddev, *size); + shmem =3D drm_gem_shmem_create_with_mnt(ddev, *size, ptdev->huge_mnt); if (IS_ERR(shmem)) return PTR_ERR(shmem); =20 diff --git a/drivers/gpu/drm/panthor/panthor_gem.h b/drivers/gpu/drm/pantho= r/panthor_gem.h index 80c6e24112d0..6804b3912cc2 100644 --- a/drivers/gpu/drm/panthor/panthor_gem.h +++ b/drivers/gpu/drm/panthor/panthor_gem.h @@ -136,6 +136,9 @@ 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); +void panthor_gem_fini(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 Thu Oct 2 00:50:48 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 719072750E3 for ; Mon, 29 Sep 2025 20:04:54 +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=1759176296; cv=none; b=Ikn7fTYpsz02deQ2oIcFxr0n47etsONOE8EKFJJPI3ZlUFsz9R+xsvbE1nmeupUH0onOwdhPLe+qZfYTRkSwU+RQjPaZ5Bua9ZitTstN+Q2/waQf4FiJrQ3xsaQx9QhDWJFn12oukZAQRhdQ+IE7n7hAsdSMvleaK7aacAwerCo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759176296; c=relaxed/simple; bh=99oZ1P7VzqkhLJbQUXrJREFvLqy3hC4FKU/uBU4LITk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=hfi2Sb589O4KJHuMZwJgnr4L8BQJLYcLheiBJDwVcAPMjgiUR8IEJGE/C6SE2Z/qCDa1M2Qg3S6TUCURYMP2EXFkRvOzUcAsOLKhacqqzk+nVDzOXTwZ/5Lt5JpRu0tteY514U7VjbyuQbyb9UIK5KmJFsIlGQ3d4m+EzHGgotA= 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=HkWzCL1V; 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="HkWzCL1V" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1759176292; bh=99oZ1P7VzqkhLJbQUXrJREFvLqy3hC4FKU/uBU4LITk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HkWzCL1VTgODwNs2olF/EN97qvp+mVWvhDn/cRxOyHvNZ9dxHMYMo093ZkHsW6z2u 22bmoYV9rKtr4m9f5UozvRl1b/1iswDL7ddGAk035uAdOAlP+N8JPOJrJuegpIhHvU UJXIA0ATufT54tRGQY0R4NhmSJc+DvzNX+5qDA7KP4RCM9ABxyGEO+c060P8XzMXJj hz/6i138BR0DbfGO48oePQPevtNXwew61jdn2T5uu8d81Nbic6RpZymEFsUZQqCG1o ABzLg51rKa+buvlGZvEwCGail5Z/WoFRBemGi1XoAdRphhyOC0OQwX74OpUHYbf6X6 3qgFlPvsfjOvg== Received: from debian-rockchip-rock5b-rk3588.. (unknown [IPv6:2a01:e0a:5e3:6100:826d:bc07:e98c:84a]) (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 1EEEE17E13C1; Mon, 29 Sep 2025 22:04:52 +0200 (CEST) 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 Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, linux-mm@kvack.org, kernel@collabora.com Subject: [PATCH 7/8] drm/panthor: Improve IOMMU map/unmap debugging logs Date: Mon, 29 Sep 2025 22:03:15 +0200 Message-ID: <20250929200316.18417-8-loic.molinari@collabora.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20250929200316.18417-1-loic.molinari@collabora.com> References: <20250929200316.18417-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 Log the number of pages and their sizes actually mapped/unmapped by the IOMMU page table driver. Since a map/unmap op is often split in several ops depending on the underlying scatter/gather table, add the start address and the total size to the debugging logs in order to help understand which batch an op is part of. Signed-off-by: Lo=C3=AFc Molinari Reviewed-by: Boris Brezillon --- drivers/gpu/drm/panthor/panthor_mmu.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/panthor/panthor_mmu.c b/drivers/gpu/drm/pantho= r/panthor_mmu.c index 6dec4354e378..aefbd83d1a75 100644 --- a/drivers/gpu/drm/panthor/panthor_mmu.c +++ b/drivers/gpu/drm/panthor/panthor_mmu.c @@ -917,10 +917,9 @@ static int panthor_vm_unmap_pages(struct panthor_vm *v= m, u64 iova, u64 size) { struct panthor_device *ptdev =3D vm->ptdev; struct io_pgtable_ops *ops =3D vm->pgtbl_ops; + u64 start_iova =3D iova; u64 offset =3D 0; =20 - drm_dbg(&ptdev->base, "unmap: as=3D%d, iova=3D%llx, len=3D%llx", vm->as.i= d, iova, size); - while (offset < size) { size_t unmapped_sz =3D 0, pgcount; size_t pgsize =3D get_pgsize(iova + offset, size - offset, &pgcount); @@ -935,6 +934,12 @@ static int panthor_vm_unmap_pages(struct panthor_vm *v= m, u64 iova, u64 size) panthor_vm_flush_range(vm, iova, offset + unmapped_sz); return -EINVAL; } + + drm_dbg(&ptdev->base, + "unmap: as=3D%d, iova=3D0x%llx, sz=3D%llu, va=3D0x%llx, pgcnt=3D%zu, pg= sz=3D%zu", + vm->as.id, start_iova, size, iova + offset, + unmapped_sz / pgsize, pgsize); + offset +=3D unmapped_sz; } =20 @@ -950,6 +955,7 @@ panthor_vm_map_pages(struct panthor_vm *vm, u64 iova, i= nt prot, struct scatterlist *sgl; struct io_pgtable_ops *ops =3D vm->pgtbl_ops; u64 start_iova =3D iova; + u64 start_size =3D size; int ret; =20 if (!size) @@ -969,15 +975,18 @@ panthor_vm_map_pages(struct panthor_vm *vm, u64 iova,= int prot, len =3D min_t(size_t, len, size); size -=3D len; =20 - drm_dbg(&ptdev->base, "map: as=3D%d, iova=3D%llx, paddr=3D%pad, len=3D%z= x", - vm->as.id, iova, &paddr, len); - while (len) { size_t pgcount, mapped =3D 0; size_t pgsize =3D get_pgsize(iova | paddr, len, &pgcount); =20 ret =3D ops->map_pages(ops, iova, paddr, pgsize, pgcount, prot, GFP_KERNEL, &mapped); + + drm_dbg(&ptdev->base, + "map: as=3D%d, iova=3D0x%llx, sz=3D%llu, va=3D0x%llx, pa=3D%pad, pgcnt= =3D%zu, pgsz=3D%zu", + vm->as.id, start_iova, start_size, iova, &paddr, + mapped / pgsize, pgsize); + iova +=3D mapped; paddr +=3D mapped; len -=3D mapped; --=20 2.47.3 From nobody Thu Oct 2 00:50:48 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 58C5C279DB6 for ; Mon, 29 Sep 2025 20:04:57 +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=1759176299; cv=none; b=k0exRItr6BapYvOtctar3eCsYvHG50JKXAO2boqvYDnB1t6cyspksrx14Esw8uoT18SnGOE6S0TIwrk8dEsEBzeJQ53hv1WpCWwUXJfOWqwQ7LBdkXQYhIXdGI1aUnUKgR+CFNeAzd0v19+zGNbZ5sda8EVj3O6A5KrM2tyiOUE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759176299; c=relaxed/simple; bh=xQ/mZxaSllKAi+O3LeitaKzfoEEyb0serr2sHxkUVHo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=GhyCG336Vli4fIM1Nbq3VqhN4aZLemixgxkq8x869fMW7tQvJ2ZvteEiA1zBBlTmGwiwQuixA1ivMErHuh6nh4jKytNOCjHM8tdldT8HdoG8RvEnJZPu+MlSNjLVrvbWgf7peQtGRtwT8qN6N7rq7moOoY3p9SkyPRfDxvHwlj8= 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=bPPFqQz0; 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="bPPFqQz0" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1759176295; bh=xQ/mZxaSllKAi+O3LeitaKzfoEEyb0serr2sHxkUVHo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bPPFqQz0vREC0Hqc0Qd0LG8oOfUapTSwVKKahr4bhHav1/MhtEeGwPWTu7oaiBqhg eLP2BAymbI9383oWnI09v6kgk9VTJ0h2+h14xuzUBmlzoenOip2ORZVFHPP07ZjYp0 8lYfM7BEQ0JQ6qjAHXtwEWpqXbCbhpqZ64SBK3y1pwtV+rhTOFSzMpNSF+/cHHFnUp IiGjfRkGxJ+sFEQYZJtIrj29P9iZlZlMiy4b8kafAX+EUCO3n76pu/8MTD1wQDw+vZ RNm8zWPXRfSZvLKsF+8/edV5lbdZorbNBKPaM1NEZ/hqK5MKMJ+alX9N1eatYKuzSw Xh75Ox1J9f4XA== Received: from debian-rockchip-rock5b-rk3588.. (unknown [IPv6:2a01:e0a:5e3:6100:826d:bc07:e98c:84a]) (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 DB3ED17E153A; Mon, 29 Sep 2025 22:04:54 +0200 (CEST) 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 Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, linux-mm@kvack.org, kernel@collabora.com Subject: [PATCH 8/8] drm/panfrost: Introduce huge tmpfs mount point option Date: Mon, 29 Sep 2025 22:03:16 +0200 Message-ID: <20250929200316.18417-9-loic.molinari@collabora.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20250929200316.18417-1-loic.molinari@collabora.com> References: <20250929200316.18417-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 mount point is created and mounted using the 'huge=3Dwithin_size' option. It's then used at GEM object creation instead of the default 'shm_mnt' mount point in order to enable Transparent Hugepage (THP) for the object (without having to rely on a system wide parameter). Signed-off-by: Lo=C3=AFc Molinari --- drivers/gpu/drm/panfrost/panfrost_device.c | 4 +++ drivers/gpu/drm/panfrost/panfrost_device.h | 2 ++ drivers/gpu/drm/panfrost/panfrost_drv.c | 6 +++++ drivers/gpu/drm/panfrost/panfrost_drv.h | 11 ++++++++ drivers/gpu/drm/panfrost/panfrost_gem.c | 29 +++++++++++++++++++++- drivers/gpu/drm/panfrost/panfrost_gem.h | 3 +++ 6 files changed, 54 insertions(+), 1 deletion(-) 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 04bec27449cb..8f551c598a5c 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" @@ -266,6 +267,8 @@ int panfrost_device_init(struct panfrost_device *pfdev) if (err) goto out_job; =20 + panfrost_gem_init(pfdev); + return 0; out_job: panfrost_job_fini(pfdev); @@ -288,6 +291,7 @@ int panfrost_device_init(struct panfrost_device *pfdev) =20 void panfrost_device_fini(struct panfrost_device *pfdev) { + panfrost_gem_fini(pfdev); panfrost_perfcnt_fini(pfdev); panfrost_job_fini(pfdev); panfrost_mmu_fini(pfdev); diff --git a/drivers/gpu/drm/panfrost/panfrost_device.h b/drivers/gpu/drm/p= anfrost/panfrost_device.h index 1e73efad02a8..b8f368aef9e4 100644 --- a/drivers/gpu/drm/panfrost/panfrost_device.h +++ b/drivers/gpu/drm/panfrost/panfrost_device.h @@ -177,6 +177,8 @@ struct panfrost_device { spinlock_t lock; } cycle_counter; =20 + struct vfsmount *huge_mnt; + #ifdef CONFIG_DEBUG_FS struct panfrost_device_debugfs debugfs; #endif diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panf= rost/panfrost_drv.c index 22350ce8a08f..e376e70a3379 100644 --- a/drivers/gpu/drm/panfrost/panfrost_drv.c +++ b/drivers/gpu/drm/panfrost/panfrost_drv.c @@ -862,6 +862,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..60454611b6a6 --- /dev/null +++ b/drivers/gpu/drm/panfrost/panfrost_drv.h @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: GPL-2.0 or MIT +/* Copyright 2025 Amazon.com, Inc. or its affiliates */ + +#ifndef __PANFROST_DRV_H__ +#define __PANFROST_DRV_H__ + +#ifdef CONFIG_TRANSPARENT_HUGEPAGE +extern bool panfrost_transparent_hugepage; +#endif + +#endif diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.c b/drivers/gpu/drm/panf= rost/panfrost_gem.c index 85d6289a6eda..e560934bbf76 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 @@ -9,9 +10,34 @@ =20 #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) +{ + struct vfsmount *huge_mnt; + + if (!panfrost_transparent_hugepage) + return; + + huge_mnt =3D drm_gem_shmem_huge_mnt_create("within_size"); + if (IS_ERR(huge_mnt)) { + drm_warn(pfdev->ddev, "Can't use Transparent Hugepage (%ld)\n", + PTR_ERR(huge_mnt)); + return; + } + + pfdev->huge_mnt =3D huge_mnt; + + drm_info(pfdev->ddev, "Using Transparent Hugepage\n"); +} + +void panfrost_gem_fini(struct panfrost_device *pfdev) +{ + drm_gem_shmem_huge_mnt_free(pfdev->huge_mnt); +} + #ifdef CONFIG_DEBUG_FS static void panfrost_gem_debugfs_bo_add(struct panfrost_device *pfdev, struct panfrost_gem_object *bo) @@ -305,6 +331,7 @@ struct drm_gem_object *panfrost_gem_create_object(struc= t drm_device *dev, size_t struct panfrost_gem_object * panfrost_gem_create(struct drm_device *dev, size_t size, u32 flags) { + struct panfrost_device *pfdev =3D dev->dev_private; struct drm_gem_shmem_object *shmem; struct panfrost_gem_object *bo; =20 @@ -312,7 +339,7 @@ panfrost_gem_create(struct drm_device *dev, size_t size= , u32 flags) if (flags & PANFROST_BO_HEAP) size =3D roundup(size, SZ_2M); =20 - shmem =3D drm_gem_shmem_create(dev, size); + shmem =3D drm_gem_shmem_create_with_mnt(dev, size, pfdev->huge_mnt); if (IS_ERR(shmem)) return ERR_CAST(shmem); =20 diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.h b/drivers/gpu/drm/panf= rost/panfrost_gem.h index 8de3e76f2717..0e874d3c1363 100644 --- a/drivers/gpu/drm/panfrost/panfrost_gem.h +++ b/drivers/gpu/drm/panfrost/panfrost_gem.h @@ -124,6 +124,9 @@ 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); +void panfrost_gem_fini(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