Skip to content

Commit 942b151

Browse files
salyzynpundiramit
authored andcommitted
FROMLIST: arm64: Avoid aligning normal memory pointers in __memcpy_{to,from}io
(cherry picked from arm64/for-next/core commit 9ca255bf041ddc7698b6906dbd846c0ba64b1fe1) __memcpy_{to,from}io fall back to byte-at-a-time copying if both the source and destination pointers are not 8-byte aligned. Since one of the pointers always points at normal memory, this is unnecessary and detrimental to performance, so only do byte copying until we hit an 8-byte boundary for the device pointer. This change was motivated by performance issues in the pstore driver. On a test platform, measuring probe time for pstore, console buffer size of 1/4MB and pmsg of 1/2MB, was in the 90-107ms region. Change managed to reduce it to 10-25ms, an improvement in boot time. Cc: Kees Cook <keescook@chromium.org> Cc: Anton Vorontsov <anton@enomsg.org> Cc: Tony Luck <tony.luck@intel.com> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Will Deacon <will.deacon@arm.com> Cc: Anton Vorontsov <anton@enomsg.org> Cc: Robin Murphy <robin.murphy@arm.com> Signed-off-by: Mark Salyzyn <salyzyn@android.com> Signed-off-by: Will Deacon <will.deacon@arm.com> Bug: 63716230 Change-Id: I245545e8243a54b44d30fbb0d0c71a9b8a77ef63
1 parent 7f8fa0b commit 942b151

1 file changed

Lines changed: 5 additions & 7 deletions

File tree

  • arch/arm64/kernel

arch/arm64/kernel/io.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@
2525
*/
2626
void __memcpy_fromio(void *to, const volatile void __iomem *from, size_t count)
2727
{
28-
while (count && (!IS_ALIGNED((unsigned long)from, 8) ||
29-
!IS_ALIGNED((unsigned long)to, 8))) {
28+
while (count && !IS_ALIGNED((unsigned long)from, 8)) {
3029
*(u8 *)to = __raw_readb(from);
3130
from++;
3231
to++;
@@ -54,23 +53,22 @@ EXPORT_SYMBOL(__memcpy_fromio);
5453
*/
5554
void __memcpy_toio(volatile void __iomem *to, const void *from, size_t count)
5655
{
57-
while (count && (!IS_ALIGNED((unsigned long)to, 8) ||
58-
!IS_ALIGNED((unsigned long)from, 8))) {
59-
__raw_writeb(*(volatile u8 *)from, to);
56+
while (count && !IS_ALIGNED((unsigned long)to, 8)) {
57+
__raw_writeb(*(u8 *)from, to);
6058
from++;
6159
to++;
6260
count--;
6361
}
6462

6563
while (count >= 8) {
66-
__raw_writeq(*(volatile u64 *)from, to);
64+
__raw_writeq(*(u64 *)from, to);
6765
from += 8;
6866
to += 8;
6967
count -= 8;
7068
}
7169

7270
while (count) {
73-
__raw_writeb(*(volatile u8 *)from, to);
71+
__raw_writeb(*(u8 *)from, to);
7472
from++;
7573
to++;
7674
count--;

0 commit comments

Comments
 (0)