public inbox for linux-xfs@vger.kernel.org
 help / color / mirror / Atom feed
From: Toshi Kani <toshi.kani@hpe.com>
To: Matthew Wilcox <willy@linux.intel.com>
Cc: jack@suse.cz, linux-nvdimm@lists.01.org,
	linux-kernel@vger.kernel.org, xfs@oss.sgi.com,
	adilger.kernel@dilger.ca, kirill.shutemov@linux.intel.com,
	linux-fsdevel@vger.kernel.org, tytso@mit.edu,
	akpm@linux-foundation.org, linux-ext4@vger.kernel.org,
	ross.zwisler@linux.intel.com, dan.j.williams@intel.com,
	viro@zeniv.linux.org.uk
Subject: Re: [PATCH v2 1/5] dax: add dax_get_unmapped_area for pmd mappings
Date: Wed, 13 Apr 2016 08:55:03 -0600	[thread overview]
Message-ID: <1460559303.24985.52.camel@hpe.com> (raw)
In-Reply-To: <20160413031801.GO2781@linux.intel.com>

On Tue, 2016-04-12 at 23:18 -0400, Matthew Wilcox wrote:
> On Tue, Apr 12, 2016 at 02:39:15PM -0600, Toshi Kani wrote:
> > 
> > + * When the target file is not a DAX file, @addr is specified, the
> > + * request is not suitable for pmd mappings, or mm-
> > >get_unmapped_area()
> > + * failed with extended @len, it simply calls the default handler,
> > + * mm->get_unmapped_area(), with the original arguments.
>
> I think you can lose this paragraph.  It describes what the function
> does, not why it does it ... and we can see what the function does from
> reading the code.

Agreed.  I will remove this paragraph.

> I think this is one of those functions which is actually improved with
> gotos, purely to reduce the indentation level.
> 
> unsigned long dax_get_unmapped_area(struct file *filp, unsigned long
> addr,
> 		unsigned long len, unsigned long pgoff, unsigned long
> flags)
> {
> 	unsigned long off, off_end, off_pmd, len_pmd, addr_pmd;
> 
> 	if (!IS_ENABLED(CONFIG_FS_DAX_PMD) ||
> 	    !filp || addr || !IS_DAX(filp->f_mapping->host))
> 		goto out;
> 
> 	off = pgoff << PAGE_SHIFT;
> 	off_end = off + len;
> 	off_pmd = round_up(off, PMD_SIZE);
> 	if ((off_end <= off_pmd) || ((off_end - off_pmd) < PMD_SIZE))
> 		goto out;
> 
> 	len_pmd = len + PMD_SIZE;
> 	addr_pmd = current->mm->get_unmapped_area(filp, addr, len_pmd,
> 							pgoff, flags);
> 
> 	if (!IS_ERR_VALUE(addr_pmd)) {
> 		addr_pmd += (off - addr_pmd) & (PMD_SIZE - 1);
> 		return addr_pmd;
> 	}
> 
>  out:
> 	return current->mm->get_unmapped_area(filp, addr, len, pgoff,
> flags);
> }

Sounds good.

> Now ... back to the original version, some questions:
> 
> > 
> > +unsigned long dax_get_unmapped_area(struct file *filp, unsigned long
> > addr,
> > +		unsigned long len, unsigned long pgoff, unsigned long
> > flags)
> > +{
> > +	unsigned long off, off_end, off_pmd, len_pmd, addr_pmd;
> > +
> > +	if (IS_ENABLED(CONFIG_FS_DAX_PMD) &&
> > +	    filp && !addr && IS_DAX(filp->f_mapping->host)) {
> > +		off = pgoff << PAGE_SHIFT;
> > +		off_end = off + len;
>
> Can off + len wrap here, or did that get checked earlier?

Yes, do_mmap() has checked this condition earlier.  But, I think I need to
check it for (off + len_pmd).

> > 
> > +		off_pmd = round_up(off, PMD_SIZE);
> > +
> > +		if ((off_end > off_pmd) && ((off_end - off_pmd) >=
> > PMD_SIZE)) {
>
> We're only going to look for a PMD-aligned mapping if the mapping is at
> least double PMD_SIZE?  I don't understand that decision.  Seems to me
> that if I ask to map offset 4MB, length 2MB, I should get a PMD-aligned
> mapping.

It checks if this request can be covered by a PMD page.  'off_pmd' is the
first PMD-aligned offset.  There needs to be at least 2MB from this offset
to the end, 'off_end', in order to cover with a PMD page.

In your example, 'off_pmd' is still 4MB, which has 2MB to the end.  So, so
this request can be covered by a PMD page.

Another example, say, offset 4KB and length 2MB.  'off_pmd' is 2MB, which
has only 4KB to the end.  So, this request cannot be covered by a PMD page.

> Speaking of offset, we don't have any checks that offset is a multiple
> of PMD_SIZE.  I know that theoretically we could map offset 1.5MB, length
> 3MB and see the first 0.5MB filled with small pages, then the next 2MB
> filled with one large page, and the tail filled with small pages, but I
> think we're better off only looking for PMD-alignment if the user asked
> for an aligned offset in the file.

Yes, that's what it checks.  In this case, 'off_pmd' is set to 2MB, which
has 2.5MB to the end.  So, it can be covered by a PMD page.  The offset
itself does not have to be aligned by 2MB.


> > +			len_pmd = len + PMD_SIZE;
> > +
> > +			addr_pmd = current->mm->get_unmapped_area(
> > +					filp, addr, len_pmd, pgoff,
> > flags);
> > +
> > +			if (!IS_ERR_VALUE(addr_pmd)) {
> > +				addr_pmd += (off - addr_pmd) &
> > (PMD_SIZE - 1);
>
> ... then you wouldn't need this calculation ;-)

Applications should not be required to provide a 2MB-aligned offset.

Thanks,
-Toshi

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

      reply	other threads:[~2016-04-13 15:03 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-12 20:39 [PATCH v2 0/5] Align mmap address for DAX pmd mappings Toshi Kani
2016-04-12 20:39 ` [PATCH v2 1/5] dax: add dax_get_unmapped_area for " Toshi Kani
2016-04-13  3:18   ` Matthew Wilcox
2016-04-13 14:55     ` Toshi Kani [this message]

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=1460559303.24985.52.camel@hpe.com \
    --to=toshi.kani@hpe.com \
    --cc=adilger.kernel@dilger.ca \
    --cc=akpm@linux-foundation.org \
    --cc=dan.j.williams@intel.com \
    --cc=jack@suse.cz \
    --cc=kirill.shutemov@linux.intel.com \
    --cc=linux-ext4@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nvdimm@lists.01.org \
    --cc=ross.zwisler@linux.intel.com \
    --cc=tytso@mit.edu \
    --cc=viro@zeniv.linux.org.uk \
    --cc=willy@linux.intel.com \
    --cc=xfs@oss.sgi.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