proc: proc_maps_open allow proc_mem_open to return NULL
Subsystems (3)
PATCH 1/1 proc: proc_maps_open allow proc_mem_open to return NULL
The commit 65c66047259f ("proc: fix the issue of proc_mem_open returning NULL") breaks perf record -g -p PID when profiling a kernel thread.
The strace of perf record -g -p $(pgrep kswapd0) shows:
openat(AT_FDCWD, "/proc/65/task/65/maps", O_RDONLY) = -1 ESRCH (No such process)
This patch partially reverts the commit to fix it.
--- fs/proc/task_mmu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/proc/task_mmu.c +2 -2
@@ -340,8 +340,8 @@ static int proc_maps_open(struct inode *inode, struct file *file, priv->inode = inode; priv->mm =proc_mem_open (inode,PTRACE_MODE_READ ); -if (IS_ERR_OR_NULL (priv->mm)) { -int err = priv->mm ?PTR_ERR (priv->mm) : -ESRCH ; +if (IS_ERR (priv->mm)) { +int err =PTR_ERR (priv->mm);seq_release_private (inode, file);return err;
Signature · 1 line
2.50.0
Andrew Morton
maintainerQuoted 8 lines · On Fri, 8 Aug 2025 00:54:55 +0800 Jialin Wang <[email protected]> wrote:
The commit
65c66047259f("proc: fix the issue ofproc_mem_openreturning NULL") breaksperf record -g -p PIDwhen profiling a kernel thread.The strace of
perf record -g -p $(pgrep kswapd0)shows:
openat(AT_FDCWD, "/proc/65/task/65/maps", O_RDONLY)= -1 ESRCH (No such process)This patch partially reverts the commit to fix it.
Thanks. But "breaks" is a rather thin description of the problem!
Can you please describe the observed misbehavior fully?
Quoted 1 line
Fixes 65c66047259f ("proc: fix the issue of proc_mem_open returning NULL")
Because we should backport this fix into 6.16.x -stable kernels. The -stable maintainers may wonder why we're requesting this. Also, any person who is having problems with their 6.16-based kernel will want such a description so they can decide whether this fix might address their problem.
Thanks.
PATCH v2 1/1 proc: proc_maps_open allow proc_mem_open to return NULL
The commit 65c66047259f ("proc: fix the issue of proc_mem_open returning NULL") caused proc_maps_open() to return -ESRCH when proc_mem_open() returns NULL. This breaks legitimate /proc/<pid>/maps access for kernel threads since kernel threads have NULL mm_struct.
The regression causes perf to fail and exit when profiling a kernel thread:
# perf record -v -g -p $(pgrep kswapd0) ... couldn't open /proc/65/task/65/maps
This patch partially reverts the commit to fix it.
---
Changes in v2 (Thanks to Andrew):
- Add more detailed misbehavior description in commit message
fs/proc/task_mmu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/proc/task_mmu.c +2 -2
@@ -340,8 +340,8 @@ static int proc_maps_open(struct inode *inode, struct file *file, priv->inode = inode; priv->mm =proc_mem_open (inode,PTRACE_MODE_READ ); -if (IS_ERR_OR_NULL (priv->mm)) { -int err = priv->mm ?PTR_ERR (priv->mm) : -ESRCH ; +if (IS_ERR (priv->mm)) { +int err =PTR_ERR (priv->mm);seq_release_private (inode, file);return err;
Signature · 1 line
2.50.0