Re: [PATCHv3 6/8] x86/mm: Provide ARCH_GET_UNTAG_MASK and ARCH_ENABLE_TAGGED_ADDR

From: Edgecombe, Rick P
Date: Fri Jun 10 2022 - 12:16:13 EST


On Fri, 2022-06-10 at 17:35 +0300, Kirill A. Shutemov wrote:
> +static int prctl_enable_tagged_addr(unsigned long nr_bits)
> +{
> + struct mm_struct *mm = current->mm;
> +
> + /* Already enabled? */
> + if (mm->context.lam_cr3_mask)
> + return -EBUSY;
> +
> + /* LAM has to be enabled before spawning threads */
> + if (get_nr_threads(current) > 1)
> + return -EBUSY;

Does this work for vfork()? I guess the idea is that locking is not
needed below because there is only one thread with the MM, but with
vfork() another task could operate on the MM, call fork(), etc. I'm not
sure...

> +
> + if (!nr_bits) {
> + return -EINVAL;
> + } else if (nr_bits <= 6) {
> + mm->context.lam_cr3_mask = X86_CR3_LAM_U57;
> + mm->context.untag_mask = ~GENMASK(62, 57);
> + } else {
> + return -EINVAL;
> + }
> +
> + /* Update CR3 to get LAM active */
> + switch_mm(current->mm, current->mm, current);
> + return 0;
> +}