diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index 4984aa8..ae52edc 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c @@ -142,6 +142,9 @@ drm_gem_object_alloc(struct drm_device *dev, size_t size) return NULL; } + if (dev->gem_flags) + mapping_set_gfp_mask(obj->filp->f_mapping, dev->gem_flags); + kref_init(&obj->refcount); kref_init(&obj->handlecount); obj->size = size; diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 8161343..049fc3f 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c @@ -1145,12 +1145,12 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) } #ifdef CONFIG_HIGHMEM64G - /* don't enable GEM on PAE - needs agp + set_memory_* interface fixes */ - dev_priv->has_gem = 0; -#else + /* set default allocation flags */ + dev->gem_flags = GFP_USER | GFP_DMA32; +#endif + /* enable GEM by default, except on I8xx */ dev_priv->has_gem = !IS_I8XX(dev) ? 1 : 0; -#endif dev->driver->get_vblank_counter = i915_get_vblank_counter; if (IS_GM45(dev)) diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 04fbd1e..018534b 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h @@ -1043,6 +1043,7 @@ struct drm_device { uint32_t gtt_total; uint32_t invalidate_domains; /* domains pending invalidation */ uint32_t flush_domains; /* domains pending flush */ + gfp_t gem_flags; /* object allocation flags */ /*@} */ }; diff --git a/mm/shmem.c b/mm/shmem.c index 4103a23..515bb1b 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -1226,7 +1226,7 @@ repeat: * Try to preload while we can wait, to not make a habit of * draining atomic reserves; but don't latch on to this cpu. */ - error = radix_tree_preload(gfp & ~__GFP_HIGHMEM); + error = radix_tree_preload(gfp & ~(__GFP_HIGHMEM|__GFP_DMA32)); if (error) goto failed; radix_tree_preload_end();