// insert_vma_rb - insert vma in rb tree according vma->start_addr static inline void insert_vma_rb(rb_tree *tree, struct vma_struct *vma, struct vma_struct **vma_prevp) { rb_node *node = &(vma->rb_link), *prev; rb_insert(tree, node); if (vma_prevp != NULL) { prev = rb_node_prev(tree, node); *vma_prevp = (prev != NULL) ? rbn2vma(prev, rb_link) : NULL; } }
void vm_insert_vma(ProcVM *proc, ProcVMA *vma) { kassert(vma->vm_start < vma->vm_end); rb_insert(&(proc->mmap_root), &(vma->vm_link)); #if defined(__PCORE_NO_OPTIMIZE__) // Check overlap. RBNode *x = rb_search(&(proc->mmap_root), vma_key_compare, &(vma->vm_start)); kassert(x != NULL); RBNode *y = rb_node_prev(&(proc->mmap_root), x); if (y != NULL) { vma_check_overlap(rbn2vma(y, vm_link), vma); } y = rb_node_next(&(proc->mmap_root), x); if (y != NULL) { vma_check_overlap(vma, rbn2vma(y, vm_link)); } #endif // __PCORE_NO_OPTIMIZE__ atomic_add(&(proc->map_count), 1); }