Skip to content

Anonymous Virtual Memory Area

include/mem/anon_vma.h View source View on GitHub

LOCK ORDERING:

mmap_lock
└─ anon_vma->root->lock
└─ folio_lock
struct anon_vma (5 fields) source
§ struct rbit tree

AVCs, keyed in OBJECT-SPACE [pgoff, pgoff+npages)

§ struct anon_vma *root

oldest ancestor, the lock is here

§ struct anon_vma *parent

immediate ancestor in fork hierarchy

§ struct rwlock lock

acquire via root

§ refcount_t refcount

AVCs + folios referencing this object

struct anon_vma * anon_vma_alloc(void)
source
void anon_vma_free(struct anon_vma *av)
source

refcount==0 only

enum err anon_vma_fork(
    struct vma_range *child,
    struct vma_range *parent
)
source
void anon_vma_read_lock(struct anon_vma *av)
source

root->lock

void anon_vma_unlock(struct anon_vma *av)
source
void anon_vma_write_lock(struct anon_vma *av)
source
enum err anon_vma_clone(struct vma_range *dst, struct vma_range *src)
source
struct anon_vma_chain * anon_vma_itree_first(
    struct anon_vma *av,
    pgoff_t first,
    pgoff_t last
)
source
struct anon_vma_chain * anon_vma_itree_next(
    struct anon_vma_chain *avc,
    pgoff_t first,
    pgoff_t last
)
source
void vma_range_unlink_anon_vmas(struct vma_range *vma_range)
source

teardown: unlink all AVCs on this vma_range, drop anon_vma refs

bool anon_vma_is_root(const struct anon_vma *av)
source
bool anon_vma_getref(struct anon_vma *av)
source
void anon_vma_putref(struct anon_vma *av)
source

Drop ref: When forked anon_vma dies it releases its root pin, allowing the putref to go up the hierarchy, but it’s bounded, as root is its own root