swiotlb: make io_tlb_default_mem local to swiotlb.c
authorPetr Tesarik <petr.tesarik.ext@huawei.com>
Tue, 1 Aug 2023 06:23:57 +0000 (08:23 +0200)
committerChristoph Hellwig <hch@lst.de>
Tue, 1 Aug 2023 16:02:09 +0000 (18:02 +0200)
SWIOTLB implementation details should not be exposed to the rest of the
kernel. This will allow to make changes to the implementation without
modifying non-swiotlb code.

To avoid breaking existing users, provide helper functions for the few
required fields.

As a bonus, using a helper function to initialize struct device allows to
get rid of an #ifdef in driver core.

Signed-off-by: Petr Tesarik <petr.tesarik.ext@huawei.com>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Christoph Hellwig <hch@lst.de>
arch/mips/pci/pci-octeon.c
drivers/base/core.c
drivers/xen/swiotlb-xen.c
include/linux/swiotlb.h
kernel/dma/swiotlb.c
mm/slab_common.c

index e457a18cbdc59005943a6bed401e1fd83cc55551..d19d9d4563092180229677347f32c6c18464261d 100644 (file)
@@ -664,7 +664,7 @@ static int __init octeon_pci_setup(void)
 
                /* BAR1 movable regions contiguous to cover the swiotlb */
                octeon_bar1_pci_phys =
-                       io_tlb_default_mem.start & ~((1ull << 22) - 1);
+                       default_swiotlb_base() & ~((1ull << 22) - 1);
 
                for (index = 0; index < 32; index++) {
                        union cvmx_pci_bar1_indexx bar1_index;
index 3dff5037943e02ddc8fa66a6f9c1468e6f93b812..46d1d78c5beb08d65414eb519e18c0380f7dfcb3 100644 (file)
@@ -3108,9 +3108,7 @@ void device_initialize(struct device *dev)
     defined(CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU_ALL)
        dev->dma_coherent = dma_default_coherent;
 #endif
-#ifdef CONFIG_SWIOTLB
-       dev->dma_io_tlb_mem = &io_tlb_default_mem;
-#endif
+       swiotlb_dev_init(dev);
 }
 EXPORT_SYMBOL_GPL(device_initialize);
 
index 67aa74d201627d681ae070c6dce74356d42b1e39..946bd56f0ac53e23a4f5215fd4412901b9be296f 100644 (file)
@@ -381,7 +381,7 @@ xen_swiotlb_sync_sg_for_device(struct device *dev, struct scatterlist *sgl,
 static int
 xen_swiotlb_dma_supported(struct device *hwdev, u64 mask)
 {
-       return xen_phys_to_dma(hwdev, io_tlb_default_mem.end - 1) <= mask;
+       return xen_phys_to_dma(hwdev, default_swiotlb_limit()) <= mask;
 }
 
 const struct dma_map_ops xen_swiotlb_dma_ops = {
index 4e52cd5e0bdcceb76e0514df2bea65eb5259fff2..2d453b3e7771eef79b0fce9d5e44e5d892d63226 100644 (file)
@@ -110,7 +110,6 @@ struct io_tlb_mem {
        atomic_long_t used_hiwater;
 #endif
 };
-extern struct io_tlb_mem io_tlb_default_mem;
 
 static inline bool is_swiotlb_buffer(struct device *dev, phys_addr_t paddr)
 {
@@ -128,13 +127,22 @@ static inline bool is_swiotlb_force_bounce(struct device *dev)
 
 void swiotlb_init(bool addressing_limited, unsigned int flags);
 void __init swiotlb_exit(void);
+void swiotlb_dev_init(struct device *dev);
 size_t swiotlb_max_mapping_size(struct device *dev);
+bool is_swiotlb_allocated(void);
 bool is_swiotlb_active(struct device *dev);
 void __init swiotlb_adjust_size(unsigned long size);
+phys_addr_t default_swiotlb_base(void);
+phys_addr_t default_swiotlb_limit(void);
 #else
 static inline void swiotlb_init(bool addressing_limited, unsigned int flags)
 {
 }
+
+static inline void swiotlb_dev_init(struct device *dev)
+{
+}
+
 static inline bool is_swiotlb_buffer(struct device *dev, phys_addr_t paddr)
 {
        return false;
@@ -151,6 +159,11 @@ static inline size_t swiotlb_max_mapping_size(struct device *dev)
        return SIZE_MAX;
 }
 
+static inline bool is_swiotlb_allocated(void)
+{
+       return false;
+}
+
 static inline bool is_swiotlb_active(struct device *dev)
 {
        return false;
@@ -159,6 +172,16 @@ static inline bool is_swiotlb_active(struct device *dev)
 static inline void swiotlb_adjust_size(unsigned long size)
 {
 }
+
+static inline phys_addr_t default_swiotlb_base(void)
+{
+       return 0;
+}
+
+static inline phys_addr_t default_swiotlb_limit(void)
+{
+       return 0;
+}
 #endif /* CONFIG_SWIOTLB */
 
 extern void swiotlb_print_info(void);
index ee57fd9949dc227c4561eb14137f92c34c32d864..0840bc15fb53044b51a4e9c52f41d4c6be7e5e46 100644 (file)
@@ -71,7 +71,7 @@ struct io_tlb_slot {
 static bool swiotlb_force_bounce;
 static bool swiotlb_force_disable;
 
-struct io_tlb_mem io_tlb_default_mem;
+static struct io_tlb_mem io_tlb_default_mem;
 
 static unsigned long default_nslabs = IO_TLB_DEFAULT_SIZE >> IO_TLB_SHIFT;
 static unsigned long default_nareas;
@@ -489,6 +489,15 @@ void __init swiotlb_exit(void)
        memset(mem, 0, sizeof(*mem));
 }
 
+/**
+ * swiotlb_dev_init() - initialize swiotlb fields in &struct device
+ * @dev:       Device to be initialized.
+ */
+void swiotlb_dev_init(struct device *dev)
+{
+       dev->dma_io_tlb_mem = &io_tlb_default_mem;
+}
+
 /*
  * Return the offset into a iotlb slot required to keep the device happy.
  */
@@ -953,6 +962,14 @@ size_t swiotlb_max_mapping_size(struct device *dev)
        return ((size_t)IO_TLB_SIZE) * IO_TLB_SEGSIZE - min_align;
 }
 
+/**
+ * is_swiotlb_allocated() - check if the default software IO TLB is initialized
+ */
+bool is_swiotlb_allocated(void)
+{
+       return io_tlb_default_mem.nslabs;
+}
+
 bool is_swiotlb_active(struct device *dev)
 {
        struct io_tlb_mem *mem = dev->dma_io_tlb_mem;
@@ -960,6 +977,26 @@ bool is_swiotlb_active(struct device *dev)
        return mem && mem->nslabs;
 }
 
+/**
+ * default_swiotlb_base() - get the base address of the default SWIOTLB
+ *
+ * Get the lowest physical address used by the default software IO TLB pool.
+ */
+phys_addr_t default_swiotlb_base(void)
+{
+       return io_tlb_default_mem.start;
+}
+
+/**
+ * default_swiotlb_limit() - get the address limit of the default SWIOTLB
+ *
+ * Get the highest physical address used by the default software IO TLB pool.
+ */
+phys_addr_t default_swiotlb_limit(void)
+{
+       return io_tlb_default_mem.end - 1;
+}
+
 #ifdef CONFIG_DEBUG_FS
 
 static int io_tlb_used_get(void *data, u64 *val)
index d1555ea2981ac51f63c11aab9b84ec906d3c6910..c639dba9a3b767f288a511607683dc04effb316c 100644 (file)
@@ -864,10 +864,9 @@ void __init setup_kmalloc_cache_index_table(void)
 
 static unsigned int __kmalloc_minalign(void)
 {
-#ifdef CONFIG_DMA_BOUNCE_UNALIGNED_KMALLOC
-       if (io_tlb_default_mem.nslabs)
+       if (IS_ENABLED(CONFIG_DMA_BOUNCE_UNALIGNED_KMALLOC) &&
+           is_swiotlb_allocated())
                return ARCH_KMALLOC_MINALIGN;
-#endif
        return dma_get_cache_alignment();
 }