Message ID | 20221107121221.156274-2-nrb@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | s390/mm: fix virtual-physical address confusion for swiotlb | expand |
Am 07.11.22 um 13:12 schrieb Nico Boehr: > 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> You can keep my RB: Reviewed-by: Christian Borntraeger <borntraeger@linux.ibm.com> > --- > arch/s390/include/asm/mem_encrypt.h | 4 ++-- > arch/s390/mm/init.c | 12 ++++++------ > 2 files changed, 8 insertions(+), 8 deletions(-) > > diff --git a/arch/s390/include/asm/mem_encrypt.h b/arch/s390/include/asm/mem_encrypt.h > index 08a8b96606d7..b85e13505a0f 100644 > --- a/arch/s390/include/asm/mem_encrypt.h > +++ b/arch/s390/include/asm/mem_encrypt.h > @@ -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__ */ > > diff --git a/arch/s390/mm/init.c b/arch/s390/mm/init.c > index 97d66a3e60fb..d509656c67d7 100644 > --- a/arch/s390/mm/init.c > +++ b/arch/s390/mm/init.c > @@ -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; > }
On Mon, 7 Nov 2022 13:12:21 +0100 Nico Boehr <nrb@linux.ibm.com> wrote: > 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> > --- > arch/s390/include/asm/mem_encrypt.h | 4 ++-- > arch/s390/mm/init.c | 12 ++++++------ > 2 files changed, 8 insertions(+), 8 deletions(-) > > diff --git a/arch/s390/include/asm/mem_encrypt.h b/arch/s390/include/asm/mem_encrypt.h > index 08a8b96606d7..b85e13505a0f 100644 > --- a/arch/s390/include/asm/mem_encrypt.h > +++ b/arch/s390/include/asm/mem_encrypt.h > @@ -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__ */ > > diff --git a/arch/s390/mm/init.c b/arch/s390/mm/init.c > index 97d66a3e60fb..d509656c67d7 100644 > --- a/arch/s390/mm/init.c > +++ b/arch/s390/mm/init.c > @@ -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; > }
diff --git a/arch/s390/include/asm/mem_encrypt.h b/arch/s390/include/asm/mem_encrypt.h index 08a8b96606d7..b85e13505a0f 100644 --- a/arch/s390/include/asm/mem_encrypt.h +++ b/arch/s390/include/asm/mem_encrypt.h @@ -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__ */ diff --git a/arch/s390/mm/init.c b/arch/s390/mm/init.c index 97d66a3e60fb..d509656c67d7 100644 --- a/arch/s390/mm/init.c +++ b/arch/s390/mm/init.c @@ -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; }
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> --- arch/s390/include/asm/mem_encrypt.h | 4 ++-- arch/s390/mm/init.c | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-)