From: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> commit 901c7280ca0d5e2b4a8929fbe0bfb007ac2a6544 upstream. Halil Pasic points out [1] that the full revert of that commit (revert in bddac7c1e02b), and that a partial revert that only reverts the problematic case, but still keeps some of the cleanups is probably better.  And that partial revert [2] had already been verified by Oleksandr Natalenko to also fix the issue, I had just missed that in the long discussion. So let's reinstate the cleanups from commit aa6f8dcbab47 ("swiotlb: rework "fix info leak with DMA_FROM_DEVICE""), and effectively only revert the part that caused problems. Link: https://lore.kernel.org/all/20220328013731.017ae3e3.pasic@xxxxxxxxxxxxx/ [1] Link: https://lore.kernel.org/all/20220324055732.GB12078@xxxxxx/ [2] Link: https://lore.kernel.org/all/4386660.LvFx2qVVIh@xxxxxxxxxxxxxx/ [3] Suggested-by: Halil Pasic <pasic@xxxxxxxxxxxxx> Tested-by: Oleksandr Natalenko <oleksandr@xxxxxxxxxxxxxx> Cc: Christoph Hellwig" <hch@xxxxxx> Signed-off-by: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> --- Documentation/core-api/dma-attributes.rst | 8 -------- include/linux/dma-mapping.h | 8 -------- kernel/dma/swiotlb.c | 12 ++++++++---- 3 files changed, 8 insertions(+), 20 deletions(-) --- a/Documentation/core-api/dma-attributes.rst +++ b/Documentation/core-api/dma-attributes.rst @@ -130,11 +130,3 @@ accesses to DMA buffers in both privileg subsystem that the buffer is fully accessible at the elevated privilege level (and ideally inaccessible or at least read-only at the lesser-privileged levels). - -DMA_ATTR_OVERWRITE ------------------- - -This is a hint to the DMA-mapping subsystem that the device is expected to -overwrite the entire mapped size, thus the caller does not require any of the -previous buffer contents to be preserved. This allows bounce-buffering -implementations to optimise DMA_FROM_DEVICE transfers. --- a/include/linux/dma-mapping.h +++ b/include/linux/dma-mapping.h @@ -62,14 +62,6 @@ #define DMA_ATTR_PRIVILEGED (1UL << 9) /* - * This is a hint to the DMA-mapping subsystem that the device is expected - * to overwrite the entire mapped size, thus the caller does not require any - * of the previous buffer contents to be preserved. This allows - * bounce-buffering implementations to optimise DMA_FROM_DEVICE transfers. - */ -#define DMA_ATTR_OVERWRITE (1UL << 10) - -/* * A dma_addr_t can hold any valid DMA or bus address for the platform. It can * be given to a device to use as a DMA source or target. It is specific to a * given device and there may be a translation between the CPU physical address --- a/kernel/dma/swiotlb.c +++ b/kernel/dma/swiotlb.c @@ -578,10 +578,14 @@ phys_addr_t swiotlb_tbl_map_single(struc for (i = 0; i < nr_slots(alloc_size + offset); i++) mem->slots[index + i].orig_addr = slot_addr(orig_addr, i); tlb_addr = slot_addr(mem->start, index) + offset; - if (!(attrs & DMA_ATTR_SKIP_CPU_SYNC) && - (!(attrs & DMA_ATTR_OVERWRITE) || dir == DMA_TO_DEVICE || - dir == DMA_BIDIRECTIONAL)) - swiotlb_bounce(dev, tlb_addr, mapping_size, DMA_TO_DEVICE); + /* + * When dir == DMA_FROM_DEVICE we could omit the copy from the orig + * to the tlb buffer, if we knew for sure the device will + * overwirte the entire current content. But we don't. Thus + * unconditional bounce may prevent leaking swiotlb content (i.e. + * kernel memory) to user-space. + */ + swiotlb_bounce(dev, tlb_addr, mapping_size, DMA_TO_DEVICE); return tlb_addr; } Patches currently in stable-queue which might be from torvalds@xxxxxxxxxxxxxxxxxxxx are queue-5.15/spi-fix-erroneous-sgs-value-with-min_t.patch queue-5.15/ocfs2-fix-crash-when-mount-with-quota-enabled.patch queue-5.15/revert-mm-madvise-skip-unmapped-vma-holes-passed-to-process_madvise.patch queue-5.15/lib-uninline-simple_strntoull-as-well.patch queue-5.15/mm-pages_alloc.c-don-t-create-zone_movable-beyond-the-end-of-a-node.patch queue-5.15/kernel-resource-fix-kfree-of-bootmem-memory-again.patch queue-5.15/selftests-vm-fix-clang-build-error-multiple-output-f.patch queue-5.15/mm-invalidate-hwpoison-page-cache-page-in-fault-path.patch queue-5.15/selftests-x86-fix-how-check_cc.sh-is-being-invoked.patch queue-5.15/mempolicy-mbind_range-set_policy-after-vma_merge.patch queue-5.15/fs-fd-tables-have-to-be-multiples-of-bits_per_long.patch queue-5.15/mm-hwpoison-unmap-poisoned-page-before-invalidation.patch queue-5.15/revert-swiotlb-rework-fix-info-leak-with-dma_from_device.patch queue-5.15/mm-kfence-fix-missing-objcg-housekeeping-for-slab.patch queue-5.15/kunit-make-kunit_test_timeout-compatible-with-commen.patch queue-5.15/mm-kmemleak-reset-tag-when-compare-object-pointer.patch queue-5.15/drivers-base-memory-add-memory-block-to-memory-group.patch queue-5.15/revert-gpio-revert-regression-in-sysfs-gpio-gpiolib..patch queue-5.15/reinstate-some-of-swiotlb-rework-fix-info-leak-with-dma_from_device.patch queue-5.15/fs-fix-fd-table-size-alignment-properly.patch queue-5.15/mm-fs-fix-lru_cache_disabled-race-in-bh_lru.patch queue-5.15/ntfs-add-sanity-check-on-allocation-size.patch queue-5.15/watch_queue-free-the-page-array-when-watch_queue-is-dismantled.patch queue-5.15/mm-madvise-skip-unmapped-vma-holes-passed-to-process_madvise.patch queue-5.15/mm-madvise-return-correct-bytes-advised-with-process_madvise.patch