46,7 → 46,7 |
#include <string.h> |
#include <unistd.h> |
#include <assert.h> |
#include <sys/gthr.h> |
//#include <pthread.h> |
#include <sys/stat.h> |
#include <sys/types.h> |
#include <stdbool.h> |
74,11 → 74,6 |
|
#define memclear(s) memset(&s, 0, sizeof(s)) |
|
|
#define pthread_mutex_lock __gthread_mutex_lock |
#define pthread_mutex_unlock __gthread_mutex_unlock |
#define pthread_mutex_destroy __gthread_mutex_destroy |
|
#if 0 |
#define DBG(...) do { \ |
if (bufmgr_gem->bufmgr.debug) \ |
123,7 → 118,7 |
|
int max_relocs; |
|
__gthread_mutex_t lock; |
// pthread_mutex_t lock; |
|
struct drm_i915_gem_exec_object *exec_objects; |
struct drm_i915_gem_exec_object2 *exec2_objects; |
756,7 → 751,7 |
bo_size = bucket->size; |
} |
|
pthread_mutex_lock(&bufmgr_gem->lock); |
// pthread_mutex_lock(&bufmgr_gem->lock); |
/* Get a buffer out of the cache if available */ |
retry: |
alloc_from_cache = false; |
805,7 → 800,7 |
} |
} |
} |
pthread_mutex_unlock(&bufmgr_gem->lock); |
// pthread_mutex_unlock(&bufmgr_gem->lock); |
|
if (!alloc_from_cache) { |
struct drm_i915_gem_create create; |
1101,7 → 1096,6 |
* alternating names for the front/back buffer a linear search |
* provides a sufficiently fast match. |
*/ |
pthread_mutex_lock(&bufmgr_gem->lock); |
for (list = bufmgr_gem->named.next; |
list != &bufmgr_gem->named; |
list = list->next) { |
1108,7 → 1102,6 |
bo_gem = DRMLISTENTRY(drm_intel_bo_gem, list, name_list); |
if (bo_gem->global_name == handle) { |
drm_intel_gem_bo_reference(&bo_gem->bo); |
pthread_mutex_unlock(&bufmgr_gem->lock); |
return &bo_gem->bo; |
} |
} |
1121,7 → 1114,6 |
if (ret != 0) { |
DBG("Couldn't reference %s handle 0x%08x: %s\n", |
name, handle, strerror(errno)); |
pthread_mutex_unlock(&bufmgr_gem->lock); |
return NULL; |
} |
/* Now see if someone has used a prime handle to get this |
1134,16 → 1126,13 |
bo_gem = DRMLISTENTRY(drm_intel_bo_gem, list, name_list); |
if (bo_gem->gem_handle == open_arg.handle) { |
drm_intel_gem_bo_reference(&bo_gem->bo); |
pthread_mutex_unlock(&bufmgr_gem->lock); |
return &bo_gem->bo; |
} |
} |
|
bo_gem = calloc(1, sizeof(*bo_gem)); |
if (!bo_gem) { |
pthread_mutex_unlock(&bufmgr_gem->lock); |
if (!bo_gem) |
return NULL; |
} |
|
bo_gem->bo.size = open_arg.size; |
bo_gem->bo.offset = 0; |
1166,7 → 1155,6 |
&get_tiling); |
if (ret != 0) { |
drm_intel_gem_bo_unreference(&bo_gem->bo); |
pthread_mutex_unlock(&bufmgr_gem->lock); |
return NULL; |
} |
bo_gem->tiling_mode = get_tiling.tiling_mode; |
1176,7 → 1164,6 |
|
DRMINITLISTHEAD(&bo_gem->vma_list); |
DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named); |
pthread_mutex_unlock(&bufmgr_gem->lock); |
DBG("bo_create_from_handle: %d (%s)\n", handle, bo_gem->name); |
|
return &bo_gem->bo; |
1405,7 → 1392,7 |
|
clock_gettime(CLOCK_MONOTONIC, &time); |
|
pthread_mutex_lock(&bufmgr_gem->lock); |
// pthread_mutex_lock(&bufmgr_gem->lock); |
|
if (atomic_dec_and_test(&bo_gem->refcount)) { |
drm_intel_gem_bo_unreference_final(bo, time.tv_sec); |
1412,7 → 1399,7 |
drm_intel_gem_cleanup_bo_cache(bufmgr_gem, time.tv_sec); |
} |
|
pthread_mutex_unlock(&bufmgr_gem->lock); |
// pthread_mutex_unlock(&bufmgr_gem->lock); |
} |
} |
|
1429,7 → 1416,7 |
return 0; |
} |
|
pthread_mutex_lock(&bufmgr_gem->lock); |
// pthread_mutex_lock(&bufmgr_gem->lock); |
|
if (bo_gem->map_count++ == 0) |
drm_intel_gem_bo_open_vma(bufmgr_gem, bo_gem); |
1453,7 → 1440,7 |
bo_gem->name, strerror(errno)); |
if (--bo_gem->map_count == 0) |
drm_intel_gem_bo_close_vma(bufmgr_gem, bo_gem); |
pthread_mutex_unlock(&bufmgr_gem->lock); |
// pthread_mutex_unlock(&bufmgr_gem->lock); |
return ret; |
} |
VG(VALGRIND_MALLOCLIKE_BLOCK(mmap_arg.addr_ptr, mmap_arg.size, 0, 1)); |
1484,7 → 1471,7 |
|
drm_intel_gem_bo_mark_mmaps_incoherent(bo); |
VG(VALGRIND_MAKE_MEM_DEFINED(bo_gem->mem_virtual, bo->size)); |
pthread_mutex_unlock(&bufmgr_gem->lock); |
// pthread_mutex_unlock(&bufmgr_gem->lock); |
|
return 0; |
} |
1558,11 → 1545,11 |
struct drm_i915_gem_set_domain set_domain; |
int ret; |
|
pthread_mutex_lock(&bufmgr_gem->lock); |
// pthread_mutex_lock(&bufmgr_gem->lock); |
|
ret = map_gtt(bo); |
if (ret) { |
pthread_mutex_unlock(&bufmgr_gem->lock); |
// pthread_mutex_unlock(&bufmgr_gem->lock); |
return ret; |
} |
|
1590,7 → 1577,7 |
|
drm_intel_gem_bo_mark_mmaps_incoherent(bo); |
VG(VALGRIND_MAKE_MEM_DEFINED(bo_gem->gtt_virtual, bo->size)); |
pthread_mutex_unlock(&bufmgr_gem->lock); |
// pthread_mutex_unlock(&bufmgr_gem->lock); |
|
return 0; |
} |
1628,10 → 1615,9 |
if (!bufmgr_gem->has_llc) |
return drm_intel_gem_bo_map_gtt(bo); |
|
pthread_mutex_lock(&bufmgr_gem->lock); |
|
// pthread_mutex_lock(&bufmgr_gem->lock); |
ret = map_gtt(bo); |
pthread_mutex_unlock(&bufmgr_gem->lock); |
// pthread_mutex_unlock(&bufmgr_gem->lock); |
|
return ret; |
} |
1649,12 → 1635,11 |
return 0; |
|
bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
// pthread_mutex_lock(&bufmgr_gem->lock); |
|
pthread_mutex_lock(&bufmgr_gem->lock); |
|
if (bo_gem->map_count <= 0) { |
DBG("attempted to unmap an unmapped bo\n"); |
pthread_mutex_unlock(&bufmgr_gem->lock); |
// pthread_mutex_unlock(&bufmgr_gem->lock); |
/* Preserve the old behaviour of just treating this as a |
* no-op rather than reporting the error. |
*/ |
1682,7 → 1667,7 |
drm_intel_gem_bo_mark_mmaps_incoherent(bo); |
bo->virtual = NULL; |
} |
pthread_mutex_unlock(&bufmgr_gem->lock); |
// pthread_mutex_unlock(&bufmgr_gem->lock); |
|
return ret; |
} |
1880,13 → 1865,11 |
struct drm_gem_close close_bo; |
int i, ret; |
|
printf("\nENTER %s\n", __FUNCTION__); |
|
free(bufmgr_gem->exec2_objects); |
free(bufmgr_gem->exec_objects); |
free(bufmgr_gem->exec_bos); |
|
pthread_mutex_destroy(&bufmgr_gem->lock); |
// pthread_mutex_destroy(&bufmgr_gem->lock); |
|
/* Free any cached buffer objects we were going to reuse */ |
for (i = 0; i < bufmgr_gem->num_buckets; i++) { |
1904,8 → 1887,6 |
} |
|
free(bufmgr); |
printf("\nLEAVE %s\n", __FUNCTION__); |
|
} |
|
/** |
2101,8 → 2082,6 |
assert(bo_gem->reloc_count >= start); |
|
/* Unreference the cleared target buffers */ |
pthread_mutex_lock(&bufmgr_gem->lock); |
|
for (i = start; i < bo_gem->reloc_count; i++) { |
drm_intel_bo_gem *target_bo_gem = (drm_intel_bo_gem *) bo_gem->reloc_target_info[i].bo; |
if (&target_bo_gem->bo != bo) { |
2118,9 → 2097,6 |
drm_intel_gem_bo_unreference_locked_timed(&target_bo_gem->bo, time.tv_sec); |
} |
bo_gem->softpin_target_count = 0; |
|
pthread_mutex_unlock(&bufmgr_gem->lock); |
|
} |
|
/** |
2263,7 → 2239,6 |
if (to_bo_gem(bo)->has_error) |
return -ENOMEM; |
|
pthread_mutex_lock(&bufmgr_gem->lock); |
/* Update indices and set up the validate list. */ |
drm_intel_gem_bo_process_reloc(bo); |
|
2314,7 → 2289,6 |
bufmgr_gem->exec_bos[i] = NULL; |
} |
bufmgr_gem->exec_count = 0; |
pthread_mutex_unlock(&bufmgr_gem->lock); |
|
return ret; |
} |
2352,7 → 2326,7 |
break; |
} |
|
pthread_mutex_lock(&bufmgr_gem->lock); |
// pthread_mutex_lock(&bufmgr_gem->lock); |
/* Update indices and set up the validate list. */ |
drm_intel_gem_bo_process_reloc2(bo); |
|
2411,7 → 2385,7 |
bufmgr_gem->exec_bos[i] = NULL; |
} |
bufmgr_gem->exec_count = 0; |
pthread_mutex_unlock(&bufmgr_gem->lock); |
// pthread_mutex_unlock(&bufmgr_gem->lock); |
|
return ret; |
} |
2580,7 → 2554,6 |
struct drm_i915_gem_get_tiling get_tiling; |
drmMMListHead *list; |
|
pthread_mutex_lock(&bufmgr_gem->lock); |
ret = drmPrimeFDToHandle(bufmgr_gem->fd, prime_fd, &handle); |
if (ret) { |
DBG("create_from_prime: failed to obtain handle from fd: %s\n", strerror(errno)); |
2599,7 → 2572,6 |
bo_gem = DRMLISTENTRY(drm_intel_bo_gem, list, name_list); |
if (bo_gem->gem_handle == handle) { |
drm_intel_gem_bo_reference(&bo_gem->bo); |
pthread_mutex_unlock(&bufmgr_gem->lock); |
return &bo_gem->bo; |
} |
} |
2606,7 → 2578,6 |
|
bo_gem = calloc(1, sizeof(*bo_gem)); |
if (!bo_gem) { |
pthread_mutex_unlock(&bufmgr_gem->lock); |
return NULL; |
} |
/* Determine size of bo. The fd-to-handle ioctl really should |
2637,7 → 2608,6 |
|
DRMINITLISTHEAD(&bo_gem->vma_list); |
DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named); |
pthread_mutex_unlock(&bufmgr_gem->lock); |
|
memclear(get_tiling); |
get_tiling.handle = bo_gem->gem_handle; |
2663,10 → 2633,8 |
drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
|
pthread_mutex_lock(&bufmgr_gem->lock); |
if (DRMLISTEMPTY(&bo_gem->name_list)) |
DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named); |
pthread_mutex_unlock(&bufmgr_gem->lock); |
|
if (drmPrimeHandleToFD(bufmgr_gem->fd, bo_gem->gem_handle, |
DRM_CLOEXEC, prime_fd) != 0) |
2691,13 → 2659,9 |
memclear(flink); |
flink.handle = bo_gem->gem_handle; |
|
pthread_mutex_lock(&bufmgr_gem->lock); |
|
ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_GEM_FLINK, &flink); |
if (ret != 0) { |
pthread_mutex_unlock(&bufmgr_gem->lock); |
if (ret != 0) |
return -errno; |
} |
|
bo_gem->global_name = flink.name; |
bo_gem->reusable = false; |
2704,7 → 2668,7 |
|
if (DRMLISTEMPTY(&bo_gem->name_list)) |
DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named); |
pthread_mutex_unlock(&bufmgr_gem->lock); |
|
} |
|
*name = bo_gem->global_name; |
3211,7 → 3175,6 |
{ |
} |
|
static __gthread_mutex_t bufmgr_list_mutex = {0, -1}; |
static drmMMListHead bufmgr_list = { &bufmgr_list, &bufmgr_list }; |
|
static drm_intel_bufmgr_gem * |
3235,7 → 3198,7 |
drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr; |
|
if (atomic_add_unless(&bufmgr_gem->refcount, -1, 1)) { |
pthread_mutex_lock(&bufmgr_list_mutex); |
// pthread_mutex_lock(&bufmgr_list_mutex); |
|
if (atomic_dec_and_test(&bufmgr_gem->refcount)) { |
DRMLISTDEL(&bufmgr_gem->managers); |
3242,7 → 3205,7 |
drm_intel_bufmgr_gem_destroy(bufmgr); |
} |
|
pthread_mutex_unlock(&bufmgr_list_mutex); |
// pthread_mutex_unlock(&bufmgr_list_mutex); |
} |
} |
|
3261,11 → 3224,8 |
int ret, tmp; |
bool exec2 = false; |
|
if(bufmgr_list_mutex.handle == -1) |
__gthread_mutex_init_function(&bufmgr_gem->lock); |
// pthread_mutex_lock(&bufmgr_list_mutex); |
|
pthread_mutex_lock(&bufmgr_list_mutex); |
|
bufmgr_gem = drm_intel_bufmgr_gem_find(fd); |
if (bufmgr_gem) |
goto exit; |
3277,7 → 3237,10 |
bufmgr_gem->fd = fd; |
atomic_set(&bufmgr_gem->refcount, 1); |
|
__gthread_mutex_init_function(&bufmgr_gem->lock); |
// if (pthread_mutex_init(&bufmgr_gem->lock, NULL) != 0) { |
// free(bufmgr_gem); |
// return NULL; |
// } |
|
memclear(aperture); |
ret = drmIoctl(bufmgr_gem->fd, |
3454,7 → 3417,7 |
DRMLISTADD(&bufmgr_gem->managers, &bufmgr_list); |
|
exit: |
pthread_mutex_unlock(&bufmgr_list_mutex); |
// pthread_mutex_unlock(&bufmgr_list_mutex); |
|
return bufmgr_gem != NULL ? &bufmgr_gem->bufmgr : NULL; |
} |
3476,14 → 3439,11 |
* alternating names for the front/back buffer a linear search |
* provides a sufficiently fast match. |
*/ |
pthread_mutex_lock(&bufmgr_gem->lock); |
for (list = bufmgr_gem->named.next; |
list != &bufmgr_gem->named; |
list = list->next) { |
bo_gem = DRMLISTENTRY(drm_intel_bo_gem, list, name_list); |
if (bo_gem->gem_handle == handle) { |
drm_intel_gem_bo_reference(&bo_gem->bo); |
pthread_mutex_unlock(&bufmgr_gem->lock); |
return &bo_gem->bo; |
} |
} |
3511,7 → 3471,6 |
&get_tiling); |
if (ret != 0) { |
drm_intel_gem_bo_unreference(&bo_gem->bo); |
pthread_mutex_unlock(&bufmgr_gem->lock); |
return NULL; |
} |
bo_gem->tiling_mode = get_tiling.tiling_mode; |
3521,8 → 3480,7 |
|
DRMINITLISTHEAD(&bo_gem->vma_list); |
DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named); |
pthread_mutex_unlock(&bufmgr_gem->lock); |
printf("bo_create_from_gem_handle: %d\n", handle); |
printf("bo_create_from_handle: %d\n", handle); |
|
return &bo_gem->bo; |
} |