| 1076 | } |
| 1077 | |
| 1078 | static int |
| 1079 | vmem_try_release(vmem_t *vm, struct vmem_btag *bt, const bool remfree) |
| 1080 | { |
| 1081 | struct vmem_btag *prev; |
| 1082 | |
| 1083 | MPASS(bt->bt_type == BT_TYPE_FREE); |
| 1084 | |
| 1085 | if (vm->vm_releasefn == NULL) |
| 1086 | return (0); |
| 1087 | |
| 1088 | prev = TAILQ_PREV(bt, vmem_seglist, bt_seglist); |
| 1089 | MPASS(prev != NULL); |
| 1090 | MPASS(prev->bt_type != BT_TYPE_FREE); |
| 1091 | |
| 1092 | if (prev->bt_type == BT_TYPE_SPAN && prev->bt_size == bt->bt_size) { |
| 1093 | vmem_addr_t spanaddr; |
| 1094 | vmem_size_t spansize; |
| 1095 | |
| 1096 | MPASS(prev->bt_start == bt->bt_start); |
| 1097 | spanaddr = prev->bt_start; |
| 1098 | spansize = prev->bt_size; |
| 1099 | if (remfree) |
| 1100 | bt_remfree(vm, bt); |
| 1101 | bt_remseg(vm, bt); |
| 1102 | bt_remseg(vm, prev); |
| 1103 | vm->vm_size -= spansize; |
| 1104 | VMEM_CONDVAR_BROADCAST(vm); |
| 1105 | bt_freetrim(vm, BT_MAXFREE); |
| 1106 | vm->vm_releasefn(vm->vm_arg, spanaddr, spansize); |
| 1107 | return (1); |
| 1108 | } |
| 1109 | return (0); |
| 1110 | } |
| 1111 | |
| 1112 | static int |
| 1113 | vmem_xalloc_nextfit(vmem_t *vm, const vmem_size_t size, vmem_size_t align, |
no test coverage detected