* bufkva_alloc: * * Allocate the buffer KVA and set b_kvasize and b_kvabase. */
| 2024 | * Allocate the buffer KVA and set b_kvasize and b_kvabase. |
| 2025 | */ |
| 2026 | static int |
| 2027 | bufkva_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: |
no test coverage detected