alloc_tag: fix rw permission issue when handling boot parameter
Boot parameters prefixed with "sysctl." are processed during the final stage of system initialization via kernel_init()-> do_sysctl_args(). When CONFIG_MEM_ALLOC_PROFILING_DEBUG is enabled, the sysctl.vm.mem_profiling entry is not writable and will cause a warning. Before run_init_process(), system initialization executes in kernel thread context. Use current->mm to distinguish sysctl writes during do_sysctl_args() from user-space triggered ones. And when the proc_handler is from do_sysctl_args(), always return success because the same value was already set by setup_early_mem_profiling() and this eliminates a permission denied warning. Link: https://lkml.kernel.org/r/20260115031536.164254-1-ranxiaokai627@163.com Signed-off-by: Ran Xiaokai <ran.xiaokai@zte.com.cn> Suggested-by: Suren Baghdasaryan <surenb@google.com> Acked-by: Suren Baghdasaryan <surenb@google.com> Cc: Kent Overstreet <kent.overstreet@linux.dev> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>master
parent
d468d8f86d
commit
77bcee8d40
|
|
@ -776,8 +776,22 @@ EXPORT_SYMBOL(page_alloc_tagging_ops);
|
|||
static int proc_mem_profiling_handler(const struct ctl_table *table, int write,
|
||||
void *buffer, size_t *lenp, loff_t *ppos)
|
||||
{
|
||||
if (!mem_profiling_support && write)
|
||||
return -EINVAL;
|
||||
if (write) {
|
||||
/*
|
||||
* Call from do_sysctl_args() which is a no-op since the same
|
||||
* value was already set by setup_early_mem_profiling.
|
||||
* Return success to avoid warnings from do_sysctl_args().
|
||||
*/
|
||||
if (!current->mm)
|
||||
return 0;
|
||||
|
||||
#ifdef CONFIG_MEM_ALLOC_PROFILING_DEBUG
|
||||
/* User can't toggle profiling while debugging */
|
||||
return -EACCES;
|
||||
#endif
|
||||
if (!mem_profiling_support)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return proc_do_static_key(table, write, buffer, lenp, ppos);
|
||||
}
|
||||
|
|
@ -787,11 +801,7 @@ static const struct ctl_table memory_allocation_profiling_sysctls[] = {
|
|||
{
|
||||
.procname = "mem_profiling",
|
||||
.data = &mem_alloc_profiling_key,
|
||||
#ifdef CONFIG_MEM_ALLOC_PROFILING_DEBUG
|
||||
.mode = 0444,
|
||||
#else
|
||||
.mode = 0644,
|
||||
#endif
|
||||
.proc_handler = proc_mem_profiling_handler,
|
||||
},
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in New Issue