Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp149194pxj; Wed, 26 May 2021 18:49:24 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyCGowLGdPsPCD/iGyKvb2unRMp8UukMEqwljxbz4Xkp5UnWoRNKk8KF06Q/bGY3bO7ZIx2 X-Received: by 2002:a92:b102:: with SMTP id t2mr997884ilh.102.1622080164757; Wed, 26 May 2021 18:49:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1622080164; cv=none; d=google.com; s=arc-20160816; b=RgtEZisI6h4vss+PwbQKvLyP8q5sWJBragkRJBBdbGDZnJIFDo1b+ruNVhi3WJBqeH Am2NNE7lvA7gT8/TRqEycgOUfVkJFlr4ctYYBsvdG5JWK9oLa/exDR/sZbchtlughd88 5WnVO+ZRW2D7R2A3y4s8MF/Wk22jUMFTuJYeEVlzLlwd1FnTgVDQU26nl/JJwz5duGFJ fvCr1RFcYwKFVSud3Jcbh83UE9mqoiBv4asO857PbUiaFypoBZUVg9gUGhRgX7TGE37u 3nRc8nMzYs5C/dO2s9qDdMBTSEpfMIUeLCb/R5G4GHv/S7xi7qPhlA31Yrc0JSMwLW+s PO5A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:user-agent:references:message-id :in-reply-to:subject:cc:to:from:date:dkim-signature; bh=VlAnyDw6pOEr4UrVszLcWbhU5bthiU7s1qIDq+xEOhg=; b=LsHq6vn0knZ+b6hR9Ex1WV5O1bTMpSkv3OWGQ7nrX3urK3Lftp97bbuHA7TNzhpkyP de3MQT+fcROZqhE8X6JC5RqE76hiDoCkWpSoKIrJ4Z3YzUULgdpyolg9+MVTfyY8TymG GwNbXYHbAWeGp9recXrtdqUPQnF4cXuFDVNYUg6RfNIqCdADY0ERXMPeguQJ3cxpUOC7 pITYTvh5QlCkaTvFrS/yz/xLsVptcmyxPc7OrvaWOZJOnxPrRlUTHbaAj9Kpub98Lhol 6TqxvgaNfxnviumRbTu8bnVrCu4a+ch+UZYnxEhIEFnsl2h6iDITAyUXaFerYx0gGz3u eNVg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=pCEe7RNP; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id b11si831868jat.37.2021.05.26.18.49.09; Wed, 26 May 2021 18:49:24 -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=@google.com header.s=20161025 header.b=pCEe7RNP; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233308AbhE0A7e (ORCPT + 99 others); Wed, 26 May 2021 20:59:34 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34278 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229956AbhE0A7b (ORCPT ); Wed, 26 May 2021 20:59:31 -0400 Received: from mail-qt1-x833.google.com (mail-qt1-x833.google.com [IPv6:2607:f8b0:4864:20::833]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D4498C061574 for ; Wed, 26 May 2021 17:57:58 -0700 (PDT) Received: by mail-qt1-x833.google.com with SMTP id c15so2353502qte.6 for ; Wed, 26 May 2021 17:57:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:from:to:cc:subject:in-reply-to:message-id:references :user-agent:mime-version; bh=VlAnyDw6pOEr4UrVszLcWbhU5bthiU7s1qIDq+xEOhg=; b=pCEe7RNPWnZ4rQBQ8SmjheElLpr1XVKjKcZt8DigpqtuH06dvNcxuWjLsT2XqVkraO soY1VcdN/ioF2VCB0b8mUg1CJcb+ssnQDXUY4tXAkOcl2wRu7CByql8gUxhH8PuaQnhx Q+l0GRyKQmnAjf9TAP1FaWKf09oRK0KCzaJE5O9hd6M8SugQidU20pJckcnUCEHekhm5 nfq0Qveh8tjf4KydffPgoL8Hny8Dpxf5RF4eWpR9ORU52lnE00qEyCS2SK5HVe9cTwhQ Q6tD0+WF4ua0dUM5UufvsZfISHQwHPdVi3uKUq+9LqfsNvdPv69iKEaaALmN6NBjGtWv qG0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:in-reply-to:message-id :references:user-agent:mime-version; bh=VlAnyDw6pOEr4UrVszLcWbhU5bthiU7s1qIDq+xEOhg=; b=WV6sUQAQnJZbqEvxMwaQnmJmMf6c/BoM6VelwhqI+Dlf7HBB4NpUctGpdVV7vhpIk1 Y5jnYahR7kgv2303yv5VrfaXqG7UHzSHAOEGI5MxuCy7HSEK+Veb+SQaX1zsjRePLfYu b0alWzrCKZI10xeEU+nnwvSFJgUARrbYgcmzIJbUux1opZlLPFrfenPgsgemZt8EdJkF apjygCFDaAq/V89kWfrs3M5EiAnPczn/KLBMH3eq7s4beShgNtbPLpg0CTM6yp47mTes Rx9Wta80LdQvQDSrQiJei88eTh0kLa9mMRDT21fW34LQR95msyxND2BXnqYL/XKXsqCg Q1DA== X-Gm-Message-State: AOAM531s6Cc/Sl7AXPIYLFrwRExRTlQHBlculCeFxg5/Niq4VBTBYejk OrqwX3IZ7nyqdASauz8SD+NI9decK3/9hQ== X-Received: by 2002:a05:622a:40d:: with SMTP id n13mr885951qtx.59.1622077077752; Wed, 26 May 2021 17:57:57 -0700 (PDT) Received: from eggly.attlocal.net (172-10-233-147.lightspeed.sntcca.sbcglobal.net. [172.10.233.147]) by smtp.gmail.com with ESMTPSA id d28sm399733qkl.105.2021.05.26.17.57.56 (version=TLS1 cipher=ECDHE-ECDSA-AES128-SHA bits=128/128); Wed, 26 May 2021 17:57:57 -0700 (PDT) Date: Wed, 26 May 2021 17:57:40 -0700 (PDT) From: Hugh Dickins X-X-Sender: hugh@eggly.anvils To: Yang Shi cc: Hugh Dickins , Zi Yan , "Kirill A. Shutemov" , =?UTF-8?Q?HORIGUCHI_NAOYA=28=E5=A0=80=E5=8F=A3_=E7=9B=B4=E4=B9=9F=29?= , Wang Yugui , Andrew Morton , Linux MM , Linux Kernel Mailing List Subject: Re: [v3 PATCH 2/2] mm: thp: check page_mapped instead of page_mapcount for split In-Reply-To: Message-ID: References: <20210525162145.3510-1-shy828301@gmail.com> <20210525162145.3510-2-shy828301@gmail.com> User-Agent: Alpine 2.11 (LSU 23 2013-08-11) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, 26 May 2021, Yang Shi wrote: > On Wed, May 26, 2021 at 3:48 PM Hugh Dickins wrote: > > On Wed, 26 May 2021, Yang Shi wrote: > > > On Tue, May 25, 2021 at 4:58 PM Hugh Dickins wrote: > > > > On Tue, 25 May 2021, Yang Shi wrote: > > > > > > > > > > We should be able to make dump_page() print total mapcount, right? The > > > > > dump_page() should be just called in some error paths so taking some > > > > > extra overhead to dump more information seems harmless, or am I > > > > > missing something? Of course, this can be done in a separate patch. > > > > > > > > I didn't want to ask that of you, but yes, if you're willing to add > > > > total_mapcount() into dump_page(), I think that would be ideal; and > > > > could be helpful for other cases too. > > > > > > > > Looking through total_mapcount(), I think it's safe to call from > > > > dump_page() - I always worry about extending crash info with > > > > something that depends on a maybe-corrupted pointer which would > > > > generate a further crash and either recurse or truncate the output - > > > > but please check that carefully. > > > > > > Yes, it is possible. If the THP is being split, some VM_BUG_* might be > > > triggered if total_mapcount() is called. But it is still feasible to > > > print total mapcount as long as we implement a more robust version for > > > dump_page(). > > > > Oh dear. I think the very last thing the kernel needs is yet another > > subtly different variant of *mapcount*(). > > > > Do you have a specific VM_BUG_* in mind there? Of course there's > > the VM_BUG_ON_PAGE(PageTail) at the start of it, and you'd want to > > print total_mapcount(head) to avoid that one. > > There are two more places in total_mapcount() other than the tail page > assertion. > > #1. compound_mapcount() has !PageCompound assertion. The similar > problem has been met before, please refer to commit 6dc5ea16c86f ("mm, > dump_page: do not crash with bad compound_mapcount()"). Thanks for the useful reference. > #2. PageDoubleMap has !PageHead assertion. > > > > > Looks like __dump_page() is already careful about "head", checking > > whether "page" is within the expected bounds. Of course, once we're > > in serious VM_WARN territory, there might be races which could flip > > fields midway: PageTail set by the time it reaches total_mapcount()? > > It seems possible, at least theoretically. > > > Narrow the race (rather like it does with PageSlab) by testing > > PageTail immediately before calling total_mapcount(head)? > > TBH I don't think of a simple testing to narrow all the races. We have > to add multiple testing in total_mapcount(), it seems too hacky. > Another variant like below might be neater? > > +static inline int __total_mapcount(struct page *head) > +{ > + int i, compound, nr, ret; > + > + compound = head_compound_mapcount(head); > + nr = compound_nr(head); > + if (PageHuge(head)) > + return compound; > + ret = compound; > + for (i = 0; i < nr; i++) > + ret += atomic_read(&head[i]._mapcount) + 1; > + /* File pages has compound_mapcount included in _mapcount */ > + if (!PageAnon(head)) > + return ret - compound * nr; > + if (head[1].flags & PG_double_map) > + ret -= nr; > + return ret; > +} I still don't want any more of those lovely functions. My current preference is just to drop the idea of trying to show total_mapcount from __dump_page(). I might end up compromising on printing the result of for (i = 0; i < nr; i++) ret += atomic_read(&head[i]._mapcount) + 1; (if we can safely decide nr), and leave all the convoluted flags logic to the poor reader of the page dump. But that in itself shows the limitation of printing total_mapcount(), when individual corrupt _mapcounts might be -1, +2, -3, +4, ... To some extent (modulo racing references to the THP), a good total_mapcount can be inferred from the page reference count. (But that probably describes better the situation when everything is going correctly: maybe problems tend to come precisely when there are multiple racing references.) Dunno. My mind is not on it at the moment. I'm more concerned that Wang Yugui's crash turns out not to be solved by any of the fixes I have lined up: we certainly did not promise that it would be, and it shouldn't stop advancing the fixes we already know, but I do want to give it a little more thought before resuming on my patches. Hugh