swiotlb: do not free decrypted pages if dynamic
authorPetr Tesarik <petrtesarik@huaweicloud.com>
Thu, 2 Nov 2023 09:36:49 +0000 (10:36 +0100)
committerChristoph Hellwig <hch@lst.de>
Fri, 3 Nov 2023 08:33:45 +0000 (09:33 +0100)
commita5e3b127455d073f146a2a4ea3e7117635d34c5c
treeed771584381cacd079132e2fca843c2f0df90020
parent8f6f76a6a29f36d2f3e4510d0bde5046672f6924
swiotlb: do not free decrypted pages if dynamic

Fix these two error paths:

1. When set_memory_decrypted() fails, pages may be left fully or partially
   decrypted.

2. Decrypted pages may be freed if swiotlb_alloc_tlb() determines that the
   physical address is too high.

To fix the first issue, call set_memory_encrypted() on the allocated region
after a failed decryption attempt. If that also fails, leak the pages.

To fix the second issue, check that the TLB physical address is below the
requested limit before decrypting.

Let the caller differentiate between unsuitable physical address (=> retry
from a lower zone) and allocation failures (=> no point in retrying).

Cc: stable@vger.kernel.org
Fixes: 79636caad361 ("swiotlb: if swiotlb is full, fall back to a transient memory pool")
Signed-off-by: Petr Tesarik <petr.tesarik1@huawei-partners.com>
Reviewed-by: Rick Edgecombe <rick.p.edgecombe@intel.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
kernel/dma/swiotlb.c