mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-11 13:04:03 +08:00
drm/nouveau: chan: provide nouveau_channel_kill()
The new VM_BIND UAPI implementation introduced in subsequent commits will allow asynchronous jobs processing push buffers and emitting fences. If a job times out, we need a way to recover from this situation. For now, simply kill the channel to unblock all hung up jobs and signal userspace that the device is dead on the next EXEC or VM_BIND ioctl. Reviewed-by: Dave Airlie <airlied@redhat.com> Signed-off-by: Danilo Krummrich <dakr@redhat.com> Link: https://patchwork.freedesktop.org/patch/msgid/20230804182406.5222-10-dakr@redhat.com
This commit is contained in:
parent
f124eef76f
commit
7576c4ca6d
@ -40,6 +40,14 @@ MODULE_PARM_DESC(vram_pushbuf, "Create DMA push buffers in VRAM");
|
||||
int nouveau_vram_pushbuf;
|
||||
module_param_named(vram_pushbuf, nouveau_vram_pushbuf, int, 0400);
|
||||
|
||||
void
|
||||
nouveau_channel_kill(struct nouveau_channel *chan)
|
||||
{
|
||||
atomic_set(&chan->killed, 1);
|
||||
if (chan->fence)
|
||||
nouveau_fence_context_kill(chan->fence, -ENODEV);
|
||||
}
|
||||
|
||||
static int
|
||||
nouveau_channel_killed(struct nvif_event *event, void *repv, u32 repc)
|
||||
{
|
||||
@ -47,9 +55,9 @@ nouveau_channel_killed(struct nvif_event *event, void *repv, u32 repc)
|
||||
struct nouveau_cli *cli = (void *)chan->user.client;
|
||||
|
||||
NV_PRINTK(warn, cli, "channel %d killed!\n", chan->chid);
|
||||
atomic_set(&chan->killed, 1);
|
||||
if (chan->fence)
|
||||
nouveau_fence_context_kill(chan->fence, -ENODEV);
|
||||
|
||||
if (unlikely(!atomic_read(&chan->killed)))
|
||||
nouveau_channel_kill(chan);
|
||||
|
||||
return NVIF_EVENT_DROP;
|
||||
}
|
||||
|
@ -66,6 +66,7 @@ int nouveau_channel_new(struct nouveau_drm *, struct nvif_device *, bool priv,
|
||||
u32 vram, u32 gart, struct nouveau_channel **);
|
||||
void nouveau_channel_del(struct nouveau_channel **);
|
||||
int nouveau_channel_idle(struct nouveau_channel *);
|
||||
void nouveau_channel_kill(struct nouveau_channel *);
|
||||
|
||||
extern int nouveau_vram_pushbuf;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user