From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753253AbdGJDLw (ORCPT ); Sun, 9 Jul 2017 23:11:52 -0400 Received: from [148.163.158.5] ([148.163.158.5]:42216 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-FAIL-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1753161AbdGJDLu (ORCPT ); Sun, 9 Jul 2017 23:11:50 -0400 From: Anshuman Khandual Subject: Re: [RFC v5 32/38] powerpc: capture the violated protection key on fault To: Ram Pai , linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, linux-mm@kvack.org, x86@kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org References: <1499289735-14220-1-git-send-email-linuxram@us.ibm.com> <1499289735-14220-33-git-send-email-linuxram@us.ibm.com> Cc: benh@kernel.crashing.org, paulus@samba.org, mpe@ellerman.id.au, khandual@linux.vnet.ibm.com, aneesh.kumar@linux.vnet.ibm.com, bsingharora@gmail.com, dave.hansen@intel.com, hbabu@us.ibm.com, arnd@arndb.de, akpm@linux-foundation.org, corbet@lwn.net, mingo@redhat.com Date: Mon, 10 Jul 2017 08:40:19 +0530 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.5.1 MIME-Version: 1.0 In-Reply-To: <1499289735-14220-33-git-send-email-linuxram@us.ibm.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-TM-AS-MML: disable x-cbid: 17071003-1617-0000-0000-000001F41FA9 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17071003-1618-0000-0000-0000483BBD28 Message-Id: <5fa43f48-d3b3-89f2-0bbd-58be3e07f4b8@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2017-07-10_01:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=0 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1703280000 definitions=main-1707100055 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 07/06/2017 02:52 AM, Ram Pai wrote: > Capture the protection key that got violated in paca. > This value will be used by used to inform the signal > handler. > > Signed-off-by: Ram Pai > --- > arch/powerpc/include/asm/paca.h | 1 + > arch/powerpc/kernel/asm-offsets.c | 1 + > arch/powerpc/mm/fault.c | 3 +++ > 3 files changed, 5 insertions(+), 0 deletions(-) > > diff --git a/arch/powerpc/include/asm/paca.h b/arch/powerpc/include/asm/paca.h > index c8bd1fc..0c06188 100644 > --- a/arch/powerpc/include/asm/paca.h > +++ b/arch/powerpc/include/asm/paca.h > @@ -94,6 +94,7 @@ struct paca_struct { > u64 dscr_default; /* per-CPU default DSCR */ > #ifdef CONFIG_PPC64_MEMORY_PROTECTION_KEYS > u64 paca_amr; /* value of amr at exception */ > + u16 paca_pkey; /* exception causing pkey */ > #endif /* CONFIG_PPC64_MEMORY_PROTECTION_KEYS */ > > #ifdef CONFIG_PPC_STD_MMU_64 > diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c > index 17f5d8a..7dff862 100644 > --- a/arch/powerpc/kernel/asm-offsets.c > +++ b/arch/powerpc/kernel/asm-offsets.c > @@ -244,6 +244,7 @@ int main(void) > > #ifdef CONFIG_PPC64_MEMORY_PROTECTION_KEYS > OFFSET(PACA_AMR, paca_struct, paca_amr); > + OFFSET(PACA_PKEY, paca_struct, paca_pkey); > #endif /* CONFIG_PPC64_MEMORY_PROTECTION_KEYS */ > > OFFSET(ACCOUNT_STARTTIME, paca_struct, accounting.starttime); > diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c > index a6710f5..c8674a7 100644 > --- a/arch/powerpc/mm/fault.c > +++ b/arch/powerpc/mm/fault.c > @@ -265,6 +265,7 @@ int do_page_fault(struct pt_regs *regs, unsigned long address, > if (error_code & DSISR_KEYFAULT) { > code = SEGV_PKUERR; > get_paca()->paca_amr = read_amr(); > + get_paca()->paca_pkey = get_pte_pkey(current->mm, address); > goto bad_area_nosemaphore; > } > #endif /* CONFIG_PPC64_MEMORY_PROTECTION_KEYS */ > @@ -290,6 +291,7 @@ int do_page_fault(struct pt_regs *regs, unsigned long address, > > perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address); > > + Stray empty line addition here. > /* > * We want to do this outside mmap_sem, because reading code around nip > * can result in fault, which will cause a deadlock when called with > @@ -453,6 +455,7 @@ int do_page_fault(struct pt_regs *regs, unsigned long address, > if (!arch_vma_access_permitted(vma, flags & FAULT_FLAG_WRITE, > is_exec, 0)) { > get_paca()->paca_amr = read_amr(); > + get_paca()->paca_pkey = vma_pkey(vma); Why not get_pte_pkey() here as well ? IIUC both these function would give us the same pkey, then why is the difference when we process a page fault for real protection key violation in HW compared to cross checking of VMA protection key in SW for regular page faults. From mboxrd@z Thu Jan 1 00:00:00 1970 From: Anshuman Khandual Subject: Re: [RFC v5 32/38] powerpc: capture the violated protection key on fault Date: Mon, 10 Jul 2017 08:40:19 +0530 Message-ID: <5fa43f48-d3b3-89f2-0bbd-58be3e07f4b8@linux.vnet.ibm.com> References: <1499289735-14220-1-git-send-email-linuxram@us.ibm.com> <1499289735-14220-33-git-send-email-linuxram@us.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1499289735-14220-33-git-send-email-linuxram@us.ibm.com> Sender: owner-linux-mm@kvack.org To: Ram Pai , linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, linux-mm@kvack.org, x86@kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org Cc: benh@kernel.crashing.org, paulus@samba.org, mpe@ellerman.id.au, khandual@linux.vnet.ibm.com, aneesh.kumar@linux.vnet.ibm.com, bsingharora@gmail.com, dave.hansen@intel.com, hbabu@us.ibm.com, arnd@arndb.de, akpm@linux-foundation.org, corbet@lwn.net, mingo@redhat.com List-Id: linux-arch.vger.kernel.org On 07/06/2017 02:52 AM, Ram Pai wrote: > Capture the protection key that got violated in paca. > This value will be used by used to inform the signal > handler. > > Signed-off-by: Ram Pai > --- > arch/powerpc/include/asm/paca.h | 1 + > arch/powerpc/kernel/asm-offsets.c | 1 + > arch/powerpc/mm/fault.c | 3 +++ > 3 files changed, 5 insertions(+), 0 deletions(-) > > diff --git a/arch/powerpc/include/asm/paca.h b/arch/powerpc/include/asm/paca.h > index c8bd1fc..0c06188 100644 > --- a/arch/powerpc/include/asm/paca.h > +++ b/arch/powerpc/include/asm/paca.h > @@ -94,6 +94,7 @@ struct paca_struct { > u64 dscr_default; /* per-CPU default DSCR */ > #ifdef CONFIG_PPC64_MEMORY_PROTECTION_KEYS > u64 paca_amr; /* value of amr at exception */ > + u16 paca_pkey; /* exception causing pkey */ > #endif /* CONFIG_PPC64_MEMORY_PROTECTION_KEYS */ > > #ifdef CONFIG_PPC_STD_MMU_64 > diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c > index 17f5d8a..7dff862 100644 > --- a/arch/powerpc/kernel/asm-offsets.c > +++ b/arch/powerpc/kernel/asm-offsets.c > @@ -244,6 +244,7 @@ int main(void) > > #ifdef CONFIG_PPC64_MEMORY_PROTECTION_KEYS > OFFSET(PACA_AMR, paca_struct, paca_amr); > + OFFSET(PACA_PKEY, paca_struct, paca_pkey); > #endif /* CONFIG_PPC64_MEMORY_PROTECTION_KEYS */ > > OFFSET(ACCOUNT_STARTTIME, paca_struct, accounting.starttime); > diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c > index a6710f5..c8674a7 100644 > --- a/arch/powerpc/mm/fault.c > +++ b/arch/powerpc/mm/fault.c > @@ -265,6 +265,7 @@ int do_page_fault(struct pt_regs *regs, unsigned long address, > if (error_code & DSISR_KEYFAULT) { > code = SEGV_PKUERR; > get_paca()->paca_amr = read_amr(); > + get_paca()->paca_pkey = get_pte_pkey(current->mm, address); > goto bad_area_nosemaphore; > } > #endif /* CONFIG_PPC64_MEMORY_PROTECTION_KEYS */ > @@ -290,6 +291,7 @@ int do_page_fault(struct pt_regs *regs, unsigned long address, > > perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address); > > + Stray empty line addition here. > /* > * We want to do this outside mmap_sem, because reading code around nip > * can result in fault, which will cause a deadlock when called with > @@ -453,6 +455,7 @@ int do_page_fault(struct pt_regs *regs, unsigned long address, > if (!arch_vma_access_permitted(vma, flags & FAULT_FLAG_WRITE, > is_exec, 0)) { > get_paca()->paca_amr = read_amr(); > + get_paca()->paca_pkey = vma_pkey(vma); Why not get_pte_pkey() here as well ? IIUC both these function would give us the same pkey, then why is the difference when we process a page fault for real protection key violation in HW compared to cross checking of VMA protection key in SW for regular page faults. -- 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: email@kvack.org