linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: David Rientjes <rientjes@google.com>
To: Eric B Munson <ebmunson@us.ibm.com>
Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org,
	linux-man@vger.kernel.org, akpm@linux-foundation.org,
	mtk.manpages@gmail.com
Subject: Re: [PATCH 2/3] Add MAP_HUGETLB for mmaping pseudo-anonymous huge page regions V2
Date: Thu, 13 Aug 2009 14:49:09 -0700 (PDT)	[thread overview]
Message-ID: <alpine.DEB.2.00.0908131443350.9805@chino.kir.corp.google.com> (raw)
In-Reply-To: <83949d066e2a7221a25dd74d12d6dcf7e8b4e9ba.1250156841.git.ebmunson@us.ibm.com>

On Thu, 13 Aug 2009, Eric B Munson wrote:

> This patch adds a flag for mmap that will be used to request a huge
> page region that will look like anonymous memory to user space.  This
> is accomplished by using a file on the internal vfsmount.  MAP_HUGETLB
> is a modifier of MAP_ANONYMOUS and so must be specified with it.  The
> region will behave the same as a MAP_ANONYMOUS region using small pages.
> 
> Signed-off-by: Eric B Munson <ebmunson@us.ibm.com>
> ---
> Changes from V1
>  Rebase to newest linux-2.6 tree
>  Rename MAP_LARGEPAGE to MAP_HUGETLB to match flag name for huge page shm
> 
>  include/asm-generic/mman-common.h |    1 +
>  include/linux/hugetlb.h           |    7 +++++++
>  mm/mmap.c                         |   16 ++++++++++++++++
>  3 files changed, 24 insertions(+), 0 deletions(-)
> 
> diff --git a/include/asm-generic/mman-common.h b/include/asm-generic/mman-common.h
> index 3b69ad3..12f5982 100644
> --- a/include/asm-generic/mman-common.h
> +++ b/include/asm-generic/mman-common.h
> @@ -19,6 +19,7 @@
>  #define MAP_TYPE	0x0f		/* Mask for type of mapping */
>  #define MAP_FIXED	0x10		/* Interpret addr exactly */
>  #define MAP_ANONYMOUS	0x20		/* don't use a file */
> +#define MAP_HUGETLB	0x40		/* create a huge page mapping */
>  
>  #define MS_ASYNC	1		/* sync memory asynchronously */
>  #define MS_INVALIDATE	2		/* invalidate the caches */
> diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
> index 78b6ddf..b84361c 100644
> --- a/include/linux/hugetlb.h
> +++ b/include/linux/hugetlb.h
> @@ -109,12 +109,19 @@ static inline void hugetlb_report_meminfo(struct seq_file *m)
>  
>  #endif /* !CONFIG_HUGETLB_PAGE */
>  
> +#define HUGETLB_ANON_FILE "anon_hugepage"
> +
>  enum {
>  	/*
>  	 * The file will be used as an shm file so shmfs accounting rules
>  	 * apply
>  	 */
>  	HUGETLB_SHMFS_INODE     = 0x01,
> +	/*
> +	 * The file is being created on the internal vfs mount and shmfs
> +	 * accounting rules do not apply
> +	 */
> +	HUGETLB_ANONHUGE_INODE  = 0x02,
>  };
>  
>  #ifdef CONFIG_HUGETLBFS

While I think it's appropriate to use an enum here, these two "flags" 
can't be used together so it would probably be better to avoid the 
hexadecimal.

If flags were ever needed in the future, you could reserve the upper eight 
bits of the int for such purposes similiar to mempolicy flags.

> diff --git a/mm/mmap.c b/mm/mmap.c
> index 34579b2..3612b20 100644
> --- a/mm/mmap.c
> +++ b/mm/mmap.c
> @@ -29,6 +29,7 @@
>  #include <linux/rmap.h>
>  #include <linux/mmu_notifier.h>
>  #include <linux/perf_counter.h>
> +#include <linux/hugetlb.h>
>  
>  #include <asm/uaccess.h>
>  #include <asm/cacheflush.h>
> @@ -954,6 +955,21 @@ unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,
>  	if (mm->map_count > sysctl_max_map_count)
>  		return -ENOMEM;
>  
> +	if (flags & MAP_HUGETLB) {
> +		if (file)
> +			return -EINVAL;
> +
> +		/*
> +		 * VM_NORESERVE is used because the reservations will be
> +		 * taken when vm_ops->mmap() is called
> +		 */
> +		len = ALIGN(len, huge_page_size(&default_hstate));
> +		file = hugetlb_file_setup(HUGETLB_ANON_FILE, len, VM_NORESERVE,
> +						HUGETLB_ANONHUGE_INODE);
> +		if (IS_ERR(file))
> +			return -ENOMEM;
> +	}
> +
>  	/* Obtain the address to map to. we verify (or select) it and ensure
>  	 * that it represents a valid section of the address space.
>  	 */

hugetlb_file_setup() can fail for reasons other than failing to reserve 
pages, so maybe it would be better to return PTR_ERR(file) instead of 
hardcoding -ENOMEM?

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

  parent reply	other threads:[~2009-08-13 21:49 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-08-13  9:57 [PATCH 0/3] Add pseudo-anonymous huge page mappings V2 Eric B Munson
2009-08-13  9:57 ` [PATCH 1/3] hugetlbfs: Allow the creation of files suitable for MAP_PRIVATE on the vfs internal mount V2 Eric B Munson
2009-08-13  9:57   ` [PATCH 2/3] Add MAP_HUGETLB for mmaping pseudo-anonymous huge page regions V2 Eric B Munson
2009-08-13  9:57     ` [PATCH 3/3] Add MAP_HUGETLB example to vm/hugetlbpage.txt V2 Eric B Munson
2009-08-13 21:49       ` David Rientjes
2009-08-14  0:46         ` Randy Dunlap
2009-08-14 12:39           ` Eric B Munson
2009-08-13 21:49     ` David Rientjes [this message]
2009-08-14 12:40       ` [PATCH 2/3] Add MAP_HUGETLB for mmaping pseudo-anonymous huge page regions V2 Eric B Munson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=alpine.DEB.2.00.0908131443350.9805@chino.kir.corp.google.com \
    --to=rientjes@google.com \
    --cc=akpm@linux-foundation.org \
    --cc=ebmunson@us.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-man@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mtk.manpages@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox