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

Function vmem_clip

freebsd/kern/subr_vmem.c:995–1035  ·  view source on GitHub ↗

* vmem_clip: Trim the boundary tag edges to the requested start and size. */

Source from the content-addressed store, hash-verified

993 * vmem_clip: Trim the boundary tag edges to the requested start and size.
994 */
995static void
996vmem_clip(vmem_t *vm, bt_t *bt, vmem_addr_t start, vmem_size_t size)
997{
998 bt_t *btnew;
999 bt_t *btprev;
1000
1001 VMEM_ASSERT_LOCKED(vm);
1002 MPASS(bt->bt_type == BT_TYPE_FREE);
1003 MPASS(bt->bt_size >= size);
1004 bt_remfree(vm, bt);
1005 if (bt->bt_start != start) {
1006 btprev = bt_alloc(vm);
1007 btprev->bt_type = BT_TYPE_FREE;
1008 btprev->bt_start = bt->bt_start;
1009 btprev->bt_size = start - bt->bt_start;
1010 bt->bt_start = start;
1011 bt->bt_size -= btprev->bt_size;
1012 bt_insfree(vm, btprev);
1013 bt_insseg(vm, btprev,
1014 TAILQ_PREV(bt, vmem_seglist, bt_seglist));
1015 }
1016 MPASS(bt->bt_start == start);
1017 if (bt->bt_size != size && bt->bt_size - size > vm->vm_quantum_mask) {
1018 /* split */
1019 btnew = bt_alloc(vm);
1020 btnew->bt_type = BT_TYPE_BUSY;
1021 btnew->bt_start = bt->bt_start;
1022 btnew->bt_size = size;
1023 bt->bt_start = bt->bt_start + size;
1024 bt->bt_size -= size;
1025 bt_insfree(vm, bt);
1026 bt_insseg(vm, btnew,
1027 TAILQ_PREV(bt, vmem_seglist, bt_seglist));
1028 bt_insbusy(vm, btnew);
1029 bt = btnew;
1030 } else {
1031 bt->bt_type = BT_TYPE_BUSY;
1032 bt_insbusy(vm, bt);
1033 }
1034 MPASS(bt->bt_size >= size);
1035}
1036
1037static int
1038vmem_try_fetch(vmem_t *vm, const vmem_size_t size, vmem_size_t align, int flags)

Callers 2

vmem_xalloc_nextfitFunction · 0.85
vmem_xallocFunction · 0.85

Calls 5

bt_remfreeFunction · 0.85
bt_allocFunction · 0.85
bt_insfreeFunction · 0.85
bt_inssegFunction · 0.85
bt_insbusyFunction · 0.85

Tested by

no test coverage detected