Re: [PATCH v8 2/3] mm: add a field to store names for private anonymous memory
From: Suren Baghdasaryan <surenb@google.com>
Date: 2021-09-01 15:28:48
Also in:
linux-fsdevel, linux-mm, lkml
On Wed, Sep 1, 2021 at 1:09 AM 'Michal Hocko' via kernel-team [off-list ref] wrote:
On Fri 27-08-21 12:18:57, Suren Baghdasaryan wrote: [...]quoted
Userspace can set the name for a region of memory by calling prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, start, len, (unsigned long)name); Setting the name to NULL clears it.Maybe I am missing this part but I do not see this being handled anywhere.
It's handled in replace_vma_anon_name(). When name==NULL we call free_vma_anon_name() which frees and resets anon_name pointer. Except that, as you noticed, the check after strndup_user() will prevent NULL to be passed here. I forgot to test this case after conversion to strndup_user() and missed this important point. Thanks for pointing it out. Will fix and retest.
[...]quoted
@@ -3283,5 +3283,16 @@ static inline int seal_check_future_write(int seals, struct vm_area_struct *vma) return 0; } +#ifdef CONFIG_ADVISE_SYSCALLS +int madvise_set_anon_name(struct mm_struct *mm, unsigned long start, + unsigned long len_in, const char *name); +#else +static inline int +madvise_set_anon_name(struct mm_struct *mm, unsigned long start, + unsigned long len_in, const char *name) { + return 0; +} +#endifYou want to make this depend on CONFIG_PROC_FS.
Ack.
[...]quoted
+#ifdef CONFIG_MMU + +#define ANON_VMA_NAME_MAX_LEN 64 + +static int prctl_set_vma(unsigned long opt, unsigned long addr, + unsigned long size, unsigned long arg) +{ + struct mm_struct *mm = current->mm; + char *name, *pch; + int error; + + switch (opt) { + case PR_SET_VMA_ANON_NAME: + name = strndup_user((const char __user *)arg, + ANON_VMA_NAME_MAX_LEN); + + if (IS_ERR(name)) + return PTR_ERR(name);unless I am missing something NULL name would lead to an error rather than a name clearing as advertised above.
Correct, I missed that. Will fix.
quoted
+ + for (pch = name; *pch != '\0'; pch++) { + if (!isprint(*pch)) { + kfree(name); + return -EINVAL; + } + } + + mmap_write_lock(mm); + error = madvise_set_anon_name(mm, addr, size, name); + mmap_write_unlock(mm); + kfree(name); + break; + default: + error = -EINVAL; + } + + return error;-- Michal Hocko SUSE Labs -- To unsubscribe from this group and stop receiving emails from it, send an email to kernel-team+unsubscribe@android.com.