Merge branch 'stable/for-linus-5.1' of git://git.kernel.org/pub/scm/linux/kernel...
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 8 Mar 2019 17:48:04 +0000 (09:48 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 8 Mar 2019 17:48:04 +0000 (09:48 -0800)
Pull swiotlb updates from Konrad Rzeszutek Wilk:
 "Expands the SWIOTLB to have debugfs support (along with bug-fixes),
  and a tiny fix"

* 'stable/for-linus-5.1' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/swiotlb:
  swiotlb: drop pointless static qualifier in swiotlb_create_debugfs()
  swiotlb: checking whether swiotlb buffer is full with io_tlb_used
  swiotlb: add debugfs to track swiotlb buffer usage
  swiotlb: fix comment on swiotlb_bounce()

1  2 
kernel/dma/swiotlb.c

diff --combined kernel/dma/swiotlb.c
index 6d0236bd3929c4e6f7092d902c92e9fc893526a0,2b0c8fd9658ea8d13c3f061677d33be3dfca3bf0..a9ad02d4d84e2ffa431fa6018f26a2c3f039cd6e
@@@ -34,6 -34,9 +34,9 @@@
  #include <linux/scatterlist.h>
  #include <linux/mem_encrypt.h>
  #include <linux/set_memory.h>
+ #ifdef CONFIG_DEBUG_FS
+ #include <linux/debugfs.h>
+ #endif
  
  #include <asm/io.h>
  #include <asm/dma.h>
@@@ -72,6 -75,11 +75,11 @@@ phys_addr_t io_tlb_start, io_tlb_end
   */
  static unsigned long io_tlb_nslabs;
  
+ /*
+  * The number of used IO TLB block
+  */
+ static unsigned long io_tlb_used;
  /*
   * This is a free list describing the number of free entries available from
   * each index
@@@ -385,7 -393,7 +393,7 @@@ void __init swiotlb_exit(void
  }
  
  /*
-  * Bounce: copy the swiotlb buffer back to the original dma location
+  * Bounce: copy the swiotlb buffer from or back to the original dma location
   */
  static void swiotlb_bounce(phys_addr_t orig_addr, phys_addr_t tlb_addr,
                           size_t size, enum dma_data_direction dir)
@@@ -475,6 -483,10 +483,10 @@@ phys_addr_t swiotlb_tbl_map_single(stru
         * request and allocate a buffer from that IO TLB pool.
         */
        spin_lock_irqsave(&io_tlb_lock, flags);
+       if (unlikely(nslots > io_tlb_nslabs - io_tlb_used))
+               goto not_found;
        index = ALIGN(io_tlb_index, stride);
        if (index >= io_tlb_nslabs)
                index = 0;
@@@ -524,6 -536,7 +536,7 @@@ not_found
                dev_warn(hwdev, "swiotlb buffer is full (sz: %zd bytes)\n", size);
        return DMA_MAPPING_ERROR;
  found:
+       io_tlb_used += nslots;
        spin_unlock_irqrestore(&io_tlb_lock, flags);
  
        /*
@@@ -584,6 -597,8 +597,8 @@@ void swiotlb_tbl_unmap_single(struct de
                 */
                for (i = index - 1; (OFFSET(i, IO_TLB_SEGSIZE) != IO_TLB_SEGSIZE -1) && io_tlb_list[i]; i--)
                        io_tlb_list[i] = ++count;
+               io_tlb_used -= nslots;
        }
        spin_unlock_irqrestore(&io_tlb_lock, flags);
  }
@@@ -650,3 -665,48 +665,36 @@@ bool swiotlb_map(struct device *dev, ph
  
        return true;
  }
 -/*
 - * Return whether the given device DMA address mask can be supported
 - * properly.  For example, if your device can only drive the low 24-bits
 - * during bus mastering, then you would pass 0x00ffffff as the mask to
 - * this function.
 - */
 -int
 -swiotlb_dma_supported(struct device *hwdev, u64 mask)
 -{
 -      return __phys_to_dma(hwdev, io_tlb_end - 1) <= mask;
 -}
 -
+ #ifdef CONFIG_DEBUG_FS
+ static int __init swiotlb_create_debugfs(void)
+ {
+       struct dentry *d_swiotlb_usage;
+       struct dentry *ent;
+       d_swiotlb_usage = debugfs_create_dir("swiotlb", NULL);
+       if (!d_swiotlb_usage)
+               return -ENOMEM;
+       ent = debugfs_create_ulong("io_tlb_nslabs", 0400,
+                                  d_swiotlb_usage, &io_tlb_nslabs);
+       if (!ent)
+               goto fail;
+       ent = debugfs_create_ulong("io_tlb_used", 0400,
+                                  d_swiotlb_usage, &io_tlb_used);
+       if (!ent)
+               goto fail;
+       return 0;
+ fail:
+       debugfs_remove_recursive(d_swiotlb_usage);
+       return -ENOMEM;
+ }
+ late_initcall(swiotlb_create_debugfs);
+ #endif