swiotlb: optimize get_max_slots()
authorPetr Tesarik <petr.tesarik.ext@huawei.com>
Thu, 3 Aug 2023 11:59:41 +0000 (13:59 +0200)
committerChristoph Hellwig <hch@lst.de>
Tue, 8 Aug 2023 17:29:21 +0000 (10:29 -0700)
commitd069ed288ac74c24e2b1c294aa9445c80ed6c518
treeab5552e5c52f44a0997c635cca9d30ea01cb88d4
parentf94cb36e760d2a4d359ad64f5fafc62ca755fd72
swiotlb: optimize get_max_slots()

Use a simple logical shift and increment to calculate the number of slots
taken by the DMA segment boundary.

At least GCC-13 is not able to optimize the expression, producing this
horrible assembly code on x86:

cmpq $-1, %rcx
je .L364
addq $2048, %rcx
shrq $11, %rcx
movq %rcx, %r13
.L331:
// rest of the function here...

// after function epilogue and return:
.L364:
movabsq $9007199254740992, %r13
jmp .L331

After the optimization, the code looks more reasonable:

shrq $11, %r11
leaq 1(%r11), %rbx

Signed-off-by: Petr Tesarik <petr.tesarik.ext@huawei.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
kernel/dma/swiotlb.c