Commit 8d58d656 authored by Baolin Wang's avatar Baolin Wang Committed by Andrew Morton
Browse files

mm: shmem: fix the shmem large folio allocation for the i915 driver

After commit acd7ccb2 ("mm: shmem: add large folio support for
tmpfs"), we extend the 'huge=' option to allow any sized large folios for
tmpfs, which means tmpfs will allow getting a highest order hint based on
the size of write() and fallocate() paths, and then will try each
allowable large order.

However, when the i915 driver allocates shmem memory, it doesn't provide
hint information about the size of the large folio to be allocated,
resulting in the inability to allocate PMD-sized shmem, which in turn
affects GPU performance.

Patryk added:

: In my tests, the performance drop ranges from a few percent up to 13%
: in Unigine Superposition under heavy memory usage on the CPU Core Ultra
: 155H with the Xe 128 EU GPU.  Other users have reported performance
: impact up to 30% on certain workloads.  Please find more in the
: regressions reports:
: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14645
: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13845
:
: I believe the change should be backported to all active kernel branches
: after version 6.12.

To fix this issue, we can use the inode's size as a write size hint in
shmem_read_folio_gfp() to help allocate PMD-sized large folios.

Link: https://lkml.kernel.org/r/f7e64e99a3a87a8144cc6b2f1dddf7a89c12ce44.1753926601.git.baolin.wang@linux.alibaba.com


Fixes: acd7ccb2 ("mm: shmem: add large folio support for tmpfs")
Signed-off-by: default avatarBaolin Wang <baolin.wang@linux.alibaba.com>
Reported-by: default avatarPatryk Kowalczyk <patryk@kowalczyk.ws>
Reported-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Tested-by: default avatarPatryk Kowalczyk <patryk@kowalczyk.ws>
Suggested-by: default avatarHugh Dickins <hughd@google.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 5c241ed8
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -5981,8 +5981,8 @@ struct folio *shmem_read_folio_gfp(struct address_space *mapping,
	struct folio *folio;
	int error;

	error = shmem_get_folio_gfp(inode, index, 0, &folio, SGP_CACHE,
				    gfp, NULL, NULL);
	error = shmem_get_folio_gfp(inode, index, i_size_read(inode),
				    &folio, SGP_CACHE, gfp, NULL, NULL);
	if (error)
		return ERR_PTR(error);