From nobody Wed Dec 17 19:39:25 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 8F3B5339A8 for ; Sat, 4 Oct 2025 09:31: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=1759570267; cv=none; b=ZjwkI7QblDq+xUJFR17QV0QOePphJ4iI2EAjOjpS1pcXecncye4UbnlkwxNCbjbV7iR3sNaK7y94qE3N7/9KZx1CS5jtgARJ3wW5KgXDo9fDnkw8UvtQyaSaaNbbVkajs6UNySWjTmDpoiQNdr3a+Zxzu4SkxXXxt+YJWmcTRaE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759570267; c=relaxed/simple; bh=oHlg+HHZ07jVp8oeT+nYSiSbJP/e2FkVTYagFoTUkDY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=FK0ucLEnhocAZFTVYl+1OeduuL9e55xvAptLlIs/hToaUGVoAMMTEj/72y3BgkkBMc1qE+FgbCjfsOOCjMoo0WLXVXQeuxFWGAf2/hem8dtjWJRN9J7ODpzLjiFIfqFUTdGkKPwsgszR7nWmZKwAz0WEjAlfSD3IYzFZSAC9xXU= 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=BKGLKEfc; 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="BKGLKEfc" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1759570261; bh=oHlg+HHZ07jVp8oeT+nYSiSbJP/e2FkVTYagFoTUkDY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BKGLKEfcHJNZ+yGu1I0N7U6Owv318R8F1qC+6XrCbc5IyG8d7z+wooJU1ULUB+Vjx QWtAFrKmLhOhx0+pYau0H0q7ZYtnWBAxykiTVJjJWpd4J7fI2o/0YHixzIJY0TbQCB Eto6lS7tb8g4vlG0Dqt3ngxVwHp0uWoPgl1BuLjtb1FWHBnoKluDS3UB2VmtsPKzmj yl+6ogpx+7N1FYPmxjMlZV5oH2+MEi1kXknLyDPdHWlF8NeEKjptHyQ3UYr7omPMRP c3accRYVOOiNbIcnGWICfN/k532H6uRqliHmoibXLrsLF9+T0ZVN2mKKd9qA4isC+5 wbzMlkTjdBWSg== 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 DB01617E0A2B; Sat, 4 Oct 2025 11:31:00 +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 , Christopher Healy Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, linux-mm@kvack.org, kernel@collabora.com, kernel test robot Subject: [PATCH v3 01/10] drm/shmem-helper: Add huge page fault handler Date: Sat, 4 Oct 2025 11:30:44 +0200 Message-ID: <20251004093054.21388-2-loic.molinari@collabora.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251004093054.21388-1-loic.molinari@collabora.com> References: <20251004093054.21388-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 Signed-off-by: Lo=C3=AFc Molinari Reviewed-by: Boris Brezillon Reported-by: kernel test robot Closes: https://lore.kernel.org/oe-kbuild-all/202509241315.8jjCyL7U-lkp@int= el.com/ Closes: https://lore.kernel.org/oe-kbuild-all/202509241654.qJk1H5kr-lkp@int= el.com/ Closes: https://lore.kernel.org/oe-kbuild-all/202509241920.PtSEkfd4-lkp@int= el.com/ --- 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 Wed Dec 17 19:39:25 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 6214626A0F8 for ; Sat, 4 Oct 2025 09:31: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=1759570269; cv=none; b=HpJenKJhN8zoSKpSJYr/QBZj+HYrRXQwuupH+ttEfHUGOBmLCJ7I4/ZbHZ+oVfixFt0/GXa/HEm1SlwQFZK4BjSjYc92GE5jwpGmdcSDp5n8n3M53UaLIsX11c79Td15Batrr0gMH9ftZO4IUJxWcQS306uCwlWhiM2LG0vlOOg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759570269; c=relaxed/simple; bh=SmIww8D1MBbr+NoG3LiBByODcEDAiHFn+8ts/mh6Eqw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=dGb87Cw1nsX/hn4wlYbpqDjIcscx0YCj+ZFJ6x9XpvJXSLZr4EHbSskoUtQbJODmTCGNJu4286qrIal04SYiRYuJ+KLoE9uYTJucTmnxbp/l1z/sKpE0HSZ5aot46rCDKzBHDYWEPYOklBxZVG35kw1t7FfPPKNihejHyjqr3LE= 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=OMRESoLq; 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="OMRESoLq" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1759570263; bh=SmIww8D1MBbr+NoG3LiBByODcEDAiHFn+8ts/mh6Eqw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OMRESoLq7qKzso2ruXJVRm6sfoCrxW8K1yi0xTMyhbgw74UgUhtXQIH7uTF5SgnLn Zbsb3pBp/d9+HKL4hP+b4ToK0QFwLr37wXPz08c2Y9hmGMRS9pA01WMGAdoNbbDQNq CZl6RCqjKRc6V6CQ9E7nPw+20txOhiEPsIFZ3qCCu50uWMb6BTzJ+kRuLA3/2O/Pu/ UUYG0DmjjutV9kJ1Nra1YbHkNFuv/tX0Y+IbkTUcY9WTSx3ERovfzPeVujHzCksDCH TDn8YFOzo1W3CImh2a86Y8z8jlh4nyAtaCDr3IYdv76Zbn6yIYeyVvuB9yoPcmOt97 JJCSs4kDjLUvg== 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 CA79917E12F7; Sat, 4 Oct 2025 11:31:02 +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 , Christopher Healy 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 v3 02/10] drm/gem: Introduce drm_gem_get_unmapped_area() fop Date: Sat, 4 Oct 2025 11:30:45 +0200 Message-ID: <20251004093054.21388-3-loic.molinari@collabora.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251004093054.21388-1-loic.molinari@collabora.com> References: <20251004093054.21388-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. v3: - add missing include: 'linux/sched/mm.h' - forward to shmem layer in !CONFIG_TRANSPARENT_HUGEPAGE builds Signed-off-by: Lo=C3=AFc Molinari --- drivers/gpu/drm/drm_gem.c | 107 ++++++++++++++++++++++++++++++-------- include/drm/drm_gem.h | 4 ++ mm/shmem.c | 1 + 3 files changed, 90 insertions(+), 22 deletions(-) diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index cbeb76b2124f..f5a10ff363c9 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 @@ -1187,36 +1188,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 +1227,85 @@ 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)) + 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; +} +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 Wed Dec 17 19:39:25 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 209E826D4DD for ; Sat, 4 Oct 2025 09:31: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=1759570272; cv=none; b=i3u4wLt8Y+Wkdazm8eoo7MA/BzD9bBD57Slcv5oylcrHmcZ7+vqwIF3wXDSvyRBjcXXCAOmVEqtUMRZYFwoGuZjm3k8vSu0Drg47cI82W3tK7SujauQXm/X3H4aewoAQrDIV+xt0q9s+bfo7iimWLvP/GT5KVl4jwoodahIosts= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759570272; c=relaxed/simple; bh=OboSG3MspALhfOlg3/ftZlyrbUep+HKm9KoLjZD+P04=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=OqJJ27xYCnN5V5MMB0BJNNNHikXuiPVBTIVyfR6ICiPwLwjohPjIXtb4QWA3GrK75kJm2/MS4dAFIkJb6Z4FbT1a8VRRCIzhVP5TtEdShyDedcAlaM1XVlYSedl1g3IWbwY61i3LKDHtN0jG0jVczHC2qrLXhcJ0PSNMtNrFOeg= 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=V6rPnmj2; 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="V6rPnmj2" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1759570265; bh=OboSG3MspALhfOlg3/ftZlyrbUep+HKm9KoLjZD+P04=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=V6rPnmj2m2VBb2rS7ppjLrf4/NU+Xfui7XcYgvhIHfQ9D9Jdzhhye/775mr8ql9pZ ywDGf88dQWTzVJuo638S5N8xYAHd2Yp9LAy/EVoNQFfNzZZPeV1NWgLePVNsrB3Z80 NfXzYFGnnjojybH+4fN1Yp5dh/pe+tW/V5Rg4nJxcbg8GZegzbHhsayua3khtQTvfJ s5/Hd6NB5dWoXH5w1Wiv9DPI/oVK/P7Txx2Vqp8bwLAtloaEa1NhYGMWHENJhcMzC5 sZxb3XWYx++yLcsZG0SAkzr8jx8wfb1vQdAORuhHs3lhVmq/KI8Ab+KiahllSJIR+I PVlQ+XUcLU4ag== 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 D486817E13B9; Sat, 4 Oct 2025 11:31:04 +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 , Christopher Healy 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 v3 03/10] drm/gem: Add huge tmpfs mount point helper Date: Sat, 4 Oct 2025 11:30:46 +0200 Message-ID: <20251004093054.21388-4-loic.molinari@collabora.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251004093054.21388-1-loic.molinari@collabora.com> References: <20251004093054.21388-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() helper to avoid code duplication in the i915, V3D, Panfrost and Panthor drivers. It creates and mounts a dedicated huge tmpfs mountpoint, for the lifetime of a drm device, used at GEM object initialization. The next commits will port drivers to this helper. v3: - store huge tmpfs mountpoint in drm_device Signed-off-by: Lo=C3=AFc Molinari --- drivers/gpu/drm/drm_gem.c | 67 +++++++++++++++++++++++++++++++++++++++ include/drm/drm_device.h | 11 +++++++ include/drm/drm_gem.h | 1 + 3 files changed, 79 insertions(+) diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index f5a10ff363c9..b4e4947210ef 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -82,6 +83,72 @@ * up at a later date, and as our interface with shmfs for memory allocati= on. */ =20 +static int drm_gem_add_fc_param(struct fs_context *fc, const char *key, + const char *value) +{ + return vfs_parse_fs_string(fc, key, value, strlen(value)); +} + +static void drm_gem_huge_mnt_free(struct drm_device *dev, void *data) +{ + drm_WARN_ON(dev, dev->huge_mnt =3D=3D NULL); + + kern_unmount(dev->huge_mnt); + dev->huge_mnt =3D NULL; +} + +/** + * 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. Returns -EEXIST if ca= lled + * more than once for the lifetime of the drm device. + */ +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 (!IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE)) + return -EOPNOTSUPP; + + type =3D get_fs_type("tmpfs"); + if (unlikely(!type)) + return -EOPNOTSUPP; + + if (unlikely(dev->huge_mnt)) + return -EEXIST; + + fc =3D fs_context_for_mount(type, SB_KERNMOUNT); + if (IS_ERR(fc)) + return PTR_ERR(fc); + ret =3D drm_gem_add_fc_param(fc, "source", "tmpfs"); + if (unlikely(ret)) + return -ENOPARAM; + ret =3D drm_gem_add_fc_param(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); + 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 59fd3f4d5995..895b0ced972e 100644 --- a/include/drm/drm_device.h +++ b/include/drm/drm_device.h @@ -3,6 +3,7 @@ =20 #include #include +#include #include #include #include @@ -168,6 +169,16 @@ struct drm_device { */ struct drm_master *master; =20 + /** + * @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; + /** * @driver_features: per-device driver features * diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h index 7c8bd67d087c..7285a62d9afc 100644 --- a/include/drm/drm_gem.h +++ b/include/drm/drm_gem.h @@ -492,6 +492,7 @@ struct drm_gem_object { DRM_GEM_FOPS,\ } =20 +int drm_gem_huge_mnt_create(struct drm_device *dev, const char *value); 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 Wed Dec 17 19:39:25 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 2097F26C3BC for ; Sat, 4 Oct 2025 09:31:08 +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=1759570271; cv=none; b=Qbenn5f3lhkB/vqL9UGKlhK7kaUkv2+qbQnR0+FHO6BuC+uI2m+4Bxkuh6NsxKVQWmvJcMNNJTc65MrCeQRbMtoP2GUhN1YFJIDTQSdR8yvFvf83yBBjTvl2y1UCOaw5jc+W4U53Yf+Dyqr595bcDlerDlZfTGs6DGr6wHomLc8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759570271; c=relaxed/simple; bh=bkezbEIN/CbG2AcIdbv+bXA+rrfF61uiuooCZCIYORU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=CsrdI6xxCKOQEj7Jnr0MEX3jLsyEkd/YtsqfakymuEeDQBJ5zI2h+ufTBTFhU78qWLDg7GHIsKCJrKXW320Mpt1paxmCYBlaCSOsLO96UlVJkohyhrEYwFrFD58W/7M5iGWlY4SmClEXU68zyEm15V5QvZDZC6Y00maNifSnUZg= 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=gTfOgpbc; 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="gTfOgpbc" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1759570267; bh=bkezbEIN/CbG2AcIdbv+bXA+rrfF61uiuooCZCIYORU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gTfOgpbc2mhdiKwL0QkXhhnQMxpRluL2jTWjXjiHfykK3DN7GUiJFAq5UIEOgDbZo tyv80u/mFf6qran+3pqQjT4Ay88OvsQaFJTeYFVq4dxyjTQQeClUal6cV7XskE1FVc 7VFmayDoK+oml/1maIcKCLZdlQVPRpC+mFARigxPebPvYTpbKTWQHghyaOEMUBaxm8 KOEop5dzprh6vCNiaNVNDSIU4Sqai08EBCCsvJD/8Epsg+zmQg+WfNFzZXmRE38qSn OzkY5zogMoCiUQfA25GUEGMDgyUCCAMKJcPsqxtlLK5P42Zzv1zghyzvPDLS/mLYUu ep9lFudV5vPTg== 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 A4F6F17E13D5; Sat, 4 Oct 2025 11:31:06 +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 , Christopher Healy 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 v3 04/10] drm/i915: Use huge tmpfs mount point helper Date: Sat, 4 Oct 2025 11:30:47 +0200 Message-ID: <20251004093054.21388-5-loic.molinari@collabora.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251004093054.21388-1-loic.molinari@collabora.com> References: <20251004093054.21388-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() helper 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 Signed-off-by: Lo=C3=AFc Molinari --- drivers/gpu/drm/i915/Makefile | 3 +- drivers/gpu/drm/i915/gem/i915_gem_shmem.c | 52 +++++++++---- drivers/gpu/drm/i915/gem/i915_gemfs.c | 74 ------------------- drivers/gpu/drm/i915/gem/i915_gemfs.h | 14 ---- .../gpu/drm/i915/gem/selftests/huge_pages.c | 10 +-- drivers/gpu/drm/i915/i915_drv.h | 5 -- 6 files changed, 45 insertions(+), 113 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 853543443072..716291c3dcd3 100644 --- a/drivers/gpu/drm/i915/Makefile +++ b/drivers/gpu/drm/i915/Makefile @@ -162,8 +162,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 e3d188455f67..3344d6f5846e 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c @@ -9,14 +9,15 @@ #include =20 #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 @@ -506,9 +507,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); + if (i915->drm.huge_mnt) + filp =3D shmem_file_setup_with_mnt(i915->drm.huge_mnt, "i915", + size, flags); else filp =3D shmem_file_setup("i915", size, flags); if (IS_ERR(filp)) @@ -628,21 +629,46 @@ 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; + int err; =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; + + if (!IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE)) + goto no_thp; + + err =3D drm_gem_huge_mnt_create(&i915->drm, "within_size"); + if (err && err !=3D -EEXIST) { + 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!"); + goto no_thp; + } + + drm_info(&i915->drm, "Using Transparent Hugepages\n"); + + 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 a09e2eb47175..000000000000 --- a/drivers/gpu/drm/i915/gem/i915_gemfs.c +++ /dev/null @@ -1,74 +0,0 @@ -// SPDX-License-Identifier: MIT -/* - * Copyright =C2=A9 2017 Intel Corporation - */ - -#include -#include -#include - -#include "i915_drv.h" -#include "i915_gemfs.h" -#include "i915_utils.h" - -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; - - /* - * 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 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) - 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..b41a38af63fd 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 i915->drm.huge_mnt && has_transparent_hugepage(); } =20 static struct drm_i915_gem_object * @@ -1761,7 +1761,7 @@ 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; + struct vfsmount *huge_mnt =3D i915->drm.huge_mnt; struct drm_i915_gem_object *obj; struct i915_vma *vma; struct file *file; @@ -1782,10 +1782,10 @@ 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; + i915->drm.huge_mnt =3D NULL; =20 obj =3D i915_gem_object_create_shmem(i915, PAGE_SIZE); if (IS_ERR(obj)) { @@ -1819,7 +1819,7 @@ static int igt_tmpfs_fallback(void *arg) out_put: i915_gem_object_put(obj); out_restore: - i915->mm.gemfs =3D gemfs; + i915->drm.huge_mnt =3D huge_mnt; =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 2f3965feada1..49987f4c6ffe 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -142,11 +142,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 Wed Dec 17 19:39:25 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 D79381EB19B for ; Sat, 4 Oct 2025 09:31:10 +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=1759570272; cv=none; b=l7Ai+yshW0L297GIOtQlZ8gYvBI7MKIEcDOuoEKwDu/q5AyceBGPBb3BEuNMd6FCveFZjmKJqOJJsDq/gwj28hU0cXztsQEaMO6SE0y4NWD5hi8mS+HytIzE5a8RoKqgU87bkgLq/8cGWAssJupe/E/fGHD+dfZETjIFPEuw8Lk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759570272; c=relaxed/simple; bh=voXKWIXXc7ZCAqr68hJ7OCR6GhuDkG9/lw40a6vV8HU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=JsHK4M4aqxjb9B3FJU9IlgRBY6D4h7Wr4BhEUJTgo4mDfc++gcm7kVxwGWMFUn4jtuip6BZ5skxrwioiDb6NeO5rpfZYqm4BkFM3I89nptwW1pJP4V9d53NHiLRme7sWyAFzpuNFxyMnUHf5xWNJ7bsSIAxkmUoREnfb3Iw4f7U= 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=LVi5S/CQ; 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="LVi5S/CQ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1759570269; bh=voXKWIXXc7ZCAqr68hJ7OCR6GhuDkG9/lw40a6vV8HU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LVi5S/CQlbVfDW6cyzL+WXoWt12tZuEt9c1NGSM+9kSNI7WSuCyGuK0K8dMbClOXg XvgxF2KjRsa7YwmJrDhCQITg1Y+2DkYwcOVOxXrncTRn50g6vzfnOUM+z3t4mW2d28 DANkjgaxRGaMGOzZp9E7j2lDSXImlY6Tw6B9C2pTuO+Weu9uaZiTDB7F8u1kAwsDkH cBJfmi7FcC0f19VcrB3/OQ0KnGSRJU7r9jOmPnWAxz0LVdMbm8UQBW0NpwoGiSXiE6 dJugNONAYiY9v116CeBUYlvrQM37g5XgrtZuOVXHlXtCTKgtlFBIr8pAuDaVNcrIko 9CoUNCm1hc8xg== 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 758C717E13E4; Sat, 4 Oct 2025 11:31:08 +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 , Christopher Healy 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 v3 05/10] drm/v3d: Use huge tmpfs mount point helper Date: Sat, 4 Oct 2025 11:30:48 +0200 Message-ID: <20251004093054.21388-6-loic.molinari@collabora.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251004093054.21388-1-loic.molinari@collabora.com> References: <20251004093054.21388-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() helper 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 Signed-off-by: Lo=C3=AFc Molinari --- 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 | 33 ++++++++++++++++- drivers/gpu/drm/v3d/v3d_gemfs.c | 65 --------------------------------- 6 files changed, 36 insertions(+), 83 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 c41476ddde68..6b9909bfce82 100644 --- a/drivers/gpu/drm/v3d/v3d_bo.c +++ b/drivers/gpu/drm/v3d/v3d_bo.c @@ -112,7 +112,7 @@ v3d_bo_create_finish(struct drm_gem_object *obj) if (IS_ERR(sgt)) return PTR_ERR(sgt); =20 - if (!v3d->gemfs) + if (!obj->dev->huge_mnt) align =3D SZ_4K; else if (obj->size >=3D SZ_1M) align =3D SZ_1M; @@ -148,12 +148,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); + dev->huge_mnt); 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 c5a3bbbc74c5..19ec0ea7f38e 100644 --- a/drivers/gpu/drm/v3d/v3d_drv.c +++ b/drivers/gpu/drm/v3d/v3d_drv.c @@ -106,7 +106,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 !!dev->huge_mnt; 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 0317f3d7452a..0b4fcb788168 100644 --- a/drivers/gpu/drm/v3d/v3d_drv.h +++ b/drivers/gpu/drm/v3d/v3d_drv.h @@ -156,11 +156,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]; @@ -567,6 +562,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); @@ -574,11 +570,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 c77d90aa9b82..1cf5ebe99c90 100644 --- a/drivers/gpu/drm/v3d/v3d_gem.c +++ b/drivers/gpu/drm/v3d/v3d_gem.c @@ -258,6 +258,36 @@ 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; + + /* + * 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; + + err =3D drm_gem_huge_mnt_create(&v3d->drm, "within_size"); + if (err && err !=3D -EEXIST) + goto err; + + drm_info(&v3d->drm, "Using Transparent Hugepages\n"); + + return; + +err: + drm_notice(&v3d->drm, + "Transparent Hugepage support is recommended for optimal performance = on this platform!\n"); +} + int v3d_gem_init(struct drm_device *dev) { @@ -308,7 +338,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) { @@ -328,7 +358,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 8ec6ed82b3d9..000000000000 --- a/drivers/gpu/drm/v3d/v3d_gemfs.c +++ /dev/null @@ -1,65 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* Copyright (C) 2024 Raspberry Pi */ - -#include -#include -#include - -#include "v3d_drv.h" - -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; - - /* - * 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 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) - 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 Wed Dec 17 19:39:25 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 C5483275B05 for ; Sat, 4 Oct 2025 09:31:12 +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=1759570274; cv=none; b=keZ7yNUn7AkWaTFS1AJzT9Va+BgI4QtUEGbkxkv2SQWrH4YGUIkrgkSZZ9sdba/+gPML4JskEQfD13Xv5hz9cW5c/2dgLkvKdI0NdAb70yhPk7dslIkzkMSAfX2H1yAR4+Sz1fViBupPisstw/CNWRzld4kFLesYg8e0FdcrILI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759570274; c=relaxed/simple; bh=8TIIJbzuKSwt0TVqrcMYvvQ6V2YmHZ1Jw8AVO7VfzY4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=MqDrco7SJf19l3Jzoz3Q5p/AXZeENVILhvcLQdT+wToItUT91VxvSAp2PfWnU7OBMK3zqxY8PyKtecpeLo0cxTt9S9X2vpkB+hYTW2IQJm44HkXbeAy0A3z+TppCSr4Jc5IemzPHiy9IAs/IkbOlaw51aYxBHDNZPsLU9uWmRas= 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=CJeRx6Hr; 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="CJeRx6Hr" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1759570271; bh=8TIIJbzuKSwt0TVqrcMYvvQ6V2YmHZ1Jw8AVO7VfzY4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=CJeRx6HrcbEwJqZ1OjAhiC2078MEVlqSLulbyV9K83amp0QHUkaN80hZQhklszt21 2q9NIln5KKsrMEoKGPhuAcEvjW3q4XnQOtulX9YHtOSAPgL0HszJZ7jyqv2R6q66zg uDaIDsCSe+6Ek+DVcEnnBbdwNpxMnt8CMgvYE/kPuETauFRHcXnkHmBmkoaWZ0K21Z 3MJAUHKTEEHDtCappuAiuI+rCdZud3k5miaoGS92Q8pZKR47xcEoGXBA+uU0xSdSao HbOVEfEWocG6LKWoWY8MMbkBuXDAheaJQsvUCqxJqNAXNZOY0umMRSaCGudP0TGFrq JHrUvu/15E9RQ== 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 43D9917E0020; Sat, 4 Oct 2025 11:31:10 +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 , Christopher Healy 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 v3 06/10] drm/gem: Get rid of *_with_mnt helpers Date: Sat, 4 Oct 2025 11:30:49 +0200 Message-ID: <20251004093054.21388-7-loic.molinari@collabora.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251004093054.21388-1-loic.molinari@collabora.com> References: <20251004093054.21388-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 drm_gem_huge_mnt_create(). Signed-off-by: Lo=C3=AFc Molinari Reviewed-by: Boris Brezillon --- drivers/gpu/drm/drm_gem.c | 34 ++++++----------------- 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, 17 insertions(+), 64 deletions(-) diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index b4e4947210ef..a29f57943b93 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c @@ -181,28 +181,26 @@ 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 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, + if (dev->huge_mnt) + filp =3D shmem_file_setup_with_mnt(dev->huge_mnt, + "drm mm object", size, VM_NORESERVE); else filp =3D shmem_file_setup("drm mm object", size, VM_NORESERVE); @@ -214,22 +212,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 22c4b09e10a3..5c1c1e8040b4 100644 --- a/drivers/gpu/drm/drm_gem_shmem_helper.c +++ b/drivers/gpu/drm/drm_gem_shmem_helper.c @@ -49,7 +49,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; @@ -61,7 +61,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); @@ -102,13 +102,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; @@ -128,7 +127,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); @@ -149,31 +148,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 @@ -878,7 +856,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 @@ -926,7 +904,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 6b9909bfce82..ef9e9c15da3c 100644 --- a/drivers/gpu/drm/v3d/v3d_bo.c +++ b/drivers/gpu/drm/v3d/v3d_bo.c @@ -151,8 +151,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, - dev->huge_mnt); + 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 7285a62d9afc..42d9066b1785 100644 --- a/include/drm/drm_gem.h +++ b/include/drm/drm_gem.h @@ -497,9 +497,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 Wed Dec 17 19:39:25 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 7B8E426CE23 for ; Sat, 4 Oct 2025 09:31:14 +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=1759570276; cv=none; b=SSWuOlKFIDhEEw3Z28zYh9+GeVsL45Y8QZs+si2g4qm9q8C/QPa1kp687rj5auKXCuSainEvUTHfBM4Fsoq9yovafzz11J1/WiJmNRKR6LSNGXeDL7SncINVKn01r/HkHWAG+ob+MPlsInLqaQE4UWgzwm0Lg3KBazK0C/spVgA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759570276; c=relaxed/simple; bh=AORDOWjgp5Q4DcRSWOWZx/uO1pC7mO8Jrs5Hqc+CYdU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=aepxzTxTbqk0jxsBNNGjpbLIlNPvRj/tR5b6wYePUgt9k24MHsmaGZhe9m36ZzpQcTya6h9GHjYOClzHV9dRSGrRzpj/Weu34NCP4NAypjRm29b66PW12hquDsFBKLagp2JDH4HMnsqRBnvFl0eunfcRz/yhYwHL89asb8UdbVQ= 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=IkjyBIgn; 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="IkjyBIgn" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1759570272; bh=AORDOWjgp5Q4DcRSWOWZx/uO1pC7mO8Jrs5Hqc+CYdU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=IkjyBIgnEgvKaipuM22XhK0fOTN3pqXVTh9JCwq7JSKFPm1Ijl1u9CswFPIV7zz4P 4Dhr5If6IGYZ/S5msgUTonsJGxj5z4m+Ow4f5e0PWHUcQQ6NJRXaSwER6DHKWShoDi 8dctHU9cuizpNAAJXzuY6UK9tT98PDl62A4cu152chYB5pXjYY9UNOT+IuUoSbpEx/ kHHmeoaU78anbMlg6POE2Qct6+9hXUPMChhsOO7PD70tw3b+JwR2zEIii/DJO9+mRq qkoiuo6SXEkbFTTUIBMVYE1/x1UVd9A9nqR/zmG+SwcE2LeU0cuUz5aLcpz5DEgQt4 V3FEhPyn9iiDw== 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 04CFA17E07EE; Sat, 4 Oct 2025 11:31:11 +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 , Christopher Healy 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 v3 07/10] drm/panthor: Introduce huge tmpfs mount point option Date: Sat, 4 Oct 2025 11:30:50 +0200 Message-ID: <20251004093054.21388-8-loic.molinari@collabora.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251004093054.21388-1-loic.molinari@collabora.com> References: <20251004093054.21388-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). v3: - use huge tmpfs mountpoint in drm_device 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 | 11 +++++++++++ drivers/gpu/drm/panthor/panthor_gem.c | 19 +++++++++++++++++++ drivers/gpu/drm/panthor/panthor_gem.h | 2 ++ 5 files changed, 42 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 81df49880bd8..3c0387156bb9 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" @@ -269,6 +270,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 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..49b7d288bfdf 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,28 @@ #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 (!panthor_transparent_hugepage) + return; + + err =3D drm_gem_huge_mnt_create(&ptdev->base, "within_size"); + if (err && err !=3D -EEXIST) { + drm_warn(&ptdev->base, "Can't use Transparent Hugepage (%d)\n", + -err); + return; + } + + drm_info(&ptdev->base, "Using Transparent Hugepage\n"); +} + #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 Wed Dec 17 19:39:25 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 5019E27EC73 for ; Sat, 4 Oct 2025 09:31:16 +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=1759570278; cv=none; b=ghQ603G75GfTQWrxPCdFgvhcZTomSmqm6yHaLPxOqQK+3dl6kWJdXY63hDgj5GDj9uXgRaPv5tLkf7qiws0gtn+Dl/lkcbc2X+T9533R9yOOLMnC/J3rHh0g2/7YWtjCnffnBwBdkYx220HdhrqCgDkbatMfvfKPFDMVf7pFdDE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759570278; c=relaxed/simple; bh=ROKoonOOaPmiRlBVqml71l+74uvjDMGSuEeXXfy4kSs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=e847C23le02odoWcfA+KcLnLng14Qjjx/oCHDT9XkzmQrhlZ/IEW/NmBN/3CvBbpQgqZfFruLY2pbK7m0ZivsdV8j7fGdBk9sUTgDTkc8J6qUDLRrpzHbqzq3GvaZPPNfgv4usDVcBNVrk+CzE269hR7wYHLKO8tBjJqusRIFGE= 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=fr5vjJJL; 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="fr5vjJJL" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1759570274; bh=ROKoonOOaPmiRlBVqml71l+74uvjDMGSuEeXXfy4kSs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fr5vjJJLezWUZE/y6PH51c7nZ6qWesMFK6/h4UtO1zaEOw8K9k9eSpe3gF+4M4/Kc BF0Wm+0fOvnqC9YZzeV6VrANKW13NkkRLg29nu1NKsREzCb3DSBCa16ksweI/z7PID y+vnGvbrenzbK+Jc6ZyM7t6dHo4WxCFFkjVMTlCXXnYU+s62FvYr629FEELjV1YTaB FrGG6iVuV/WfeEgUd/NET0l07ZJQaueiigQz/CYC16Osb70CMUQ0T1te+W3Xy+GDIf pVNly8S61gLafxHpne/2nHCRUkJLFq81J3LP5Opfvr5HXtcj/Ho7LZvBTp/MVbY5Qo dtNOAHaNMRogg== 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 D1BF817E154C; Sat, 4 Oct 2025 11:31:13 +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 , Christopher Healy 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 v3 08/10] drm/panthor: Improve IOMMU map/unmap debugging logs Date: Sat, 4 Oct 2025 11:30:51 +0200 Message-ID: <20251004093054.21388-9-loic.molinari@collabora.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251004093054.21388-1-loic.molinari@collabora.com> References: <20251004093054.21388-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 Wed Dec 17 19:39:25 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 14D6428031D for ; Sat, 4 Oct 2025 09:31:17 +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=1759570279; cv=none; b=nvqNnFAakAsVxUvU3E6ML2HaCnYQWqqdQaApuw+nlYHt2hp0zZ70AqS8xzH3o6JRpulzS8M5dlJXFij2Xl/a8evnX3o+3DvXuu/fUz83WbgsdRBvH0UkfzxYmYDTJjdRzYSH9CtTBE7xyvuXTNUk6tcKFoEvtkXT2qF9RNb63PI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759570279; c=relaxed/simple; bh=5f3j5sCwUUm4zOM7eQNMiBq0+mfIGQqbuZDFMB62Zc4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=aB8a4yI8fptfNOTCM9O4w9LCxTbabdfsiWdxfz2Q8v57rsPw4/psAKGiCS+aasYjwzCTecTGFVy8IZFPgc9a0HXnNZUWGqXmZBJOBoQEdZPZ/0spKEHvv47FDp4rKO9aEO7oF6yD1ctr13/Dni6ePhdwTG/zwesu1HvKd8I2UeY= 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=qVW4BEgc; 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="qVW4BEgc" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1759570276; bh=5f3j5sCwUUm4zOM7eQNMiBq0+mfIGQqbuZDFMB62Zc4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qVW4BEgczpRlg+66tqdysqb6yDeiDP1nw9RCe9ZZ80f015QEko/NejBcfYdz9Kb2z 1jhA5y36QlTRURsuDSmk84vy00x9LWTQImTdcPwmDiOw1WxEcll0Ss0ERu/gvyAIcH lw6riW++z57enRybhqjT372MdkcF/lqjt3JJnzL4zKAfookzGX+MgKF9LBpUzDU6iS So8h2kBEhZ8r/hzk+dDBDv6R4wocIPLFEg46db6PEGrQ0ihW1F5TwRdzhY7TU/PO6k KWSZxBZPP6Mk0fZYTwYA31YMgHq2Zzd9aN8u/QJJO68dJ2mUEAQa31OuhCF07J+Lxk g0ifKxJN5cxlQ== 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 B031717E13C3; Sat, 4 Oct 2025 11:31:15 +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 , Christopher Healy 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 v3 09/10] drm/panfrost: Introduce huge tmpfs mount point option Date: Sat, 4 Oct 2025 11:30:52 +0200 Message-ID: <20251004093054.21388-10-loic.molinari@collabora.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251004093054.21388-1-loic.molinari@collabora.com> References: <20251004093054.21388-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). v3: - use huge tmpfs mountpoint in drm_device 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 | 11 +++++++++++ drivers/gpu/drm/panfrost/panfrost_gem.c | 19 +++++++++++++++++++ drivers/gpu/drm/panfrost/panfrost_gem.h | 2 ++ 5 files changed, 41 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 04bec27449cb..a189bfaac959 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); 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..c3883a639e13 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,27 @@ =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) +{ + int err; + + if (!panfrost_transparent_hugepage) + return; + + err =3D drm_gem_huge_mnt_create(pfdev->ddev, "within_size"); + if (err && err !=3D -EEXIST) { + drm_warn(pfdev->ddev, "Can't use Transparent Hugepage (%d)\n", + -err); + return; + } + + drm_info(pfdev->ddev, "Using Transparent Hugepage\n"); +} + #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 Wed Dec 17 19:39:25 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 016E22820A9 for ; Sat, 4 Oct 2025 09:31:19 +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=1759570281; cv=none; b=KIRW35kSqp3TzXzvmutUwFKkdg3t3gJgRueyBwRerUXVRnLwH4Nynfigjv4SCHcwUBXEE4iyXN7WH6qCUkaRTY6QyMjIaIKyg0i80ZBO1x5IpZmhGzvYQrn3/1dmDMlVLIEQhZbJrUS1rzDFZ2l1FuvlzCIiI0Qvn5QHHUYGR1E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759570281; c=relaxed/simple; bh=D0Fu/ldQhntehM2Mq/IXQJTZKKJwzHie8we5EhgLjv8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=gtP1DctedtEgGhIT7EX1MoEazmeQsnfU8/tHpDvWgRrZ9EHm9aBY2xrOuKBSUaSYYmlRVEzUyc44ZthizJNUVm+3fIM4uZjAvjbwfAs34w7WSWQR5Ssgsc6z+st/16VQbcII4O8Nru0YGMQNujZPMOxe6+GlVBrEDJ+bd+QF+54= 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=AMlhrgUf; 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="AMlhrgUf" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1759570278; bh=D0Fu/ldQhntehM2Mq/IXQJTZKKJwzHie8we5EhgLjv8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=AMlhrgUfj67oXsQPTFjfkhXxPYErzu07l7zcQuFt1VeLOO4l1kddXtiTb2X/cetOS 6XMF0S8g5Fu73Rg3lAVLMWykZe56IdRC60HwD9pv/MEZTOZ6Rsmkio0eJfbmu1nwCK d4IdxOltI8YwNAtsLWvnJxFMf/9AVfESz8Ub5ydUncWsPC7OnRkCO+XAq+H4dRQyS2 llItYjnG94oPb9HEZHBOeRVHE+Lsuht91g6GWGJTZzTqRPBN3VlqNnsa57784xcp1/ Of2brQuMsVBOznatNjK2ireFQDvmFsXBo6sqcHe+RO6GcwaxxUcglmxauY2WbuVjd7 UuGUKAQRIUOaA== 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 9C0FC17E13DA; Sat, 4 Oct 2025 11:31:17 +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 , Christopher Healy 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 v3 10/10] Documentation/gpu/drm-mm: Add THP paragraph to GEM mapping section Date: Sat, 4 Oct 2025 11:30:53 +0200 Message-ID: <20251004093054.21388-11-loic.molinari@collabora.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251004093054.21388-1-loic.molinari@collabora.com> References: <20251004093054.21388-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. Signed-off-by: Lo=C3=AFc Molinari Reviewed-by: Bagas Sanjaya --- Documentation/gpu/drm-mm.rst | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/Documentation/gpu/drm-mm.rst b/Documentation/gpu/drm-mm.rst index d55751cad67c..0ce6e27f8463 100644 --- a/Documentation/gpu/drm-mm.rst +++ b/Documentation/gpu/drm-mm.rst @@ -283,6 +283,8 @@ made up of several fields, the more interesting ones be= ing: void (*open)(struct vm_area_struct * area); void (*close)(struct vm_area_struct * area); vm_fault_t (*fault)(struct vm_fault *vmf); + vm_fault_t (*huge_fault)(struct vm_fault *vmf, + unsigned int order); }; =20 =20 @@ -290,7 +292,7 @@ The open and close operations must update the GEM objec= t 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 +The fault operation handlers are 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 @@ -299,6 +301,19 @@ created. 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 +manages to allocate huge pages, faulty addresses within huge pages will +be mapped into the tables using the huge page fault handler. In such +cases, mmap() user address alignment for GEM objects is handled by +providing a custom get_unmapped_area properly forwarding 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