diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index 5fabee5b84ac..f25a36bcc863 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -1047,10 +1047,20 @@ static int kgsl_close_device(struct kgsl_device *device) int result = 0; mutex_lock(&device->mutex); - device->open_count--; - if (device->open_count == 0) + if (device->open_count == 1) result = device->ftbl->last_close(device); + /* + * We must decrement the open_count after last_close() has finished. + * This is because last_close() relinquishes device mutex while + * waiting for active count to become 0. This opens up a window + * where a new process can come in, see that open_count is 0, and + * initiate a first_open(). This can potentially mess up the power + * state machine. To avoid a first_open() from happening before + * last_close() has finished, decrement the open_count after + * last_close(). + */ + device->open_count--; mutex_unlock(&device->mutex); return result;