Merge "msm: kgsl: Fix leak when preemption init fails"
This commit is contained in:
commit
e944accf8c
1 changed files with 39 additions and 4 deletions
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved.
|
||||
/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
|
@ -537,13 +537,42 @@ static int a5xx_preemption_iommu_init(struct adreno_device *adreno_dev)
|
|||
KGSL_MEMFLAGS_GPUREADONLY, KGSL_MEMDESC_PRIVILEGED,
|
||||
"smmu_info");
|
||||
}
|
||||
|
||||
static void a5xx_preemption_iommu_close(struct adreno_device *adreno_dev)
|
||||
{
|
||||
struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
|
||||
struct kgsl_iommu *iommu = KGSL_IOMMU_PRIV(device);
|
||||
|
||||
kgsl_free_global(device, &iommu->smmu_info);
|
||||
}
|
||||
|
||||
#else
|
||||
static int a5xx_preemption_iommu_init(struct adreno_device *adreno_dev)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static void a5xx_preemption_iommu_close(struct adreno_device *adreno_dev)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
static void a5xx_preemption_close(struct kgsl_device *device)
|
||||
{
|
||||
struct adreno_device *adreno_dev = ADRENO_DEVICE(device);
|
||||
struct adreno_preemption *preempt = &adreno_dev->preempt;
|
||||
struct adreno_ringbuffer *rb;
|
||||
unsigned int i;
|
||||
|
||||
del_timer(&preempt->timer);
|
||||
kgsl_free_global(device, &preempt->counters);
|
||||
a5xx_preemption_iommu_close(adreno_dev);
|
||||
|
||||
FOR_EACH_RINGBUFFER(adreno_dev, rb, i) {
|
||||
kgsl_free_global(device, &rb->preemption_desc);
|
||||
}
|
||||
}
|
||||
|
||||
int a5xx_preemption_init(struct adreno_device *adreno_dev)
|
||||
{
|
||||
struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
|
||||
|
@ -568,7 +597,7 @@ int a5xx_preemption_init(struct adreno_device *adreno_dev)
|
|||
A5XX_CP_CTXRECORD_PREEMPTION_COUNTER_SIZE, 0, 0,
|
||||
"preemption_counters");
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err;
|
||||
|
||||
addr = preempt->counters.gpuaddr;
|
||||
|
||||
|
@ -576,10 +605,16 @@ int a5xx_preemption_init(struct adreno_device *adreno_dev)
|
|||
FOR_EACH_RINGBUFFER(adreno_dev, rb, i) {
|
||||
ret = a5xx_preemption_ringbuffer_init(adreno_dev, rb, addr);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err;
|
||||
|
||||
addr += A5XX_CP_CTXRECORD_PREEMPTION_COUNTER_SIZE;
|
||||
}
|
||||
|
||||
return a5xx_preemption_iommu_init(adreno_dev);
|
||||
ret = a5xx_preemption_iommu_init(adreno_dev);
|
||||
|
||||
err:
|
||||
if (ret)
|
||||
a5xx_preemption_close(device);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue