Received: by 2002:a25:e74b:0:0:0:0:0 with SMTP id e72csp1858689ybh; Fri, 17 Jul 2020 03:09:18 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzGmC8GsB7WN8IPkwpo87hSNHRBWd22KFmkIjtzoGyWhnfzpPAPx4+rAhGQB6R0RTAi0MsM X-Received: by 2002:a17:907:100a:: with SMTP id ox10mr7657873ejb.351.1594980558601; Fri, 17 Jul 2020 03:09:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1594980558; cv=none; d=google.com; s=arc-20160816; b=DPTiVDQOGtogdpx046p2AQ0gcbNY42bOU4F5X4t/ztM1OW6AUM/7l9NM6E8DXHU3jG 5HOVuEnuTvOd3Cd5+MnnFHD/wm3xZG8fQYKOA36m1LNW9RTiokaG9FNvRo9wr87BQYTa Fr5UH3IGVOAtMkD5a0M7GpiqzjLIqZlI11BCpK6sPo0af/5kDA9deygDZf18IswR4Sbm jl+9R2KO425V7kBQcnvHSnBfqmKBW1uIX1mRyLkV5ZT6ybpLEc0RwO9pjqXrx3bRDqPD 1g/pXY0/WrwVeQCMQQJoZ8lXdl412CKW0BuGCzrroZy9QrZC0FhsTfPx8rnNKBX624ei XIMg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature; bh=DATnivA39Vml0YlJwkym9EN5+CMKOOfS2C9BcFU9YfM=; b=FUaZxSpIbrFjFmNS0cV3vsxa+mF+pRIrfxJ/Do40/vjBNSfZxDYWon7HnaAx6o0i7I QH13go+B+s8WlzDXy+y250Ph4VuEbQB9Nkzn5mwDTW5DKp6oIgg1mreSfS3jwtGdIlGV U48CYIs7vy+23ueTRIkJLoI65+K3hrk3rLg4o+6TIE9pf4SEa44z1rotaI//6bFUCnOQ 9baltKaA1cqe06Zbmuo9LFrY0epJ10OObP1B9f7UjlMzSe5wfqDt2cxcPmngPpVVE2ld KsNGNoEspjZaNOaZJqwoMgBtYUFR1KYEDdqvET2qgW5NyK++ZUUM9jSDg2BeYaOEJhQQ mDrg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=E6hU5MZX; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id t14si4883587ejb.435.2020.07.17.03.08.56; Fri, 17 Jul 2020 03:09:18 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=E6hU5MZX; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726335AbgGQKI0 (ORCPT + 99 others); Fri, 17 Jul 2020 06:08:26 -0400 Received: from mail.kernel.org ([198.145.29.99]:36936 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725932AbgGQKI0 (ORCPT ); Fri, 17 Jul 2020 06:08:26 -0400 Received: from willie-the-truck (236.31.169.217.in-addr.arpa [217.169.31.236]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 0072F20768; Fri, 17 Jul 2020 10:08:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1594980505; bh=gCGv+BOdErj4My2s2UtMojCmurB5s1x7zRohk6RLUzg=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=E6hU5MZXfGTBkrenCHz4AuJpso3SHUOFQjex6kcXUXbdJ0/KjKb9tVTA1Epy43buQ vfq+qI4mSA5Ly1blOiEypsLlhD6v7X4YvSs8qQF0AxQJTREqfX6PU2C7UAHpU7OQca DW7fjdkZfS3Bpq/Man22UEi3CfmOdVHI7pHAippk= Date: Fri, 17 Jul 2020 11:08:21 +0100 From: Will Deacon To: Yang Shi Cc: hannes@cmpxchg.org, catalin.marinas@arm.com, will.deacon@arm.com, akpm@linux-foundation.org, xuyu@linux.alibaba.com, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mm@kvack.org Subject: Re: [v2 PATCH] mm: avoid access flag update TLB flush for retried page fault Message-ID: <20200717100820.GB8673@willie-the-truck> References: <1594848990-55657-1-git-send-email-yang.shi@linux.alibaba.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1594848990-55657-1-git-send-email-yang.shi@linux.alibaba.com> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Jul 16, 2020 at 05:36:30AM +0800, Yang Shi wrote: > Recently we found regression when running will_it_scale/page_fault3 test > on ARM64. Over 70% down for the multi processes cases and over 20% down > for the multi threads cases. It turns out the regression is caused by commit > 89b15332af7c0312a41e50846819ca6613b58b4c ("mm: drop mmap_sem before > calling balance_dirty_pages() in write fault"). > > The test mmaps a memory size file then write to the mapping, this would > make all memory dirty and trigger dirty pages throttle, that upstream > commit would release mmap_sem then retry the page fault. The retried > page fault would see correct PTEs installed by the first try then update > dirty bit and clear read-only bit and flush TLBs for ARM. The regression is > caused by the excessive TLB flush. It is fine on x86 since x86 doesn't > clear read-only bit so there is no need to flush TLB for this case. > > The page fault would be retried due to: > 1. Waiting for page readahead > 2. Waiting for page swapped in > 3. Waiting for dirty pages throttling > > The first two cases don't have PTEs set up at all, so the retried page > fault would install the PTEs, so they don't reach there. But the #3 > case usually has PTEs installed, the retried page fault would reach the > dirty bit and read-only bit update. But it seems not necessary to > modify those bits again for #3 since they should be already set by the > first page fault try. > > Of course the parallel page fault may set up PTEs, but we just need care > about write fault. If the parallel page fault setup a writable and dirty > PTE then the retried fault doesn't need do anything extra. If the > parallel page fault setup a clean read-only PTE, the retried fault should > just call do_wp_page() then return as the below code snippet shows: > > if (vmf->flags & FAULT_FLAG_WRITE) { > if (!pte_write(entry)) > return do_wp_page(vmf); > } > > With this fix the test result get back to normal. > > Fixes: 89b15332af7c ("mm: drop mmap_sem before calling balance_dirty_pages() in write fault") > Cc: Catalin Marinas > Cc: Will Deacon > Cc: Johannes Weiner > Reported-by: Xu Yu > Debugged-by: Xu Yu > Tested-by: Xu Yu > Signed-off-by: Yang Shi > --- > v2: * Incorporated the comment from Will Deacon. > * Updated the commit log per the discussion. > > mm/memory.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/mm/memory.c b/mm/memory.c > index 87ec87c..e93e1da 100644 > --- a/mm/memory.c > +++ b/mm/memory.c > @@ -4241,8 +4241,14 @@ static vm_fault_t handle_pte_fault(struct vm_fault *vmf) > if (vmf->flags & FAULT_FLAG_WRITE) { > if (!pte_write(entry)) > return do_wp_page(vmf); > - entry = pte_mkdirty(entry); > } > + > + if (vmf->flags & FAULT_FLAG_TRIED) > + goto unlock; > + > + if (vmf->flags & FAULT_FLAG_WRITE) > + entry = pte_mkdirty(entry); > + Thanks, this looks better to me. Andrew -- please can you update the version in your tree? Cheers, Will