From patchwork Sun Dec 18 10:19:00 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hyeonggon Yoo <42.hyeyoo@gmail.com> X-Patchwork-Id: 13076025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id EEAC7C4332F for ; Sun, 18 Dec 2022 10:19:42 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 899E88E0006; Sun, 18 Dec 2022 05:19:42 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 854DC8E0001; Sun, 18 Dec 2022 05:19:42 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 6EAA98E0006; Sun, 18 Dec 2022 05:19:42 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 5A8548E0001 for ; Sun, 18 Dec 2022 05:19:42 -0500 (EST) Received: from smtpin23.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 32611AACE3 for ; Sun, 18 Dec 2022 10:19:42 +0000 (UTC) X-FDA: 80255030604.23.4CD0D7B Received: from mail-pj1-f47.google.com (mail-pj1-f47.google.com [209.85.216.47]) by imf26.hostedemail.com (Postfix) with ESMTP id 7B76414000A for ; Sun, 18 Dec 2022 10:19:40 +0000 (UTC) Authentication-Results: imf26.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=GB+cIi5r; spf=pass (imf26.hostedemail.com: domain of 42.hyeyoo@gmail.com designates 209.85.216.47 as permitted sender) smtp.mailfrom=42.hyeyoo@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1671358780; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=D+7GjecAQWYKdyIMijkjG0fslIItZloxZjhPMs3OBpw=; b=MXCrfJJOy90s9UIfLPjRtA8Ru+UTVybzMoNmyK79Mgk6WFOrjswQB2har/6kE/2WybP9nI WpNJ85yIHdrIf+CetjvuZpwzTNVwc4VYXl7znptDK8WF2KCtRkY8ayaom9ClNMeAnVEFrd odE1bT68gThZHjZY7cIk18sWI1PBmHw= ARC-Authentication-Results: i=1; imf26.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=GB+cIi5r; spf=pass (imf26.hostedemail.com: domain of 42.hyeyoo@gmail.com designates 209.85.216.47 as permitted sender) smtp.mailfrom=42.hyeyoo@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1671358780; a=rsa-sha256; cv=none; b=khreLxs3hamtyDxA48q9YP2cXC90qIbgnzvG9hzNmyWqhCEfXAxwXkwYDgf84LFHFJnlRW KRI1oyl/BWzeDgONF/Kmn3Sz1JEwhgYUvPp3fK6y7HUxucECp0ISFgPB/3I7Duydzcajwo 6JW0mM7s+xzze5fbHPMQlApBekhuWgA= Received: by mail-pj1-f47.google.com with SMTP id o12so6441285pjo.4 for ; Sun, 18 Dec 2022 02:19:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=D+7GjecAQWYKdyIMijkjG0fslIItZloxZjhPMs3OBpw=; b=GB+cIi5ruQzrbOrlJbNzYlQ1gH9cgIK6ioIhYfetGCqlHswGzIRR+TzMfVrKR0C2sX n+F50/v7rHI0gvqm5BvXZClesXl4zQkvidtIZZF3tTXSePliVaxQ5fsuAGyppWUv0BLl Zx6Tbei1P6+mqoGTku/v3tvi92L60cjrk/4LQXalFfFxBVwUnUyfIIlxqKyrQgRHKJYX 9zv9KGOVZttO1NiJX0T9p/YQlFONDN1Bjr2E3N+qVvpzDLUbKlZK+SLK0LhphmCGBbKd zUUqqJAai4NSOX6qTtT8hN8A00XODki6V9A2BBFy386HS7wkbQr73yRAmuTDPDa91/2M Uviw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=D+7GjecAQWYKdyIMijkjG0fslIItZloxZjhPMs3OBpw=; b=Oi4/cb0V8QBBUkoQMYFLFrNibiaXxeibKx83veVtrwC6vwHLjRNAUkP8Vf2rgzlkSU HgmJ/ViE2kDb/jKwmu1rdfQnC+rBqe5LrmhfoTlSnZ7M3VYigUpbUIuO8xPSkFoZfCF6 kZy6/pbKrjX7/v3yI/zHPkop8rP0gbTVONdNEWh54abM7RgpBsfI+mADl1QEro4Ei0+b x/OoAEhhxB5kG3/J051vddR3pEEzgMDEXVqd0fKeAvpoe0tKBvPlpxnQb08hINeOzlkn 2IYZ2TAKvlMJbbYi9mGIH7MJHwUfPp7V+FpCmsqcDj2HkJ9LIquZ9gaCWI4iJizU7PX6 WyyQ== X-Gm-Message-State: ANoB5pkZBG5zSJ7zMF7om0+QuwO2UYQDT+fHgoVUPOEbKTWrH/zJ2lqf JEKmYpRcKpJs9E5wd1hT4bA= X-Google-Smtp-Source: AA0mqf5oVPeB5bhp8aKBFuvgIKkQpspt6mh+LJK000FqqtoAAMJTJ0x6zwvVmJvhrD0/w2mwwG2NjQ== X-Received: by 2002:a17:902:d18b:b0:18f:8f1d:2352 with SMTP id m11-20020a170902d18b00b0018f8f1d2352mr26047426plb.30.1671358779463; Sun, 18 Dec 2022 02:19:39 -0800 (PST) Received: from hyeyoo.. ([114.29.91.56]) by smtp.gmail.com with ESMTPSA id ik11-20020a170902ab0b00b001897bfc9800sm4789791plb.53.2022.12.18.02.19.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 18 Dec 2022 02:19:38 -0800 (PST) From: Hyeonggon Yoo <42.hyeyoo@gmail.com> To: Christoph Lameter , Pekka Enberg , David Rientjes , Joonsoo Kim , Andrew Morton , Vlastimil Babka , Roman Gushchin Cc: Hyeonggon Yoo <42.hyeyoo@gmail.com>, =?utf-8?b?SE9SSUdVQ0hJIE5BT1lBKA==?= =?utf-8?b?5aCA5Y+j44CA55u05LmfKQ==?= , Joe Perches , Petr Mladek , Andy Shevchenko , Matthew WilCox , David Hildenbrand , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [RFC v3 3/4] mm, printk: introduce new format %pGt for page_type Date: Sun, 18 Dec 2022 19:19:00 +0900 Message-Id: <20221218101901.373450-4-42.hyeyoo@gmail.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20221218101901.373450-1-42.hyeyoo@gmail.com> References: <20221218101901.373450-1-42.hyeyoo@gmail.com> MIME-Version: 1.0 X-Rspamd-Queue-Id: 7B76414000A X-Stat-Signature: 66zooeqwsox73r57zoah9z3qu1ubzy51 X-Rspam-User: X-Rspamd-Server: rspam08 X-HE-Tag: 1671358780-535251 X-HE-Meta: U2FsdGVkX195glFNZcSEa86Gky7rMqFGtGEfLC2HrTdcaDdfKI9Hg+RLW2j1hupSj5I2yYMKTi8Mkw0Pk1Kd8QMu2VtwxvWDbumzzpP9l/egNqIBn+02MxeT2d1QUnoitfxkVwd9PilPXY4kl3trZFBabo9kaOB0U6FmU28mv51Zr0LrwAouleEtmiZfOmvMEZBoW+lKO40FZjTAVt0gy1jZd92aV6/vwa4SCGOfoOZuU/sWo+7roKMlsnVMtHW+PgBWoG5oS+J2e3zSRYm2BXbBxRV4C83MTP3MEGTINEZVl0WrPK5tqkjJjHXb4i02YdZ40DGJD09MzSrGgbJ1vbWlnEemnSnhfM1Z0G9BVmsaW/YREFla5zerU2vJo/mAuLuuYRqCm5j/HGGq7zSUfwCue2pv+qoZFMDBaD2amqP1KJsszJVaQUE2uxjBoZGYy32t7GQZbEgQc3soNCR4M0pE2jfv/9bO9bCsi6BodhexQol8pG8g2r6AelRCHi701/PnNRVHbnHQSuv7qDRWrT7MT8CeaYi3pSB2I5bAmUWjdHLOxAW7vdt5daB6pVL2S8GFgTLAIVBf9p7mbXAJHZseG2D4AgMoTsfTZAqgsiaQPpOdxrcSc0YiuzVITK2dNAd1CJ6DvC8GE+YJcPFg+Sa215e2TZ2LF+CZJqd2xwxj78/PTwxi3idyNJDOk0OwDq+rnOcz0P28XIt/vFMsXsN8F8nyAV57TUtJAl9AK5V1L+ROmuCVO7JSoSz5zC8GN0EMGzBxSnNAQ85L3jZGb7NtOskwgGVpLt0BCOZhzG6THhc1ylTcz60JIazpwjyOpnGDEFgw8rX0n00de2bsCD11HzNAhXwGSdA3RyNJBR0G5LJJK346cG6GydbRaRHbDDP+MyElesYtXbdfHvixu7aKf9bzwgULk86MnTEMlmkTdMnJc3a6tPNfK0wbfuMUTHzA25hCrPC2DB2CIDZ HXaMND11 KvxIj7Opu3Z39A7xdp4mYNK3US7UjVSpk/P2m7frcr3bG6Pny/nBNswTvW8CACGp4wn7VYLMrRMD1Oe/kJtk+sXZw8g1Ex1FAY6ldgnD1zAjrGJgqcjvX/eB0fO7/n/jk1ZtusQ4ygLrn08dC+O7I4rc3vStv1oPulnOncaNtLNgMu0RqX/WZrNtGiHqEdQNIa6CNtS5GhLbkOZacUKAyNz7hBLurawAEZN9C2GLdZWwJHwR4zW87XjkDotUnlw0F1w7Tram8rwszo3MqAwBH/rQdxi04zrzy2Kzd X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: %pGp format is used to print 'flags' field of struct page. As some page flags (e.g. PG_buddy, see page-flags.h for more details) are set in page_type field, introduce %pGt format which provides human readable output of page_type. Note that the sense of bits are different in page_type. if page_type is 0xffffffff, no flags are set. if PG_slab (0x00100000) flag is set, page_type is 0xffefffff. Clearing a bit means we set the bit. Bits in page_type are inverted when printing page type names. Signed-off-by: Hyeonggon Yoo <42.hyeyoo@gmail.com> --- Documentation/core-api/printk-formats.rst | 3 ++- include/trace/events/mmflags.h | 7 ++++++ lib/test_printf.c | 26 +++++++++++++++++++++++ lib/vsprintf.c | 21 ++++++++++++++++++ mm/debug.c | 5 +++++ mm/internal.h | 1 + 6 files changed, 62 insertions(+), 1 deletion(-) diff --git a/Documentation/core-api/printk-formats.rst b/Documentation/core-api/printk-formats.rst index dbe1aacc79d0..582e965508eb 100644 --- a/Documentation/core-api/printk-formats.rst +++ b/Documentation/core-api/printk-formats.rst @@ -575,12 +575,13 @@ The field width is passed by value, the bitmap is passed by reference. Helper macros cpumask_pr_args() and nodemask_pr_args() are available to ease printing cpumask and nodemask. -Flags bitfields such as page flags, gfp_flags +Flags bitfields such as page flags, page_type, gfp_flags --------------------------------------------- :: %pGp 0x17ffffc0002036(referenced|uptodate|lru|active|private|node=0|zone=2|lastcpupid=0x1fffff) + %pGt 0xffefffff(slab) %pGg GFP_USER|GFP_DMA32|GFP_NOWARN %pGv read|exec|mayread|maywrite|mayexec|denywrite diff --git a/include/trace/events/mmflags.h b/include/trace/events/mmflags.h index 8301912f8c25..57f52d00e761 100644 --- a/include/trace/events/mmflags.h +++ b/include/trace/events/mmflags.h @@ -138,6 +138,13 @@ IF_HAVE_PG_SKIP_KASAN_POISON(PG_skip_kasan_poison, "skip_kasan_poison") __def_pageflag_names \ ) : "none" +#define __def_pagetype_names \ + {PG_slab, "slab" }, \ + {PG_offline, "offline" }, \ + {PG_guard, "guard" }, \ + {PG_table, "table" }, \ + {PG_buddy, "buddy" } + #if defined(CONFIG_X86) #define __VM_ARCH_SPECIFIC_1 {VM_PAT, "pat" } #elif defined(CONFIG_PPC) diff --git a/lib/test_printf.c b/lib/test_printf.c index d34dc636b81c..e0d0770d5eec 100644 --- a/lib/test_printf.c +++ b/lib/test_printf.c @@ -642,12 +642,26 @@ page_flags_test(int section, int node, int zone, int last_cpupid, test(cmp_buf, "%pGp", &flags); } +static void __init page_type_test(unsigned int page_type, const char *name, + char *cmp_buf) +{ + unsigned long size; + + size = scnprintf(cmp_buf, BUF_SIZE, "%#x(", page_type); + if (page_type_has_type(page_type)) + size += scnprintf(cmp_buf + size, BUF_SIZE - size, "%s", name); + + snprintf(cmp_buf + size, BUF_SIZE - size, ")"); + test(cmp_buf, "%pGt", &page_type); +} + static void __init flags(void) { unsigned long flags; char *cmp_buffer; gfp_t gfp; + unsigned int page_type; cmp_buffer = kmalloc(BUF_SIZE, GFP_KERNEL); if (!cmp_buffer) @@ -687,6 +701,18 @@ flags(void) gfp |= __GFP_ATOMIC; test(cmp_buffer, "%pGg", &gfp); + page_type = ~0; + page_type_test(page_type, "", cmp_buffer); + + page_type = 10; + page_type_test(page_type, "", cmp_buffer); + + page_type = ~PG_slab; + page_type_test(page_type, "slab", cmp_buffer); + + page_type = ~(PG_slab | PG_table | PG_buddy); + page_type_test(page_type, "slab|table|buddy", cmp_buffer); + kfree(cmp_buffer); } diff --git a/lib/vsprintf.c b/lib/vsprintf.c index be71a03c936a..fbe320b5e89f 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -2052,6 +2052,25 @@ char *format_page_flags(char *buf, char *end, unsigned long flags) return buf; } +static +char *format_page_type(char *buf, char *end, unsigned int page_type) +{ + buf = number(buf, end, page_type, default_flag_spec); + + if (buf < end) + *buf = '('; + buf++; + + if (page_type_has_type(page_type)) + buf = format_flags(buf, end, ~page_type, pagetype_names); + + if (buf < end) + *buf = ')'; + buf++; + + return buf; +} + static noinline_for_stack char *flags_string(char *buf, char *end, void *flags_ptr, struct printf_spec spec, const char *fmt) @@ -2065,6 +2084,8 @@ char *flags_string(char *buf, char *end, void *flags_ptr, switch (fmt[1]) { case 'p': return format_page_flags(buf, end, *(unsigned long *)flags_ptr); + case 't': + return format_page_type(buf, end, *(unsigned int *)flags_ptr); case 'v': flags = *(unsigned long *)flags_ptr; names = vmaflag_names; diff --git a/mm/debug.c b/mm/debug.c index 7f8e5f744e42..5ce6b359004a 100644 --- a/mm/debug.c +++ b/mm/debug.c @@ -36,6 +36,11 @@ const struct trace_print_flags pageflag_names[] = { {0, NULL} }; +const struct trace_print_flags pagetype_names[] = { + __def_pagetype_names, + {0, NULL} +}; + const struct trace_print_flags gfpflag_names[] = { __def_gfpflag_names, {0, NULL} diff --git a/mm/internal.h b/mm/internal.h index bcf75a8b032d..b4ba6fd6051c 100644 --- a/mm/internal.h +++ b/mm/internal.h @@ -773,6 +773,7 @@ static inline void flush_tlb_batched_pending(struct mm_struct *mm) #endif /* CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH */ extern const struct trace_print_flags pageflag_names[]; +extern const struct trace_print_flags pagetype_names[]; extern const struct trace_print_flags vmaflag_names[]; extern const struct trace_print_flags gfpflag_names[];