drm/msm/a6xx: Fix kvzalloc vs state_kcalloc usage
adreno_show_object() is a trap! It will re-allocate the pointer it is passed on first call, when the data is ascii85 encoded, using kvmalloc/ kvfree(). Which means the data *passed* to it must be kvmalloc'd, ie. we cannot use the state_kcalloc() helper. This partially reverts commitec8f1813bf
("drm/msm/a6xx: Replace kcalloc() with kvzalloc()"), but adds the missing kvfree() to fix the memory leak that was present previously. And adds a warning comment. Fixes:ec8f1813bf
("drm/msm/a6xx: Replace kcalloc() with kvzalloc()") Closes: https://gitlab.freedesktop.org/drm/msm/-/issues/20 Signed-off-by: Rob Clark <robdclark@chromium.org> Reviewed-by: Chia-I Wu <olvaffe@gmail.com> Reviewed-by: Akhil P Oommen <quic_akhilpo@quicinc.com> Patchwork: https://patchwork.freedesktop.org/patch/507014/ Link: https://lore.kernel.org/r/20221013225520.371226-2-robdclark@gmail.com
This commit is contained in:
parent
70445dee1b
commit
83d18e9d9c
@ -819,7 +819,7 @@ static struct msm_gpu_state_bo *a6xx_snapshot_gmu_bo(
|
||||
|
||||
snapshot->iova = bo->iova;
|
||||
snapshot->size = bo->size;
|
||||
snapshot->data = state_kcalloc(a6xx_state, 1, snapshot->size);
|
||||
snapshot->data = kvzalloc(snapshot->size, GFP_KERNEL);
|
||||
if (!snapshot->data)
|
||||
return NULL;
|
||||
|
||||
@ -1034,6 +1034,15 @@ static void a6xx_gpu_state_destroy(struct kref *kref)
|
||||
struct a6xx_gpu_state *a6xx_state = container_of(state,
|
||||
struct a6xx_gpu_state, base);
|
||||
|
||||
if (a6xx_state->gmu_log)
|
||||
kvfree(a6xx_state->gmu_log->data);
|
||||
|
||||
if (a6xx_state->gmu_hfi)
|
||||
kvfree(a6xx_state->gmu_hfi->data);
|
||||
|
||||
if (a6xx_state->gmu_debug)
|
||||
kvfree(a6xx_state->gmu_debug->data);
|
||||
|
||||
list_for_each_entry_safe(obj, tmp, &a6xx_state->objs, node)
|
||||
kvfree(obj);
|
||||
|
||||
|
@ -729,7 +729,12 @@ static char *adreno_gpu_ascii85_encode(u32 *src, size_t len)
|
||||
return buf;
|
||||
}
|
||||
|
||||
/* len is expected to be in bytes */
|
||||
/* len is expected to be in bytes
|
||||
*
|
||||
* WARNING: *ptr should be allocated with kvmalloc or friends. It can be free'd
|
||||
* with kvfree() and replaced with a newly kvmalloc'd buffer on the first call
|
||||
* when the unencoded raw data is encoded
|
||||
*/
|
||||
void adreno_show_object(struct drm_printer *p, void **ptr, int len,
|
||||
bool *encoded)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user