From: Shan Hai <haishan.bai@gmail.com>
To: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: tony.luck@intel.com, linux-kernel@vger.kernel.org,
cmetcalf@tilera.com, dhowells@redhat.com, paulus@samba.org,
tglx@linutronix.de, walken@google.com,
linuxppc-dev@lists.ozlabs.org, akpm@linux-foundation.org
Subject: Re: [PATCH 1/1] Fixup write permission of TLB on powerpc e500 core
Date: Fri, 15 Jul 2011 11:18:59 -0400 [thread overview]
Message-ID: <4E205A63.90401@gmail.com> (raw)
In-Reply-To: <1310725418.2586.309.camel@twins>
On 07/15/2011 06:23 AM, Peter Zijlstra wrote:
> On Fri, 2011-07-15 at 16:07 +0800, Shan Hai wrote:
>> The kernel has no write permission on COW pages by default on e500 core, this
>> will cause endless loop in futex_lock_pi, because futex code assumes the kernel
>> has write permission on COW pages. Grant write permission to the kernel on COW
>> pages when access violation page fault occurs.
>>
>> Signed-off-by: Shan Hai<haishan.bai@gmail.com>
>> ---
>> arch/powerpc/include/asm/futex.h | 11 ++++++++++-
>> arch/powerpc/include/asm/tlb.h | 25 +++++++++++++++++++++++++
>> 2 files changed, 35 insertions(+), 1 deletions(-)
>>
>> diff --git a/arch/powerpc/include/asm/futex.h b/arch/powerpc/include/asm/futex.h
>> index c94e4a3..54c3e74 100644
>> --- a/arch/powerpc/include/asm/futex.h
>> +++ b/arch/powerpc/include/asm/futex.h
>> @@ -8,6 +8,7 @@
>> #include<asm/errno.h>
>> #include<asm/synch.h>
>> #include<asm/asm-compat.h>
>> +#include<asm/tlb.h>
>>
>> #define __futex_atomic_op(insn, ret, oldval, uaddr, oparg) \
>> __asm__ __volatile ( \
>> @@ -113,7 +114,15 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
>> : "cc", "memory");
>>
>> *uval = prev;
>> - return ret;
>> +
>> + /* Futex assumes the kernel has permission to write to
>> + * COW pages, grant the kernel write permission on COW
>> + * pages because it has none by default.
>> + */
>> + if (ret == -EFAULT)
>> + __tlb_fixup_write_permission(current->mm, (unsigned long)uaddr);
>> +
>> + return ret;
>> }
>>
>> #endif /* __KERNEL__ */
>> diff --git a/arch/powerpc/include/asm/tlb.h b/arch/powerpc/include/asm/tlb.h
>> index e2b428b..3863c6a 100644
>> --- a/arch/powerpc/include/asm/tlb.h
>> +++ b/arch/powerpc/include/asm/tlb.h
>> @@ -45,5 +45,30 @@ static inline void __tlb_remove_tlb_entry(struct mmu_gather *tlb, pte_t *ptep,
>> #endif
>> }
>>
>> +/* Grant write permission to the kernel on a page. */
>> +static inline void __tlb_fixup_write_permission(struct mm_struct *mm,
>> + unsigned long address)
>> +{
>> +#if defined(CONFIG_FSL_BOOKE)
>> + /* Grant write permission to the kernel on a page by setting TLB.SW
>> + * bit, the bit setting operation is tricky here, calling
>> + * handle_mm_fault with FAULT_FLAG_WRITE causes _PAGE_DIRTY bit of
>> + * the pte to be set, the _PAGE_DIRTY of the pte is translated into
>> + * TLB.SW on Powerpc e500 core.
>> + */
>> +
>> + struct vm_area_struct *vma;
>> +
>> + vma = find_vma(mm, address);
> Uhm, find_vma() needs mmap_sem, and futex_atomic_cmpxchg_inatomic() is
> most certainly not called with that lock held.
>
My fault, that will be fixed in the V2 patch.
>> + if (likely(vma)) {
>> + /* only fixup present page */
>> + if (follow_page(vma, address, FOLL_WRITE)) {
>> + handle_mm_fault(mm, vma, address, FAULT_FLAG_WRITE);
> So how can this toggle your sw dirty/young tracking, that's pretty much
> what gup(.write=1) does too!
>
because of the kernel read only permission of the page is transparent
to the follow_page(), the handle_mm_fault() is not to be activated
in the __get_use_pages(), so the gup(.write=1) could not help to fixup
the write permission.
Thanks
Shan Hai
>> + flush_tlb_page(vma, address);
>> + }
>> + }
>> +#endif
>> +}
>> +
>> #endif /* __KERNEL__ */
>> #endif /* __ASM_POWERPC_TLB_H */
WARNING: multiple messages have this Message-ID (diff)
From: Shan Hai <haishan.bai@gmail.com>
To: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: benh@kernel.crashing.org, paulus@samba.org, tglx@linutronix.de,
walken@google.com, dhowells@redhat.com, cmetcalf@tilera.com,
tony.luck@intel.com, akpm@linux-foundation.org,
linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/1] Fixup write permission of TLB on powerpc e500 core
Date: Fri, 15 Jul 2011 11:18:59 -0400 [thread overview]
Message-ID: <4E205A63.90401@gmail.com> (raw)
In-Reply-To: <1310725418.2586.309.camel@twins>
On 07/15/2011 06:23 AM, Peter Zijlstra wrote:
> On Fri, 2011-07-15 at 16:07 +0800, Shan Hai wrote:
>> The kernel has no write permission on COW pages by default on e500 core, this
>> will cause endless loop in futex_lock_pi, because futex code assumes the kernel
>> has write permission on COW pages. Grant write permission to the kernel on COW
>> pages when access violation page fault occurs.
>>
>> Signed-off-by: Shan Hai<haishan.bai@gmail.com>
>> ---
>> arch/powerpc/include/asm/futex.h | 11 ++++++++++-
>> arch/powerpc/include/asm/tlb.h | 25 +++++++++++++++++++++++++
>> 2 files changed, 35 insertions(+), 1 deletions(-)
>>
>> diff --git a/arch/powerpc/include/asm/futex.h b/arch/powerpc/include/asm/futex.h
>> index c94e4a3..54c3e74 100644
>> --- a/arch/powerpc/include/asm/futex.h
>> +++ b/arch/powerpc/include/asm/futex.h
>> @@ -8,6 +8,7 @@
>> #include<asm/errno.h>
>> #include<asm/synch.h>
>> #include<asm/asm-compat.h>
>> +#include<asm/tlb.h>
>>
>> #define __futex_atomic_op(insn, ret, oldval, uaddr, oparg) \
>> __asm__ __volatile ( \
>> @@ -113,7 +114,15 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
>> : "cc", "memory");
>>
>> *uval = prev;
>> - return ret;
>> +
>> + /* Futex assumes the kernel has permission to write to
>> + * COW pages, grant the kernel write permission on COW
>> + * pages because it has none by default.
>> + */
>> + if (ret == -EFAULT)
>> + __tlb_fixup_write_permission(current->mm, (unsigned long)uaddr);
>> +
>> + return ret;
>> }
>>
>> #endif /* __KERNEL__ */
>> diff --git a/arch/powerpc/include/asm/tlb.h b/arch/powerpc/include/asm/tlb.h
>> index e2b428b..3863c6a 100644
>> --- a/arch/powerpc/include/asm/tlb.h
>> +++ b/arch/powerpc/include/asm/tlb.h
>> @@ -45,5 +45,30 @@ static inline void __tlb_remove_tlb_entry(struct mmu_gather *tlb, pte_t *ptep,
>> #endif
>> }
>>
>> +/* Grant write permission to the kernel on a page. */
>> +static inline void __tlb_fixup_write_permission(struct mm_struct *mm,
>> + unsigned long address)
>> +{
>> +#if defined(CONFIG_FSL_BOOKE)
>> + /* Grant write permission to the kernel on a page by setting TLB.SW
>> + * bit, the bit setting operation is tricky here, calling
>> + * handle_mm_fault with FAULT_FLAG_WRITE causes _PAGE_DIRTY bit of
>> + * the pte to be set, the _PAGE_DIRTY of the pte is translated into
>> + * TLB.SW on Powerpc e500 core.
>> + */
>> +
>> + struct vm_area_struct *vma;
>> +
>> + vma = find_vma(mm, address);
> Uhm, find_vma() needs mmap_sem, and futex_atomic_cmpxchg_inatomic() is
> most certainly not called with that lock held.
>
My fault, that will be fixed in the V2 patch.
>> + if (likely(vma)) {
>> + /* only fixup present page */
>> + if (follow_page(vma, address, FOLL_WRITE)) {
>> + handle_mm_fault(mm, vma, address, FAULT_FLAG_WRITE);
> So how can this toggle your sw dirty/young tracking, that's pretty much
> what gup(.write=1) does too!
>
because of the kernel read only permission of the page is transparent
to the follow_page(), the handle_mm_fault() is not to be activated
in the __get_use_pages(), so the gup(.write=1) could not help to fixup
the write permission.
Thanks
Shan Hai
>> + flush_tlb_page(vma, address);
>> + }
>> + }
>> +#endif
>> +}
>> +
>> #endif /* __KERNEL__ */
>> #endif /* __ASM_POWERPC_TLB_H */
next prev parent reply other threads:[~2011-07-15 15:19 UTC|newest]
Thread overview: 138+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-07-15 8:07 [PATCH 0/1] Fixup write permission of TLB on powerpc e500 core Shan Hai
2011-07-15 8:07 ` Shan Hai
2011-07-15 8:07 ` [PATCH 1/1] " Shan Hai
2011-07-15 8:07 ` Shan Hai
2011-07-15 10:23 ` Peter Zijlstra
2011-07-15 10:23 ` Peter Zijlstra
2011-07-15 15:18 ` Shan Hai [this message]
2011-07-15 15:18 ` Shan Hai
2011-07-15 15:24 ` Peter Zijlstra
2011-07-15 15:24 ` Peter Zijlstra
2011-07-16 15:36 ` Shan Hai
2011-07-16 15:36 ` Shan Hai
2011-07-16 14:50 ` Shan Hai
2011-07-16 14:50 ` Shan Hai
2011-07-16 23:49 ` Benjamin Herrenschmidt
2011-07-16 23:49 ` Benjamin Herrenschmidt
2011-07-17 9:38 ` Peter Zijlstra
2011-07-17 9:38 ` Peter Zijlstra
2011-07-17 14:29 ` Benjamin Herrenschmidt
2011-07-17 14:29 ` Benjamin Herrenschmidt
2011-07-17 23:14 ` Benjamin Herrenschmidt
2011-07-17 23:14 ` Benjamin Herrenschmidt
2011-07-18 3:53 ` Benjamin Herrenschmidt
2011-07-18 3:53 ` Benjamin Herrenschmidt
2011-07-18 4:02 ` Benjamin Herrenschmidt
2011-07-18 4:02 ` Benjamin Herrenschmidt
2011-07-18 4:01 ` Benjamin Herrenschmidt
2011-07-18 4:01 ` Benjamin Herrenschmidt
2011-07-18 6:48 ` Shan Hai
2011-07-18 6:48 ` Shan Hai
2011-07-18 7:01 ` Benjamin Herrenschmidt
2011-07-18 7:01 ` Benjamin Herrenschmidt
2011-07-18 7:26 ` Shan Hai
2011-07-18 7:26 ` Shan Hai
2011-07-18 7:36 ` Benjamin Herrenschmidt
2011-07-18 7:36 ` Benjamin Herrenschmidt
2011-07-18 7:50 ` Shan Hai
2011-07-18 7:50 ` Shan Hai
2011-07-19 3:30 ` Shan Hai
2011-07-19 3:30 ` Shan Hai
2011-07-19 4:20 ` Benjamin Herrenschmidt
2011-07-19 4:20 ` Benjamin Herrenschmidt
2011-07-19 4:29 ` [RFC/PATCH] mm/futex: Fix futex writes on archs with SW tracking of dirty & young Benjamin Herrenschmidt
2011-07-19 4:29 ` Benjamin Herrenschmidt
2011-07-19 4:55 ` Shan Hai
2011-07-19 4:55 ` Shan Hai
2011-07-19 5:17 ` Shan Hai
2011-07-19 5:17 ` Shan Hai
2011-07-19 5:24 ` Benjamin Herrenschmidt
2011-07-19 5:24 ` Benjamin Herrenschmidt
2011-07-19 5:38 ` Shan Hai
2011-07-19 5:38 ` Shan Hai
2011-07-19 7:46 ` Benjamin Herrenschmidt
2011-07-19 7:46 ` Benjamin Herrenschmidt
2011-07-19 8:24 ` Shan Hai
2011-07-19 8:24 ` Shan Hai
2011-07-19 8:26 ` [RFC/PATCH] mm/futex: Fix futex writes on archs with SW trackingof " David Laight
2011-07-19 8:26 ` David Laight
2011-07-19 8:45 ` Benjamin Herrenschmidt
2011-07-19 8:45 ` Benjamin Herrenschmidt
2011-07-19 8:45 ` Shan Hai
2011-07-19 8:45 ` Shan Hai
2011-07-19 11:10 ` [RFC/PATCH] mm/futex: Fix futex writes on archs with SW tracking of " Peter Zijlstra
2011-07-19 11:10 ` Peter Zijlstra
2011-07-20 14:39 ` Darren Hart
2011-07-20 14:39 ` Darren Hart
2011-07-21 22:36 ` Andrew Morton
2011-07-21 22:36 ` Andrew Morton
2011-07-21 22:52 ` Benjamin Herrenschmidt
2011-07-21 22:52 ` Benjamin Herrenschmidt
2011-07-21 22:57 ` Benjamin Herrenschmidt
2011-07-21 22:57 ` Benjamin Herrenschmidt
2011-07-21 22:59 ` Andrew Morton
2011-07-21 22:59 ` Andrew Morton
2011-07-22 1:40 ` Benjamin Herrenschmidt
2011-07-22 1:40 ` Benjamin Herrenschmidt
2011-07-22 1:54 ` Shan Hai
2011-07-22 1:54 ` Shan Hai
2011-07-27 6:50 ` Mike Frysinger
2011-07-27 6:50 ` Mike Frysinger
2011-07-27 7:58 ` Benjamin Herrenschmidt
2011-07-27 7:58 ` Benjamin Herrenschmidt
2011-07-27 8:59 ` Peter Zijlstra
2011-07-27 8:59 ` Peter Zijlstra
2011-07-27 10:09 ` David Howells
2011-07-27 10:09 ` David Howells
2011-07-27 10:17 ` Peter Zijlstra
2011-07-27 10:17 ` Peter Zijlstra
2011-07-27 10:20 ` Benjamin Herrenschmidt
2011-07-27 10:20 ` Benjamin Herrenschmidt
2011-07-28 0:12 ` Mike Frysinger
2011-07-28 0:12 ` Mike Frysinger
2011-07-28 10:55 ` David Howells
2011-07-28 10:55 ` David Howells
2011-08-08 2:31 ` Mike Frysinger
2011-08-08 2:31 ` Mike Frysinger
2011-07-17 11:02 ` [PATCH 1/1] Fixup write permission of TLB on powerpc e500 core Peter Zijlstra
2011-07-17 11:02 ` Peter Zijlstra
2011-07-17 13:33 ` Shan Hai
2011-07-17 13:33 ` Shan Hai
2011-07-17 14:48 ` Benjamin Herrenschmidt
2011-07-17 14:48 ` Benjamin Herrenschmidt
2011-07-17 15:40 ` Shan Hai
2011-07-17 15:40 ` Shan Hai
2011-07-17 22:34 ` Benjamin Herrenschmidt
2011-07-17 22:34 ` Benjamin Herrenschmidt
2011-07-17 14:34 ` Benjamin Herrenschmidt
2011-07-17 14:34 ` Benjamin Herrenschmidt
2011-07-15 8:20 ` [PATCH 0/1] " Peter Zijlstra
2011-07-15 8:20 ` Peter Zijlstra
2011-07-15 8:38 ` MailingLists
2011-07-15 8:38 ` MailingLists
2011-07-15 8:44 ` Peter Zijlstra
2011-07-15 8:44 ` Peter Zijlstra
2011-07-15 9:08 ` Shan Hai
2011-07-15 9:08 ` Shan Hai
2011-07-15 9:12 ` Benjamin Herrenschmidt
2011-07-15 9:12 ` Benjamin Herrenschmidt
2011-07-15 9:50 ` Peter Zijlstra
2011-07-15 9:50 ` Peter Zijlstra
2011-07-15 10:06 ` Shan Hai
2011-07-15 10:06 ` Shan Hai
2011-07-15 10:32 ` David Laight
2011-07-15 10:32 ` David Laight
2011-07-15 10:39 ` Peter Zijlstra
2011-07-15 10:39 ` Peter Zijlstra
2011-07-15 15:32 ` Shan Hai
2011-07-15 15:32 ` Shan Hai
2011-07-16 0:20 ` Benjamin Herrenschmidt
2011-07-16 0:20 ` Benjamin Herrenschmidt
2011-07-16 15:03 ` Shan Hai
2011-07-16 15:03 ` Shan Hai
2011-07-15 23:47 ` Benjamin Herrenschmidt
2011-07-15 23:47 ` Benjamin Herrenschmidt
2011-07-15 9:07 ` Benjamin Herrenschmidt
2011-07-15 9:07 ` Benjamin Herrenschmidt
2011-07-15 9:05 ` Benjamin Herrenschmidt
2011-07-15 9:05 ` Benjamin Herrenschmidt
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=4E205A63.90401@gmail.com \
--to=haishan.bai@gmail.com \
--cc=a.p.zijlstra@chello.nl \
--cc=akpm@linux-foundation.org \
--cc=cmetcalf@tilera.com \
--cc=dhowells@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=paulus@samba.org \
--cc=tglx@linutronix.de \
--cc=tony.luck@intel.com \
--cc=walken@google.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.