svn commit: r248666 - head/sys/dev/drm2/ttm
Konstantin Belousov
kib at FreeBSD.org
Sat Mar 23 22:23:16 UTC 2013
Author: kib
Date: Sat Mar 23 22:23:15 2013
New Revision: 248666
URL: http://svnweb.freebsd.org/changeset/base/248666
Log:
Do not call malloc(M_WAITOK) while bodev->fence_lock mutex is
held. The ttm_buffer_object_transfer() does not need the mutex locked
at all, except for the call to the driver sync_obj_ref() method.
Reported and tested by: dumbbell
MFC after: 2 weeks
Modified:
head/sys/dev/drm2/ttm/ttm_bo_util.c
Modified: head/sys/dev/drm2/ttm/ttm_bo_util.c
==============================================================================
--- head/sys/dev/drm2/ttm/ttm_bo_util.c Sat Mar 23 21:56:19 2013 (r248665)
+++ head/sys/dev/drm2/ttm/ttm_bo_util.c Sat Mar 23 22:23:15 2013 (r248666)
@@ -391,12 +391,11 @@ static void ttm_transfered_destroy(struc
* !0: Failure.
*/
-static int ttm_buffer_object_transfer(struct ttm_buffer_object *bo,
- struct ttm_buffer_object **new_obj)
+static int
+ttm_buffer_object_transfer(struct ttm_buffer_object *bo,
+ void *sync_obj, struct ttm_buffer_object **new_obj)
{
struct ttm_buffer_object *fbo;
- struct ttm_bo_device *bdev = bo->bdev;
- struct ttm_bo_driver *driver = bdev->driver;
fbo = malloc(sizeof(*fbo), M_TTM_TRANSF_OBJ, M_ZERO | M_WAITOK);
*fbo = *bo;
@@ -413,7 +412,7 @@ static int ttm_buffer_object_transfer(st
fbo->vm_node = NULL;
atomic_set(&fbo->cpu_writers, 0);
- fbo->sync_obj = driver->sync_obj_ref(bo->sync_obj);
+ fbo->sync_obj = sync_obj;
refcount_init(&fbo->list_kref, 1);
refcount_init(&fbo->kref, 1);
fbo->destroy = &ttm_transfered_destroy;
@@ -594,6 +593,7 @@ int ttm_bo_move_accel_cleanup(struct ttm
int ret;
struct ttm_buffer_object *ghost_obj;
void *tmp_obj = NULL;
+ void *sync_obj_ref;
mtx_lock(&bdev->fence_lock);
if (bo->sync_obj) {
@@ -627,9 +627,10 @@ int ttm_bo_move_accel_cleanup(struct ttm
set_bit(TTM_BO_PRIV_FLAG_MOVING, &bo->priv_flags);
- /* ttm_buffer_object_transfer accesses bo->sync_obj */
- ret = ttm_buffer_object_transfer(bo, &ghost_obj);
+ sync_obj_ref = bo->bdev->driver->sync_obj_ref(bo->sync_obj);
mtx_unlock(&bdev->fence_lock);
+ /* ttm_buffer_object_transfer accesses bo->sync_obj */
+ ret = ttm_buffer_object_transfer(bo, sync_obj_ref, &ghost_obj);
if (tmp_obj)
driver->sync_obj_unref(&tmp_obj);
More information about the svn-src-head
mailing list