Since pvr_vm_context_lookup() returns either NULL or a pointer, then stop
using IS_ERR() for checking the return value.
Using IS_ERR() leads to the kernel oops reported below. It can be
reproduced by passing an invalid VM context handle from userspace to the
DRM_IOCTL_PVR_CREATE_CONTEXT ioctl.
[ 92.733119] Unable to handle kernel NULL pointer dereference at virtual address
0000000000000148
[ 92.742042] Mem abort info:
[ 92.744890] ESR = 0x0000000096000004
[ 92.748686] EC = 0x25: DABT (current EL), IL = 32 bits
[ 92.754020] SET = 0, FnV = 0
[ 92.757154] EA = 0, S1PTW = 0
[ 92.760337] FSC = 0x04: level 0 translation fault
[ 92.765243] Data abort info:
[ 92.768129] ISV = 0, ISS = 0x00000004, ISS2 = 0x00000000
[ 92.773626] CM = 0, WnR = 0, TnD = 0, TagAccess = 0
[ 92.778763] GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0
[ 92.784098] user pgtable: 4k pages, 48-bit VAs, pgdp=
000000088ed23000
[ 92.790550] [
0000000000000148] pgd=
0000000000000000, p4d=
0000000000000000
[ 92.797381] Internal error: Oops:
0000000096000004 [#1] SMP
[ 92.803027] Modules linked in: powervr
[ 92.852533] CPU: 0 UID: 0 PID: 409 Comm: triangle Not tainted
7.1.0-rc5-g98b46e693b91 #1 PREEMPT
[ 92.861385] Hardware name: Texas Instruments AM68 SK (DT)
[ 92.866766] pstate:
60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[ 92.873709] pc : pvr_vm_get_fw_mem_context+0x0/0xc [powervr]
[ 92.879376] lr : pvr_queue_create+0x26c/0x440 [powervr]
[ 92.884595] sp :
ffff8000837fbb00
[ 92.887895] x29:
ffff8000837fbb60 x28:
0000000000000000 x27:
ffff8000837fbce8
[ 92.895015] x26:
ffff000807f61a40 x25:
ffff000807f61a00 x24:
ffff000807f64400
[ 92.902135] x23:
ffff00080a5ab000 x22:
ffff800079b24730 x21:
ffff000807f61800
[ 92.909254] x20:
ffff00080999e680 x19:
0000000000000000 x18:
0000000000000000
[ 92.916373] x17:
0000000000000000 x16:
0000000000000000 x15:
0000000000000001
[ 92.923492] x14:
0000000000000000 x13:
0000000000000002 x12:
ffff80008145b298
[ 92.930611] x11:
ffff8000844e5000 x10:
ffff80008165a130 x9 :
0000000000000100
[ 92.937730] x8 :
0000000000000001 x7 :
ffff0008076b27e0 x6 :
ffff00080ec43b7c
[ 92.944850] x5 :
ffff00080ec43b78 x4 :
0000000000000000 x3 :
ffff00080999e680
[ 92.951968] x2 :
0000000000000000 x1 :
0000000000000000 x0 :
0000000000000000
[ 92.959088] Call trace:
[ 92.961521] pvr_vm_get_fw_mem_context+0x0/0xc [powervr] (P)
[ 92.967173] pvr_context_create+0x190/0x410 [powervr]
[ 92.972218] pvr_ioctl_create_context+0x44/0x8c [powervr]
[ 92.977608] drm_ioctl_kernel+0xbc/0x124 [drm]
[ 92.982127] drm_ioctl+0x1f8/0x4dc [drm]
[ 92.986098] __arm64_sys_ioctl+0xac/0x104
[ 92.990102] invoke_syscall+0x54/0x10c
[ 92.993842] el0_svc_common.constprop.0+0x40/0xe0
[ 92.998532] do_el0_svc+0x1c/0x28
[ 93.001835] el0_svc+0x38/0x11c
[ 93.004969] el0t_64_sync_handler+0xa0/0xe4
[ 93.009139] el0t_64_sync+0x198/0x19c
[ 93.012792] Code:
aa1703e0 d2800014 95cb0ba4 17ffffe8 (
f940a400)
[ 93.018869] ---[ end trace
0000000000000000 ]---
Fixes: d2d79d29bb98 ("drm/imagination: Implement context creation/destruction ioctls")
Cc: stable@vger.kernel.org
Signed-off-by: Luigi Santivetti <luigi.santivetti@imgtec.com>
Reviewed-by: Alessio Belle <alessio.belle@imgtec.com>
Link: https://patch.msgid.link/20260707-staging-ddkopsrc-2435-v1-1-24e160d44476@imgtec.com
Signed-off-by: Alessio Belle <alessio.belle@imgtec.com>