All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Kirill A. Shutemov" <kirill@shutemov.name>
To: Matthew Wilcox <matthew.r.wilcox@intel.com>
Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.krenel.org,
	linux-mm@kvack.org, Matthew Wilcox <willy@linux.intel.com>
Subject: Re: [PATCH v1 2/7] mm: Prepare for DAX huge pages
Date: Wed, 8 Oct 2014 18:21:24 +0300	[thread overview]
Message-ID: <20141008152124.GA7288@node.dhcp.inet.fi> (raw)
In-Reply-To: <1412774729-23956-3-git-send-email-matthew.r.wilcox@intel.com>

On Wed, Oct 08, 2014 at 09:25:24AM -0400, Matthew Wilcox wrote:
> From: Matthew Wilcox <willy@linux.intel.com>
> 
> DAX wants to use the 'special' bit to mark PMD entries that are not backed
> by struct page, just as for PTEs. 

Hm. I don't see where you use PMD without special set.

> Add pmd_special() and pmd_mkspecial
> for x86 (nb: also need to be added for other architectures).  Prepare
> do_huge_pmd_wp_page(), zap_huge_pmd() and __split_huge_page_pmd() to
> handle pmd_special entries.
> 
> Signed-off-by: Matthew Wilcox <willy@linux.intel.com>
> ---
>  arch/x86/include/asm/pgtable.h | 10 +++++++++
>  mm/huge_memory.c               | 51 ++++++++++++++++++++++++++----------------
>  2 files changed, 42 insertions(+), 19 deletions(-)
> 
> diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h
> index aa97a07..f4f42f2 100644
> --- a/arch/x86/include/asm/pgtable.h
> +++ b/arch/x86/include/asm/pgtable.h
> @@ -302,6 +302,11 @@ static inline pmd_t pmd_mknotpresent(pmd_t pmd)
>  	return pmd_clear_flags(pmd, _PAGE_PRESENT);
>  }
>  
> +static inline pmd_t pmd_mkspecial(pmd_t pmd)
> +{
> +	return pmd_set_flags(pmd, _PAGE_SPECIAL);
> +}
> +
>  #ifdef CONFIG_HAVE_ARCH_SOFT_DIRTY
>  static inline int pte_soft_dirty(pte_t pte)
>  {
> @@ -504,6 +509,11 @@ static inline int pmd_none(pmd_t pmd)
>  	return (unsigned long)native_pmd_val(pmd) == 0;
>  }
>  
> +static inline int pmd_special(pmd_t pmd)
> +{
> +	return (pmd_flags(pmd) & _PAGE_SPECIAL) && pmd_present(pmd);
> +}
> +
>  static inline unsigned long pmd_page_vaddr(pmd_t pmd)
>  {
>  	return (unsigned long)__va(pmd_val(pmd) & PTE_PFN_MASK);
> diff --git a/mm/huge_memory.c b/mm/huge_memory.c
> index 2a56ddd..ad09fc1 100644
> --- a/mm/huge_memory.c
> +++ b/mm/huge_memory.c
> @@ -1096,7 +1096,6 @@ int do_huge_pmd_wp_page(struct mm_struct *mm, struct vm_area_struct *vma,
>  	unsigned long mmun_end;		/* For mmu_notifiers */
>  
>  	ptl = pmd_lockptr(mm, pmd);
> -	VM_BUG_ON(!vma->anon_vma);
>  	haddr = address & HPAGE_PMD_MASK;
>  	if (is_huge_zero_pmd(orig_pmd))
>  		goto alloc;
> @@ -1104,9 +1103,20 @@ int do_huge_pmd_wp_page(struct mm_struct *mm, struct vm_area_struct *vma,
>  	if (unlikely(!pmd_same(*pmd, orig_pmd)))
>  		goto out_unlock;
>  
> -	page = pmd_page(orig_pmd);
> -	VM_BUG_ON_PAGE(!PageCompound(page) || !PageHead(page), page);
> -	if (page_mapcount(page) == 1) {
> +	if (pmd_special(orig_pmd)) {
> +		/* VM_MIXEDMAP !pfn_valid() case */
> +		if ((vma->vm_flags & (VM_WRITE|VM_SHARED)) !=
> +				     (VM_WRITE|VM_SHARED)) {
> +			pmdp_clear_flush(vma, haddr, pmd);
> +			ret = VM_FAULT_FALLBACK;

No private THP pages with THP? Why?
It should be trivial: we already have a code path for !page case for zero
page and it shouldn't be too hard to modify do_dax_pmd_fault() to support
COW.

I remeber I've mentioned that you don't think it's reasonable to allocate
2M page on COW, but that's what we do for anon memory...

-- 
 Kirill A. Shutemov

--
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>

  reply	other threads:[~2014-10-08 15:21 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-08 13:25 [PATCH v1 0/7] Huge page support for DAX Matthew Wilcox
2014-10-08 13:25 ` Matthew Wilcox
2014-10-08 13:25 ` [PATCH v1 1/7] thp: vma_adjust_trans_huge(): adjust file-backed VMA too Matthew Wilcox
2014-10-08 13:25   ` Matthew Wilcox
2014-10-08 13:25 ` [PATCH v1 2/7] mm: Prepare for DAX huge pages Matthew Wilcox
2014-10-08 13:25   ` Matthew Wilcox
2014-10-08 15:21   ` Kirill A. Shutemov [this message]
2014-10-08 15:57     ` Matthew Wilcox
2014-10-08 19:43       ` Kirill A. Shutemov
2014-10-08 19:43         ` Kirill A. Shutemov
2014-10-09 20:40         ` Matthew Wilcox
2014-10-09 20:40           ` Matthew Wilcox
2014-10-13 20:36           ` Kirill A. Shutemov
2014-10-13 20:36             ` Kirill A. Shutemov
2014-10-08 13:25 ` [PATCH v1 3/7] mm: Add vm_insert_pfn_pmd() Matthew Wilcox
2014-10-08 13:25 ` [PATCH v1 4/7] mm: Add a pmd_fault handler Matthew Wilcox
2014-10-08 13:25   ` Matthew Wilcox
2014-10-08 13:25 ` [PATCH v1 5/7] dax: Add huge page fault support Matthew Wilcox
2014-10-08 13:25   ` Matthew Wilcox
2014-10-08 20:11   ` Kirill A. Shutemov
2014-10-08 20:11     ` Kirill A. Shutemov
2014-10-09 20:47     ` Matthew Wilcox
2014-10-09 20:47       ` Matthew Wilcox
2014-10-13  1:13       ` Dave Chinner
2014-10-13  1:13         ` Dave Chinner
2014-10-08 13:25 ` [PATCH v1 6/7] ext2: Huge " Matthew Wilcox
2014-10-08 13:25   ` Matthew Wilcox
2014-10-08 13:25 ` [PATCH v1 7/7] ext4: " Matthew Wilcox
2014-10-08 13:25   ` Matthew Wilcox

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=20141008152124.GA7288@node.dhcp.inet.fi \
    --to=kirill@shutemov.name \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.krenel.org \
    --cc=linux-mm@kvack.org \
    --cc=matthew.r.wilcox@intel.com \
    --cc=willy@linux.intel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.