MCPcopy Create free account
hub / github.com/F-Stack/f-stack / vmem_add1

Function vmem_add1

freebsd/kern/subr_vmem.c:827–874  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

825SYSINIT(vfs, SI_SUB_CONFIGURE, SI_ORDER_ANY, vmem_start_callout, NULL);
826
827static void
828vmem_add1(vmem_t *vm, vmem_addr_t addr, vmem_size_t size, int type)
829{
830 bt_t *btfree, *btprev, *btspan;
831
832 VMEM_ASSERT_LOCKED(vm);
833 MPASS(type == BT_TYPE_SPAN || type == BT_TYPE_SPAN_STATIC);
834 MPASS((size & vm->vm_quantum_mask) == 0);
835
836 if (vm->vm_releasefn == NULL) {
837 /*
838 * The new segment will never be released, so see if it is
839 * contiguous with respect to an existing segment. In this case
840 * a span tag is not needed, and it may be possible now or in
841 * the future to coalesce the new segment with an existing free
842 * segment.
843 */
844 btprev = TAILQ_LAST(&vm->vm_seglist, vmem_seglist);
845 if ((!bt_isbusy(btprev) && !bt_isfree(btprev)) ||
846 btprev->bt_start + btprev->bt_size != addr)
847 btprev = NULL;
848 } else {
849 btprev = NULL;
850 }
851
852 if (btprev == NULL || bt_isbusy(btprev)) {
853 if (btprev == NULL) {
854 btspan = bt_alloc(vm);
855 btspan->bt_type = type;
856 btspan->bt_start = addr;
857 btspan->bt_size = size;
858 bt_insseg_tail(vm, btspan);
859 }
860
861 btfree = bt_alloc(vm);
862 btfree->bt_type = BT_TYPE_FREE;
863 btfree->bt_start = addr;
864 btfree->bt_size = size;
865 bt_insseg_tail(vm, btfree);
866 bt_insfree(vm, btfree);
867 } else {
868 bt_remfree(vm, btprev);
869 btprev->bt_size += size;
870 bt_insfree(vm, btprev);
871 }
872
873 vm->vm_size += size;
874}
875
876static void
877vmem_destroy1(vmem_t *vm)

Callers 2

vmem_importFunction · 0.85
vmem_addFunction · 0.85

Calls 6

bt_isbusyFunction · 0.85
bt_isfreeFunction · 0.85
bt_allocFunction · 0.85
bt_insseg_tailFunction · 0.85
bt_insfreeFunction · 0.85
bt_remfreeFunction · 0.85

Tested by

no test coverage detected