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

Function bufkva_alloc

freebsd/kern/vfs_bio.c:2026–2060  ·  view source on GitHub ↗

* bufkva_alloc: * * Allocate the buffer KVA and set b_kvasize and b_kvabase. */

Source from the content-addressed store, hash-verified

2024 * Allocate the buffer KVA and set b_kvasize and b_kvabase.
2025 */
2026static int
2027bufkva_alloc(struct buf *bp, int maxsize, int gbflags)
2028{
2029 vm_offset_t addr;
2030 int error;
2031
2032 KASSERT((gbflags & GB_UNMAPPED) == 0 || (gbflags & GB_KVAALLOC) != 0,
2033 ("Invalid gbflags 0x%x in %s", gbflags, __func__));
2034 MPASS((bp->b_flags & B_MAXPHYS) == 0);
2035 KASSERT(maxsize <= maxbcachebuf,
2036 ("bufkva_alloc kva too large %d %u", maxsize, maxbcachebuf));
2037
2038 bufkva_free(bp);
2039
2040 addr = 0;
2041 error = vmem_alloc(buffer_arena, maxsize, M_BESTFIT | M_NOWAIT, &addr);
2042 if (error != 0) {
2043 /*
2044 * Buffer map is too fragmented. Request the caller
2045 * to defragment the map.
2046 */
2047 return (error);
2048 }
2049 bp->b_kvabase = (caddr_t)addr;
2050 bp->b_kvasize = maxsize;
2051 counter_u64_add(bufkvaspace, bp->b_kvasize);
2052 if ((gbflags & GB_UNMAPPED) != 0) {
2053 bp->b_data = unmapped_buf;
2054 BUF_CHECK_UNMAPPED(bp);
2055 } else {
2056 bp->b_data = bp->b_kvabase;
2057 BUF_CHECK_MAPPED(bp);
2058 }
2059 return (0);
2060}
2061
2062/*
2063 * bufkva_reclaim:

Callers 2

getnewbuf_kvaFunction · 0.85
bp_unmapped_get_kvaFunction · 0.85

Calls 3

bufkva_freeFunction · 0.85
vmem_allocFunction · 0.85
counter_u64_addFunction · 0.50

Tested by

no test coverage detected