Lines Matching refs:bo
32 /* Default max size of the bo cache, in MB.
85 bo_remove_from_cache(struct v3dv_bo_cache *cache, struct v3dv_bo *bo)
87 list_del(&bo->time_list);
88 list_del(&bo->size_list);
91 cache->cache_size -= bo->size;
103 struct v3dv_bo *bo = NULL;
107 bo = list_first_entry(&cache->size_list[page_index],
114 if (!v3dv_bo_wait(device, bo, 0)) {
119 bo_remove_from_cache(cache, bo);
120 bo->name = name;
121 p_atomic_set(&bo->refcnt, 1);
124 return bo;
129 struct v3dv_bo *bo)
131 if (!bo)
134 assert(p_atomic_read(&bo->refcnt) == 0);
135 assert(bo->map == NULL);
139 c.handle = bo->handle;
142 fprintf(stderr, "close object %d: %s\n", bo->handle, strerror(errno));
145 device->bo_size -= bo->size;
149 bo->name ? bo->name : "",
150 bo->name ? " " : "",
151 bo->size / 1024);
159 memset(bo, 0, sizeof(*bo));
172 list_for_each_entry_safe(struct v3dv_bo, bo, &cache->time_list,
174 bo_remove_from_cache(cache, bo);
175 bo_free(device, bo);
183 v3dv_bo_init(struct v3dv_bo *bo,
190 p_atomic_set(&bo->refcnt, 1);
191 bo->handle = handle;
192 bo->handle_bit = 1ull << (handle % 64);
193 bo->size = size;
194 bo->offset = offset;
195 bo->map = NULL;
196 bo->map_size = 0;
197 bo->name = name;
198 bo->private = private;
199 bo->dumb_handle = -1;
200 list_inithead(&bo->list_link);
209 struct v3dv_bo *bo;
215 bo = bo_from_cache(device, size, name);
216 if (bo) {
222 return bo;
251 bo = v3dv_device_lookup_bo(device->pdevice, create.handle);
252 assert(bo && bo->handle == 0);
254 v3dv_bo_init(bo, create.handle, size, create.offset, name, private);
257 device->bo_size += bo->size;
263 return bo;
268 struct v3dv_bo *bo,
271 assert(bo != NULL && size <= bo->size);
273 if (bo->map)
274 return bo->map;
278 map.handle = bo->handle;
286 bo->map = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED,
288 if (bo->map == MAP_FAILED) {
289 fprintf(stderr, "mmap of bo %d (offset 0x%016llx, size %d) failed\n",
290 bo->handle, (long long)map.offset, (uint32_t)bo->size);
293 VG(VALGRIND_MALLOCLIKE_BLOCK(bo->map, bo->size, 0, false));
295 bo->map_size = size;
302 struct v3dv_bo *bo,
306 .handle = bo->handle,
314 v3dv_bo_map(struct v3dv_device *device, struct v3dv_bo *bo, uint32_t size)
316 assert(bo && size <= bo->size);
318 bool ok = v3dv_bo_map_unsynchronized(device, bo, size);
322 ok = v3dv_bo_wait(device, bo, PIPE_TIMEOUT_INFINITE);
332 v3dv_bo_unmap(struct v3dv_device *device, struct v3dv_bo *bo)
334 assert(bo && bo->map && bo->map_size > 0);
336 munmap(bo->map, bo->map_size);
337 VG(VALGRIND_FREELIKE_BLOCK(bo->map, 0));
338 bo->map = NULL;
339 bo->map_size = 0;
352 fprintf(stderr, "Failed to allocate host memory for cache bo list\n");
427 list_for_each_entry_safe(struct v3dv_bo, bo, &cache->time_list,
430 if (time - bo->free_time > 2) {
437 bo_remove_from_cache(cache, bo);
438 bo_free(device, bo);
452 struct v3dv_bo *bo)
454 if (!bo)
457 if (!p_atomic_dec_zero(&bo->refcnt))
460 if (bo->map)
461 v3dv_bo_unmap(device, bo);
465 uint32_t page_index = bo->size / 4096 - 1;
467 if (bo->private &&
468 bo->size > cache->max_cache_size - cache->cache_size) {
475 if (!bo->private ||
476 bo->size > cache->max_cache_size - cache->cache_size) {
477 return bo_free(device, bo);
485 bool outcome = bo_free(device, bo);
487 * memory, so we also free all the bo cache. We need to call it to
496 bo->free_time = time.tv_sec;
497 list_addtail(&bo->size_list, &cache->size_list[page_index]);
498 list_addtail(&bo->time_list, &cache->time_list);
501 cache->cache_size += bo->size;
505 bo->name, bo->size / 1024);
508 bo->name = NULL;