[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v7 25/36] swiotlb: Add warnings for use of bounce buffers with SME



On 6/21/2017 5:50 AM, Borislav Petkov wrote:
On Fri, Jun 16, 2017 at 01:54:36PM -0500, Tom Lendacky wrote:
Add warnings to let the user know when bounce buffers are being used for
DMA when SME is active.  Since the bounce buffers are not in encrypted
memory, these notifications are to allow the user to determine some
appropriate action - if necessary.  Actions can range from utilizing an
IOMMU, replacing the device with another device that can support 64-bit
DMA, ignoring the message if the device isn't used much, etc.

Signed-off-by: Tom Lendacky <thomas.lendacky@xxxxxxx>
---
  include/linux/dma-mapping.h |   11 +++++++++++
  include/linux/mem_encrypt.h |    8 ++++++++
  lib/swiotlb.c               |    3 +++
  3 files changed, 22 insertions(+)

diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
index 4f3eece..ee2307e 100644
--- a/include/linux/dma-mapping.h
+++ b/include/linux/dma-mapping.h
@@ -10,6 +10,7 @@
  #include <linux/scatterlist.h>
  #include <linux/kmemcheck.h>
  #include <linux/bug.h>
+#include <linux/mem_encrypt.h>
/**
   * List of possible attributes associated with a DMA mapping. The semantics
@@ -577,6 +578,11 @@ static inline int dma_set_mask(struct device *dev, u64 
mask)
if (!dev->dma_mask || !dma_supported(dev, mask))
                return -EIO;
+
+       /* Since mask is unsigned, this can only be true if SME is active */
+       if (mask < sme_dma_mask())
+               dev_warn(dev, "SME is active, device will require DMA bounce 
buffers\n");
+
        *dev->dma_mask = mask;
        return 0;
  }
@@ -596,6 +602,11 @@ static inline int dma_set_coherent_mask(struct device 
*dev, u64 mask)
  {
        if (!dma_supported(dev, mask))
                return -EIO;
+
+       /* Since mask is unsigned, this can only be true if SME is active */
+       if (mask < sme_dma_mask())
+               dev_warn(dev, "SME is active, device will require DMA bounce 
buffers\n");

Looks to me like those two checks above need to be a:

void sme_check_mask(struct device *dev, u64 mask)
{
         if (!sme_me_mask)
                 return;

         /* Since mask is unsigned, this can only be true if SME is active */
         if (mask < (((u64)sme_me_mask << 1) - 1))
                 dev_warn(dev, "SME is active, device will require DMA bounce 
buffers\n");
}

which gets called and sme_dma_mask() is not really needed.

Makes a lot of sense, I'll update the patch.

Thanks,
Tom



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.