Re: [PATCH v3 20/23] fs: Allow copy_mount_options() to access user-space in a single pass
From: Dave Martin <dave.martin@arm.com>
Date: 2020-04-27 16:56:48
Also in:
linux-arch, linux-mm
On Tue, Apr 21, 2020 at 03:26:00PM +0100, Catalin Marinas wrote:
The copy_mount_options() function takes a user pointer argument but not a size. It tries to read up to a PAGE_SIZE. However, copy_from_user() is not guaranteed to return all the accessible bytes if, for example, the access crosses a page boundary and gets a fault on the second page. To work around this, the current copy_mount_options() implementations performs to copy_from_user() passes, first to the end of the current page and the second to what's left in the subsequent page. Some architectures like arm64 can guarantee an exact copy_from_user() depending on the size (since the arch function performs some alignment on the source register). Introduce an arch_has_exact_copy_from_user() function and allow copy_mount_options() to perform the user access in a single pass. While this function is not on a critical path, the single-pass behaviour is required for arm64 MTE (memory tagging) support where a uaccess can trigger intra-page faults (tag not matching). With the current implementation, if this happens during the first page, the function will return -EFAULT.
Do you know how much extra overhead we'd incur if we read at must one tag granule at a time, instead of PAGE_SIZE? I'm guessing that in practice strcpy_from_user() type operations copy much less than a page most of the time, so what we lose in uaccess overheads we _might_ regain in less redundant copying. Would need behchmarking though. [...] Cheers ---Dave _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel