| 825 | SYSINIT(vfs, SI_SUB_CONFIGURE, SI_ORDER_ANY, vmem_start_callout, NULL); |
| 826 | |
| 827 | static void |
| 828 | vmem_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 | |
| 876 | static void |
| 877 | vmem_destroy1(vmem_t *vm) |
no test coverage detected