865
870
/* XXX stride is unknown */
866
871
drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem);
873
DRMINITLISTHEAD(&bo_gem->vma_list);
868
874
DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named);
869
875
DBG("bo_create_from_handle: %d (%s)\n", handle, bo_gem->name);
879
885
struct drm_gem_close close;
882
if (bo_gem->mem_virtual)
888
DRMLISTDEL(&bo_gem->vma_list);
889
if (bo_gem->mem_virtual) {
883
890
munmap(bo_gem->mem_virtual, bo_gem->bo.size);
884
if (bo_gem->gtt_virtual)
891
bufmgr_gem->vma_count--;
893
if (bo_gem->gtt_virtual) {
885
894
munmap(bo_gem->gtt_virtual, bo_gem->bo.size);
895
bufmgr_gem->vma_count--;
887
898
/* Close this object */
888
899
memset(&close, 0, sizeof(close));
925
936
bufmgr_gem->time = time;
939
static void drm_intel_gem_bo_purge_vma_cache(drm_intel_bufmgr_gem *bufmgr_gem)
943
DBG("%s: cached=%d, open=%d, limit=%d\n", __FUNCTION__,
944
bufmgr_gem->vma_count, bufmgr_gem->vma_open, bufmgr_gem->vma_max);
946
if (bufmgr_gem->vma_max < 0)
949
/* We may need to evict a few entries in order to create new mmaps */
950
limit = bufmgr_gem->vma_max - 2*bufmgr_gem->vma_open;
954
while (bufmgr_gem->vma_count > limit) {
955
drm_intel_bo_gem *bo_gem;
957
bo_gem = DRMLISTENTRY(drm_intel_bo_gem,
958
bufmgr_gem->vma_cache.next,
960
assert(bo_gem->map_count == 0);
961
DRMLISTDEL(&bo_gem->vma_list);
963
if (bo_gem->mem_virtual) {
964
munmap(bo_gem->mem_virtual, bo_gem->bo.size);
965
bo_gem->mem_virtual = NULL;
966
bufmgr_gem->vma_count--;
968
if (bo_gem->gtt_virtual) {
969
munmap(bo_gem->gtt_virtual, bo_gem->bo.size);
970
bo_gem->gtt_virtual = NULL;
971
bufmgr_gem->vma_count--;
976
static void drm_intel_gem_bo_close_vma(drm_intel_bufmgr_gem *bufmgr_gem,
977
drm_intel_bo_gem *bo_gem)
979
bufmgr_gem->vma_open--;
980
DRMLISTADDTAIL(&bo_gem->vma_list, &bufmgr_gem->vma_cache);
981
if (bo_gem->mem_virtual)
982
bufmgr_gem->vma_count++;
983
if (bo_gem->gtt_virtual)
984
bufmgr_gem->vma_count++;
985
drm_intel_gem_bo_purge_vma_cache(bufmgr_gem);
988
static void drm_intel_gem_bo_open_vma(drm_intel_bufmgr_gem *bufmgr_gem,
989
drm_intel_bo_gem *bo_gem)
991
bufmgr_gem->vma_open++;
992
DRMLISTDEL(&bo_gem->vma_list);
993
if (bo_gem->mem_virtual)
994
bufmgr_gem->vma_count--;
995
if (bo_gem->gtt_virtual)
996
bufmgr_gem->vma_count--;
997
drm_intel_gem_bo_purge_vma_cache(bufmgr_gem);
929
1001
drm_intel_gem_bo_unreference_final(drm_intel_bo *bo, time_t time)
957
1029
bo_gem->relocs = NULL;
1032
/* Clear any left-over mappings */
1033
if (bo_gem->map_count) {
1034
DBG("bo freed with non-zero map-count %d\n", bo_gem->map_count);
1035
bo_gem->map_count = 0;
1036
drm_intel_gem_bo_close_vma(bufmgr_gem, bo_gem);
960
1039
DRMLISTDEL(&bo_gem->name_list);
962
1041
bucket = drm_intel_gem_bo_bucket_for_size(bufmgr_gem, bo->size);
1014
1093
pthread_mutex_lock(&bufmgr_gem->lock);
1095
if (bo_gem->map_count++ == 0)
1096
drm_intel_gem_bo_open_vma(bufmgr_gem, bo_gem);
1016
1098
if (!bo_gem->mem_virtual) {
1017
1099
struct drm_i915_gem_mmap mmap_arg;
1019
DBG("bo_map: %d (%s)\n", bo_gem->gem_handle, bo_gem->name);
1101
DBG("bo_map: %d (%s), map_count=%d\n",
1102
bo_gem->gem_handle, bo_gem->name, bo_gem->map_count);
1021
1104
memset(&mmap_arg, 0, sizeof(mmap_arg));
1022
1105
mmap_arg.handle = bo_gem->gem_handle;
1030
1113
DBG("%s:%d: Error mapping buffer %d (%s): %s .\n",
1031
1114
__FILE__, __LINE__, bo_gem->gem_handle,
1032
1115
bo_gem->name, strerror(errno));
1116
if (--bo_gem->map_count == 0)
1117
drm_intel_gem_bo_close_vma(bufmgr_gem, bo_gem);
1033
1118
pthread_mutex_unlock(&bufmgr_gem->lock);
1072
1157
pthread_mutex_lock(&bufmgr_gem->lock);
1159
if (bo_gem->map_count++ == 0)
1160
drm_intel_gem_bo_open_vma(bufmgr_gem, bo_gem);
1074
1162
/* Get a mapping of the buffer if we haven't before. */
1075
1163
if (bo_gem->gtt_virtual == NULL) {
1076
1164
struct drm_i915_gem_mmap_gtt mmap_arg;
1078
DBG("bo_map_gtt: mmap %d (%s)\n", bo_gem->gem_handle,
1166
DBG("bo_map_gtt: mmap %d (%s), map_count=%d\n",
1167
bo_gem->gem_handle, bo_gem->name, bo_gem->map_count);
1081
1169
memset(&mmap_arg, 0, sizeof(mmap_arg));
1082
1170
mmap_arg.handle = bo_gem->gem_handle;
1091
1179
__FILE__, __LINE__,
1092
1180
bo_gem->gem_handle, bo_gem->name,
1093
1181
strerror(errno));
1182
if (--bo_gem->map_count == 0)
1183
drm_intel_gem_bo_close_vma(bufmgr_gem, bo_gem);
1094
1184
pthread_mutex_unlock(&bufmgr_gem->lock);
1106
1196
__FILE__, __LINE__,
1107
1197
bo_gem->gem_handle, bo_gem->name,
1108
1198
strerror(errno));
1199
if (--bo_gem->map_count == 0)
1200
drm_intel_gem_bo_close_vma(bufmgr_gem, bo_gem);
1109
1201
pthread_mutex_unlock(&bufmgr_gem->lock);
1147
1239
pthread_mutex_lock(&bufmgr_gem->lock);
1241
if (bo_gem->map_count <= 0) {
1242
DBG("attempted to unmap an unmapped bo\n");
1243
pthread_mutex_unlock(&bufmgr_gem->lock);
1244
/* Preserve the old behaviour of just treating this as a
1245
* no-op rather than reporting the error.
1149
1250
if (bo_gem->mapped_cpu_write) {
1150
1251
/* Cause a flush to happen if the buffer's pinned for
1151
1252
* scanout, so the results show up in a timely manner.
1161
1262
bo_gem->mapped_cpu_write = false;
1265
/* We need to unmap after every innovation as we cannot track
1266
* an open vma for every bo as that will exhaasut the system
1267
* limits and cause later failures.
1269
if (--bo_gem->map_count == 0) {
1270
drm_intel_gem_bo_close_vma(bufmgr_gem, bo_gem);
1165
1273
pthread_mutex_unlock(&bufmgr_gem->lock);
2257
drm_intel_bufmgr_gem_set_vma_cache_size(drm_intel_bufmgr *bufmgr, int limit)
2259
drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr;
2261
bufmgr_gem->vma_max = limit;
2263
drm_intel_gem_bo_purge_vma_cache(bufmgr_gem);
2149
2267
* Initializes the GEM buffer manager, which uses the kernel to allocate, map,
2150
2268
* and manage map buffer objections.
2205
2323
bufmgr_gem->gen = 6;
2325
if (IS_GEN3(bufmgr_gem) && bufmgr_gem->gtt_size > 256*1024*1024) {
2326
/* The unmappable part of gtt on gen 3 (i.e. above 256MB) can't
2327
* be used for tiled blits. To simplify the accounting, just
2328
* substract the unmappable part (fixed to 256MB on all known
2329
* gen3 devices) if the kernel advertises it. */
2330
bufmgr_gem->gtt_size -= 256*1024*1024;
2207
2333
gp.value = &tmp;
2209
2335
gp.param = I915_PARAM_HAS_EXECBUF2;
2296
2422
DRMINITLISTHEAD(&bufmgr_gem->named);
2297
2423
init_cache_buckets(bufmgr_gem);
2425
DRMINITLISTHEAD(&bufmgr_gem->vma_cache);
2426
bufmgr_gem->vma_max = -1; /* unlimited by default */
2299
2428
return &bufmgr_gem->bufmgr;