* [PATCH] arm64: mm: Add pgd_page to support RCU fast_gup @ 2014-12-20 0:49 Jungseok Lee 2014-12-21 10:56 ` Will Deacon 0 siblings, 1 reply; 11+ messages in thread From: Jungseok Lee @ 2014-12-20 0:49 UTC (permalink / raw) To: linux-arm-kernel This patch adds pgd_page definition in order to keep supporting HAVE_GENERIC_RCU_GUP configuration. In addition, it changes pud_page expression to align with pmd_page for readability. An introduction of pgd_page resolves the following build breakage under 4KB + 4Level memory management combo. mm/gup.c: In function 'gup_huge_pgd': mm/gup.c:889:2: error: implicit declaration of function 'pgd_page' [-Werror=implicit-function-declaration] head = pgd_page(orig); ^ mm/gup.c:889:7: warning: assignment makes pointer from integer without a cast head = pgd_page(orig); Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Will Deacon <will.deacon@arm.com> Cc: Steve Capper <steve.capper@linaro.org> Signed-off-by: Jungseok Lee <jungseoklee85@gmail.com> --- arch/arm64/include/asm/pgtable.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h index df22314..a1fe927 100644 --- a/arch/arm64/include/asm/pgtable.h +++ b/arch/arm64/include/asm/pgtable.h @@ -401,7 +401,7 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr) return (pmd_t *)pud_page_vaddr(*pud) + pmd_index(addr); } -#define pud_page(pud) pmd_page(pud_pmd(pud)) +#define pud_page(pud) pfn_to_page(__phys_to_pfn(pud_val(pud) & PHYS_MASK)) #endif /* CONFIG_ARM64_PGTABLE_LEVELS > 2 */ @@ -437,6 +437,8 @@ static inline pud_t *pud_offset(pgd_t *pgd, unsigned long addr) return (pud_t *)pgd_page_vaddr(*pgd) + pud_index(addr); } +#define pgd_page(pgd) pfn_to_page(__phys_to_pfn(pgd_val(pgd) & PHYS_MASK)) + #endif /* CONFIG_ARM64_PGTABLE_LEVELS > 3 */ #define pgd_ERROR(pgd) __pgd_error(__FILE__, __LINE__, pgd_val(pgd)) -- 1.9.1 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH] arm64: mm: Add pgd_page to support RCU fast_gup 2014-12-20 0:49 [PATCH] arm64: mm: Add pgd_page to support RCU fast_gup Jungseok Lee @ 2014-12-21 10:56 ` Will Deacon 2014-12-22 12:30 ` Catalin Marinas 2014-12-23 15:25 ` Catalin Marinas 0 siblings, 2 replies; 11+ messages in thread From: Will Deacon @ 2014-12-21 10:56 UTC (permalink / raw) To: linux-arm-kernel On Sat, Dec 20, 2014 at 12:49:40AM +0000, Jungseok Lee wrote: > This patch adds pgd_page definition in order to keep supporting > HAVE_GENERIC_RCU_GUP configuration. In addition, it changes pud_page > expression to align with pmd_page for readability. > > An introduction of pgd_page resolves the following build breakage > under 4KB + 4Level memory management combo. > > mm/gup.c: In function 'gup_huge_pgd': > mm/gup.c:889:2: error: implicit declaration of function 'pgd_page' [-Werror=implicit-function-declaration] > head = pgd_page(orig); > ^ > mm/gup.c:889:7: warning: assignment makes pointer from integer without a cast > head = pgd_page(orig); > > Cc: Catalin Marinas <catalin.marinas@arm.com> > Cc: Will Deacon <will.deacon@arm.com> > Cc: Steve Capper <steve.capper@linaro.org> > Signed-off-by: Jungseok Lee <jungseoklee85@gmail.com> > --- > arch/arm64/include/asm/pgtable.h | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h > index df22314..a1fe927 100644 > --- a/arch/arm64/include/asm/pgtable.h > +++ b/arch/arm64/include/asm/pgtable.h > @@ -401,7 +401,7 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr) > return (pmd_t *)pud_page_vaddr(*pud) + pmd_index(addr); > } > > -#define pud_page(pud) pmd_page(pud_pmd(pud)) > +#define pud_page(pud) pfn_to_page(__phys_to_pfn(pud_val(pud) & PHYS_MASK)) It would be cleaner to use pud_pfn here, otherwise we end up passing a physical address with the lower attributes present to __phys_to_pfn, which "knows" to shift them away. > #endif /* CONFIG_ARM64_PGTABLE_LEVELS > 2 */ > > @@ -437,6 +437,8 @@ static inline pud_t *pud_offset(pgd_t *pgd, unsigned long addr) > return (pud_t *)pgd_page_vaddr(*pgd) + pud_index(addr); > } > > +#define pgd_page(pgd) pfn_to_page(__phys_to_pfn(pgd_val(pgd) & PHYS_MASK)) Then you'd need to define pgd_pfn for this guy. With that change: Acked-by: Will Deacon <will.deacon@arm.com> Will ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH] arm64: mm: Add pgd_page to support RCU fast_gup 2014-12-21 10:56 ` Will Deacon @ 2014-12-22 12:30 ` Catalin Marinas 2014-12-22 15:11 ` Jungseok Lee 2014-12-23 15:25 ` Catalin Marinas 1 sibling, 1 reply; 11+ messages in thread From: Catalin Marinas @ 2014-12-22 12:30 UTC (permalink / raw) To: linux-arm-kernel On Sun, Dec 21, 2014 at 10:56:33AM +0000, Will Deacon wrote: > On Sat, Dec 20, 2014 at 12:49:40AM +0000, Jungseok Lee wrote: > > This patch adds pgd_page definition in order to keep supporting > > HAVE_GENERIC_RCU_GUP configuration. In addition, it changes pud_page > > expression to align with pmd_page for readability. > > > > An introduction of pgd_page resolves the following build breakage > > under 4KB + 4Level memory management combo. > > > > mm/gup.c: In function 'gup_huge_pgd': > > mm/gup.c:889:2: error: implicit declaration of function 'pgd_page' [-Werror=implicit-function-declaration] > > head = pgd_page(orig); > > ^ > > mm/gup.c:889:7: warning: assignment makes pointer from integer without a cast > > head = pgd_page(orig); > > > > Cc: Catalin Marinas <catalin.marinas@arm.com> > > Cc: Will Deacon <will.deacon@arm.com> > > Cc: Steve Capper <steve.capper@linaro.org> > > Signed-off-by: Jungseok Lee <jungseoklee85@gmail.com> > > --- > > arch/arm64/include/asm/pgtable.h | 4 +++- > > 1 file changed, 3 insertions(+), 1 deletion(-) > > > > diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h > > index df22314..a1fe927 100644 > > --- a/arch/arm64/include/asm/pgtable.h > > +++ b/arch/arm64/include/asm/pgtable.h > > @@ -401,7 +401,7 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr) > > return (pmd_t *)pud_page_vaddr(*pud) + pmd_index(addr); > > } > > > > -#define pud_page(pud) pmd_page(pud_pmd(pud)) > > +#define pud_page(pud) pfn_to_page(__phys_to_pfn(pud_val(pud) & PHYS_MASK)) > > It would be cleaner to use pud_pfn here, otherwise we end up passing a > physical address with the lower attributes present to __phys_to_pfn, which > "knows" to shift them away. It looks like we did the same with pmd_page() but not with pte_page(), the latter using pte_pfn(). It's not a problem with lower attributes because they are within the first 12 bits, so the shifting gets rid of them. For pmd/pud/pgd, bits above 12 and up to the actual address must be 0. I agree with changing all of them to use pte/pmd/pud/pgd_pfn but I'm inclined to merge this patch now to fix the kernel build and we'll look at the clean-up after Christmas. -- Catalin ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH] arm64: mm: Add pgd_page to support RCU fast_gup 2014-12-22 12:30 ` Catalin Marinas @ 2014-12-22 15:11 ` Jungseok Lee 2014-12-22 15:31 ` Catalin Marinas 0 siblings, 1 reply; 11+ messages in thread From: Jungseok Lee @ 2014-12-22 15:11 UTC (permalink / raw) To: linux-arm-kernel On Dec 22, 2014, at 9:30 PM, Catalin Marinas wrote: > On Sun, Dec 21, 2014 at 10:56:33AM +0000, Will Deacon wrote: >> On Sat, Dec 20, 2014 at 12:49:40AM +0000, Jungseok Lee wrote: >>> This patch adds pgd_page definition in order to keep supporting >>> HAVE_GENERIC_RCU_GUP configuration. In addition, it changes pud_page >>> expression to align with pmd_page for readability. >>> >>> An introduction of pgd_page resolves the following build breakage >>> under 4KB + 4Level memory management combo. >>> >>> mm/gup.c: In function 'gup_huge_pgd': >>> mm/gup.c:889:2: error: implicit declaration of function 'pgd_page' [-Werror=implicit-function-declaration] >>> head = pgd_page(orig); >>> ^ >>> mm/gup.c:889:7: warning: assignment makes pointer from integer without a cast >>> head = pgd_page(orig); >>> >>> Cc: Catalin Marinas <catalin.marinas@arm.com> >>> Cc: Will Deacon <will.deacon@arm.com> >>> Cc: Steve Capper <steve.capper@linaro.org> >>> Signed-off-by: Jungseok Lee <jungseoklee85@gmail.com> >>> --- >>> arch/arm64/include/asm/pgtable.h | 4 +++- >>> 1 file changed, 3 insertions(+), 1 deletion(-) >>> >>> diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h >>> index df22314..a1fe927 100644 >>> --- a/arch/arm64/include/asm/pgtable.h >>> +++ b/arch/arm64/include/asm/pgtable.h >>> @@ -401,7 +401,7 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr) >>> return (pmd_t *)pud_page_vaddr(*pud) + pmd_index(addr); >>> } >>> >>> -#define pud_page(pud) pmd_page(pud_pmd(pud)) >>> +#define pud_page(pud) pfn_to_page(__phys_to_pfn(pud_val(pud) & PHYS_MASK)) >> >> It would be cleaner to use pud_pfn here, otherwise we end up passing a >> physical address with the lower attributes present to __phys_to_pfn, which >> "knows" to shift them away. > > It looks like we did the same with pmd_page() but not with pte_page(), > the latter using pte_pfn(). > > It's not a problem with lower attributes because they are within the > first 12 bits, so the shifting gets rid of them. For pmd/pud/pgd, bits > above 12 and up to the actual address must be 0. > > I agree with changing all of them to use pte/pmd/pud/pgd_pfn but I'm > inclined to merge this patch now to fix the kernel build and we'll look > at the clean-up after Christmas. Either way, I'm fine. Best Regards Jungseok Lee ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH] arm64: mm: Add pgd_page to support RCU fast_gup 2014-12-22 15:11 ` Jungseok Lee @ 2014-12-22 15:31 ` Catalin Marinas 2014-12-22 16:28 ` Catalin Marinas 0 siblings, 1 reply; 11+ messages in thread From: Catalin Marinas @ 2014-12-22 15:31 UTC (permalink / raw) To: linux-arm-kernel On Mon, Dec 22, 2014 at 03:11:37PM +0000, Jungseok Lee wrote: > On Dec 22, 2014, at 9:30 PM, Catalin Marinas wrote: > > On Sun, Dec 21, 2014 at 10:56:33AM +0000, Will Deacon wrote: > >> On Sat, Dec 20, 2014 at 12:49:40AM +0000, Jungseok Lee wrote: > >>> This patch adds pgd_page definition in order to keep supporting > >>> HAVE_GENERIC_RCU_GUP configuration. In addition, it changes pud_page > >>> expression to align with pmd_page for readability. > >>> > >>> An introduction of pgd_page resolves the following build breakage > >>> under 4KB + 4Level memory management combo. > >>> > >>> mm/gup.c: In function 'gup_huge_pgd': > >>> mm/gup.c:889:2: error: implicit declaration of function 'pgd_page' [-Werror=implicit-function-declaration] > >>> head = pgd_page(orig); > >>> ^ > >>> mm/gup.c:889:7: warning: assignment makes pointer from integer without a cast > >>> head = pgd_page(orig); > >>> > >>> Cc: Catalin Marinas <catalin.marinas@arm.com> > >>> Cc: Will Deacon <will.deacon@arm.com> > >>> Cc: Steve Capper <steve.capper@linaro.org> > >>> Signed-off-by: Jungseok Lee <jungseoklee85@gmail.com> > >>> --- > >>> arch/arm64/include/asm/pgtable.h | 4 +++- > >>> 1 file changed, 3 insertions(+), 1 deletion(-) > >>> > >>> diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h > >>> index df22314..a1fe927 100644 > >>> --- a/arch/arm64/include/asm/pgtable.h > >>> +++ b/arch/arm64/include/asm/pgtable.h > >>> @@ -401,7 +401,7 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr) > >>> return (pmd_t *)pud_page_vaddr(*pud) + pmd_index(addr); > >>> } > >>> > >>> -#define pud_page(pud) pmd_page(pud_pmd(pud)) > >>> +#define pud_page(pud) pfn_to_page(__phys_to_pfn(pud_val(pud) & PHYS_MASK)) > >> > >> It would be cleaner to use pud_pfn here, otherwise we end up passing a > >> physical address with the lower attributes present to __phys_to_pfn, which > >> "knows" to shift them away. > > > > It looks like we did the same with pmd_page() but not with pte_page(), > > the latter using pte_pfn(). > > > > It's not a problem with lower attributes because they are within the > > first 12 bits, so the shifting gets rid of them. For pmd/pud/pgd, bits > > above 12 and up to the actual address must be 0. > > > > I agree with changing all of them to use pte/pmd/pud/pgd_pfn but I'm > > inclined to merge this patch now to fix the kernel build and we'll look > > at the clean-up after Christmas. > > Either way, I'm fine. Unless you post an updated patch quickly enough ;) -- Catalin ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH] arm64: mm: Add pgd_page to support RCU fast_gup 2014-12-22 15:31 ` Catalin Marinas @ 2014-12-22 16:28 ` Catalin Marinas 2014-12-23 15:37 ` Jungseok Lee 0 siblings, 1 reply; 11+ messages in thread From: Catalin Marinas @ 2014-12-22 16:28 UTC (permalink / raw) To: linux-arm-kernel On Mon, Dec 22, 2014 at 03:31:12PM +0000, Catalin Marinas wrote: > On Mon, Dec 22, 2014 at 03:11:37PM +0000, Jungseok Lee wrote: > > On Dec 22, 2014, at 9:30 PM, Catalin Marinas wrote: > > > On Sun, Dec 21, 2014 at 10:56:33AM +0000, Will Deacon wrote: > > >> On Sat, Dec 20, 2014 at 12:49:40AM +0000, Jungseok Lee wrote: > > >>> This patch adds pgd_page definition in order to keep supporting > > >>> HAVE_GENERIC_RCU_GUP configuration. In addition, it changes pud_page > > >>> expression to align with pmd_page for readability. > > >>> > > >>> An introduction of pgd_page resolves the following build breakage > > >>> under 4KB + 4Level memory management combo. > > >>> > > >>> mm/gup.c: In function 'gup_huge_pgd': > > >>> mm/gup.c:889:2: error: implicit declaration of function 'pgd_page' [-Werror=implicit-function-declaration] > > >>> head = pgd_page(orig); > > >>> ^ > > >>> mm/gup.c:889:7: warning: assignment makes pointer from integer without a cast > > >>> head = pgd_page(orig); > > >>> > > >>> Cc: Catalin Marinas <catalin.marinas@arm.com> > > >>> Cc: Will Deacon <will.deacon@arm.com> > > >>> Cc: Steve Capper <steve.capper@linaro.org> > > >>> Signed-off-by: Jungseok Lee <jungseoklee85@gmail.com> > > >>> --- > > >>> arch/arm64/include/asm/pgtable.h | 4 +++- > > >>> 1 file changed, 3 insertions(+), 1 deletion(-) > > >>> > > >>> diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h > > >>> index df22314..a1fe927 100644 > > >>> --- a/arch/arm64/include/asm/pgtable.h > > >>> +++ b/arch/arm64/include/asm/pgtable.h > > >>> @@ -401,7 +401,7 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr) > > >>> return (pmd_t *)pud_page_vaddr(*pud) + pmd_index(addr); > > >>> } > > >>> > > >>> -#define pud_page(pud) pmd_page(pud_pmd(pud)) > > >>> +#define pud_page(pud) pfn_to_page(__phys_to_pfn(pud_val(pud) & PHYS_MASK)) > > >> > > >> It would be cleaner to use pud_pfn here, otherwise we end up passing a > > >> physical address with the lower attributes present to __phys_to_pfn, which > > >> "knows" to shift them away. > > > > > > It looks like we did the same with pmd_page() but not with pte_page(), > > > the latter using pte_pfn(). > > > > > > It's not a problem with lower attributes because they are within the > > > first 12 bits, so the shifting gets rid of them. For pmd/pud/pgd, bits > > > above 12 and up to the actual address must be 0. > > > > > > I agree with changing all of them to use pte/pmd/pud/pgd_pfn but I'm > > > inclined to merge this patch now to fix the kernel build and we'll look > > > at the clean-up after Christmas. > > > > Either way, I'm fine. > > Unless you post an updated patch quickly enough ;) Actually, don't worry, I'll fold Will's suggestions into your patch. I found another problem with pmd_page being defined twice. Thanks. -- Catalin ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH] arm64: mm: Add pgd_page to support RCU fast_gup 2014-12-22 16:28 ` Catalin Marinas @ 2014-12-23 15:37 ` Jungseok Lee 2014-12-23 16:01 ` Catalin Marinas 0 siblings, 1 reply; 11+ messages in thread From: Jungseok Lee @ 2014-12-23 15:37 UTC (permalink / raw) To: linux-arm-kernel On Dec 23, 2014, at 1:28 AM, Catalin Marinas wrote: > On Mon, Dec 22, 2014 at 03:31:12PM +0000, Catalin Marinas wrote: >> On Mon, Dec 22, 2014 at 03:11:37PM +0000, Jungseok Lee wrote: >>> On Dec 22, 2014, at 9:30 PM, Catalin Marinas wrote: >>>> On Sun, Dec 21, 2014 at 10:56:33AM +0000, Will Deacon wrote: >>>>> On Sat, Dec 20, 2014 at 12:49:40AM +0000, Jungseok Lee wrote: >>>>>> This patch adds pgd_page definition in order to keep supporting >>>>>> HAVE_GENERIC_RCU_GUP configuration. In addition, it changes pud_page >>>>>> expression to align with pmd_page for readability. >>>>>> >>>>>> An introduction of pgd_page resolves the following build breakage >>>>>> under 4KB + 4Level memory management combo. >>>>>> >>>>>> mm/gup.c: In function 'gup_huge_pgd': >>>>>> mm/gup.c:889:2: error: implicit declaration of function 'pgd_page' [-Werror=implicit-function-declaration] >>>>>> head = pgd_page(orig); >>>>>> ^ >>>>>> mm/gup.c:889:7: warning: assignment makes pointer from integer without a cast >>>>>> head = pgd_page(orig); >>>>>> >>>>>> Cc: Catalin Marinas <catalin.marinas@arm.com> >>>>>> Cc: Will Deacon <will.deacon@arm.com> >>>>>> Cc: Steve Capper <steve.capper@linaro.org> >>>>>> Signed-off-by: Jungseok Lee <jungseoklee85@gmail.com> >>>>>> --- >>>>>> arch/arm64/include/asm/pgtable.h | 4 +++- >>>>>> 1 file changed, 3 insertions(+), 1 deletion(-) >>>>>> >>>>>> diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h >>>>>> index df22314..a1fe927 100644 >>>>>> --- a/arch/arm64/include/asm/pgtable.h >>>>>> +++ b/arch/arm64/include/asm/pgtable.h >>>>>> @@ -401,7 +401,7 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr) >>>>>> return (pmd_t *)pud_page_vaddr(*pud) + pmd_index(addr); >>>>>> } >>>>>> >>>>>> -#define pud_page(pud) pmd_page(pud_pmd(pud)) >>>>>> +#define pud_page(pud) pfn_to_page(__phys_to_pfn(pud_val(pud) & PHYS_MASK)) >>>>> >>>>> It would be cleaner to use pud_pfn here, otherwise we end up passing a >>>>> physical address with the lower attributes present to __phys_to_pfn, which >>>>> "knows" to shift them away. >>>> >>>> It looks like we did the same with pmd_page() but not with pte_page(), >>>> the latter using pte_pfn(). >>>> >>>> It's not a problem with lower attributes because they are within the >>>> first 12 bits, so the shifting gets rid of them. For pmd/pud/pgd, bits >>>> above 12 and up to the actual address must be 0. >>>> >>>> I agree with changing all of them to use pte/pmd/pud/pgd_pfn but I'm >>>> inclined to merge this patch now to fix the kernel build and we'll look >>>> at the clean-up after Christmas. >>> >>> Either way, I'm fine. >> >> Unless you post an updated patch quickly enough ;) > > Actually, don't worry, I'll fold Will's suggestions into your patch. I > found another problem with pmd_page being defined twice. Yeah. One of them should be removed. I tried to rework the patch with Will's suggestion, but I've failed to figure out a full story of pmd_pfn and pmd_page. It looks like that pmd_page cannot be written using pmd_pfn unless pmd_pfn is changed since pmd_pfn masks an input value with PMD_MASK, but pmd_page does not. Additionally, I'm not sure about whether pmd_pfn with PMD_MASK works well for an user process page table. So, my change on pmd_pfn and pmd_page is as follows. Please correct me if I am wrong. -----8<----- --- a/arch/arm64/include/asm/pgtable.h +++ b/arch/arm64/include/asm/pgtable.h @@ -294,11 +294,11 @@ void pmdp_splitting_flush(struct vm_area_struct *vma, unsigned long address, #define pmd_mkhuge(pmd) (__pmd(pmd_val(pmd) & ~PMD_TABLE_BIT)) -#define pmd_pfn(pmd) (((pmd_val(pmd) & PMD_MASK) & PHYS_MASK) >> PAGE_SHIFT) +#define pmd_pfn(pmd) ((pmd_val(pmd) & PHYS_MASK) >> PAGE_SHIFT) #define pfn_pmd(pfn,prot) (__pmd(((phys_addr_t)(pfn) << PAGE_SHIFT) | pgprot_val(prot))) #define mk_pmd(page,prot) pfn_pmd(page_to_pfn(page),prot) -#define pmd_page(pmd) pfn_to_page(__phys_to_pfn(pmd_val(pmd) & PHYS_MASK)) +#define pmd_page(pmd) pfn_to_page(pmd_pfn(pmd)) #define pud_write(pud) pte_write(pud_pte(pud)) #define pud_pfn(pud) (((pud_val(pud) & PUD_MASK) & PHYS_MASK) >> PAGE_SHIFT) Thanks for a kind response, Catalin and Will! Best Regards Jungseok Lee ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH] arm64: mm: Add pgd_page to support RCU fast_gup 2014-12-23 15:37 ` Jungseok Lee @ 2014-12-23 16:01 ` Catalin Marinas 2014-12-23 23:28 ` Jungseok Lee 0 siblings, 1 reply; 11+ messages in thread From: Catalin Marinas @ 2014-12-23 16:01 UTC (permalink / raw) To: linux-arm-kernel On Tue, Dec 23, 2014 at 03:37:14PM +0000, Jungseok Lee wrote: > It looks like that pmd_page cannot be written using pmd_pfn unless pmd_pfn is > changed since pmd_pfn masks an input value with PMD_MASK, but pmd_page does not. > Additionally, I'm not sure about whether pmd_pfn with PMD_MASK works well for an > user process page table. > > So, my change on pmd_pfn and pmd_page is as follows. Please correct me if I am wrong. > > -----8<----- > > --- a/arch/arm64/include/asm/pgtable.h > +++ b/arch/arm64/include/asm/pgtable.h > @@ -294,11 +294,11 @@ void pmdp_splitting_flush(struct vm_area_struct *vma, unsigned long address, > > #define pmd_mkhuge(pmd) (__pmd(pmd_val(pmd) & ~PMD_TABLE_BIT)) > > -#define pmd_pfn(pmd) (((pmd_val(pmd) & PMD_MASK) & PHYS_MASK) >> PAGE_SHIFT) > +#define pmd_pfn(pmd) ((pmd_val(pmd) & PHYS_MASK) >> PAGE_SHIFT) > #define pfn_pmd(pfn,prot) (__pmd(((phys_addr_t)(pfn) << PAGE_SHIFT) | pgprot_val(prot))) > #define mk_pmd(page,prot) pfn_pmd(page_to_pfn(page),prot) > > -#define pmd_page(pmd) pfn_to_page(__phys_to_pfn(pmd_val(pmd) & PHYS_MASK)) > +#define pmd_page(pmd) pfn_to_page(pmd_pfn(pmd)) > #define pud_write(pud) pte_write(pud_pte(pud)) > #define pud_pfn(pud) (((pud_val(pud) & PUD_MASK) & PHYS_MASK) >> PAGE_SHIFT) It looks like pmd_pfn() is only used for huge pages, so the original code was safe. As I said, I won't do further changes here, at least not for 3.19. -- Catalin ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH] arm64: mm: Add pgd_page to support RCU fast_gup 2014-12-23 16:01 ` Catalin Marinas @ 2014-12-23 23:28 ` Jungseok Lee 0 siblings, 0 replies; 11+ messages in thread From: Jungseok Lee @ 2014-12-23 23:28 UTC (permalink / raw) To: linux-arm-kernel On Dec 24, 2014, at 1:01 AM, Catalin Marinas wrote: > On Tue, Dec 23, 2014 at 03:37:14PM +0000, Jungseok Lee wrote: >> It looks like that pmd_page cannot be written using pmd_pfn unless pmd_pfn is >> changed since pmd_pfn masks an input value with PMD_MASK, but pmd_page does not. >> Additionally, I'm not sure about whether pmd_pfn with PMD_MASK works well for an >> user process page table. >> >> So, my change on pmd_pfn and pmd_page is as follows. Please correct me if I am wrong. >> >> -----8<----- >> >> --- a/arch/arm64/include/asm/pgtable.h >> +++ b/arch/arm64/include/asm/pgtable.h >> @@ -294,11 +294,11 @@ void pmdp_splitting_flush(struct vm_area_struct *vma, unsigned long address, >> >> #define pmd_mkhuge(pmd) (__pmd(pmd_val(pmd) & ~PMD_TABLE_BIT)) >> >> -#define pmd_pfn(pmd) (((pmd_val(pmd) & PMD_MASK) & PHYS_MASK) >> PAGE_SHIFT) >> +#define pmd_pfn(pmd) ((pmd_val(pmd) & PHYS_MASK) >> PAGE_SHIFT) >> #define pfn_pmd(pfn,prot) (__pmd(((phys_addr_t)(pfn) << PAGE_SHIFT) | pgprot_val(prot))) >> #define mk_pmd(page,prot) pfn_pmd(page_to_pfn(page),prot) >> >> -#define pmd_page(pmd) pfn_to_page(__phys_to_pfn(pmd_val(pmd) & PHYS_MASK)) >> +#define pmd_page(pmd) pfn_to_page(pmd_pfn(pmd)) >> #define pud_write(pud) pte_write(pud_pte(pud)) >> #define pud_pfn(pud) (((pud_val(pud) & PUD_MASK) & PHYS_MASK) >> PAGE_SHIFT) > > It looks like pmd_pfn() is only used for huge pages, so the original > code was safe. As I said, I won't do further changes here, at least not > for 3.19. Okay, everything is clear. Best Regards Jungseok Lee ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH] arm64: mm: Add pgd_page to support RCU fast_gup 2014-12-21 10:56 ` Will Deacon 2014-12-22 12:30 ` Catalin Marinas @ 2014-12-23 15:25 ` Catalin Marinas 2014-12-23 15:45 ` Jungseok Lee 1 sibling, 1 reply; 11+ messages in thread From: Catalin Marinas @ 2014-12-23 15:25 UTC (permalink / raw) To: linux-arm-kernel On Sun, Dec 21, 2014 at 10:56:33AM +0000, Will Deacon wrote: > On Sat, Dec 20, 2014 at 12:49:40AM +0000, Jungseok Lee wrote: > > This patch adds pgd_page definition in order to keep supporting > > HAVE_GENERIC_RCU_GUP configuration. In addition, it changes pud_page > > expression to align with pmd_page for readability. > > > > An introduction of pgd_page resolves the following build breakage > > under 4KB + 4Level memory management combo. > > > > mm/gup.c: In function 'gup_huge_pgd': > > mm/gup.c:889:2: error: implicit declaration of function 'pgd_page' [-Werror=implicit-function-declaration] > > head = pgd_page(orig); > > ^ > > mm/gup.c:889:7: warning: assignment makes pointer from integer without a cast > > head = pgd_page(orig); > > > > Cc: Catalin Marinas <catalin.marinas@arm.com> > > Cc: Will Deacon <will.deacon@arm.com> > > Cc: Steve Capper <steve.capper@linaro.org> > > Signed-off-by: Jungseok Lee <jungseoklee85@gmail.com> > > --- > > arch/arm64/include/asm/pgtable.h | 4 +++- > > 1 file changed, 3 insertions(+), 1 deletion(-) > > > > diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h > > index df22314..a1fe927 100644 > > --- a/arch/arm64/include/asm/pgtable.h > > +++ b/arch/arm64/include/asm/pgtable.h > > @@ -401,7 +401,7 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr) > > return (pmd_t *)pud_page_vaddr(*pud) + pmd_index(addr); > > } > > > > -#define pud_page(pud) pmd_page(pud_pmd(pud)) > > +#define pud_page(pud) pfn_to_page(__phys_to_pfn(pud_val(pud) & PHYS_MASK)) > > It would be cleaner to use pud_pfn here, otherwise we end up passing a > physical address with the lower attributes present to __phys_to_pfn, which > "knows" to shift them away. OK, I tried this, together with aligning pmd_page to use pmd_pfn, and after debugging I realised why it is a bad idea. I had a feeling that I tried this before but didn't remember the details. I'll take the pmd_page() example, it is used in two scenarios: a) getting the first page structure of a huge page b) getting the page structure of the pte page pointed at by the pmd In the first case, we know that the pmd value is aligned to PMD_SIZE as it points to the physical address of a huge page, so pmd_pfn() masking is fine. In the second case, such masking is not, a pte page can be just PAGE_SIZE aligned. So using pmd_pfn to mask out the bits above 12 in the pmd val breaks case (b) above. While we don't have such use-case (b) for pud_page(), I would rather keep them consistent with pmd_page. A better fix would be to change such pmd_page() usage to pmd_pgtable() in the core mm code and have a different implementation for the latter. I guess we can leave this exercise to Steve ;). In the meantime, I'll merge Jungseok's original patch. -- Catalin ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH] arm64: mm: Add pgd_page to support RCU fast_gup 2014-12-23 15:25 ` Catalin Marinas @ 2014-12-23 15:45 ` Jungseok Lee 0 siblings, 0 replies; 11+ messages in thread From: Jungseok Lee @ 2014-12-23 15:45 UTC (permalink / raw) To: linux-arm-kernel On Dec 24, 2014, at 12:25 AM, Catalin Marinas wrote: > On Sun, Dec 21, 2014 at 10:56:33AM +0000, Will Deacon wrote: >> On Sat, Dec 20, 2014 at 12:49:40AM +0000, Jungseok Lee wrote: >>> This patch adds pgd_page definition in order to keep supporting >>> HAVE_GENERIC_RCU_GUP configuration. In addition, it changes pud_page >>> expression to align with pmd_page for readability. >>> >>> An introduction of pgd_page resolves the following build breakage >>> under 4KB + 4Level memory management combo. >>> >>> mm/gup.c: In function 'gup_huge_pgd': >>> mm/gup.c:889:2: error: implicit declaration of function 'pgd_page' [-Werror=implicit-function-declaration] >>> head = pgd_page(orig); >>> ^ >>> mm/gup.c:889:7: warning: assignment makes pointer from integer without a cast >>> head = pgd_page(orig); >>> >>> Cc: Catalin Marinas <catalin.marinas@arm.com> >>> Cc: Will Deacon <will.deacon@arm.com> >>> Cc: Steve Capper <steve.capper@linaro.org> >>> Signed-off-by: Jungseok Lee <jungseoklee85@gmail.com> >>> --- >>> arch/arm64/include/asm/pgtable.h | 4 +++- >>> 1 file changed, 3 insertions(+), 1 deletion(-) >>> >>> diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h >>> index df22314..a1fe927 100644 >>> --- a/arch/arm64/include/asm/pgtable.h >>> +++ b/arch/arm64/include/asm/pgtable.h >>> @@ -401,7 +401,7 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr) >>> return (pmd_t *)pud_page_vaddr(*pud) + pmd_index(addr); >>> } >>> >>> -#define pud_page(pud) pmd_page(pud_pmd(pud)) >>> +#define pud_page(pud) pfn_to_page(__phys_to_pfn(pud_val(pud) & PHYS_MASK)) >> >> It would be cleaner to use pud_pfn here, otherwise we end up passing a >> physical address with the lower attributes present to __phys_to_pfn, which >> "knows" to shift them away. > > OK, I tried this, together with aligning pmd_page to use pmd_pfn, and > after debugging I realised why it is a bad idea. I had a feeling that I > tried this before but didn't remember the details. > > I'll take the pmd_page() example, it is used in two scenarios: > > a) getting the first page structure of a huge page > b) getting the page structure of the pte page pointed at by the pmd > > In the first case, we know that the pmd value is aligned to PMD_SIZE as > it points to the physical address of a huge page, so pmd_pfn() masking > is fine. In the second case, such masking is not, a pte page can be just > PAGE_SIZE aligned. So using pmd_pfn to mask out the bits above 12 in the > pmd val breaks case (b) above. > > While we don't have such use-case (b) for pud_page(), I would rather > keep them consistent with pmd_page. > > A better fix would be to change such pmd_page() usage to pmd_pgtable() > in the core mm code and have a different implementation for the latter. > I guess we can leave this exercise to Steve ;). > > In the meantime, I'll merge Jungseok's original patch. After reading this mail, I could imagine what happen to pmd_page(). Thanks Jungseok Lee ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2014-12-23 23:28 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-12-20 0:49 [PATCH] arm64: mm: Add pgd_page to support RCU fast_gup Jungseok Lee 2014-12-21 10:56 ` Will Deacon 2014-12-22 12:30 ` Catalin Marinas 2014-12-22 15:11 ` Jungseok Lee 2014-12-22 15:31 ` Catalin Marinas 2014-12-22 16:28 ` Catalin Marinas 2014-12-23 15:37 ` Jungseok Lee 2014-12-23 16:01 ` Catalin Marinas 2014-12-23 23:28 ` Jungseok Lee 2014-12-23 15:25 ` Catalin Marinas 2014-12-23 15:45 ` Jungseok Lee
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).