On Tue, Aug 05, 2014 at 02:51:38PM -0400, Rafal Sapala wrote: > The changes make sure that members of the bufmgr_gem and bo_gem > name lists are sychronized between threads > when using the create from prime and create from name methods. > > Signed-off-by: Rafal Sapala <rafal.a.sap...@intel.com> > --- > intel/intel_bufmgr_gem.c | 28 ++++++++++++++++++++++++---- > 1 files changed, 24 insertions(+), 4 deletions(-) > > diff --git a/intel/intel_bufmgr_gem.c b/intel/intel_bufmgr_gem.c > index 007a6d8..243f563 100644 > --- a/intel/intel_bufmgr_gem.c > +++ b/intel/intel_bufmgr_gem.c > @@ -871,12 +871,14 @@ drm_intel_bo_gem_create_from_name(drm_intel_bufmgr > *bufmgr, > * 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->global_name == handle) { > drm_intel_gem_bo_reference(&bo_gem->bo); > + pthread_mutex_unlock(&bufmgr_gem->lock); > return &bo_gem->bo; > } > } > @@ -889,6 +891,7 @@ drm_intel_bo_gem_create_from_name(drm_intel_bufmgr > *bufmgr, > 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 > @@ -901,13 +904,16 @@ drm_intel_bo_gem_create_from_name(drm_intel_bufmgr > *bufmgr, > 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) > + if (!bo_gem) { > + pthread_mutex_unlock(&bufmgr_gem->lock); > return NULL; > + } > > bo_gem->bo.size = open_arg.size; > bo_gem->bo.offset = 0; > @@ -929,6 +935,7 @@ drm_intel_bo_gem_create_from_name(drm_intel_bufmgr > *bufmgr, > &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; > @@ -938,6 +945,7 @@ drm_intel_bo_gem_create_from_name(drm_intel_bufmgr > *bufmgr, > > 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; > @@ -2502,25 +2510,29 @@ drm_intel_bo_gem_create_from_prime(drm_intel_bufmgr > *bufmgr, int prime_fd, int s > * for named buffers, we must not create two bo's pointing at the same > * kernel object > */ > + 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; > } > } > > if (ret) { > fprintf(stderr,"ret is %d %d\n", ret, errno); > + pthread_mutex_unlock(&bufmgr_gem->lock); > return NULL; > } > > bo_gem = calloc(1, sizeof(*bo_gem)); > - if (!bo_gem) > + if (!bo_gem) { > + pthread_mutex_unlock(&bufmgr_gem->lock); > return NULL; > - > + } > /* Determine size of bo. The fd-to-handle ioctl really should > * return the size, but it doesn't. If we have kernel 3.12 or > * later, we can lseek on the prime fd to get the size. Older > @@ -2548,6 +2560,7 @@ drm_intel_bo_gem_create_from_prime(drm_intel_bufmgr > *bufmgr, int prime_fd, int s > > DRMINITLISTHEAD(&bo_gem->vma_list); > DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named); > + pthread_mutex_unlock(&bufmgr_gem->lock); > > VG_CLEAR(get_tiling); > get_tiling.handle = bo_gem->gem_handle; > @@ -2572,8 +2585,10 @@ drm_intel_bo_gem_export_to_prime(drm_intel_bo *bo, int > *prime_fd) > 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) > @@ -2597,15 +2612,20 @@ drm_intel_gem_bo_flink(drm_intel_bo *bo, uint32_t * > name) > VG_CLEAR(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) > + if (ret != 0) { > + pthread_mutex_unlock(&bufmgr_gem->lock); > return -errno; > + } > > bo_gem->global_name = flink.name; > bo_gem->reusable = false; > > 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; > -- > 1.7.1 > > -------------------------------------------------------------------- > > Intel Technology Poland sp. z o.o. > ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII > Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP > 957-07-52-316 | Kapital zakladowy 200.000 PLN. > > Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i > moze zawierac informacje poufne. W razie przypadkowego otrzymania tej > wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; > jakiekolwiek > przegladanie lub rozpowszechnianie jest zabronione. > This e-mail and any attachments may contain confidential material for the > sole use of the intended recipient(s). If you are not the intended recipient, > please contact the sender and delete all copies; any review or distribution by > others is strictly prohibited.
I can't merge patches with this disclaimer ... Patch looks good otherwise. Is there a testcase for it? As long as it's a stand-alone C testcase I can easily do the integration with igt myself quickly. -Daniel -- Daniel Vetter Software Engineer, Intel Corporation +41 (0) 79 365 57 48 - http://blog.ffwll.ch _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/intel-gfx