From bea238a81af9446799fc8813cbede28c98a98703 Mon Sep 17 00:00:00 2001 From: c00284940 Date: Sat, 22 May 2021 09:56:14 +0800 Subject: [PATCH 8/9] add total_cnt/too_big_cnt/flush_cnt/iova32_full_cnt --- drivers/iommu/iommu-debugfs.c | 11 ++++++++++- drivers/iommu/iova.c | 12 +++++++++++- include/linux/iova.h | 4 ++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/drivers/iommu/iommu-debugfs.c b/drivers/iommu/iommu-debugfs.c index 63fdf88..92e02b4 100644 --- a/drivers/iommu/iommu-debugfs.c +++ b/drivers/iommu/iommu-debugfs.c @@ -119,10 +119,19 @@ static int debugfs_iova_rcache_show(struct seq_file *s, void *p) } pr_err("%s\n", string); pr_err("rb_total: %lld\n", iovad->rb_total); - pr_err("get_rb_cnt:%lld get_rb_retry_cnt:%d\n", iovad->get_rb_cnt, + pr_err("total_cnt=%lld too_big_cnt=%lld flush_cnt=%lld iova32_full_cnt=%lld\n", + atomic64_read(&iovad->total_cnt), + atomic64_read(&iovad->too_big_cnt), + atomic64_read(&iovad->flush_cnt), + iovad->iova32_full_cnt); + pr_err("get_rb_cnt:%lld get_rb_retry_cnt:%lld\n", iovad->get_rb_cnt, iovad->get_rb_retry_cnt); iovad->get_rb_cnt = 0; iovad->get_rb_retry_cnt = 0; + atomic64_set(&iovad->total_cnt, 0); + atomic64_set(&iovad->too_big_cnt, 0); + atomic64_set(&iovad->flush_cnt, 0); + iovad->iova32_full_cnt = 0; return 0; } DEFINE_SHOW_ATTRIBUTE(debugfs_iova_rcache); diff --git a/drivers/iommu/iova.c b/drivers/iommu/iova.c index a0373dd..201d430 100644 --- a/drivers/iommu/iova.c +++ b/drivers/iommu/iova.c @@ -69,6 +69,10 @@ init_iova_domain(struct iova_domain *iovad, unsigned long granule, iovad->rb_total = 0; iovad->get_rb_cnt = 0; iovad->get_rb_retry_cnt = 0; + atomic64_set(&iovad->total_cnt, 0); + atomic64_set(&iovad->too_big_cnt, 0); + atomic64_set(&iovad->flush_cnt, 0); + iovad->iova32_full_cnt = 0; rb_link_node(&iovad->anchor.node, NULL, &iovad->rbroot.rb_node); rb_insert_color(&iovad->anchor.node, &iovad->rbroot); cpuhp_state_add_instance_nocalls(CPUHP_IOMMU_IOVA_DEAD, &iovad->cpuhp_dead); @@ -294,6 +298,7 @@ static int __alloc_and_insert_iova_range(struct iova_domain *iovad, return 0; iova32_full: + iovad->iova32_full_cnt++; spin_unlock_irqrestore(&iovad->iova_rbtree_lock, flags); return -ENOMEM; } @@ -519,6 +524,8 @@ alloc_iova_fast(struct iova_domain *iovad, unsigned long size, if (!flush_rcache) return 0; + atomic64_inc(&iovad->flush_cnt); + /* Try replenishing IOVAs by flushing rcache. */ flush_rcache = false; for_each_online_cpu(cpu) @@ -1007,8 +1014,11 @@ static unsigned long iova_rcache_get(struct iova_domain *iovad, { unsigned int log_size = order_base_2(size); - if (log_size >= IOVA_RANGE_CACHE_MAX_SIZE) + atomic64_inc(&iovad->total_cnt); + if (log_size >= IOVA_RANGE_CACHE_MAX_SIZE) { + atomic64_inc(&iovad->too_big_cnt); return 0; + } return __iova_rcache_get(&iovad->rcaches[log_size], limit_pfn - size); } diff --git a/include/linux/iova.h b/include/linux/iova.h index 29bd27b..6d7a7bf 100644 --- a/include/linux/iova.h +++ b/include/linux/iova.h @@ -111,6 +111,10 @@ struct iova_domain { u64 rb_total; u64 get_rb_cnt; u64 get_rb_retry_cnt; + atomic64_t total_cnt; + atomic64_t too_big_cnt; + atomic64_t flush_cnt; + u64 iova32_full_cnt; }; static inline unsigned long iova_size(struct iova *iova) -- 2.8.1