s390/mm: fix virtual-physical address confusion for swiotlb
authorNico Boehr <nrb@linux.ibm.com>
Mon, 7 Nov 2022 12:12:21 +0000 (13:12 +0100)
committerJanosch Frank <frankja@linux.ibm.com>
Mon, 7 Nov 2022 13:33:40 +0000 (14:33 +0100)
swiotlb passes virtual addresses to set_memory_encrypted() and
set_memory_decrypted(), but uv_remove_shared() and uv_set_shared()
expect physical addresses. This currently works, because virtual
and physical addresses are the same.

Add virt_to_phys() to resolve the virtual-physical confusion.

Reported-by: Marc Hartmayer <mhartmay@linux.ibm.com>
Signed-off-by: Nico Boehr <nrb@linux.ibm.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Reviewed-by: Christian Borntraeger <borntraeger@linux.ibm.com>
Link: https://lore.kernel.org/r/20221107121221.156274-2-nrb@linux.ibm.com
Message-Id: <20221107121221.156274-2-nrb@linux.ibm.com>
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
arch/s390/include/asm/mem_encrypt.h
arch/s390/mm/init.c

index 08a8b96..b85e135 100644 (file)
@@ -4,8 +4,8 @@
 
 #ifndef __ASSEMBLY__
 
-int set_memory_encrypted(unsigned long addr, int numpages);
-int set_memory_decrypted(unsigned long addr, int numpages);
+int set_memory_encrypted(unsigned long vaddr, int numpages);
+int set_memory_decrypted(unsigned long vaddr, int numpages);
 
 #endif /* __ASSEMBLY__ */
 
index 97d66a3..d509656 100644 (file)
@@ -140,25 +140,25 @@ void mark_rodata_ro(void)
        debug_checkwx();
 }
 
-int set_memory_encrypted(unsigned long addr, int numpages)
+int set_memory_encrypted(unsigned long vaddr, int numpages)
 {
        int i;
 
        /* make specified pages unshared, (swiotlb, dma_free) */
        for (i = 0; i < numpages; ++i) {
-               uv_remove_shared(addr);
-               addr += PAGE_SIZE;
+               uv_remove_shared(virt_to_phys((void *)vaddr));
+               vaddr += PAGE_SIZE;
        }
        return 0;
 }
 
-int set_memory_decrypted(unsigned long addr, int numpages)
+int set_memory_decrypted(unsigned long vaddr, int numpages)
 {
        int i;
        /* make specified pages shared (swiotlb, dma_alloca) */
        for (i = 0; i < numpages; ++i) {
-               uv_set_shared(addr);
-               addr += PAGE_SIZE;
+               uv_set_shared(virt_to_phys((void *)vaddr));
+               vaddr += PAGE_SIZE;
        }
        return 0;
 }