IOMMU fixes for Linux v3.5-rc5
The patches fix several issues in the AMD IOMMU driver, the NVidia SMMU driver, and the DMA debug code. The most important fix for the AMD IOMMU solves a problem with SR-IOV devices where virtual functions did not work with IOMMU enabled. The NVidia SMMU patch fixes a possible sleep while spin-lock situation (queued the small fix for v3.5, a better but more intrusive fix is coming for v3.6). The DMA debug patches fix a possible data corruption issue due to bool vs. u32 usage. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iQIcBAABAgAGBQJP8YJLAAoJECvwRC2XARrjv74QAJKyaUoXbhqst84RU1owiFcz A2oUC/DwqEGJD3VrixcY6Ih/2SXYuHd+Cpjd2Q8Eyc2gq66aXy7DTm/Rp+TeMxFD M65ZZzbbrVeU2Ym7apNeKe3AzaspVRLKThirbCK5/cMuM6l0Dmh6+X/O1iqnagju OLsd+rk8eMRPF7N2dFdG28OwI/rdWkkFj1apdo4BwavPjDP06C7pqd9/sbxtDc55 u7Yxsw456U7N/aimBKn24EeXo8NmT58W+NsNMxMqrF3sJ/gzJCotnYTR/ijZCz5w jv1JQlhNSL+tD2F7yQMXLmhvK72UvFPrMiRK/mSgDnQUoSxxiuKDRQ+TnDardhdC YMTj6488cnMqjmPIlkz41Wfu7knMDZVT8yUdfBy9nWEQYe6ALfLwVWwDSZzkA4SA Dl0VyryIZMqeJbuCbPO5mR0Lh2WzBEapHSpoo30bz7E0n+F7Uw47XVSWfkiGEbfv z41oKmqEK6xD1Kl/71gzwlADMRwkIrX+qDWuOTTRuHJVhb58Kwg3/P05hTAe6E3b BDXROOiCO9GiNuecH0QbdBQNOEFsCdIqpqzUMaGzUOQHHP1w6Y8dMn3TZnabX5wO 0mZWH1tzBmIPkI4G5V9h3UaurqJT0ZdsAehyjBtvACBOn8TUyricbvHF/imVS4T1 zzHcTVEFLV4ocSpG3ZsY =1jsG -----END PGP SIGNATURE----- Merge tag 'iommu-fixes-v3.5-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu Pull IOMMU fixes from Joerg Roedel: "The patches fix several issues in the AMD IOMMU driver, the NVidia SMMU driver, and the DMA debug code. The most important fix for the AMD IOMMU solves a problem with SR-IOV devices where virtual functions did not work with IOMMU enabled. The NVidia SMMU patch fixes a possible sleep while spin-lock situation (queued the small fix for v3.5, a better but more intrusive fix is coming for v3.6). The DMA debug patches fix a possible data corruption issue due to bool vs u32 usage." * tag 'iommu-fixes-v3.5-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu: iommu/amd: fix type bug in flush code dma-debug: debugfs_create_bool() takes a u32 pointer iommu/tegra: smmu: Fix unsleepable memory allocation iommu/amd: Initialize dma_ops for hotplug and sriov devices iommu/amd: Fix missing iommu_shutdown initialization in passthrough mode
This commit is contained in:
Коммит
17fae1cdea
|
@ -83,6 +83,8 @@ static struct iommu_ops amd_iommu_ops;
|
|||
static ATOMIC_NOTIFIER_HEAD(ppr_notifier);
|
||||
int amd_iommu_max_glx_val = -1;
|
||||
|
||||
static struct dma_map_ops amd_iommu_dma_ops;
|
||||
|
||||
/*
|
||||
* general struct to manage commands send to an IOMMU
|
||||
*/
|
||||
|
@ -402,7 +404,7 @@ static void amd_iommu_stats_init(void)
|
|||
return;
|
||||
|
||||
de_fflush = debugfs_create_bool("fullflush", 0444, stats_dir,
|
||||
(u32 *)&amd_iommu_unmap_flush);
|
||||
&amd_iommu_unmap_flush);
|
||||
|
||||
amd_iommu_stats_add(&compl_wait);
|
||||
amd_iommu_stats_add(&cnt_map_single);
|
||||
|
@ -2267,6 +2269,13 @@ static int device_change_notifier(struct notifier_block *nb,
|
|||
list_add_tail(&dma_domain->list, &iommu_pd_list);
|
||||
spin_unlock_irqrestore(&iommu_pd_list_lock, flags);
|
||||
|
||||
dev_data = get_dev_data(dev);
|
||||
|
||||
if (!dev_data->passthrough)
|
||||
dev->archdata.dma_ops = &amd_iommu_dma_ops;
|
||||
else
|
||||
dev->archdata.dma_ops = &nommu_dma_ops;
|
||||
|
||||
break;
|
||||
case BUS_NOTIFY_DEL_DEVICE:
|
||||
|
||||
|
|
|
@ -129,7 +129,7 @@ u16 amd_iommu_last_bdf; /* largest PCI device id we have
|
|||
to handle */
|
||||
LIST_HEAD(amd_iommu_unity_map); /* a list of required unity mappings
|
||||
we find in ACPI */
|
||||
bool amd_iommu_unmap_flush; /* if true, flush on every unmap */
|
||||
u32 amd_iommu_unmap_flush; /* if true, flush on every unmap */
|
||||
|
||||
LIST_HEAD(amd_iommu_list); /* list of all AMD IOMMUs in the
|
||||
system */
|
||||
|
@ -1641,6 +1641,8 @@ static int __init amd_iommu_init(void)
|
|||
|
||||
amd_iommu_init_api();
|
||||
|
||||
x86_platform.iommu_shutdown = disable_iommus;
|
||||
|
||||
if (iommu_pass_through)
|
||||
goto out;
|
||||
|
||||
|
@ -1649,8 +1651,6 @@ static int __init amd_iommu_init(void)
|
|||
else
|
||||
printk(KERN_INFO "AMD-Vi: Lazy IO/TLB flushing enabled\n");
|
||||
|
||||
x86_platform.iommu_shutdown = disable_iommus;
|
||||
|
||||
out:
|
||||
return ret;
|
||||
|
||||
|
|
|
@ -652,7 +652,7 @@ extern unsigned long *amd_iommu_pd_alloc_bitmap;
|
|||
* If true, the addresses will be flushed on unmap time, not when
|
||||
* they are reused
|
||||
*/
|
||||
extern bool amd_iommu_unmap_flush;
|
||||
extern u32 amd_iommu_unmap_flush;
|
||||
|
||||
/* Smallest number of PASIDs supported by any IOMMU in the system */
|
||||
extern u32 amd_iommu_max_pasids;
|
||||
|
|
|
@ -550,13 +550,13 @@ static int alloc_pdir(struct smmu_as *as)
|
|||
return 0;
|
||||
|
||||
as->pte_count = devm_kzalloc(smmu->dev,
|
||||
sizeof(as->pte_count[0]) * SMMU_PDIR_COUNT, GFP_KERNEL);
|
||||
sizeof(as->pte_count[0]) * SMMU_PDIR_COUNT, GFP_ATOMIC);
|
||||
if (!as->pte_count) {
|
||||
dev_err(smmu->dev,
|
||||
"failed to allocate smmu_device PTE cunters\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
as->pdir_page = alloc_page(GFP_KERNEL | __GFP_DMA);
|
||||
as->pdir_page = alloc_page(GFP_ATOMIC | __GFP_DMA);
|
||||
if (!as->pdir_page) {
|
||||
dev_err(smmu->dev,
|
||||
"failed to allocate smmu_device page directory\n");
|
||||
|
|
|
@ -78,7 +78,7 @@ static LIST_HEAD(free_entries);
|
|||
static DEFINE_SPINLOCK(free_entries_lock);
|
||||
|
||||
/* Global disable flag - will be set in case of an error */
|
||||
static bool global_disable __read_mostly;
|
||||
static u32 global_disable __read_mostly;
|
||||
|
||||
/* Global error count */
|
||||
static u32 error_count;
|
||||
|
@ -657,7 +657,7 @@ static int dma_debug_fs_init(void)
|
|||
|
||||
global_disable_dent = debugfs_create_bool("disabled", 0444,
|
||||
dma_debug_dent,
|
||||
(u32 *)&global_disable);
|
||||
&global_disable);
|
||||
if (!global_disable_dent)
|
||||
goto out_err;
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче