Exemplo n.º 1
0
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");
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
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);
}