x86/mm/iommu/sva: Make LAM and SVA mutually exclusive
[sfrench/cifs-2.6.git] / arch / x86 / kernel / process_64.c
index 186f34add8658451662c717ed0bae0c8efc09a5d..b46924c9e46d9356e6bcaef2675c7d5ffbea85ca 100644 (file)
@@ -756,6 +756,10 @@ static int prctl_enable_tagged_addr(struct mm_struct *mm, unsigned long nr_bits)
        if (current->mm != mm)
                return -EINVAL;
 
+       if (mm_valid_pasid(mm) &&
+           !test_bit(MM_CONTEXT_FORCE_TAGGED_SVA, &mm->context.flags))
+               return -EINTR;
+
        if (mmap_write_lock_killable(mm))
                return -EINTR;
 
@@ -878,6 +882,9 @@ long do_arch_prctl_64(struct task_struct *task, int option, unsigned long arg2)
                                (unsigned long __user *)arg2);
        case ARCH_ENABLE_TAGGED_ADDR:
                return prctl_enable_tagged_addr(task->mm, arg2);
+       case ARCH_FORCE_TAGGED_SVA:
+               set_bit(MM_CONTEXT_FORCE_TAGGED_SVA, &task->mm->context.flags);
+               return 0;
        case ARCH_GET_MAX_TAG_BITS:
                if (!cpu_feature_enabled(X86_FEATURE_LAM))
                        return put_user(0, (unsigned long __user *)arg2);