aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/agp/i460-agp.c
diff options
context:
space:
mode:
authorAlan Hourihane <alanh@fairlite.demon.co.uk>2005-11-07 02:35:34 -0500
committerDave Jones <davej@redhat.com>2005-11-08 16:43:54 -0500
commit88d51967f56f55a45849efe50858ea7dfa0d38dc (patch)
tree048db8e12c2b31ec2b88c3154da4c6a77b80028c /drivers/char/agp/i460-agp.c
parent329f7dba5f7dc3bc9a30ad00cf373d2e83115aa1 (diff)
[PATCH] AGP performance fixes
AGP allocation/deallocation is suffering major performance issues due to the nature of global_flush_tlb() being called on every change_page_attr() call. For small allocations this isn't really seen, but when you start allocating 50000 pages of AGP space, for say, texture memory, then things can take seconds to complete. In some cases the situation is doubled or even quadrupled in the time due to SMP, or a deallocation, then a new reallocation. I've had a case of upto 20 seconds wait time to deallocate and reallocate AGP space. This patch fixes the problem by making it the caller's responsibility to call global_flush_tlb(), and so removes it from every instance of mapping a page into AGP space until the time that all change_page_attr() changes are done. Signed-off-by: Dave Jones <davej@redhat.com> Signed-off-by: Andrew Morton <akpm@osdl.org>
Diffstat (limited to 'drivers/char/agp/i460-agp.c')
-rw-r--r--drivers/char/agp/i460-agp.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/char/agp/i460-agp.c b/drivers/char/agp/i460-agp.c
index 58944cd271ea..be2e569ae910 100644
--- a/drivers/char/agp/i460-agp.c
+++ b/drivers/char/agp/i460-agp.c
@@ -514,9 +514,10 @@ static void *i460_alloc_page (struct agp_bridge_data *bridge)
514{ 514{
515 void *page; 515 void *page;
516 516
517 if (I460_IO_PAGE_SHIFT <= PAGE_SHIFT) 517 if (I460_IO_PAGE_SHIFT <= PAGE_SHIFT) {
518 page = agp_generic_alloc_page(agp_bridge); 518 page = agp_generic_alloc_page(agp_bridge);
519 else 519 global_flush_tlb();
520 } else
520 /* Returning NULL would cause problems */ 521 /* Returning NULL would cause problems */
521 /* AK: really dubious code. */ 522 /* AK: really dubious code. */
522 page = (void *)~0UL; 523 page = (void *)~0UL;
@@ -525,8 +526,10 @@ static void *i460_alloc_page (struct agp_bridge_data *bridge)
525 526
526static void i460_destroy_page (void *page) 527static void i460_destroy_page (void *page)
527{ 528{
528 if (I460_IO_PAGE_SHIFT <= PAGE_SHIFT) 529 if (I460_IO_PAGE_SHIFT <= PAGE_SHIFT) {
529 agp_generic_destroy_page(page); 530 agp_generic_destroy_page(page);
531 global_flush_tlb();
532 }
530} 533}
531 534
532#endif /* I460_LARGE_IO_PAGES */ 535#endif /* I460_LARGE_IO_PAGES */