diff options
author | Yinghai Lu <Yinghai.Lu@Sun.COM> | 2008-02-15 04:28:41 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-04-26 17:41:03 -0400 |
commit | 0b64ad7123eb013c3de26750f2d4c356cd566231 (patch) | |
tree | f6c1f3ad3880a39eae7e309c0c24605063019fcf /arch/x86/pci/mmconfig_64.c | |
parent | 7752d5cfe3d11ca0bb9c673ec38bd78ba6578f8e (diff) |
x86: clear pci_mmcfg_virt when mmcfg get rejected
For x86_64, need to free pci_mmcfg_virt, and iounmap some pointers
when MMCONF is not reserved in E820 or acpi _CRS and get rejected.
Signed-off-by: Yinghai Lu <yinghai.lu@sun.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Greg KH <greg@kroah.com>
Cc: Greg KH <greg@kroah.com>
Cc: Andi Kleen <ak@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/x86/pci/mmconfig_64.c')
-rw-r--r-- | arch/x86/pci/mmconfig_64.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/arch/x86/pci/mmconfig_64.c b/arch/x86/pci/mmconfig_64.c index 9207fd49233c..a1994163c99d 100644 --- a/arch/x86/pci/mmconfig_64.c +++ b/arch/x86/pci/mmconfig_64.c | |||
@@ -127,7 +127,7 @@ static void __iomem * __init mcfg_ioremap(struct acpi_mcfg_allocation *cfg) | |||
127 | int __init pci_mmcfg_arch_init(void) | 127 | int __init pci_mmcfg_arch_init(void) |
128 | { | 128 | { |
129 | int i; | 129 | int i; |
130 | pci_mmcfg_virt = kmalloc(sizeof(*pci_mmcfg_virt) * | 130 | pci_mmcfg_virt = kzalloc(sizeof(*pci_mmcfg_virt) * |
131 | pci_mmcfg_config_num, GFP_KERNEL); | 131 | pci_mmcfg_config_num, GFP_KERNEL); |
132 | if (pci_mmcfg_virt == NULL) { | 132 | if (pci_mmcfg_virt == NULL) { |
133 | printk(KERN_ERR "PCI: Can not allocate memory for mmconfig structures\n"); | 133 | printk(KERN_ERR "PCI: Can not allocate memory for mmconfig structures\n"); |
@@ -141,9 +141,29 @@ int __init pci_mmcfg_arch_init(void) | |||
141 | printk(KERN_ERR "PCI: Cannot map mmconfig aperture for " | 141 | printk(KERN_ERR "PCI: Cannot map mmconfig aperture for " |
142 | "segment %d\n", | 142 | "segment %d\n", |
143 | pci_mmcfg_config[i].pci_segment); | 143 | pci_mmcfg_config[i].pci_segment); |
144 | pci_mmcfg_arch_free(); | ||
144 | return 0; | 145 | return 0; |
145 | } | 146 | } |
146 | } | 147 | } |
147 | raw_pci_ext_ops = &pci_mmcfg; | 148 | raw_pci_ext_ops = &pci_mmcfg; |
148 | return 1; | 149 | return 1; |
149 | } | 150 | } |
151 | |||
152 | void __init pci_mmcfg_arch_free(void) | ||
153 | { | ||
154 | int i; | ||
155 | |||
156 | if (pci_mmcfg_virt == NULL) | ||
157 | return; | ||
158 | |||
159 | for (i = 0; i < pci_mmcfg_config_num; ++i) { | ||
160 | if (pci_mmcfg_virt[i].virt) { | ||
161 | iounmap(pci_mmcfg_virt[i].virt); | ||
162 | pci_mmcfg_virt[i].virt = NULL; | ||
163 | pci_mmcfg_virt[i].cfg = NULL; | ||
164 | } | ||
165 | } | ||
166 | |||
167 | kfree(pci_mmcfg_virt); | ||
168 | pci_mmcfg_virt = NULL; | ||
169 | } | ||