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

[PATCH v9 11/14] swiotlb: Add restricted DMA alloc/free support.



Add the functions, swiotlb_{alloc,free} to support the memory allocation
from restricted DMA pool.

Signed-off-by: Claire Chang <tientzu@xxxxxxxxxxxx>
---
 include/linux/swiotlb.h | 15 +++++++++++++++
 kernel/dma/swiotlb.c    | 35 +++++++++++++++++++++++++++++++++--
 2 files changed, 48 insertions(+), 2 deletions(-)

diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h
index 8200c100fe10..d3374497a4f8 100644
--- a/include/linux/swiotlb.h
+++ b/include/linux/swiotlb.h
@@ -162,4 +162,19 @@ static inline void swiotlb_adjust_size(unsigned long size)
 extern void swiotlb_print_info(void);
 extern void swiotlb_set_max_segment(unsigned int);
 
+#ifdef CONFIG_DMA_RESTRICTED_POOL
+struct page *swiotlb_alloc(struct device *dev, size_t size);
+bool swiotlb_free(struct device *dev, struct page *page, size_t size);
+#else
+static inline struct page *swiotlb_alloc(struct device *dev, size_t size)
+{
+       return NULL;
+}
+static inline bool swiotlb_free(struct device *dev, struct page *page,
+                               size_t size)
+{
+       return false;
+}
+#endif /* CONFIG_DMA_RESTRICTED_POOL */
+
 #endif /* __LINUX_SWIOTLB_H */
diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c
index a6562573f090..0a19858da5b8 100644
--- a/kernel/dma/swiotlb.c
+++ b/kernel/dma/swiotlb.c
@@ -461,8 +461,9 @@ static int find_slots(struct device *dev, phys_addr_t 
orig_addr,
 
        index = wrap = wrap_index(mem, ALIGN(mem->index, stride));
        do {
-               if ((slot_addr(tbl_dma_addr, index) & iotlb_align_mask) !=
-                   (orig_addr & iotlb_align_mask)) {
+               if (orig_addr &&
+                   (slot_addr(tbl_dma_addr, index) & iotlb_align_mask) !=
+                           (orig_addr & iotlb_align_mask)) {
                        index = wrap_index(mem, index + 1);
                        continue;
                }
@@ -702,6 +703,36 @@ late_initcall(swiotlb_create_default_debugfs);
 #endif
 
 #ifdef CONFIG_DMA_RESTRICTED_POOL
+struct page *swiotlb_alloc(struct device *dev, size_t size)
+{
+       struct io_tlb_mem *mem = dev->dma_io_tlb_mem;
+       phys_addr_t tlb_addr;
+       int index;
+
+       if (!mem)
+               return NULL;
+
+       index = find_slots(dev, 0, size);
+       if (index == -1)
+               return NULL;
+
+       tlb_addr = slot_addr(mem->start, index);
+
+       return pfn_to_page(PFN_DOWN(tlb_addr));
+}
+
+bool swiotlb_free(struct device *dev, struct page *page, size_t size)
+{
+       phys_addr_t tlb_addr = page_to_phys(page);
+
+       if (!is_swiotlb_buffer(dev, tlb_addr))
+               return false;
+
+       release_slots(dev, tlb_addr);
+
+       return true;
+}
+
 static int rmem_swiotlb_device_init(struct reserved_mem *rmem,
                                    struct device *dev)
 {
-- 
2.32.0.272.g935e593368-goog




 


Rackspace

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