Author: hselasky
Date: Thu May 16 15:44:27 2019
New Revision: 347715
URL: https://svnweb.freebsd.org/changeset/base/347715

Log:
  MFC r347251:
  Import Linux code to implement mlx5_ib_disassociate_ucontext() in mlx5ib.
  
  Submitted by: kib@
  Sponsored by: Mellanox Technologies

Modified:
  stable/12/sys/dev/mlx5/mlx5_ib/mlx5_ib_main.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/dev/mlx5/mlx5_ib/mlx5_ib_main.c
==============================================================================
--- stable/12/sys/dev/mlx5/mlx5_ib/mlx5_ib_main.c       Thu May 16 15:43:34 
2019        (r347714)
+++ stable/12/sys/dev/mlx5/mlx5_ib/mlx5_ib_main.c       Thu May 16 15:44:27 
2019        (r347715)
@@ -1335,6 +1335,70 @@ static int mlx5_ib_set_vma_data(struct vm_area_struct 
        return 0;
 }
 
+static void mlx5_ib_disassociate_ucontext(struct ib_ucontext *ibcontext)
+{
+       int ret;
+       struct vm_area_struct *vma;
+       struct mlx5_ib_vma_private_data *vma_private, *n;
+       struct mlx5_ib_ucontext *context = to_mucontext(ibcontext);
+       struct task_struct *owning_process  = NULL;
+       struct mm_struct   *owning_mm       = NULL;
+
+       owning_process = get_pid_task(ibcontext->tgid, PIDTYPE_PID);
+       if (!owning_process)
+               return;
+
+       owning_mm = get_task_mm(owning_process);
+       if (!owning_mm) {
+               pr_info("no mm, disassociate ucontext is pending task 
termination\n");
+               while (1) {
+                       put_task_struct(owning_process);
+                       usleep_range(1000, 2000);
+                       owning_process = get_pid_task(ibcontext->tgid,
+                                                     PIDTYPE_PID);
+                       if (!owning_process || owning_process->task_thread->
+                           td_proc->p_state == PRS_ZOMBIE) {
+                               pr_info("disassociate ucontext done, task was 
terminated\n");
+                               /* in case task was dead need to release the
+                                * task struct.
+                                */
+                               if (owning_process)
+                                       put_task_struct(owning_process);
+                               return;
+                       }
+               }
+       }
+
+       /* need to protect from a race on closing the vma as part of
+        * mlx5_ib_vma_close.
+        */
+       down_write(&owning_mm->mmap_sem);
+       list_for_each_entry_safe(vma_private, n, &context->vma_private_list,
+                                list) {
+               vma = vma_private->vma;
+               ret = zap_vma_ptes(vma, vma->vm_start,
+                                  PAGE_SIZE);
+               if (ret == -ENOTSUP) {
+                       if (bootverbose)
+                               WARN_ONCE(
+       "%s: zap_vma_ptes not implemented for unmanaged mappings", __func__);
+               } else {
+                       WARN(ret, "%s: zap_vma_ptes failed, error %d",
+                           __func__, -ret);
+               }
+               /* context going to be destroyed, should
+                * not access ops any more.
+                */
+               /* XXXKIB vma->vm_flags &= ~(VM_SHARED | VM_MAYSHARE); */
+               vma->vm_ops = NULL;
+               list_del(&vma_private->list);
+               kfree(vma_private);
+       }
+       up_write(&owning_mm->mmap_sem);
+       mmput(owning_mm);
+       put_task_struct(owning_process);
+}
+
 static inline char *mmap_cmd2str(enum mlx5_ib_mmap_cmd cmd)
 {
        switch (cmd) {
@@ -3083,6 +3147,8 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev)
                dev->ib_dev.get_vf_stats        = mlx5_ib_get_vf_stats;
                dev->ib_dev.set_vf_guid         = mlx5_ib_set_vf_guid;
        }
+
+       dev->ib_dev.disassociate_ucontext = mlx5_ib_disassociate_ucontext;
 
        mlx5_ib_internal_fill_odp_caps(dev);
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to