From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S966792AbdCXRLG (ORCPT ); Fri, 24 Mar 2017 13:11:06 -0400 Received: from out1-smtp.messagingengine.com ([66.111.4.25]:43067 "EHLO out1-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S935544AbdCXRKh (ORCPT ); Fri, 24 Mar 2017 13:10:37 -0400 X-ME-Sender: X-Sasl-enc: E/Df0s2Tj0xNCnoCeD1bSffon3gxdvG0UPTslSOwSzjt 1490375380 Message-ID: <58D552D2.9030307@sent.com> Date: Fri, 24 Mar 2017 12:09:38 -0500 From: Zi Yan User-Agent: Postbox 5.0.11 (Windows/20170302) MIME-Version: 1.0 To: "Kirill A. Shutemov" CC: Zi Yan , linux-kernel@vger.kernel.org, linux-mm@kvack.org, kirill.shutemov@linux.intel.com, akpm@linux-foundation.org, minchan@kernel.org, vbabka@suse.cz, mgorman@techsingularity.net, mhocko@kernel.org, n-horiguchi@ah.jp.nec.com, khandual@linux.vnet.ibm.com, dnellans@nvidia.com Subject: Re: [PATCH v4 06/11] mm: thp: check pmd migration entry in common path References: <20170313154507.3647-1-zi.yan@sent.com> <20170313154507.3647-7-zi.yan@sent.com> <20170324145042.bda52glerop5wydx@node.shutemov.name> <58D544B5.20102@cs.rutgers.edu> <20170324165014.2ibdmurirjd4pa7r@node.shutemov.name> In-Reply-To: <20170324165014.2ibdmurirjd4pa7r@node.shutemov.name> X-Enigmail-Version: 1.2.3 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Kirill A. Shutemov wrote: > On Fri, Mar 24, 2017 at 11:09:25AM -0500, Zi Yan wrote: >> Kirill A. Shutemov wrote: >>> On Mon, Mar 13, 2017 at 11:45:02AM -0400, Zi Yan wrote: >>> Again. That's doesn't look right.. >> It will be changed: >> >> ptl = pmd_lock(mm, pmd); >> +retry_locked: >> + if (unlikely(!pmd_present(*pmd))) { >> + if (likely(!(flags & FOLL_MIGRATION))) { >> + spin_unlock(ptl); >> + return no_page_table(vma, flags); >> + } >> + pmd_migration_entry_wait(mm, pmd); >> + goto retry_locked; > > Nope. pmd_migration_entry_wait() unlocks the ptl. Right. This chunk is wrong. pmd_migrtion_entry_wait() actually locks pmd, then unlocks it and waits on the page if it is suitable. An simple fix could be: +retry_locked: ptl = pmd_lock(mm, pmd); + if (unlikely(!pmd_present(*pmd))) { + spin_unlock(ptl); + if (likely(!(flags & FOLL_MIGRATION))) + return no_page_table(vma, flags); + pmd_migration_entry_wait(mm, pmd); + goto retry_locked; + } Or is it better to change pmd_migration_entry_wait() to void pmd_migration_entry_wait(struct mm_struct *mm, pmd_t *pmd, spinlock_t *ptl)? So that if ptl is NULL, then it takes the pmd lock and unlocks it; if ptl is specified, it only unlocks it. This can avoid the redundant unlock and lock in the code above, when pmd_migration_entry_wait() is called. Thanks. -- Best Regards, Yan Zi