mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-01 08:04:22 +08:00
x86, dmar: use atomic allocations for QI and Intr-remapping init
Impact: invalid use of GFP_KERNEL in interrupt context Queued invalidation and interrupt-remapping will get initialized with interrupts disabled (while enabling interrupt-remapping). So use GFP_ATOMIC instead of GFP_KERNEL for memory alloacations. Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com> Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
This commit is contained in:
parent
68a8ca593f
commit
fa4b57cc04
@ -809,20 +809,20 @@ int dmar_enable_qi(struct intel_iommu *iommu)
|
||||
if (iommu->qi)
|
||||
return 0;
|
||||
|
||||
iommu->qi = kmalloc(sizeof(*qi), GFP_KERNEL);
|
||||
iommu->qi = kmalloc(sizeof(*qi), GFP_ATOMIC);
|
||||
if (!iommu->qi)
|
||||
return -ENOMEM;
|
||||
|
||||
qi = iommu->qi;
|
||||
|
||||
qi->desc = (void *)(get_zeroed_page(GFP_KERNEL));
|
||||
qi->desc = (void *)(get_zeroed_page(GFP_ATOMIC));
|
||||
if (!qi->desc) {
|
||||
kfree(qi);
|
||||
iommu->qi = 0;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
qi->desc_status = kmalloc(QI_LENGTH * sizeof(int), GFP_KERNEL);
|
||||
qi->desc_status = kmalloc(QI_LENGTH * sizeof(int), GFP_ATOMIC);
|
||||
if (!qi->desc_status) {
|
||||
free_page((unsigned long) qi->desc);
|
||||
kfree(qi);
|
||||
|
@ -447,12 +447,12 @@ static int setup_intr_remapping(struct intel_iommu *iommu, int mode)
|
||||
struct page *pages;
|
||||
|
||||
ir_table = iommu->ir_table = kzalloc(sizeof(struct ir_table),
|
||||
GFP_KERNEL);
|
||||
GFP_ATOMIC);
|
||||
|
||||
if (!iommu->ir_table)
|
||||
return -ENOMEM;
|
||||
|
||||
pages = alloc_pages(GFP_KERNEL | __GFP_ZERO, INTR_REMAP_PAGE_ORDER);
|
||||
pages = alloc_pages(GFP_ATOMIC | __GFP_ZERO, INTR_REMAP_PAGE_ORDER);
|
||||
|
||||
if (!pages) {
|
||||
printk(KERN_ERR "failed to allocate pages of order %d\n",
|
||||
|
Loading…
Reference in New Issue
Block a user