[Intel-gfx] [PATCH 17/18] mm/shmem: tweak the huge-page interface

Daniel Vetter daniel at ffwll.ch
Wed Apr 5 06:42:54 UTC 2017


On Tue, Apr 04, 2017 at 11:11:27PM +0100, Matthew Auld wrote:
> In its current form huge-pages through shmemfs are controlled at the
> super-block level, and are currently disabled by default, so to enable
> huge-pages for a shmem backed gem object we would need to re-mount the
> fs with the huge= argument, but for drm the mount is not user visible,
> so good luck with that. The other option is the global sysfs knob
> shmem_enabled which exposes the same huge= options, with the addition of
> DENY and FORCE.
> 
> Neither option seems really workable, what we probably want is to able
> to control the use of huge-pages at the time of pinning the backing
> storage for a particular gem object, and only where it makes sense given
> the size of the object. One caveat is when we write into the page cache
> prior to pinning the backing storage. I played around with a bunch of
> ideas but in the end just settled with driver overridable huge option
> embedded in shmem_inode_info. Thoughts?
> 
> Signed-off-by: Matthew Auld <matthew.auld at intel.com>

You need to Cc: mm folks and mailing lists for this. Ask
scripts/get_maintainers.pl for the full list please. Otherwise this can't
ever land (and we're looking at along time of bikeshedding anyway).
-Daniel

> ---
>  include/linux/shmem_fs.h |  1 +
>  mm/shmem.c               | 10 ++++++++--
>  2 files changed, 9 insertions(+), 2 deletions(-)
> 
> diff --git a/include/linux/shmem_fs.h b/include/linux/shmem_fs.h
> index a7d6bd2a918f..001be751420d 100644
> --- a/include/linux/shmem_fs.h
> +++ b/include/linux/shmem_fs.h
> @@ -21,6 +21,7 @@ struct shmem_inode_info {
>  	struct shared_policy	policy;		/* NUMA memory alloc policy */
>  	struct simple_xattrs	xattrs;		/* list of xattrs */
>  	struct inode		vfs_inode;
> +	bool                    huge;           /* driver override shmem_huge */
>  };
>  
>  struct shmem_sb_info {
> diff --git a/mm/shmem.c b/mm/shmem.c
> index e67d6ba4e98e..879a9e514afe 100644
> --- a/mm/shmem.c
> +++ b/mm/shmem.c
> @@ -1723,6 +1723,9 @@ static int shmem_getpage_gfp(struct inode *inode, pgoff_t index,
>  		/* shmem_symlink() */
>  		if (mapping->a_ops != &shmem_aops)
>  			goto alloc_nohuge;
> +		/* driver override shmem_huge */
> +		if (info->huge)
> +			goto alloc_huge;
>  		if (shmem_huge == SHMEM_HUGE_DENY || sgp_huge == SGP_NOHUGE)
>  			goto alloc_nohuge;
>  		if (shmem_huge == SHMEM_HUGE_FORCE)
> @@ -2000,6 +2003,7 @@ unsigned long shmem_get_unmapped_area(struct file *file,
>  	unsigned long inflated_len;
>  	unsigned long inflated_addr;
>  	unsigned long inflated_offset;
> +	struct shmem_inode_info *info = SHMEM_I(file_inode(file));
>  
>  	if (len > TASK_SIZE)
>  		return -ENOMEM;
> @@ -2016,7 +2020,7 @@ unsigned long shmem_get_unmapped_area(struct file *file,
>  	if (addr > TASK_SIZE - len)
>  		return addr;
>  
> -	if (shmem_huge == SHMEM_HUGE_DENY)
> +	if (!info->huge && shmem_huge == SHMEM_HUGE_DENY)
>  		return addr;
>  	if (len < HPAGE_PMD_SIZE)
>  		return addr;
> @@ -2030,7 +2034,7 @@ unsigned long shmem_get_unmapped_area(struct file *file,
>  	if (uaddr)
>  		return addr;
>  
> -	if (shmem_huge != SHMEM_HUGE_FORCE) {
> +	if (!info->huge && shmem_huge != SHMEM_HUGE_FORCE) {
>  		struct super_block *sb;
>  
>  		if (file) {
> @@ -4034,6 +4038,8 @@ bool shmem_huge_enabled(struct vm_area_struct *vma)
>  	loff_t i_size;
>  	pgoff_t off;
>  
> +	if (SHMEM_I(inode)->huge)
> +		return true;
>  	if (shmem_huge == SHMEM_HUGE_FORCE)
>  		return true;
>  	if (shmem_huge == SHMEM_HUGE_DENY)
> -- 
> 2.9.3
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch


More information about the Intel-gfx mailing list