• Pasha Tatashin's avatar
    mm: anonymous shared memory naming · d09e8ca6
    Pasha Tatashin authored
    Since commit 9a10064f ("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
    useful for tracking purposes.
    
    Extend the functionality to be able to set names for shared anon.
    
    There are two ways to create anonymous shared memory, using memfd or
    directly via mmap():
    1. fd = memfd_create(...)
       mem = mmap(..., MAP_SHARED, fd, ...)
    2. mem = mmap(..., MAP_SHARED | MAP_ANONYMOUS, -1, ...)
    
    In both cases the anonymous shared memory is created the same way by
    mapping an unlinked file on tmpfs.
    
    The memfd way allows to give a name for anonymous shared memory, but
    not useful when parts of shared memory require to have distinct names.
    
    Example use case: The VMM maps VM memory as anonymous shared memory (not
    private because VMM is sandboxed and drivers are running in their own
    processes).  However, the VM tells back to the VMM how parts of the memory
    are actually used by the guest, how each of the segments should be backed
    (i.e.  4K pages, 2M pages), and some other information about the segments.
    The naming allows us to monitor the effective memory footprint for each
    of these segments from the host without looking inside the guest.
    
    Sample output:
      /* Create shared anonymous segmenet */
      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]
    
    If the segment is not named, the output is:
    7fc8e2b4c000-7fc8f2b4c000 rw-s 00000000 00:01 1024 /dev/zero (deleted)
    
    Link: https://lkml.kernel.org/r/20221115020602.804224-1-pasha.tatashin@soleen.comSigned-off-by: default avatarPasha Tatashin <pasha.tatashin@soleen.com>
    Acked-by: default avatarDavid Hildenbrand <david@redhat.com>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Cc: Bagas Sanjaya <bagasdotme@gmail.com>
    Cc: Colin Cross <ccross@google.com>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Jonathan Corbet <corbet@lwn.net>
    Cc: "Kirill A . Shutemov" <kirill@shutemov.name>
    Cc: Liam Howlett <liam.howlett@oracle.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Mike Rapoport <rppt@kernel.org>
    Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: Sean Christopherson <seanjc@google.com>
    Cc: Vincent Whitchurch <vincent.whitchurch@axis.com>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: xu xin <cgel.zte@gmail.com>
    Cc: Yang Shi <shy828301@gmail.com>
    Cc: Yu Zhao <yuzhao@google.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    d09e8ca6
task_mmu.c 49.2 KB