Re: [PATCH v2] mm: anonymous shared memory naming

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 07.11.22 19:47, Pasha Tatashin wrote:
Since: commit 9a10064f5625 ("mm: add a field to store names for private
anonymous memory"), name for private anonymous memory, but not shared
anonymous, can be set. However, naming shared anonymous memory just as

                                                                 ^ is

useful for tracking purposes.

Extend the functionality to be able to set names for shared anon.

Sample output:
   /* Create shared anonymous segmenet */

s/segmenet/segment/

   anon_shmem = mmap(NULL, SIZE, PROT_READ | PROT_WRITE,
                     MAP_SHARED | MAP_ANONYMOUS, -1, 0);
   /* Name the segment: "MY-NAME" */
   rv = prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME,
              anon_shmem, SIZE, "MY-NAME");

cat /proc/<pid>/maps (and smaps):
7fc8e2b4c000-7fc8f2b4c000 rw-s 00000000 00:01 1024 [anon_shmem:MY-NAME]

What would it have looked like before? Just no additional information?


Signed-off-by: Pasha Tatashin <pasha.tatashin@xxxxxxxxxx>
---


[...]

diff --git a/include/linux/mm.h b/include/linux/mm.h
index 8bbcccbc5565..06b6fb3277ab 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -699,8 +699,10 @@ static inline unsigned long vma_iter_addr(struct vma_iterator *vmi)
   * paths in userfault.
   */
  bool vma_is_shmem(struct vm_area_struct *vma);
+bool vma_is_anon_shmem(struct vm_area_struct *vma);
  #else
  static inline bool vma_is_shmem(struct vm_area_struct *vma) { return false; }
+static inline bool vma_is_anon_shmem(struct vm_area_struct *vma) { return false; }
  #endif
int vma_is_stack_for_current(struct vm_area_struct *vma);
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
index 500e536796ca..08d8b973fb60 100644
--- a/include/linux/mm_types.h
+++ b/include/linux/mm_types.h
@@ -461,21 +461,11 @@ struct vm_area_struct {
  	 * For areas with an address space and backing store,
  	 * linkage into the address_space->i_mmap interval tree.
  	 *
-	 * For private anonymous mappings, a pointer to a null terminated string
-	 * containing the name given to the vma, or NULL if unnamed.
  	 */
-
-	union {
-		struct {
-			struct rb_node rb;
-			unsigned long rb_subtree_last;
-		} shared;
-		/*
-		 * Serialized by mmap_sem. Never use directly because it is
-		 * valid only when vm_file is NULL. Use anon_vma_name instead.
-		 */
-		struct anon_vma_name *anon_name;
-	};
+	struct {
+		struct rb_node rb;
+		unsigned long rb_subtree_last;
+	} shared;

So that effectively grows the size of vm_area_struct. Hm. I'd really prefer to keep this specific to actual anonymous memory, not extending it to anonymous files.

Do we have any *actual* users where we don't have an alternative? I doubt that this is really required.

The simplest approach seems to be to use memfd instead of MAP_SHARED | MAP_ANONYMOUS. __NR_memfd_create can be passed a name and you get what you propose here effectively already. Or does anything speak against it?

--
Thanks,

David / dhildenb




[Index of Archives]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux