diff mbox

mm: move huge_pmd_set_accessed out of huge_memory.c

Message ID 1461176698-9714-1-git-send-email-yang.shi@linaro.org
State New
Headers show

Commit Message

Yang Shi April 20, 2016, 6:24 p.m. UTC
huge_pmd_set_accessed is only called by __handle_mm_fault from memory.c,
move the definition to memory.c and make it static like create_huge_pmd and
wp_huge_pmd.

Signed-off-by: Yang Shi <yang.shi@linaro.org>

---
 include/linux/huge_mm.h |  4 ----
 mm/huge_memory.c        | 23 -----------------------
 mm/memory.c             | 23 +++++++++++++++++++++++
 3 files changed, 23 insertions(+), 27 deletions(-)

-- 
2.0.2

Comments

Yang Shi April 20, 2016, 9 p.m. UTC | #1
Hi folks,

I didn't realize pmd_* functions are protected by 
CONFIG_TRANSPARENT_HUGEPAGE on the most architectures before I made this 
change.

Before I fix all the affected architectures code, I want to check if you 
guys think this change is worth or not?

Thanks,
Yang

On 4/20/2016 11:24 AM, Yang Shi wrote:
> huge_pmd_set_accessed is only called by __handle_mm_fault from memory.c,

> move the definition to memory.c and make it static like create_huge_pmd and

> wp_huge_pmd.

>

> Signed-off-by: Yang Shi <yang.shi@linaro.org>

> ---

>   include/linux/huge_mm.h |  4 ----

>   mm/huge_memory.c        | 23 -----------------------

>   mm/memory.c             | 23 +++++++++++++++++++++++

>   3 files changed, 23 insertions(+), 27 deletions(-)

>

> diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h

> index 7008623..c218ab7b 100644

> --- a/include/linux/huge_mm.h

> +++ b/include/linux/huge_mm.h

> @@ -8,10 +8,6 @@ extern int do_huge_pmd_anonymous_page(struct mm_struct *mm,

>   extern int copy_huge_pmd(struct mm_struct *dst_mm, struct mm_struct *src_mm,

>   			 pmd_t *dst_pmd, pmd_t *src_pmd, unsigned long addr,

>   			 struct vm_area_struct *vma);

> -extern void huge_pmd_set_accessed(struct mm_struct *mm,

> -				  struct vm_area_struct *vma,

> -				  unsigned long address, pmd_t *pmd,

> -				  pmd_t orig_pmd, int dirty);

>   extern int do_huge_pmd_wp_page(struct mm_struct *mm, struct vm_area_struct *vma,

>   			       unsigned long address, pmd_t *pmd,

>   			       pmd_t orig_pmd);

> diff --git a/mm/huge_memory.c b/mm/huge_memory.c

> index fecbbc5..6c14cb6 100644

> --- a/mm/huge_memory.c

> +++ b/mm/huge_memory.c

> @@ -1137,29 +1137,6 @@ out:

>   	return ret;

>   }

>

> -void huge_pmd_set_accessed(struct mm_struct *mm,

> -			   struct vm_area_struct *vma,

> -			   unsigned long address,

> -			   pmd_t *pmd, pmd_t orig_pmd,

> -			   int dirty)

> -{

> -	spinlock_t *ptl;

> -	pmd_t entry;

> -	unsigned long haddr;

> -

> -	ptl = pmd_lock(mm, pmd);

> -	if (unlikely(!pmd_same(*pmd, orig_pmd)))

> -		goto unlock;

> -

> -	entry = pmd_mkyoung(orig_pmd);

> -	haddr = address & HPAGE_PMD_MASK;

> -	if (pmdp_set_access_flags(vma, haddr, pmd, entry, dirty))

> -		update_mmu_cache_pmd(vma, address, pmd);

> -

> -unlock:

> -	spin_unlock(ptl);

> -}

> -

>   static int do_huge_pmd_wp_page_fallback(struct mm_struct *mm,

>   					struct vm_area_struct *vma,

>   					unsigned long address,

> diff --git a/mm/memory.c b/mm/memory.c

> index 93897f2..6ced4eb 100644

> --- a/mm/memory.c

> +++ b/mm/memory.c

> @@ -3287,6 +3287,29 @@ static int wp_huge_pmd(struct mm_struct *mm, struct vm_area_struct *vma,

>   	return VM_FAULT_FALLBACK;

>   }

>

> +static void huge_pmd_set_accessed(struct mm_struct *mm,

> +				  struct vm_area_struct *vma,

> +				  unsigned long address,

> +				  pmd_t *pmd, pmd_t orig_pmd,

> +				  int dirty)

> +{

> +	spinlock_t *ptl;

> +	pmd_t entry;

> +	unsigned long haddr;

> +

> +	ptl = pmd_lock(mm, pmd);

> +	if (unlikely(!pmd_same(*pmd, orig_pmd)))

> +		goto unlock;

> +

> +	entry = pmd_mkyoung(orig_pmd);

> +	haddr = address & HPAGE_PMD_MASK;

> +	if (pmdp_set_access_flags(vma, haddr, pmd, entry, dirty))

> +		update_mmu_cache_pmd(vma, address, pmd);

> +

> +unlock:

> +	spin_unlock(ptl);

> +}

> +

>   /*

>    * These routines also need to handle stuff like marking pages dirty

>    * and/or accessed for architectures that don't do it in hardware (most

>
Yang Shi April 21, 2016, 10:56 p.m. UTC | #2
On 4/21/2016 12:30 AM, Kirill A. Shutemov wrote:
> On Wed, Apr 20, 2016 at 02:00:11PM -0700, Shi, Yang wrote:

>> Hi folks,

>>

>> I didn't realize pmd_* functions are protected by

>> CONFIG_TRANSPARENT_HUGEPAGE on the most architectures before I made this

>> change.

>>

>> Before I fix all the affected architectures code, I want to check if you

>> guys think this change is worth or not?

>>

>> Thanks,

>> Yang

>>

>> On 4/20/2016 11:24 AM, Yang Shi wrote:

>>> huge_pmd_set_accessed is only called by __handle_mm_fault from memory.c,

>>> move the definition to memory.c and make it static like create_huge_pmd and

>>> wp_huge_pmd.

>>>

>>> Signed-off-by: Yang Shi <yang.shi@linaro.org>

>

> On pte side we have the same functionality open-coded. Should we do the

> same for pmd? Or change pte side the same way?


Sorry, I don't quite understand you. Do you mean pte_* functions?

Thanks,
Yang

>
Yang Shi April 21, 2016, 10:57 p.m. UTC | #3
On 4/21/2016 2:15 AM, Hugh Dickins wrote:
> On Wed, 20 Apr 2016, Shi, Yang wrote:

>

>> Hi folks,

>>

>> I didn't realize pmd_* functions are protected by CONFIG_TRANSPARENT_HUGEPAGE

>> on the most architectures before I made this change.

>>

>> Before I fix all the affected architectures code, I want to check if you guys

>> think this change is worth or not?

>

> Thanks for asking: no, it is not worthwhile.

>

> I would much prefer not to have to consider these trivial cleanups

> in the huge memory area at this time.  Kirill and I have urgent work

> to do in this area, and coping with patch conflicts between different

> versions of the source will not help any of us.


Thanks for your suggestion. I would consider to put such cleanup work on 
the back burner.

Yang

>

> Thanks,

> Hugh

>

>>

>> Thanks,

>> Yang

>>

>> On 4/20/2016 11:24 AM, Yang Shi wrote:

>>> huge_pmd_set_accessed is only called by __handle_mm_fault from memory.c,

>>> move the definition to memory.c and make it static like create_huge_pmd and

>>> wp_huge_pmd.

>>>

>>> Signed-off-by: Yang Shi <yang.shi@linaro.org>

>>> ---

>>>    include/linux/huge_mm.h |  4 ----

>>>    mm/huge_memory.c        | 23 -----------------------

>>>    mm/memory.c             | 23 +++++++++++++++++++++++

>>>    3 files changed, 23 insertions(+), 27 deletions(-)

>>>

>>> diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h

>>> index 7008623..c218ab7b 100644

>>> --- a/include/linux/huge_mm.h

>>> +++ b/include/linux/huge_mm.h

>>> @@ -8,10 +8,6 @@ extern int do_huge_pmd_anonymous_page(struct mm_struct

>>> *mm,

>>>    extern int copy_huge_pmd(struct mm_struct *dst_mm, struct mm_struct

>>> *src_mm,

>>>    			 pmd_t *dst_pmd, pmd_t *src_pmd, unsigned long addr,

>>>    			 struct vm_area_struct *vma);

>>> -extern void huge_pmd_set_accessed(struct mm_struct *mm,

>>> -				  struct vm_area_struct *vma,

>>> -				  unsigned long address, pmd_t *pmd,

>>> -				  pmd_t orig_pmd, int dirty);

>>>    extern int do_huge_pmd_wp_page(struct mm_struct *mm, struct

>>> vm_area_struct *vma,

>>>    			       unsigned long address, pmd_t *pmd,

>>>    			       pmd_t orig_pmd);

>>> diff --git a/mm/huge_memory.c b/mm/huge_memory.c

>>> index fecbbc5..6c14cb6 100644

>>> --- a/mm/huge_memory.c

>>> +++ b/mm/huge_memory.c

>>> @@ -1137,29 +1137,6 @@ out:

>>>    	return ret;

>>>    }

>>>

>>> -void huge_pmd_set_accessed(struct mm_struct *mm,

>>> -			   struct vm_area_struct *vma,

>>> -			   unsigned long address,

>>> -			   pmd_t *pmd, pmd_t orig_pmd,

>>> -			   int dirty)

>>> -{

>>> -	spinlock_t *ptl;

>>> -	pmd_t entry;

>>> -	unsigned long haddr;

>>> -

>>> -	ptl = pmd_lock(mm, pmd);

>>> -	if (unlikely(!pmd_same(*pmd, orig_pmd)))

>>> -		goto unlock;

>>> -

>>> -	entry = pmd_mkyoung(orig_pmd);

>>> -	haddr = address & HPAGE_PMD_MASK;

>>> -	if (pmdp_set_access_flags(vma, haddr, pmd, entry, dirty))

>>> -		update_mmu_cache_pmd(vma, address, pmd);

>>> -

>>> -unlock:

>>> -	spin_unlock(ptl);

>>> -}

>>> -

>>>    static int do_huge_pmd_wp_page_fallback(struct mm_struct *mm,

>>>    					struct vm_area_struct *vma,

>>>    					unsigned long address,

>>> diff --git a/mm/memory.c b/mm/memory.c

>>> index 93897f2..6ced4eb 100644

>>> --- a/mm/memory.c

>>> +++ b/mm/memory.c

>>> @@ -3287,6 +3287,29 @@ static int wp_huge_pmd(struct mm_struct *mm, struct

>>> vm_area_struct *vma,

>>>    	return VM_FAULT_FALLBACK;

>>>    }

>>>

>>> +static void huge_pmd_set_accessed(struct mm_struct *mm,

>>> +				  struct vm_area_struct *vma,

>>> +				  unsigned long address,

>>> +				  pmd_t *pmd, pmd_t orig_pmd,

>>> +				  int dirty)

>>> +{

>>> +	spinlock_t *ptl;

>>> +	pmd_t entry;

>>> +	unsigned long haddr;

>>> +

>>> +	ptl = pmd_lock(mm, pmd);

>>> +	if (unlikely(!pmd_same(*pmd, orig_pmd)))

>>> +		goto unlock;

>>> +

>>> +	entry = pmd_mkyoung(orig_pmd);

>>> +	haddr = address & HPAGE_PMD_MASK;

>>> +	if (pmdp_set_access_flags(vma, haddr, pmd, entry, dirty))

>>> +		update_mmu_cache_pmd(vma, address, pmd);

>>> +

>>> +unlock:

>>> +	spin_unlock(ptl);

>>> +}

>>> +

>>>    /*

>>>     * These routines also need to handle stuff like marking pages dirty

>>>     * and/or accessed for architectures that don't do it in hardware (most
Yang Shi April 29, 2016, 6:09 p.m. UTC | #4
On 4/22/2016 2:48 AM, Kirill A. Shutemov wrote:
> On Thu, Apr 21, 2016 at 03:56:07PM -0700, Shi, Yang wrote:

>> On 4/21/2016 12:30 AM, Kirill A. Shutemov wrote:

>>> On Wed, Apr 20, 2016 at 02:00:11PM -0700, Shi, Yang wrote:

>>>> Hi folks,

>>>>

>>>> I didn't realize pmd_* functions are protected by

>>>> CONFIG_TRANSPARENT_HUGEPAGE on the most architectures before I made this

>>>> change.

>>>>

>>>> Before I fix all the affected architectures code, I want to check if you

>>>> guys think this change is worth or not?

>>>>

>>>> Thanks,

>>>> Yang

>>>>

>>>> On 4/20/2016 11:24 AM, Yang Shi wrote:

>>>>> huge_pmd_set_accessed is only called by __handle_mm_fault from memory.c,

>>>>> move the definition to memory.c and make it static like create_huge_pmd and

>>>>> wp_huge_pmd.

>>>>>

>>>>> Signed-off-by: Yang Shi <yang.shi@linaro.org>

>>>

>>> On pte side we have the same functionality open-coded. Should we do the

>>> same for pmd? Or change pte side the same way?

>>

>> Sorry, I don't quite understand you. Do you mean pte_* functions?

>

> See handle_pte_fault(), we do the same for pte there what

> huge_pmd_set_accessed() does for pmd.


Thanks for directing to this code.

>

> I think we should be consistent here: either both are abstructed into

> functions or both open-coded.


I'm supposed functions sound better. However, do_wp_page has to be 
called with pte lock acquired. So, the abstracted function has to call it.

Thanks,
Yang


>
diff mbox

Patch

diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h
index 7008623..c218ab7b 100644
--- a/include/linux/huge_mm.h
+++ b/include/linux/huge_mm.h
@@ -8,10 +8,6 @@  extern int do_huge_pmd_anonymous_page(struct mm_struct *mm,
 extern int copy_huge_pmd(struct mm_struct *dst_mm, struct mm_struct *src_mm,
 			 pmd_t *dst_pmd, pmd_t *src_pmd, unsigned long addr,
 			 struct vm_area_struct *vma);
-extern void huge_pmd_set_accessed(struct mm_struct *mm,
-				  struct vm_area_struct *vma,
-				  unsigned long address, pmd_t *pmd,
-				  pmd_t orig_pmd, int dirty);
 extern int do_huge_pmd_wp_page(struct mm_struct *mm, struct vm_area_struct *vma,
 			       unsigned long address, pmd_t *pmd,
 			       pmd_t orig_pmd);
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index fecbbc5..6c14cb6 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -1137,29 +1137,6 @@  out:
 	return ret;
 }
 
-void huge_pmd_set_accessed(struct mm_struct *mm,
-			   struct vm_area_struct *vma,
-			   unsigned long address,
-			   pmd_t *pmd, pmd_t orig_pmd,
-			   int dirty)
-{
-	spinlock_t *ptl;
-	pmd_t entry;
-	unsigned long haddr;
-
-	ptl = pmd_lock(mm, pmd);
-	if (unlikely(!pmd_same(*pmd, orig_pmd)))
-		goto unlock;
-
-	entry = pmd_mkyoung(orig_pmd);
-	haddr = address & HPAGE_PMD_MASK;
-	if (pmdp_set_access_flags(vma, haddr, pmd, entry, dirty))
-		update_mmu_cache_pmd(vma, address, pmd);
-
-unlock:
-	spin_unlock(ptl);
-}
-
 static int do_huge_pmd_wp_page_fallback(struct mm_struct *mm,
 					struct vm_area_struct *vma,
 					unsigned long address,
diff --git a/mm/memory.c b/mm/memory.c
index 93897f2..6ced4eb 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -3287,6 +3287,29 @@  static int wp_huge_pmd(struct mm_struct *mm, struct vm_area_struct *vma,
 	return VM_FAULT_FALLBACK;
 }
 
+static void huge_pmd_set_accessed(struct mm_struct *mm,
+				  struct vm_area_struct *vma,
+				  unsigned long address,
+				  pmd_t *pmd, pmd_t orig_pmd,
+				  int dirty)
+{
+	spinlock_t *ptl;
+	pmd_t entry;
+	unsigned long haddr;
+
+	ptl = pmd_lock(mm, pmd);
+	if (unlikely(!pmd_same(*pmd, orig_pmd)))
+		goto unlock;
+
+	entry = pmd_mkyoung(orig_pmd);
+	haddr = address & HPAGE_PMD_MASK;
+	if (pmdp_set_access_flags(vma, haddr, pmd, entry, dirty))
+		update_mmu_cache_pmd(vma, address, pmd);
+
+unlock:
+	spin_unlock(ptl);
+}
+
 /*
  * These routines also need to handle stuff like marking pages dirty
  * and/or accessed for architectures that don't do it in hardware (most