Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752168AbdHHMQS (ORCPT ); Tue, 8 Aug 2017 08:16:18 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:37888 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751880AbdHHMQQ (ORCPT ); Tue, 8 Aug 2017 08:16:16 -0400 Subject: Re: [RFC v5 03/11] mm: Introduce pte_spinlock for FAULT_FLAG_SPECULATIVE To: Anshuman Khandual , paulmck@linux.vnet.ibm.com, peterz@infradead.org, akpm@linux-foundation.org, kirill@shutemov.name, ak@linux.intel.com, mhocko@kernel.org, dave@stgolabs.net, jack@suse.cz, Matthew Wilcox Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, haren@linux.vnet.ibm.com, npiggin@gmail.com, bsingharora@gmail.com, Tim Chen References: <1497635555-25679-1-git-send-email-ldufour@linux.vnet.ibm.com> <1497635555-25679-4-git-send-email-ldufour@linux.vnet.ibm.com> From: Laurent Dufour Date: Tue, 8 Aug 2017 14:16:06 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=windows-1252 Content-Language: fr Content-Transfer-Encoding: 7bit X-TM-AS-GCONF: 00 x-cbid: 17080812-0016-0000-0000-000004E14DBF X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17080812-0017-0000-0000-000028198A28 Message-Id: X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2017-08-08_04:,, 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-1706020000 definitions=main-1708080195 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2437 Lines: 69 On 08/08/2017 12:35, Anshuman Khandual wrote: > On 06/16/2017 11:22 PM, Laurent Dufour wrote: >> When handling page fault without holding the mmap_sem the fetch of the >> pte lock pointer and the locking will have to be done while ensuring >> that the VMA is not touched in our back. > > It does not change things from whats happening right now, where do we > check that VMA has not changed by now ? This patch is preparing the use done later in this series, the goal is to introduce the service and the check which are relevant. Later when the VMA check will be added this service is changed. The goal is to ease the review. > >> >> So move the fetch and locking operations in a dedicated function. >> >> Signed-off-by: Laurent Dufour >> --- >> mm/memory.c | 15 +++++++++++---- >> 1 file changed, 11 insertions(+), 4 deletions(-) >> >> diff --git a/mm/memory.c b/mm/memory.c >> index 40834444ea0d..f1132f7931ef 100644 >> --- a/mm/memory.c >> +++ b/mm/memory.c >> @@ -2240,6 +2240,13 @@ static inline void wp_page_reuse(struct vm_fault *vmf) >> pte_unmap_unlock(vmf->pte, vmf->ptl); >> } >> >> +static bool pte_spinlock(struct vm_fault *vmf) >> +{ >> + vmf->ptl = pte_lockptr(vmf->vma->vm_mm, vmf->pmd); >> + spin_lock(vmf->ptl); >> + return true; >> +} >> + > > Moving them together makes sense but again if blocks are redundant when > it returns true all the time. > >> static bool pte_map_lock(struct vm_fault *vmf) >> { >> vmf->pte = pte_offset_map_lock(vmf->vma->vm_mm, vmf->pmd, vmf->address, &vmf->ptl); >> @@ -3552,8 +3559,8 @@ static int do_numa_page(struct vm_fault *vmf) >> * validation through pte_unmap_same(). It's of NUMA type but >> * the pfn may be screwed if the read is non atomic. >> */ >> - vmf->ptl = pte_lockptr(vma->vm_mm, vmf->pmd); >> - spin_lock(vmf->ptl); >> + if (!pte_spinlock(vmf)) >> + return VM_FAULT_RETRY; >> if (unlikely(!pte_same(*vmf->pte, vmf->orig_pte))) { >> pte_unmap_unlock(vmf->pte, vmf->ptl); >> goto out; >> @@ -3745,8 +3752,8 @@ static int handle_pte_fault(struct vm_fault *vmf) >> if (pte_protnone(vmf->orig_pte) && vma_is_accessible(vmf->vma)) >> return do_numa_page(vmf); >> >> - vmf->ptl = pte_lockptr(vmf->vma->vm_mm, vmf->pmd); >> - spin_lock(vmf->ptl); >> + if (!pte_spinlock(vmf)) >> + return VM_FAULT_RETRY; >> entry = vmf->orig_pte; >> if (unlikely(!pte_same(*vmf->pte, entry))) >> goto unlock; >> >