@@ -956,6 +956,28 @@ static void dec_used(struct io_tlb_mem *mem, unsigned int nslots)
956
956
}
957
957
#endif /* CONFIG_DEBUG_FS */
958
958
959
+ #ifdef CONFIG_SWIOTLB_DYNAMIC
960
+ #ifdef CONFIG_DEBUG_FS
961
+ static void inc_transient_used (struct io_tlb_mem * mem , unsigned int nslots )
962
+ {
963
+ atomic_long_add (nslots , & mem -> transient_nslabs );
964
+ }
965
+
966
+ static void dec_transient_used (struct io_tlb_mem * mem , unsigned int nslots )
967
+ {
968
+ atomic_long_sub (nslots , & mem -> transient_nslabs );
969
+ }
970
+
971
+ #else /* !CONFIG_DEBUG_FS */
972
+ static void inc_transient_used (struct io_tlb_mem * mem , unsigned int nslots )
973
+ {
974
+ }
975
+ static void dec_transient_used (struct io_tlb_mem * mem , unsigned int nslots )
976
+ {
977
+ }
978
+ #endif /* CONFIG_DEBUG_FS */
979
+ #endif /* CONFIG_SWIOTLB_DYNAMIC */
980
+
959
981
/**
960
982
* swiotlb_search_pool_area() - search one memory area in one pool
961
983
* @dev: Device which maps the buffer.
@@ -1170,6 +1192,7 @@ static int swiotlb_find_slots(struct device *dev, phys_addr_t orig_addr,
1170
1192
spin_lock_irqsave (& dev -> dma_io_tlb_lock , flags );
1171
1193
list_add_rcu (& pool -> node , & dev -> dma_io_tlb_pools );
1172
1194
spin_unlock_irqrestore (& dev -> dma_io_tlb_lock , flags );
1195
+ inc_transient_used (mem , pool -> nslabs );
1173
1196
1174
1197
found :
1175
1198
WRITE_ONCE (dev -> dma_uses_io_tlb , true);
@@ -1415,6 +1438,7 @@ static bool swiotlb_del_transient(struct device *dev, phys_addr_t tlb_addr)
1415
1438
1416
1439
dec_used (dev -> dma_io_tlb_mem , pool -> nslabs );
1417
1440
swiotlb_del_pool (dev , pool );
1441
+ dec_transient_used (dev -> dma_io_tlb_mem , pool -> nslabs );
1418
1442
return true;
1419
1443
}
1420
1444
@@ -1557,6 +1581,23 @@ phys_addr_t default_swiotlb_limit(void)
1557
1581
}
1558
1582
1559
1583
#ifdef CONFIG_DEBUG_FS
1584
+ #ifdef CONFIG_SWIOTLB_DYNAMIC
1585
+ static unsigned long mem_transient_used (struct io_tlb_mem * mem )
1586
+ {
1587
+ return atomic_long_read (& mem -> transient_nslabs );
1588
+ }
1589
+
1590
+ static int io_tlb_transient_used_get (void * data , u64 * val )
1591
+ {
1592
+ struct io_tlb_mem * mem = data ;
1593
+
1594
+ * val = mem_transient_used (mem );
1595
+ return 0 ;
1596
+ }
1597
+
1598
+ DEFINE_DEBUGFS_ATTRIBUTE (fops_io_tlb_transient_used , io_tlb_transient_used_get ,
1599
+ NULL , "%llu\n" );
1600
+ #endif /* CONFIG_SWIOTLB_DYNAMIC */
1560
1601
1561
1602
static int io_tlb_used_get (void * data , u64 * val )
1562
1603
{
@@ -1605,6 +1646,11 @@ static void swiotlb_create_debugfs_files(struct io_tlb_mem *mem,
1605
1646
& fops_io_tlb_used );
1606
1647
debugfs_create_file ("io_tlb_used_hiwater" , 0600 , mem -> debugfs , mem ,
1607
1648
& fops_io_tlb_hiwater );
1649
+ #ifdef CONFIG_SWIOTLB_DYNAMIC
1650
+ atomic_long_set (& mem -> transient_nslabs , 0 );
1651
+ debugfs_create_file ("io_tlb_transient_nslabs" , 0400 , mem -> debugfs ,
1652
+ mem , & fops_io_tlb_transient_used );
1653
+ #endif
1608
1654
}
1609
1655
1610
1656
static int __init swiotlb_create_default_debugfs (void )
0 commit comments