diff options
Diffstat (limited to 'drivers/char/agp/generic.c')
-rw-r--r-- | drivers/char/agp/generic.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/drivers/char/agp/generic.c b/drivers/char/agp/generic.c index 3db4f4076ed4..64b2f6d7059d 100644 --- a/drivers/char/agp/generic.c +++ b/drivers/char/agp/generic.c | |||
@@ -195,9 +195,12 @@ void agp_free_memory(struct agp_memory *curr) | |||
195 | } | 195 | } |
196 | if (curr->page_count != 0) { | 196 | if (curr->page_count != 0) { |
197 | for (i = 0; i < curr->page_count; i++) { | 197 | for (i = 0; i < curr->page_count; i++) { |
198 | curr->bridge->driver->agp_destroy_page(gart_to_virt(curr->memory[i])); | 198 | curr->bridge->driver->agp_destroy_page(gart_to_virt(curr->memory[i]), AGP_PAGE_DESTROY_UNMAP); |
199 | } | 199 | } |
200 | flush_agp_mappings(); | 200 | flush_agp_mappings(); |
201 | for (i = 0; i < curr->page_count; i++) { | ||
202 | curr->bridge->driver->agp_destroy_page(gart_to_virt(curr->memory[i]), AGP_PAGE_DESTROY_FREE); | ||
203 | } | ||
201 | } | 204 | } |
202 | agp_free_key(curr->key); | 205 | agp_free_key(curr->key); |
203 | agp_free_page_array(curr); | 206 | agp_free_page_array(curr); |
@@ -1176,7 +1179,7 @@ void *agp_generic_alloc_page(struct agp_bridge_data *bridge) | |||
1176 | EXPORT_SYMBOL(agp_generic_alloc_page); | 1179 | EXPORT_SYMBOL(agp_generic_alloc_page); |
1177 | 1180 | ||
1178 | 1181 | ||
1179 | void agp_generic_destroy_page(void *addr) | 1182 | void agp_generic_destroy_page(void *addr, int flags) |
1180 | { | 1183 | { |
1181 | struct page *page; | 1184 | struct page *page; |
1182 | 1185 | ||
@@ -1184,10 +1187,14 @@ void agp_generic_destroy_page(void *addr) | |||
1184 | return; | 1187 | return; |
1185 | 1188 | ||
1186 | page = virt_to_page(addr); | 1189 | page = virt_to_page(addr); |
1187 | unmap_page_from_agp(page); | 1190 | if (flags & AGP_PAGE_DESTROY_UNMAP) |
1188 | put_page(page); | 1191 | unmap_page_from_agp(page); |
1189 | free_page((unsigned long)addr); | 1192 | |
1190 | atomic_dec(&agp_bridge->current_memory_agp); | 1193 | if (flags & AGP_PAGE_DESTROY_FREE) { |
1194 | put_page(page); | ||
1195 | free_page((unsigned long)addr); | ||
1196 | atomic_dec(&agp_bridge->current_memory_agp); | ||
1197 | } | ||
1191 | } | 1198 | } |
1192 | EXPORT_SYMBOL(agp_generic_destroy_page); | 1199 | EXPORT_SYMBOL(agp_generic_destroy_page); |
1193 | 1200 | ||