RE: [PATCH 05/11] drm/amdgpu:use work instead of delay-work
Reviewed-by: Xiangliang Yu > -Original Message- > From: amd-gfx [mailto:amd-gfx-boun...@lists.freedesktop.org] On Behalf > Of Monk Liu > Sent: Wednesday, February 08, 2017 5:27 PM > To: amd-gfx@lists.freedesktop.org > Cc: Liu, Monk> Subject: [PATCH 05/11] drm/amdgpu:use work instead of delay-work > > no need to use a delay work since we don't know how much time hypervisor > takes on FLR, so just polling and waiting in a work. > > Change-Id: I41b6336baa00b1fd299311349402a17951b585a2 > Signed-off-by: Monk Liu > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h | 2 +- > drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c| 36 +++ > - > 2 files changed, 18 insertions(+), 20 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h > b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h > index 4b05568..846f29c 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h > @@ -50,7 +50,7 @@ struct amdgpu_virt { > struct mutexlock_reset; > struct amdgpu_irq_src ack_irq; > struct amdgpu_irq_src rcv_irq; > - struct delayed_work flr_work; > + struct work_struct flr_work; > const struct amdgpu_virt_ops*ops; > }; > > diff --git a/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c > b/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c > index 7c7420f..5f156d3 100644 > --- a/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c > +++ b/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c > @@ -501,17 +501,19 @@ static int xgpu_vi_set_mailbox_ack_irq(struct > amdgpu_device *adev, > > static void xgpu_vi_mailbox_flr_work(struct work_struct *work) { > - struct amdgpu_virt *virt = container_of(work, > - struct amdgpu_virt, flr_work.work); > - struct amdgpu_device *adev = container_of(virt, > - struct amdgpu_device, virt); > - int r = 0; > - > - r = xgpu_vi_poll_msg(adev, IDH_FLR_NOTIFICATION_CMPL); > - if (r) > - DRM_ERROR("failed to get flr cmpl msg from hypervior.\n"); > + struct amdgpu_virt *virt = container_of(work, struct amdgpu_virt, > flr_work); > + struct amdgpu_device *adev = container_of(virt, struct > amdgpu_device, > +virt); > + > + /* wait until RCV_MSG become 3 */ > + if (!xgpu_vi_poll_msg(adev, IDH_FLR_NOTIFICATION_CMPL)) > + adev->virt.caps &= ~AMDGPU_SRIOV_CAPS_RUNTIME; > + else { > + pr_err("failed to recieve FLR_CMPL\n"); > + return; > + } > > - /* TODO: need to restore gfx states */ > + /* Trigger recovery due to world switch failure */ > + amdgpu_sriov_gpu_reset(adev, false); > } > > static int xgpu_vi_set_mailbox_rcv_irq(struct amdgpu_device *adev, @@ - > 534,15 +536,12 @@ static int xgpu_vi_mailbox_rcv_irq(struct amdgpu_device > *adev, { > int r; > > - adev->virt.caps &= ~AMDGPU_SRIOV_CAPS_RUNTIME; > + /* see what event we get */ > r = xgpu_vi_mailbox_rcv_msg(adev, IDH_FLR_NOTIFICATION); > - /* do nothing for other msg */ > - if (r) > - return 0; > > - /* TODO: need to save gfx states */ > - schedule_delayed_work(>virt.flr_work, > - msecs_to_jiffies(VI_MAILBOX_RESET_TIME)); > + /* only handle FLR_NOTIFY now */ > + if (!r) > + schedule_work(>virt.flr_work); > > return 0; > } > @@ -595,14 +594,13 @@ int xgpu_vi_mailbox_get_irq(struct > amdgpu_device *adev) > return r; > } > > - INIT_DELAYED_WORK(>virt.flr_work, > xgpu_vi_mailbox_flr_work); > + INIT_WORK(>virt.flr_work, xgpu_vi_mailbox_flr_work); > > return 0; > } > > void xgpu_vi_mailbox_put_irq(struct amdgpu_device *adev) { > - cancel_delayed_work_sync(>virt.flr_work); > amdgpu_irq_put(adev, >virt.ack_irq, 0); > amdgpu_irq_put(adev, >virt.rcv_irq, 0); } > -- > 2.7.4 > > ___ > amd-gfx mailing list > amd-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx ___ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx
RE: [PATCH 05/11] drm/amdgpu:use work instead of delay-work
> -Original Message- > From: amd-gfx [mailto:amd-gfx-boun...@lists.freedesktop.org] On Behalf > Of Monk Liu > Sent: Wednesday, February 08, 2017 4:27 AM > To: amd-gfx@lists.freedesktop.org > Cc: Liu, Monk > Subject: [PATCH 05/11] drm/amdgpu:use work instead of delay-work > > no need to use a delay work since we don't know how > much time hypervisor takes on FLR, so just polling > and waiting in a work. > > Change-Id: I41b6336baa00b1fd299311349402a17951b585a2 > Signed-off-by: Monk LiuAcked-by: Alex Deucher > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h | 2 +- > drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c| 36 +++ > - > 2 files changed, 18 insertions(+), 20 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h > b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h > index 4b05568..846f29c 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h > @@ -50,7 +50,7 @@ struct amdgpu_virt { > struct mutexlock_reset; > struct amdgpu_irq_src ack_irq; > struct amdgpu_irq_src rcv_irq; > - struct delayed_work flr_work; > + struct work_struct flr_work; > const struct amdgpu_virt_ops*ops; > }; > > diff --git a/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c > b/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c > index 7c7420f..5f156d3 100644 > --- a/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c > +++ b/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c > @@ -501,17 +501,19 @@ static int xgpu_vi_set_mailbox_ack_irq(struct > amdgpu_device *adev, > > static void xgpu_vi_mailbox_flr_work(struct work_struct *work) > { > - struct amdgpu_virt *virt = container_of(work, > - struct amdgpu_virt, flr_work.work); > - struct amdgpu_device *adev = container_of(virt, > - struct amdgpu_device, virt); > - int r = 0; > - > - r = xgpu_vi_poll_msg(adev, IDH_FLR_NOTIFICATION_CMPL); > - if (r) > - DRM_ERROR("failed to get flr cmpl msg from hypervior.\n"); > + struct amdgpu_virt *virt = container_of(work, struct amdgpu_virt, > flr_work); > + struct amdgpu_device *adev = container_of(virt, struct > amdgpu_device, virt); > + > + /* wait until RCV_MSG become 3 */ > + if (!xgpu_vi_poll_msg(adev, IDH_FLR_NOTIFICATION_CMPL)) > + adev->virt.caps &= ~AMDGPU_SRIOV_CAPS_RUNTIME; > + else { > + pr_err("failed to recieve FLR_CMPL\n"); > + return; > + } > > - /* TODO: need to restore gfx states */ > + /* Trigger recovery due to world switch failure */ > + amdgpu_sriov_gpu_reset(adev, false); > } > > static int xgpu_vi_set_mailbox_rcv_irq(struct amdgpu_device *adev, > @@ -534,15 +536,12 @@ static int xgpu_vi_mailbox_rcv_irq(struct > amdgpu_device *adev, > { > int r; > > - adev->virt.caps &= ~AMDGPU_SRIOV_CAPS_RUNTIME; > + /* see what event we get */ > r = xgpu_vi_mailbox_rcv_msg(adev, IDH_FLR_NOTIFICATION); > - /* do nothing for other msg */ > - if (r) > - return 0; > > - /* TODO: need to save gfx states */ > - schedule_delayed_work(>virt.flr_work, > - msecs_to_jiffies(VI_MAILBOX_RESET_TIME)); > + /* only handle FLR_NOTIFY now */ > + if (!r) > + schedule_work(>virt.flr_work); > > return 0; > } > @@ -595,14 +594,13 @@ int xgpu_vi_mailbox_get_irq(struct > amdgpu_device *adev) > return r; > } > > - INIT_DELAYED_WORK(>virt.flr_work, > xgpu_vi_mailbox_flr_work); > + INIT_WORK(>virt.flr_work, xgpu_vi_mailbox_flr_work); > > return 0; > } > > void xgpu_vi_mailbox_put_irq(struct amdgpu_device *adev) > { > - cancel_delayed_work_sync(>virt.flr_work); > amdgpu_irq_put(adev, >virt.ack_irq, 0); > amdgpu_irq_put(adev, >virt.rcv_irq, 0); > } > -- > 2.7.4 > > ___ > amd-gfx mailing list > amd-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx ___ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx