Skip to contentSkip to conversation

s390/protvirt: restore force_dma_unencrypted()

PATCH In review Halil Pasic 3 participants 8 messages Jul 15, 2019

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 s390/protvirt: restore force_dma_unencrypted()

Since commit e67a5ed1f86f ("dma-direct: Force unencrypted DMA under SME for certain DMA masks"), force_dma_unencrypted() is broken on s390 (under protvirt). Before used to return sev_active(), after it became practically architecture specific, with the default implementation always returning false.

Let's restore the old behavior of force_dma_unencrypted().

Note: we still need sev_active() defined because of the reference in fs/core/vmcore, but this one is likely to go away soon along with the need for an s390 sev_active().

Fixes e67a5ed1f86f ("dma-direct: Force unencrypted DMA under SME for

certain DMA masks")

--

Thiago has a path that gets rid of the fs/core/vmcore reference. Link:
https://patchwork.ozlabs.org/patch/1131571/

Prior discussion:
https://www.spinics.net/lists/kernel/msg3189113.html

---
 arch/s390/Kconfig                   | 1 +
 arch/s390/include/asm/mem_encrypt.h | 2 +-
 arch/s390/mm/init.c                 | 2 +-
 3 files changed, 3 insertions(+), 2 deletions(-)
arch/s390/Kconfig +1 -0
index 5d8570ed6cab..a4ad2733eedf 100644
@@ -189,6 +189,7 @@ config S390
 	select VIRT_CPU_ACCOUNTING
 	select ARCH_HAS_SCALED_CPUTIME
 	select HAVE_NMI
+	select ARCH_HAS_FORCE_DMA_UNENCRYPTED
 	select SWIOTLB
 	select GENERIC_ALLOCATOR
 
arch/s390/include/asm/mem_encrypt.h +1 -1
index 3eb018508190..f8453f8cc191 100644
@@ -7,7 +7,7 @@
 #define sme_me_mask	0ULL
 
 static inline bool sme_active(void) { return false; }
-extern bool sev_active(void);
+static inline bool sev_active(void) { return false; }
 
 int set_memory_encrypted(unsigned long addr, int numpages);
 int set_memory_decrypted(unsigned long addr, int numpages);
arch/s390/mm/init.c +1 -1
index f0bee6af3960..023ab4221687 100644
@@ -156,7 +156,7 @@ int set_memory_decrypted(unsigned long addr, int numpages)
 }
 
 /* are we a protected virtualization guest? */
-bool sev_active(void)
+bool force_dma_unencrypted(struct device *dev)
 {
 	return is_prot_virt_guest();
 }
Signature · 1 line
2.17.1
#1 lore raw

This looks good to me - if you and Tom are fine with it I'd like to fold it into his commit so that what I'll send to Linus is bisection clean.

Quoted 3 lines

Note: we still need sev_active() defined because of the reference in fs/core/vmcore, but this one is likely to go away soon along with the need for an s390 sev_active().

Any chance we could not change the return value from the function at least in this patch/fold as that change seems unrelated to the dma functionality. If that is what you really wanted and only the dma code was in the way we can happily merge it as a separate patch, of couse.

#2 lore raw
Quoted 3 lines · Christoph Hellwig

This looks good to me - if you and Tom are fine with it I'd like to fold it into his commit so that what I'll send to Linus is bisection clean.

I'm ok with folding it in. Sorry about missing that.

Thanks,
Tom

Quoted 11 lines
Quoted 4 lines

Note: we still need sev_active() defined because of the reference in fs/core/vmcore, but this one is likely to go away soon along with the need for an s390 sev_active().

Any chance we could not change the return value from the function at least in this patch/fold as that change seems unrelated to the dma functionality. If that is what you really wanted and only the dma code was in the way we can happily merge it as a separate patch, of couse.

#3 lore raw
Quoted 6 lines · Thomas
Quoted 3 lines · Christoph Hellwig

This looks good to me - if you and Tom are fine with it I'd like to fold it into his commit so that what I'll send to Linus is bisection clean.

I'm ok with folding it in. Sorry about missing that.

The s390 changes were queued up in a different tree for 5.2, so you had no easy way of noticing this.

#7 lore raw
In reply to Christoph Hellwig
Quoted 3 lines · On Mon, 15 Jul 2019 06:20:27 -0700 Christoph Hellwig <[email protected]> wrote:

This looks good to me - if you and Tom are fine with it I'd like to fold it into his commit so that what I'll send to Linus is bisection clean.

No objections here.

Quoted 11 lines
Quoted 4 lines

Note: we still need sev_active() defined because of the reference in fs/core/vmcore, but this one is likely to go away soon along with the need for an s390 sev_active().

Any chance we could not change the return value from the function at least in this patch/fold as that change seems unrelated to the dma functionality. If that is what you really wanted and only the dma code was in the way we can happily merge it as a separate patch, of couse.

AFAIU the story form fs/core/vmcore.c boils down to the same on s390. I explained this in an email I've sent a moment ago (to Thiago). I expect sev_active() on s390 to go away soon as it really does not make sense for us (any more).

Thus yes, we can restore the pre- e67a5ed1f86f ("dma-direct: Force unencrypted DMA under SME for certain DMA masks") sev_active() behavior as well, even if we don't care about it. What I did conveys the semantic better. Not changing the behavior of however sev_active() makes more sense if the two are going to be squashed.

The corresponding diff looks like follows. Would you like me to send it out as v2?

Regards,
Halil

----------------------------8<---------------------------------------

arch/s390/Kconfig +1 -0
index 5d8570ed6cab..a4ad2733eedf 100644
@@ -189,6 +189,7 @@ config S390
        select VIRT_CPU_ACCOUNTING
        select ARCH_HAS_SCALED_CPUTIME
        select HAVE_NMI
+       select ARCH_HAS_FORCE_DMA_UNENCRYPTED
        select SWIOTLB
        select GENERIC_ALLOCATOR
 
arch/s390/mm/init.c +6 -1
index f0bee6af3960..dfe47a22480a 100644
@@ -155,12 +155,17 @@ int set_memory_decrypted(unsigned long addr, int numpages)
        return 0;
 }
 
-/* are we a protected virtualization guest? */
 bool sev_active(void)
 {
        return is_prot_virt_guest();
 }
 
+/* are we a protected virtualization guest? */
+bool force_dma_unencrypted(struct device *dev)
+{
+       return is_prot_virt_guest();
+}
+
 /* protected virtualization */
 static void pv_init(void)
 {