[PATCH 18/48] staging: etnaviv: make context a per-GPU thing
Lucas Stach
l.stach at pengutronix.de
Fri Sep 25 04:57:30 PDT 2015
From: Russell King <rmk+kernel at arm.linux.org.uk>
Tracking the current context on a system wide level is incorrect: if the
context for one GPU core changes, the context does not change on other
GPU cores. Make the context tracking a per-GPU thing.
Signed-off-by: Russell King <rmk+kernel at arm.linux.org.uk>
---
drivers/staging/etnaviv/etnaviv_drv.c | 9 +++++++--
drivers/staging/etnaviv/etnaviv_drv.h | 1 -
drivers/staging/etnaviv/etnaviv_gpu.c | 5 ++---
drivers/staging/etnaviv/etnaviv_gpu.h | 1 +
4 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/drivers/staging/etnaviv/etnaviv_drv.c b/drivers/staging/etnaviv/etnaviv_drv.c
index a87de2e79fee..7ec4b224b589 100644
--- a/drivers/staging/etnaviv/etnaviv_drv.c
+++ b/drivers/staging/etnaviv/etnaviv_drv.c
@@ -173,10 +173,15 @@ static void etnaviv_preclose(struct drm_device *dev, struct drm_file *file)
{
struct etnaviv_drm_private *priv = dev->dev_private;
struct etnaviv_file_private *ctx = file->driver_priv;
+ unsigned int i;
mutex_lock(&dev->struct_mutex);
- if (ctx == priv->lastctx)
- priv->lastctx = NULL;
+ for (i = 0; i < ETNA_MAX_PIPES; i++) {
+ struct etnaviv_gpu *gpu = priv->gpu[i];
+
+ if (gpu && gpu->lastctx == ctx)
+ gpu->lastctx = NULL;
+ }
mutex_unlock(&dev->struct_mutex);
kfree(ctx);
diff --git a/drivers/staging/etnaviv/etnaviv_drv.h b/drivers/staging/etnaviv/etnaviv_drv.h
index 37992342bbf0..f7aff4b2562c 100644
--- a/drivers/staging/etnaviv/etnaviv_drv.h
+++ b/drivers/staging/etnaviv/etnaviv_drv.h
@@ -52,7 +52,6 @@ struct etnaviv_file_private {
struct etnaviv_drm_private {
int num_gpus;
struct etnaviv_gpu *gpu[ETNA_MAX_PIPES];
- struct etnaviv_file_private *lastctx;
uint32_t next_fence, completed_fence;
wait_queue_head_t fence_event;
diff --git a/drivers/staging/etnaviv/etnaviv_gpu.c b/drivers/staging/etnaviv/etnaviv_gpu.c
index 9f4e99855517..2dbf25121a07 100644
--- a/drivers/staging/etnaviv/etnaviv_gpu.c
+++ b/drivers/staging/etnaviv/etnaviv_gpu.c
@@ -916,15 +916,14 @@ int etnaviv_gpu_submit(struct etnaviv_gpu *gpu,
gpu->submitted_fence = submit->fence;
- if (priv->lastctx != ctx) {
+ if (gpu->lastctx != ctx) {
gpu->mmu->need_flush = true;
gpu->switch_context = true;
+ gpu->lastctx = ctx;
}
etnaviv_buffer_queue(gpu, event, submit);
- priv->lastctx = ctx;
-
for (i = 0; i < submit->nr_bos; i++) {
struct etnaviv_gem_object *etnaviv_obj = submit->bos[i].obj;
diff --git a/drivers/staging/etnaviv/etnaviv_gpu.h b/drivers/staging/etnaviv/etnaviv_gpu.h
index 6b4f241c0ca6..67f6097ba576 100644
--- a/drivers/staging/etnaviv/etnaviv_gpu.h
+++ b/drivers/staging/etnaviv/etnaviv_gpu.h
@@ -87,6 +87,7 @@ struct etnaviv_gpu {
struct drm_device *drm;
struct device *dev;
struct etnaviv_chip_identity identity;
+ struct etnaviv_file_private *lastctx;
bool switch_context;
/* 'ring'-buffer: */
--
2.5.1
More information about the dri-devel
mailing list