* vmem_alloc: allocate resource from the arena. */
| 1323 | * vmem_alloc: allocate resource from the arena. |
| 1324 | */ |
| 1325 | int |
| 1326 | vmem_alloc(vmem_t *vm, vmem_size_t size, int flags, vmem_addr_t *addrp) |
| 1327 | { |
| 1328 | const int strat __unused = flags & VMEM_FITMASK; |
| 1329 | qcache_t *qc; |
| 1330 | |
| 1331 | flags &= VMEM_FLAGS; |
| 1332 | MPASS(size > 0); |
| 1333 | MPASS(strat == M_BESTFIT || strat == M_FIRSTFIT || strat == M_NEXTFIT); |
| 1334 | if ((flags & M_NOWAIT) == 0) |
| 1335 | WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL, "vmem_alloc"); |
| 1336 | |
| 1337 | if (size <= vm->vm_qcache_max) { |
| 1338 | /* |
| 1339 | * Resource 0 cannot be cached, so avoid a blocking allocation |
| 1340 | * in qc_import() and give the vmem_xalloc() call below a chance |
| 1341 | * to return 0. |
| 1342 | */ |
| 1343 | qc = &vm->vm_qcache[(size - 1) >> vm->vm_quantum_shift]; |
| 1344 | *addrp = (vmem_addr_t)uma_zalloc(qc->qc_cache, |
| 1345 | (flags & ~M_WAITOK) | M_NOWAIT); |
| 1346 | if (__predict_true(*addrp != 0)) |
| 1347 | return (0); |
| 1348 | } |
| 1349 | |
| 1350 | return (vmem_xalloc(vm, size, 0, 0, 0, VMEM_ADDR_MIN, VMEM_ADDR_MAX, |
| 1351 | flags, addrp)); |
| 1352 | } |
| 1353 | |
| 1354 | int |
| 1355 | vmem_xalloc(vmem_t *vm, const vmem_size_t size0, vmem_size_t align, |
no test coverage detected