freedreno/msm: use private bo-cache for ringbuffer bo's

Since they get vmap'd on the kernel side, they are a bit more costly.
Don't let them mingle with the riffraff.

Signed-off-by: Rob Clark <robclark@freedesktop.org>
main
Rob Clark 2016-06-01 16:11:52 -04:00
parent 19b82b9817
commit 892141a321
3 changed files with 39 additions and 2 deletions

View File

@ -39,6 +39,7 @@
static void msm_device_destroy(struct fd_device *dev) static void msm_device_destroy(struct fd_device *dev)
{ {
struct msm_device *msm_dev = to_msm_device(dev); struct msm_device *msm_dev = to_msm_device(dev);
fd_bo_cache_cleanup(&msm_dev->ring_cache, 0);
free(msm_dev); free(msm_dev);
} }
@ -61,5 +62,7 @@ drm_private struct fd_device * msm_device_new(int fd)
dev = &msm_dev->base; dev = &msm_dev->base;
dev->funcs = &funcs; dev->funcs = &funcs;
fd_bo_cache_init(&msm_dev->ring_cache, TRUE);
return dev; return dev;
} }

View File

@ -39,6 +39,7 @@
struct msm_device { struct msm_device {
struct fd_device base; struct fd_device base;
struct fd_bo_cache ring_cache;
}; };
static inline struct msm_device * to_msm_device(struct fd_device *x) static inline struct msm_device * to_msm_device(struct fd_device *x)

View File

@ -65,6 +65,39 @@ struct msm_ringbuffer {
}; };
static pthread_mutex_t idx_lock = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t idx_lock = PTHREAD_MUTEX_INITIALIZER;
drm_private extern pthread_mutex_t table_lock;
static void ring_bo_del(struct fd_device *dev, struct fd_bo *bo)
{
int ret;
pthread_mutex_lock(&table_lock);
ret = fd_bo_cache_free(&to_msm_device(dev)->ring_cache, bo);
pthread_mutex_unlock(&table_lock);
if (ret == 0)
return;
fd_bo_del(bo);
}
static struct fd_bo * ring_bo_new(struct fd_device *dev, uint32_t size)
{
struct fd_bo *bo;
bo = fd_bo_cache_alloc(&to_msm_device(dev)->ring_cache, &size, 0);
if (bo)
return bo;
bo = fd_bo_new(dev, size, 0);
if (!bo)
return NULL;
/* keep ringbuffer bo's out of the normal bo cache: */
bo->bo_reuse = FALSE;
return bo;
}
static void *grow(void *ptr, uint32_t nr, uint32_t *max, uint32_t sz) static void *grow(void *ptr, uint32_t nr, uint32_t *max, uint32_t sz)
{ {
@ -344,7 +377,7 @@ static void msm_ringbuffer_destroy(struct fd_ringbuffer *ring)
{ {
struct msm_ringbuffer *msm_ring = to_msm_ringbuffer(ring); struct msm_ringbuffer *msm_ring = to_msm_ringbuffer(ring);
if (msm_ring->ring_bo) if (msm_ring->ring_bo)
fd_bo_del(msm_ring->ring_bo); ring_bo_del(ring->pipe->dev, msm_ring->ring_bo);
free(msm_ring->submit.relocs); free(msm_ring->submit.relocs);
free(msm_ring->submit.cmds); free(msm_ring->submit.cmds);
free(msm_ring->submit.bos); free(msm_ring->submit.bos);
@ -377,7 +410,7 @@ drm_private struct fd_ringbuffer * msm_ringbuffer_new(struct fd_pipe *pipe,
ring = &msm_ring->base; ring = &msm_ring->base;
ring->funcs = &funcs; ring->funcs = &funcs;
msm_ring->ring_bo = fd_bo_new(pipe->dev, size, 0); msm_ring->ring_bo = ring_bo_new(pipe->dev, size);
if (!msm_ring->ring_bo) { if (!msm_ring->ring_bo) {
ERROR_MSG("ringbuffer allocation failed"); ERROR_MSG("ringbuffer allocation failed");
goto fail; goto fail;