From patchwork Thu Jun 27 17:08:53 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrii Nakryiko X-Patchwork-Id: 13714875 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 12851C30653 for ; Thu, 27 Jun 2024 17:09:11 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id B75286B009E; Thu, 27 Jun 2024 13:09:10 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id A82186B00A1; Thu, 27 Jun 2024 13:09:10 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 79C726B009F; Thu, 27 Jun 2024 13:09:10 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 533DB6B009E for ; Thu, 27 Jun 2024 13:09:10 -0400 (EDT) Received: from smtpin11.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id D3EEC120BAC for ; Thu, 27 Jun 2024 17:09:09 +0000 (UTC) X-FDA: 82277304018.11.A7C361A Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by imf08.hostedemail.com (Postfix) with ESMTP id 165F6160013 for ; Thu, 27 Jun 2024 17:09:07 +0000 (UTC) Authentication-Results: imf08.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=pjIV75Ud; dmarc=pass (policy=none) header.from=kernel.org; spf=pass (imf08.hostedemail.com: domain of andrii@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=andrii@kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1719508135; a=rsa-sha256; cv=none; b=3EuuhOJ/dgaOctjVcq6TqD//A6/PTUBy97IO+tyXyi/+PE7YEav9ZxzaV1d8NwTJP9G6hY Rg0Rx4wtbKXPRsjNg0lnda7ZZgDT4xbiIrXFGhKSXqPdNbSaJELU8jmpCobiDEtTSzf2bv IylBTm09yYjycKGI+CgkSeHP/OT7qIw= ARC-Authentication-Results: i=1; imf08.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=pjIV75Ud; dmarc=pass (policy=none) header.from=kernel.org; spf=pass (imf08.hostedemail.com: domain of andrii@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=andrii@kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1719508135; 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=pr/fv0ckxhWR6mlagUsulw9zLq7bdT+8t88N5DpZzzA=; b=w+40cW8TxtyvAN6jgLSW/boyLWKRDMjkwbVkiKcE+XHV87Q6Hz2RNyEWtsTucmFI52Z31O h7BLCASTGKYntTjoTg4MNWcG+EKQO5FBPRVGJUmgaxEDeI9DM8NjsXHQdQf52Cnev+YiM1 Z3a9JGf5CoMvHICnEm8HhKsILvNtADo= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id 2209261F69; Thu, 27 Jun 2024 17:09:07 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id BAC91C4AF07; Thu, 27 Jun 2024 17:09:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1719508146; bh=b8KoHPdCbnvChHG05PMTrqcngJcnOaTMuFGj6VIsl38=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pjIV75UdEeKIB7IaNhqm13TydwUtSi56/ZC2Js19IziL9voEgHiIwjqXBr2yhR3L9 1aD9WGGVRkJYV/8UXnoJjYJ8L8GY8/BLLtk9TU4jAskODI/pNepgLHZ7YzRUboN1TH QVzI4nCGbatSePOYnxFYraXGY7YuyvYUXo7bKJR2fQR0uvXrXud8u4ei0uaJeFAeua 1wy5q4juZ0gjE2gTNngqv6AQSCplJgyvsoR47iGoWhzaCpOrijxgfJdUPOOrSaO1Dv tFVeG9/As5PFN5bGgB54aokX6FsGm+y0G8h15R1y/7roRHfbhsn03uKzajvqWOL8nd tz++M0cJJZ39Q== From: Andrii Nakryiko To: linux-fsdevel@vger.kernel.org, brauner@kernel.org, viro@zeniv.linux.org.uk, akpm@linux-foundation.org Cc: linux-kernel@vger.kernel.org, bpf@vger.kernel.org, gregkh@linuxfoundation.org, linux-mm@kvack.org, liam.howlett@oracle.com, surenb@google.com, rppt@kernel.org, adobriyan@gmail.com, Andrii Nakryiko Subject: [PATCH v6 1/6] fs/procfs: extract logic for getting VMA name constituents Date: Thu, 27 Jun 2024 10:08:53 -0700 Message-ID: <20240627170900.1672542-2-andrii@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240627170900.1672542-1-andrii@kernel.org> References: <20240627170900.1672542-1-andrii@kernel.org> MIME-Version: 1.0 X-Rspamd-Queue-Id: 165F6160013 X-Rspam-User: X-Rspamd-Server: rspam05 X-Stat-Signature: 1sqxrrwb8pwpjwafq7tpbzxxocszkh7k X-HE-Tag: 1719508147-448605 X-HE-Meta: U2FsdGVkX1+CuNLfh0hFOmpAj6Ca0Rz1iNW2cXXUXEV3ZXCHd+31GyuzZt0+HqnqpxlU2Pun+bUWgOoi35guyLDZGO8wZDVxwB0y65A7qOG5J6mBqJ5dsKFtW7GCLCsCkTchCNjZE2Dg59eXnCCT4jN7FtMkSOS6UKnMCQKsTkki/GvGPHOvjo9+4pi4n+LiYlmpFqnnrq73FBm1SxObxlprHwDM4mMtW72WPeKRNFplmSl+V1ARL+yw070IUQwzHT/gErfTDcwoUUytLhdbjX3Ti6bgS5kjtIZzNk80S5RzhETFzuEte64cSShCHzxKmAgoNmBuoC8+ms6OLFE+IGErntCXYFV7LdEixBooKH6Hj10cybyon9S214kGhY6sC0ZQXCuOrRcA0W6Lm+WkRWC05F99KQOa+Z6O4wmD1ZZKe+u1Zoo2K8VLwbRbNM3HQ8WfN1DHthVMlrbPx0DbY5jRTlqtLBKeD+Rc3U9tJPsbsO4QbktSmvhiSTdhxx8xukMNcyrZi2yJXOmEnmCMPpJQjyIOtI5nRjbXrOIukSXG3ddC/Mg1XFGnCf5WBhXRkwvBMICf1v7hK9c35v7ZFoTCiYsH3NYgbAyWl6ZhLFil6Qtdeps7A5zh8KFFAE34W9Hxx4dII0M2LELdqNXa2zwkqDUOAFD5rd2JrZfkhA7qhVLpQNwyTCgFaTqfSRpNVocLc6FgiPa5svgYyI7zmZF9Nu4e1OC2LmeVqy3o+i5UzH5CJpl4KRF+3upkDcZsLScv3euXPQ/QVpO1P+q+H/G1j67RG7jGqrIRLkct+3nRnnwb24cOTcIBfYC63b8BXr1/TK+r9K2Gvj884fHIKfcy+hTGiA+/iGZGGHTmBO8qCSh103xwv8pi+zqrZd0Adcz3Wcc8a7fzJtpIZ6rnJTXB6UzLowFSyBAPuSuNFTvvO3p4AkbxkQsv3xOWUFemEjJp7Yz23ftPXLVv1q7 HP0H8E9M zISzeRzmKBWXy/W+xLNb8uROnIgMBINLVXNey6A+E64t/907jzWOZGTSu98Uyfge0Yd7/BfyvwAET8sor+z7phjYC1j9f85BsDj1uxOpGaq/2oz/hv2CBCmMPoITnogjiDjDE0QZpxAYyY761+irz9cCPd8WbZ6VCKMqP0A8qwMeqg980FDgjNdizdThugGLjJdj6hrHdJy1NYIv+DSpJQqx8GBG6n5ry2qZcFSZMgJiT3eO2ld4yCwex4s9Ahxat04j3fgVDt1qCR7RKD4UQxQGSHz8icI9gR39QXG7avM9cJEZRwkATdagsnN/6mV5D5EvY 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: List-Subscribe: List-Unsubscribe: Extract generic logic to fetch relevant pieces of data to describe VMA name. This could be just some string (either special constant or user-provided), or a string with some formatted wrapping text (e.g., "[anon_shmem:]"), or, commonly, file path. seq_file-based logic has different methods to handle all three cases, but they are currently mixed in with extracting underlying sources of data. This patch splits this into data fetching and data formatting, so that data fetching can be reused later on. There should be no functional changes. Signed-off-by: Andrii Nakryiko --- fs/proc/task_mmu.c | 125 +++++++++++++++++++++++++-------------------- 1 file changed, 71 insertions(+), 54 deletions(-) diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 93fb2c61b154..507b7dc7c4c8 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -239,6 +239,67 @@ static int do_maps_open(struct inode *inode, struct file *file, sizeof(struct proc_maps_private)); } +static void get_vma_name(struct vm_area_struct *vma, + const struct path **path, + const char **name, + const char **name_fmt) +{ + struct anon_vma_name *anon_name = vma->vm_mm ? anon_vma_name(vma) : NULL; + + *name = NULL; + *path = NULL; + *name_fmt = NULL; + + /* + * Print the dentry name for named mappings, and a + * special [heap] marker for the heap: + */ + if (vma->vm_file) { + /* + * If user named this anon shared memory via + * prctl(PR_SET_VMA ..., use the provided name. + */ + if (anon_name) { + *name_fmt = "[anon_shmem:%s]"; + *name = anon_name->name; + } else { + *path = file_user_path(vma->vm_file); + } + return; + } + + if (vma->vm_ops && vma->vm_ops->name) { + *name = vma->vm_ops->name(vma); + if (*name) + return; + } + + *name = arch_vma_name(vma); + if (*name) + return; + + if (!vma->vm_mm) { + *name = "[vdso]"; + return; + } + + if (vma_is_initial_heap(vma)) { + *name = "[heap]"; + return; + } + + if (vma_is_initial_stack(vma)) { + *name = "[stack]"; + return; + } + + if (anon_name) { + *name_fmt = "[anon:%s]"; + *name = anon_name->name; + return; + } +} + static void show_vma_header_prefix(struct seq_file *m, unsigned long start, unsigned long end, vm_flags_t flags, unsigned long long pgoff, @@ -262,17 +323,15 @@ static void show_vma_header_prefix(struct seq_file *m, static void show_map_vma(struct seq_file *m, struct vm_area_struct *vma) { - struct anon_vma_name *anon_name = NULL; - struct mm_struct *mm = vma->vm_mm; - struct file *file = vma->vm_file; + const struct path *path; + const char *name_fmt, *name; vm_flags_t flags = vma->vm_flags; unsigned long ino = 0; unsigned long long pgoff = 0; unsigned long start, end; dev_t dev = 0; - const char *name = NULL; - if (file) { + if (vma->vm_file) { const struct inode *inode = file_user_inode(vma->vm_file); dev = inode->i_sb->s_dev; @@ -283,57 +342,15 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma) start = vma->vm_start; end = vma->vm_end; show_vma_header_prefix(m, start, end, flags, pgoff, dev, ino); - if (mm) - anon_name = anon_vma_name(vma); - /* - * Print the dentry name for named mappings, and a - * special [heap] marker for the heap: - */ - if (file) { + get_vma_name(vma, &path, &name, &name_fmt); + if (path) { seq_pad(m, ' '); - /* - * If user named this anon shared memory via - * prctl(PR_SET_VMA ..., use the provided name. - */ - if (anon_name) - seq_printf(m, "[anon_shmem:%s]", anon_name->name); - else - seq_path(m, file_user_path(file), "\n"); - goto done; - } - - if (vma->vm_ops && vma->vm_ops->name) { - name = vma->vm_ops->name(vma); - if (name) - goto done; - } - - name = arch_vma_name(vma); - if (!name) { - if (!mm) { - name = "[vdso]"; - goto done; - } - - if (vma_is_initial_heap(vma)) { - name = "[heap]"; - goto done; - } - - if (vma_is_initial_stack(vma)) { - name = "[stack]"; - goto done; - } - - if (anon_name) { - seq_pad(m, ' '); - seq_printf(m, "[anon:%s]", anon_name->name); - } - } - -done: - if (name) { + seq_path(m, path, "\n"); + } else if (name_fmt) { + seq_pad(m, ' '); + seq_printf(m, name_fmt, name); + } else if (name) { seq_pad(m, ' '); seq_puts(m, name); }