diff --git a/drivers/gpu/msm/kgsl_vbo.c b/drivers/gpu/msm/kgsl_vbo.c index 551822ba98daf1b11a835b35c47642924dadd280..c850a47f0fdbe3136bca7672559a4114d84109d0 100644 --- a/drivers/gpu/msm/kgsl_vbo.c +++ b/drivers/gpu/msm/kgsl_vbo.c @@ -12,6 +12,7 @@ #include "kgsl_device.h" #include "kgsl_mmu.h" +#include "kgsl_reclaim.h" #include "kgsl_sharedmem.h" #include "kgsl_trace.h" @@ -371,6 +372,12 @@ kgsl_sharedmem_create_bind_op(struct kgsl_process_private *private, op->nr_ops = ranges_nents; op->target = target; + /* Make sure process is pinned in memory before proceeding */ + atomic_inc(&private->cmd_count); + ret = kgsl_reclaim_to_pinned_state(private); + if (ret) + goto err; + for (i = 0; i < ranges_nents; i++) { struct kgsl_gpumem_bind_range range; struct kgsl_mem_entry *entry; @@ -471,12 +478,14 @@ kgsl_sharedmem_create_bind_op(struct kgsl_process_private *private, ranges += ranges_size; } + atomic_dec(&private->cmd_count); init_completion(&op->comp); kref_init(&op->ref); return op; err: + atomic_dec(&private->cmd_count); kgsl_sharedmem_free_bind_op(op); return ERR_PTR(ret); }