[PATCH 13/14] drm/amdkfd: Factor PDD destruction out of kfd_process_wq_release

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Nov 28, 2017 at 1:29 AM, Felix Kuehling <Felix.Kuehling at amd.com> wrote:
> Signed-off-by: Felix Kuehling <Felix.Kuehling at amd.com>
> ---
>  drivers/gpu/drm/amd/amdkfd/kfd_process.c | 40 +++++++++++++++++++-------------
>  1 file changed, 24 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
> index 88fc822..096710c 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
> @@ -152,28 +152,15 @@ void kfd_unref_process(struct kfd_process *p)
>         kref_put(&p->ref, kfd_process_ref_release);
>  }
>
> -/* No process locking is needed in this function, because the process
> - * is not findable any more. We must assume that no other thread is
> - * using it any more, otherwise we couldn't safely free the process
> - * structure in the end.
> - */
> -static void kfd_process_wq_release(struct work_struct *work)
> +static void kfd_process_destroy_pdds(struct kfd_process *p)
>  {
> -       struct kfd_process *p = container_of(work, struct kfd_process,
> -                                            release_work);
>         struct kfd_process_device *pdd, *temp;
>
> -       pr_debug("Releasing process (pasid %d) in workqueue\n",
> -                       p->pasid);
> -
>         list_for_each_entry_safe(pdd, temp, &p->per_device_data,
> -                                                       per_device_list) {
> -               pr_debug("Releasing pdd (topology id %d) for process (pasid %d) in workqueue\n",
> +                                per_device_list) {
> +               pr_debug("Releasing pdd (topology id %d) for process (pasid %d)\n",
>                                 pdd->dev->id, p->pasid);
>
> -               if (pdd->bound == PDD_BOUND)
> -                       amd_iommu_unbind_pasid(pdd->dev->pdev, p->pasid);
> -
>                 list_del(&pdd->per_device_list);
>
>                 if (pdd->qpd.cwsr_kaddr)
> @@ -182,6 +169,27 @@ static void kfd_process_wq_release(struct work_struct *work)
>
>                 kfree(pdd);
>         }
> +}
> +
> +/* No process locking is needed in this function, because the process
> + * is not findable any more. We must assume that no other thread is
> + * using it any more, otherwise we couldn't safely free the process
> + * structure in the end.
> + */
> +static void kfd_process_wq_release(struct work_struct *work)
> +{
> +       struct kfd_process *p = container_of(work, struct kfd_process,
> +                                            release_work);
> +       struct kfd_process_device *pdd;
> +
> +       pr_debug("Releasing process (pasid %d) in workqueue\n", p->pasid);
> +
> +       list_for_each_entry(pdd, &p->per_device_data, per_device_list) {
> +               if (pdd->bound == PDD_BOUND)
> +                       amd_iommu_unbind_pasid(pdd->dev->pdev, p->pasid);
> +       }
> +
> +       kfd_process_destroy_pdds(p);
>
>         kfd_event_free_process(p);
>
> --
> 2.7.4
>
This patch is:
Reviewed-by: Oded Gabbay <oded.gabbay at gmail.com>


[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux