AGP fix race condition between unmapping and freeing pages
With Andi's clflush fixup, we were getting hangs on server exit, flushing the mappings after freeing each page helped. This showed up a race condition where the pages after being freed could be reused before the agp mappings had been flushed. Flushing after each single page is a bad thing for future drm work, so make the page destroy a two pass unmapping all the pages, flushing the mappings, and then destroying the pages. Signed-off-by: Dave Airlie <airlied@linux.ie> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Šī revīzija ir iekļauta:

revīziju iesūtīja
Dave Airlie

vecāks
23fd50450a
revīzija
a2721e998e
@@ -58,6 +58,9 @@ struct gatt_mask {
|
||||
* devices this will probably be ignored */
|
||||
};
|
||||
|
||||
#define AGP_PAGE_DESTROY_UNMAP 1
|
||||
#define AGP_PAGE_DESTROY_FREE 2
|
||||
|
||||
struct aper_size_info_8 {
|
||||
int size;
|
||||
int num_entries;
|
||||
@@ -113,7 +116,7 @@ struct agp_bridge_driver {
|
||||
struct agp_memory *(*alloc_by_type) (size_t, int);
|
||||
void (*free_by_type)(struct agp_memory *);
|
||||
void *(*agp_alloc_page)(struct agp_bridge_data *);
|
||||
void (*agp_destroy_page)(void *);
|
||||
void (*agp_destroy_page)(void *, int flags);
|
||||
int (*agp_type_to_mask_type) (struct agp_bridge_data *, int);
|
||||
};
|
||||
|
||||
@@ -267,7 +270,7 @@ int agp_generic_remove_memory(struct agp_memory *mem, off_t pg_start, int type);
|
||||
struct agp_memory *agp_generic_alloc_by_type(size_t page_count, int type);
|
||||
void agp_generic_free_by_type(struct agp_memory *curr);
|
||||
void *agp_generic_alloc_page(struct agp_bridge_data *bridge);
|
||||
void agp_generic_destroy_page(void *addr);
|
||||
void agp_generic_destroy_page(void *addr, int flags);
|
||||
void agp_free_key(int key);
|
||||
int agp_num_entries(void);
|
||||
u32 agp_collect_device_status(struct agp_bridge_data *bridge, u32 mode, u32 command);
|
||||
|
Atsaukties uz šo jaunā problēmā
Block a user