changeset 10293:ac02598ffdd8

6869654 pci_autoconfig: memory leak in memlist_alloc() in snv_121 on x86 on systems with zfs root
author Dan Mick <Dan.Mick@Sun.COM>
date Tue, 11 Aug 2009 19:17:28 -0700
parents 5f64d818187b
children b85a363540de
files usr/src/uts/intel/io/pci/pci_boot.c
diffstat 1 files changed, 9 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/intel/io/pci/pci_boot.c	Tue Aug 11 17:46:05 2009 -0700
+++ b/usr/src/uts/intel/io/pci/pci_boot.c	Tue Aug 11 19:17:28 2009 -0700
@@ -600,7 +600,7 @@
 	int rv, cap_ptr, physhi;
 	dev_info_t *dip;
 	uint16_t cmd_reg;
-	struct memlist *list;
+	struct memlist *list, *scratch_list;
 
 	/* skip root (peer) PCI busses */
 	if (pci_bus_res[secbus].par_bus == (uchar_t)-1)
@@ -785,13 +785,13 @@
 	io_limit = ((io_limit & 0xf0) << 8) | 0xfff;
 
 	/* Form list of all resources passed (avail + used) */
-	list = memlist_dup(pci_bus_res[secbus].io_avail);
-	memlist_merge(&pci_bus_res[secbus].io_used, &list);
+	scratch_list = memlist_dup(pci_bus_res[secbus].io_avail);
+	memlist_merge(&pci_bus_res[secbus].io_used, &scratch_list);
 
 	if ((pci_bus_res[parbus].io_reprogram ||
 	    (io_base > io_limit) ||
 	    (!(cmd_reg & PCI_COMM_IO))) &&
-	    !list_is_vga_only(list, IO)) {
+	    !list_is_vga_only(scratch_list, IO)) {
 		if (pci_bus_res[secbus].io_used) {
 			memlist_subsume(&pci_bus_res[secbus].io_used,
 			    &pci_bus_res[secbus].io_avail);
@@ -857,6 +857,7 @@
 			    bus, dev, func, io_base, io_limit);
 		}
 	}
+	memlist_free_all(&scratch_list);
 
 	/*
 	 * Check memory space as we did I/O space.
@@ -866,13 +867,13 @@
 	mem_limit = (uint_t)pci_getw(bus, dev, func, PCI_BCNF_MEM_LIMIT);
 	mem_limit = ((mem_limit & 0xfff0) << 16) | 0xfffff;
 
-	list = memlist_dup(pci_bus_res[secbus].mem_avail);
-	memlist_merge(&pci_bus_res[secbus].mem_used, &list);
+	scratch_list = memlist_dup(pci_bus_res[secbus].mem_avail);
+	memlist_merge(&pci_bus_res[secbus].mem_used, &scratch_list);
 
 	if ((pci_bus_res[parbus].mem_reprogram ||
 	    (mem_base > mem_limit) ||
 	    (!(cmd_reg & PCI_COMM_MAE))) &&
-	    !list_is_vga_only(list, MEM)) {
+	    !list_is_vga_only(scratch_list, MEM)) {
 		if (pci_bus_res[secbus].mem_used) {
 			memlist_subsume(&pci_bus_res[secbus].mem_used,
 			    &pci_bus_res[secbus].mem_avail);
@@ -959,6 +960,7 @@
 			    bus, dev, func, mem_base, mem_limit);
 		}
 	}
+	memlist_free_all(&scratch_list);
 
 cmd_enable:
 	if (pci_bus_res[secbus].io_avail)