* vmem_clip: Trim the boundary tag edges to the requested start and size. */
| 993 | * vmem_clip: Trim the boundary tag edges to the requested start and size. |
| 994 | */ |
| 995 | static void |
| 996 | vmem_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 | |
| 1037 | static int |
| 1038 | vmem_try_fetch(vmem_t *vm, const vmem_size_t size, vmem_size_t align, int flags) |
no test coverage detected