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 at amd.com> >> --- >> 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 >