Thread (29 messages) 29 messages, 8 authors, 2021-09-03

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;
+}
+#endif
You 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.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help