void l4x_evict_tasks(struct task_struct *exclude) { struct task_struct *p; int cnt = 0; rcu_read_lock(); for_each_process(p) { l4_cap_idx_t t; struct mm_struct *mm; if (p == exclude) continue; task_lock(p); mm = p->mm; if (!mm) { task_unlock(p); continue; } t = ACCESS_ONCE(mm->context.task); if (l4_is_invalid_cap(t)) { task_unlock(p); continue; } if (down_read_trylock(&mm->mmap_sem)) { struct vm_area_struct *vma; for (vma = mm->mmap; vma; vma = vma->vm_next) if (vma->vm_flags & VM_LOCKED) { t = L4_INVALID_CAP; break; } up_read(&mm->mmap_sem); if (!vma) if (cmpxchg(&mm->context.task, t, L4_INVALID_CAP) != t) t = L4_INVALID_CAP; } else t = L4_INVALID_CAP; task_unlock(p); if (!l4_is_invalid_cap(t)) { l4lx_task_delete_task(t); l4lx_task_number_free(t); if (++cnt > 10) break; } } rcu_read_unlock(); if (cnt == 0) pr_info_ratelimited("l4x-evict: Found no process to free.\n"); }
int l4x_kvm_destroy_vm(struct kvm *kvm) { printk("%s: cap = %08lx\n", __func__, kvm->arch.l4vmcap); if (!l4lx_task_delete_task(kvm->arch.l4vmcap, 1)) { printk("%s: kvm task destruction failed cap=%08lx\n", __func__, kvm->arch.l4vmcap); l4lx_task_number_free(kvm->arch.l4vmcap); return -ENOENT; } l4lx_task_number_free(kvm->arch.l4vmcap); return 0; }
void destroy_context(struct mm_struct *mm) { l4_cap_idx_t task_id; destroy_context_origarch(mm); if (!mm || !mm->context.task || l4_is_invalid_cap(task_id = mm->context.task)) return; if (l4lx_task_delete_task(task_id)) do_exit(9); mm->context.task = L4_INVALID_CAP; l4lx_task_number_free(task_id); }