Skip to content

Commit

Permalink
drm/ttm: Avoid conflicting reserve_memtype during ttm_tt_set_page_cac…
Browse files Browse the repository at this point in the history
…hing.

Fixes errors like:
> reserve_ram_pages_type failed 0x15b7a000-0x15b7b000, track 0x8, req 0x10
when a BO is moved between WC and UC areas.

Reported-by: Xavier Chantry <shiningxc@gmail.com>
Signed-off-by: Francisco Jerez <currojerez@riseup.net>
Acked-by: Thomas Hellstrom <thellstrom@vmware.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
  • Loading branch information
Francisco Jerez authored and Dave Airlie committed Feb 1, 2010
1 parent f28cf33 commit db78e27
Showing 1 changed file with 16 additions and 7 deletions.
23 changes: 16 additions & 7 deletions drivers/gpu/drm/ttm/ttm_tt.c
Original file line number Diff line number Diff line change
Expand Up @@ -198,17 +198,26 @@ EXPORT_SYMBOL(ttm_tt_populate);
static inline int ttm_tt_set_page_caching(struct page *p,
enum ttm_caching_state c_state)
{
int ret = 0;

if (PageHighMem(p))
return 0;

switch (c_state) {
case tt_cached:
return set_pages_wb(p, 1);
case tt_wc:
return set_memory_wc((unsigned long) page_address(p), 1);
default:
return set_pages_uc(p, 1);
if (get_page_memtype(p) != -1) {
/* p isn't in the default caching state, set it to
* writeback first to free its current memtype. */

ret = set_pages_wb(p, 1);
if (ret)
return ret;
}

if (c_state == tt_wc)
ret = set_memory_wc((unsigned long) page_address(p), 1);
else if (c_state == tt_uncached)
ret = set_pages_uc(p, 1);

return ret;
}
#else /* CONFIG_X86 */
static inline int ttm_tt_set_page_caching(struct page *p,
Expand Down

0 comments on commit db78e27

Please sign in to comment.