Skip to content

Commit

Permalink
iommu/amd: Improve amd_iommu_v2_exit()
Browse files Browse the repository at this point in the history
During module exit, the current logic loops through all possible
16-bit device ID space to search for existing devices and clean up
device state structures. This can be simplified by looping through
the device state list.

Also, refactor various clean up logic into free_device_state()
for better reusability.

Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Link: https://lore.kernel.org/r/20220301085626.87680-6-vasant.hegde@amd.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
  • Loading branch information
Suravee Suthikulpanit authored and Joerg Roedel committed Mar 8, 2022
1 parent c1d5b57 commit 9f968fc
Showing 1 changed file with 17 additions and 17 deletions.
34 changes: 17 additions & 17 deletions drivers/iommu/amd/iommu_v2.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("Joerg Roedel <jroedel@suse.de>");

#define MAX_DEVICES 0x10000
#define PRI_QUEUE_SIZE 512

struct pri_queue {
Expand Down Expand Up @@ -124,6 +123,15 @@ static void free_device_state(struct device_state *dev_state)
{
struct iommu_group *group;

/* Get rid of any remaining pasid states */
free_pasid_states(dev_state);

/*
* Wait until the last reference is dropped before freeing
* the device state.
*/
wait_event(dev_state->wq, !atomic_read(&dev_state->count));

/*
* First detach device from domain - No more PRI requests will arrive
* from that device after it is unbound from the IOMMUv2 domain.
Expand Down Expand Up @@ -849,15 +857,7 @@ void amd_iommu_free_device(struct pci_dev *pdev)

spin_unlock_irqrestore(&state_lock, flags);

/* Get rid of any remaining pasid states */
free_pasid_states(dev_state);

put_device_state(dev_state);
/*
* Wait until the last reference is dropped before freeing
* the device state.
*/
wait_event(dev_state->wq, !atomic_read(&dev_state->count));
free_device_state(dev_state);
}
EXPORT_SYMBOL(amd_iommu_free_device);
Expand Down Expand Up @@ -954,8 +954,8 @@ static int __init amd_iommu_v2_init(void)

static void __exit amd_iommu_v2_exit(void)
{
struct device_state *dev_state;
int i;
struct device_state *dev_state, *next;
unsigned long flags;

if (!amd_iommu_v2_supported())
return;
Expand All @@ -968,18 +968,18 @@ static void __exit amd_iommu_v2_exit(void)
* The loop below might call flush_workqueue(), so call
* destroy_workqueue() after it
*/
for (i = 0; i < MAX_DEVICES; ++i) {
dev_state = get_device_state(i);

if (dev_state == NULL)
continue;
spin_lock_irqsave(&state_lock, flags);

list_for_each_entry_safe(dev_state, next, &state_list, list) {
WARN_ON_ONCE(1);

put_device_state(dev_state);
amd_iommu_free_device(dev_state->pdev);
list_del(&dev_state->list);
free_device_state(dev_state);
}

spin_unlock_irqrestore(&state_lock, flags);

destroy_workqueue(iommu_wq);
}

Expand Down

0 comments on commit 9f968fc

Please sign in to comment.