Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp2002937ybl; Sun, 19 Jan 2020 16:35:56 -0800 (PST) X-Google-Smtp-Source: APXvYqyglqlmFBz8WCB+Pg8jsG4JWrJw61A1o9KD7/O16ascg6NEr8d+f7qv+/cvAOxgRqKNmrQ/ X-Received: by 2002:a9d:7cd0:: with SMTP id r16mr14560593otn.50.1579480556218; Sun, 19 Jan 2020 16:35:56 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1579480556; cv=none; d=google.com; s=arc-20160816; b=zblEAhA8yrdtzPrMGOBaqfyaD3zMvUMqINOem29VLLhG0YmprIgdFTZNYtBg5xULbk +IAOoiVgkzvjSOYdE4MQtbr22sd1JaY4Jp6n/Ol7NPdpYouqm0/pLg9vP058WPvPwqwZ JY8BJVVE57XqC40+Gtoq+9aWvwamZlJKAtfwNEmpagKA19h8BwQfZKFvr3LahdDh28Di F4DqRmjhJCEwQFtWrSIcWqvRM4iVMAJ5VwLlUljXdiiYxkmbPptUc9UXdjPEQxF/WMLr ZZQm84iTReqDnLKBph1ZLdXJfr0xTAozx3ZBLEfjU7Ygz/6Kp7YTXEKIBfADl2sK8L5+ ysGQ== 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:reply-to:message-id :subject:cc:to:from:date; bh=NJesIwbt0r2Bzr1v1kZhT++ChdZFScXWvbsWLbbJrwI=; b=CAqRtCeY/Qn7wnscrH7ZpEPfhwgaONuc0jsLCp+SBJjaVgs79CWpm7JsYkVCV5DmcV BDf4BgOaNf4KhOiexamVm47BCF7US+eTJj2SrtjNwPc4ciAg07Alqse4oBmarFEd5aiU hDxnkwRwldpvQV/YnWkW7xCuPvxmj4Bj0JgkHO+w8pmA6c4iamxQS8rliiEesDDDZ6Pv Ccr8+fbIzJul68GIuTev16IvwOH0Ol+OqKVR7nPGs89IrOHofNSVz4vor+rbcjQ7Stlx g1Irf6k7IfYcZmjRjnQCDbRUtHSwiPcDEpuQa62orSXTxkuE7Nlnbf4hFH5fySW6HjTe vLOw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t74si16651208oih.155.2020.01.19.16.35.43; Sun, 19 Jan 2020 16:35:56 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728981AbgATAdu (ORCPT + 99 others); Sun, 19 Jan 2020 19:33:50 -0500 Received: from mga05.intel.com ([192.55.52.43]:29231 "EHLO mga05.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728841AbgATAdu (ORCPT ); Sun, 19 Jan 2020 19:33:50 -0500 X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Jan 2020 16:33:50 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.70,340,1574150400"; d="scan'208";a="374184346" Received: from richard.sh.intel.com (HELO localhost) ([10.239.159.54]) by orsmga004.jf.intel.com with ESMTP; 19 Jan 2020 16:33:48 -0800 Date: Mon, 20 Jan 2020 08:33:59 +0800 From: Wei Yang To: David Rientjes Cc: Wei Yang , akpm@linux-foundation.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH 1/4] mm/page_alloc.c: extract commom part to check page Message-ID: <20200120003359.GB26292@richard> Reply-To: Wei Yang References: <20200119131408.23247-1-richardw.yang@linux.intel.com> <20200119131408.23247-2-richardw.yang@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.9.4 (2018-02-28) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sun, Jan 19, 2020 at 02:06:18PM -0800, David Rientjes wrote: >On Sun, 19 Jan 2020, Wei Yang wrote: > >> diff --git a/mm/page_alloc.c b/mm/page_alloc.c >> index d047bf7d8fd4..8cd06729169f 100644 >> --- a/mm/page_alloc.c >> +++ b/mm/page_alloc.c >> @@ -1025,13 +1025,9 @@ static inline bool page_expected_state(struct page *page, >> return true; >> } >> >> -static void free_pages_check_bad(struct page *page) >> +static inline const char *__check_page(struct page *page) >> { >> - const char *bad_reason; >> - unsigned long bad_flags; >> - >> - bad_reason = NULL; >> - bad_flags = 0; >> + const char *bad_reason = NULL; >> >> if (unlikely(atomic_read(&page->_mapcount) != -1)) >> bad_reason = "nonzero mapcount"; >> @@ -1039,14 +1035,23 @@ static void free_pages_check_bad(struct page *page) >> bad_reason = "non-NULL mapping"; >> if (unlikely(page_ref_count(page) != 0)) >> bad_reason = "nonzero _refcount"; >> - if (unlikely(page->flags & PAGE_FLAGS_CHECK_AT_FREE)) { >> - bad_reason = "PAGE_FLAGS_CHECK_AT_FREE flag(s) set"; >> - bad_flags = PAGE_FLAGS_CHECK_AT_FREE; >> - } >> #ifdef CONFIG_MEMCG >> if (unlikely(page->mem_cgroup)) >> bad_reason = "page still charged to cgroup"; >> #endif >> + return bad_reason; >> +} >> + >> +static void free_pages_check_bad(struct page *page) >> +{ >> + const char *bad_reason = NULL; >> + unsigned long bad_flags = 0; >> + >> + bad_reason = __check_page(page); >> + if (unlikely(page->flags & PAGE_FLAGS_CHECK_AT_FREE)) { >> + bad_reason = "PAGE_FLAGS_CHECK_AT_FREE flag(s) set"; >> + bad_flags = PAGE_FLAGS_CHECK_AT_FREE; >> + } >> bad_page(page, bad_reason, bad_flags); >> } >> >> @@ -2044,12 +2049,7 @@ static void check_new_page_bad(struct page *page) >> const char *bad_reason = NULL; >> unsigned long bad_flags = 0; >> >> - if (unlikely(atomic_read(&page->_mapcount) != -1)) >> - bad_reason = "nonzero mapcount"; >> - if (unlikely(page->mapping != NULL)) >> - bad_reason = "non-NULL mapping"; >> - if (unlikely(page_ref_count(page) != 0)) >> - bad_reason = "nonzero _refcount"; >> + bad_reason = __check_page(page); >> if (unlikely(page->flags & __PG_HWPOISON)) { >> bad_reason = "HWPoisoned (hardware-corrupted)"; >> bad_flags = __PG_HWPOISON; >> @@ -2061,10 +2061,6 @@ static void check_new_page_bad(struct page *page) >> bad_reason = "PAGE_FLAGS_CHECK_AT_PREP flag set"; >> bad_flags = PAGE_FLAGS_CHECK_AT_PREP; >> } >> -#ifdef CONFIG_MEMCG >> - if (unlikely(page->mem_cgroup)) >> - bad_reason = "page still charged to cgroup"; >> -#endif >> bad_page(page, bad_reason, bad_flags); >> } >> > >I think this is compounding a previous problem in these functions: these >are all "if" clauses, not "else if" clauses so they are presumably ordered >based on least significant to most significant (we only see the last >bad_reason that we find). For the page->mem_cgroup check, this leaves >bad_flags set but it doesn't match bad_reason. > I have thought about this. And curious about the order of those reasons. >Could you instead fix the problem with these functions so that we actually >list *all* the problems with the page rather than only the last >conditional that is true? Sure, thanks for the suggestion. -- Wei Yang Help you, Help me