svn commit: r347251 - head/sys/dev/mlx5/mlx5_ib
Hans Petter Selasky
hselasky at FreeBSD.org
Wed May 8 10:29:47 UTC 2019
Author: hselasky
Date: Wed May 8 10:29:45 2019
New Revision: 347251
URL: https://svnweb.freebsd.org/changeset/base/347251
Log:
Import Linux code to implement mlx5_ib_disassociate_ucontext() in mlx5ib.
Submitted by: kib@
MFC after: 3 days
Sponsored by: Mellanox Technologies
Modified:
head/sys/dev/mlx5/mlx5_ib/mlx5_ib_main.c
Modified: head/sys/dev/mlx5/mlx5_ib/mlx5_ib_main.c
==============================================================================
--- head/sys/dev/mlx5/mlx5_ib/mlx5_ib_main.c Wed May 8 10:28:18 2019 (r347250)
+++ head/sys/dev/mlx5/mlx5_ib/mlx5_ib_main.c Wed May 8 10:29:45 2019 (r347251)
@@ -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);
More information about the svn-src-head
mailing list