lkml.org 
[lkml]   [2023]   [Jun]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH drm-next v5 11/14] drm/nouveau: chan: provide nouveau_channel_kill()
    Date
    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.

    Signed-off-by: Danilo Krummrich <dakr@redhat.com>
    ---
    drivers/gpu/drm/nouveau/nouveau_chan.c | 14 +++++++++++---
    drivers/gpu/drm/nouveau/nouveau_chan.h | 1 +
    2 files changed, 12 insertions(+), 3 deletions(-)

    diff --git a/drivers/gpu/drm/nouveau/nouveau_chan.c b/drivers/gpu/drm/nouveau/nouveau_chan.c
    index f47c0363683c..a975f8b0e0e5 100644
    --- a/drivers/gpu/drm/nouveau/nouveau_chan.c
    +++ b/drivers/gpu/drm/nouveau/nouveau_chan.c
    @@ -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;
    }
    diff --git a/drivers/gpu/drm/nouveau/nouveau_chan.h b/drivers/gpu/drm/nouveau/nouveau_chan.h
    index e06a8ffed31a..e483f4a254da 100644
    --- a/drivers/gpu/drm/nouveau/nouveau_chan.h
    +++ b/drivers/gpu/drm/nouveau/nouveau_chan.h
    @@ -65,6 +65,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;

    --
    2.40.1
    \
     
     \ /
      Last update: 2023-06-20 02:45    [W:6.042 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site