diff options
author | Doug Moore <dougm@FreeBSD.org> | 2022-09-16 20:32:11 +0000 |
---|---|---|
committer | Doug Moore <dougm@FreeBSD.org> | 2022-09-16 20:32:11 +0000 |
commit | 87cd087a4ae7b272986ce3bcf27ffe4930f15e55 (patch) | |
tree | 24c003e1ffdc9542871f0a09956d2fe0dcac9728 /sys/dev | |
parent | daa85548d5cfc65e4beb7a211a155ae9b9fc41d9 (diff) | |
download | src-87cd087a4ae7b272986ce3bcf27ffe4930f15e55.tar.gz src-87cd087a4ae7b272986ce3bcf27ffe4930f15e55.zip |
iommu_gas: don't remove and insert boundary entry
Avoid removing an item in iommu_gas_free_region only to reinsert it,
by avoiding removing an entry that is either first_place or
last_place.
Reviewed by: kib
MFC after: 3 weeks
Differential Revision: https://reviews.freebsd.org/D36597
Diffstat (limited to 'sys/dev')
-rw-r--r-- | sys/dev/iommu/iommu_gas.c | 14 |
1 files changed, 4 insertions, 10 deletions
diff --git a/sys/dev/iommu/iommu_gas.c b/sys/dev/iommu/iommu_gas.c index ca5a614060fe..68e22f16c69f 100644 --- a/sys/dev/iommu/iommu_gas.c +++ b/sys/dev/iommu/iommu_gas.c @@ -580,7 +580,6 @@ void iommu_gas_free_region(struct iommu_map_entry *entry) { struct iommu_domain *domain; - struct iommu_map_entry *next, *prev; domain = entry->domain; KASSERT((entry->flags & (IOMMU_MAP_ENTRY_PLACE | IOMMU_MAP_ENTRY_RMRR | @@ -588,15 +587,10 @@ iommu_gas_free_region(struct iommu_map_entry *entry) ("non-RMRR entry %p %p", domain, entry)); IOMMU_DOMAIN_LOCK(domain); - prev = RB_PREV(iommu_gas_entries_tree, &domain->rb_root, entry); - next = RB_NEXT(iommu_gas_entries_tree, &domain->rb_root, entry); - iommu_gas_rb_remove(domain, entry); + if (entry != domain->first_place && + entry != domain->last_place) + iommu_gas_rb_remove(domain, entry); entry->flags &= ~IOMMU_MAP_ENTRY_RMRR; - - if (prev == NULL) - iommu_gas_rb_insert(domain, domain->first_place); - if (next == NULL) - iommu_gas_rb_insert(domain, domain->last_place); IOMMU_DOMAIN_UNLOCK(domain); } @@ -608,7 +602,7 @@ iommu_gas_remove_clip_left(struct iommu_domain *domain, iommu_gaddr_t start, IOMMU_DOMAIN_ASSERT_LOCKED(domain); MPASS(start <= end); - MPASS(end <= domain->last_place->end); + MPASS(end <= domain->end); /* * Find an entry which contains the supplied guest's address |