Skip to content

Commit 4a37f3d

Browse files
rmurphy-armChristoph Hellwig
authored andcommitted
dma-direct: don't over-decrypt memory
The original x86 sev_alloc() only called set_memory_decrypted() on memory returned by alloc_pages_node(), so the page order calculation fell out of that logic. However, the common dma-direct code has several potential allocators, not all of which are guaranteed to round up the underlying allocation to a power-of-two size, so carrying over that calculation for the encryption/decryption size was a mistake. Fix it by rounding to a *number* of pages, rather than an order. Until recently there was an even worse interaction with DMA_DIRECT_REMAP where we could have ended up decrypting part of the next adjacent vmalloc area, only averted by no architecture actually supporting both configs at once. Don't ask how I found that one out... Fixes: c10f07a ("dma/direct: Handle force decryption for DMA coherent buffers in common code") Signed-off-by: Robin Murphy <robin.murphy@arm.com> Signed-off-by: Christoph Hellwig <hch@lst.de> Acked-by: David Rientjes <rientjes@google.com>
1 parent 8280674 commit 4a37f3d

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

kernel/dma/direct.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ static int dma_set_decrypted(struct device *dev, void *vaddr, size_t size)
7979
{
8080
if (!force_dma_unencrypted(dev))
8181
return 0;
82-
return set_memory_decrypted((unsigned long)vaddr, 1 << get_order(size));
82+
return set_memory_decrypted((unsigned long)vaddr, PFN_UP(size));
8383
}
8484

8585
static int dma_set_encrypted(struct device *dev, void *vaddr, size_t size)
@@ -88,7 +88,7 @@ static int dma_set_encrypted(struct device *dev, void *vaddr, size_t size)
8888

8989
if (!force_dma_unencrypted(dev))
9090
return 0;
91-
ret = set_memory_encrypted((unsigned long)vaddr, 1 << get_order(size));
91+
ret = set_memory_encrypted((unsigned long)vaddr, PFN_UP(size));
9292
if (ret)
9393
pr_warn_ratelimited("leaking DMA memory that can't be re-encrypted\n");
9494
return ret;

0 commit comments

Comments
 (0)