mirror of https://gitee.com/openkylin/linux.git
iommu/amd: Set up data structures for flush queue
The flush queue is the equivalent to defered-flushing in the Intel VT-d driver. This patch sets up the data structures needed for this. Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
parent
bda350dbdb
commit
c5b5da9c79
|
@ -89,6 +89,22 @@ LIST_HEAD(ioapic_map);
|
||||||
LIST_HEAD(hpet_map);
|
LIST_HEAD(hpet_map);
|
||||||
LIST_HEAD(acpihid_map);
|
LIST_HEAD(acpihid_map);
|
||||||
|
|
||||||
|
#define FLUSH_QUEUE_SIZE 256
|
||||||
|
|
||||||
|
struct flush_queue_entry {
|
||||||
|
unsigned long iova_pfn;
|
||||||
|
unsigned long pages;
|
||||||
|
struct dma_ops_domain *dma_dom;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct flush_queue {
|
||||||
|
spinlock_t lock;
|
||||||
|
unsigned next;
|
||||||
|
struct flush_queue_entry *entries;
|
||||||
|
};
|
||||||
|
|
||||||
|
DEFINE_PER_CPU(struct flush_queue, flush_queue);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Domain for untranslated devices - only allocated
|
* Domain for untranslated devices - only allocated
|
||||||
* if iommu=pt passed on kernel cmd line.
|
* if iommu=pt passed on kernel cmd line.
|
||||||
|
@ -2508,7 +2524,7 @@ static int init_reserved_iova_ranges(void)
|
||||||
|
|
||||||
int __init amd_iommu_init_api(void)
|
int __init amd_iommu_init_api(void)
|
||||||
{
|
{
|
||||||
int ret, err = 0;
|
int ret, cpu, err = 0;
|
||||||
|
|
||||||
ret = iova_cache_get();
|
ret = iova_cache_get();
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -2518,6 +2534,18 @@ int __init amd_iommu_init_api(void)
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
for_each_possible_cpu(cpu) {
|
||||||
|
struct flush_queue *queue = per_cpu_ptr(&flush_queue, cpu);
|
||||||
|
|
||||||
|
queue->entries = kzalloc(FLUSH_QUEUE_SIZE *
|
||||||
|
sizeof(*queue->entries),
|
||||||
|
GFP_KERNEL);
|
||||||
|
if (!queue->entries)
|
||||||
|
goto out_put_iova;
|
||||||
|
|
||||||
|
spin_lock_init(&queue->lock);
|
||||||
|
}
|
||||||
|
|
||||||
err = bus_set_iommu(&pci_bus_type, &amd_iommu_ops);
|
err = bus_set_iommu(&pci_bus_type, &amd_iommu_ops);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
@ -2530,6 +2558,15 @@ int __init amd_iommu_init_api(void)
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
out_put_iova:
|
||||||
|
for_each_possible_cpu(cpu) {
|
||||||
|
struct flush_queue *queue = per_cpu_ptr(&flush_queue, cpu);
|
||||||
|
|
||||||
|
kfree(queue->entries);
|
||||||
|
}
|
||||||
|
|
||||||
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init amd_iommu_init_dma_ops(void)
|
int __init amd_iommu_init_dma_ops(void)
|
||||||
|
@ -2552,6 +2589,7 @@ int __init amd_iommu_init_dma_ops(void)
|
||||||
pr_info("AMD-Vi: Lazy IO/TLB flushing enabled\n");
|
pr_info("AMD-Vi: Lazy IO/TLB flushing enabled\n");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
Loading…
Reference in New Issue