diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem.c')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 32 | 
1 files changed, 19 insertions, 13 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 19dbdd7dd56..9b285da4449 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -1407,8 +1407,10 @@ out:  		return VM_FAULT_NOPAGE;  	case -ENOMEM:  		return VM_FAULT_OOM; +	case -ENOSPC: +		return VM_FAULT_SIGBUS;  	default: -		WARN_ON_ONCE(ret); +		WARN_ONCE(ret, "unhandled error in i915_gem_fault: %i\n", ret);  		return VM_FAULT_SIGBUS;  	}  } @@ -1794,7 +1796,7 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)  	 */  	mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping;  	gfp = mapping_gfp_mask(mapping); -	gfp |= __GFP_NORETRY | __GFP_NOWARN; +	gfp |= __GFP_NORETRY | __GFP_NOWARN | __GFP_NO_KSWAPD;  	gfp &= ~(__GFP_IO | __GFP_WAIT);  	for_each_sg(st->sgl, sg, page_count, i) {  		page = shmem_read_mapping_page_gfp(mapping, i, gfp); @@ -1807,7 +1809,7 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)  			 * our own buffer, now let the real VM do its job and  			 * go down in flames if truly OOM.  			 */ -			gfp &= ~(__GFP_NORETRY | __GFP_NOWARN); +			gfp &= ~(__GFP_NORETRY | __GFP_NOWARN | __GFP_NO_KSWAPD);  			gfp |= __GFP_IO | __GFP_WAIT;  			i915_gem_shrink_all(dev_priv); @@ -1815,17 +1817,18 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)  			if (IS_ERR(page))  				goto err_pages; -			gfp |= __GFP_NORETRY | __GFP_NOWARN; +			gfp |= __GFP_NORETRY | __GFP_NOWARN | __GFP_NO_KSWAPD;  			gfp &= ~(__GFP_IO | __GFP_WAIT);  		}  		sg_set_page(sg, page, PAGE_SIZE, 0);  	} +	obj->pages = st; +  	if (i915_gem_object_needs_bit17_swizzle(obj))  		i915_gem_object_do_bit_17_swizzle(obj); -	obj->pages = st;  	return 0;  err_pages: @@ -1955,11 +1958,12 @@ i915_gem_next_request_seqno(struct intel_ring_buffer *ring)  int  i915_add_request(struct intel_ring_buffer *ring,  		 struct drm_file *file, -		 struct drm_i915_gem_request *request) +		 u32 *out_seqno)  {  	drm_i915_private_t *dev_priv = ring->dev->dev_private; -	uint32_t seqno; +	struct drm_i915_gem_request *request;  	u32 request_ring_position; +	u32 seqno;  	int was_empty;  	int ret; @@ -1974,11 +1978,9 @@ i915_add_request(struct intel_ring_buffer *ring,  	if (ret)  		return ret; -	if (request == NULL) { -		request = kmalloc(sizeof(*request), GFP_KERNEL); -		if (request == NULL) -			return -ENOMEM; -	} +	request = kmalloc(sizeof(*request), GFP_KERNEL); +	if (request == NULL) +		return -ENOMEM;  	seqno = i915_gem_next_request_seqno(ring); @@ -2030,6 +2032,8 @@ i915_add_request(struct intel_ring_buffer *ring,  		}  	} +	if (out_seqno) +		*out_seqno = seqno;  	return 0;  } @@ -3959,6 +3963,9 @@ i915_gem_init_hw(struct drm_device *dev)  	if (!intel_enable_gtt())  		return -EIO; +	if (IS_HASWELL(dev) && (I915_READ(0x120010) == 1)) +		I915_WRITE(0x9008, I915_READ(0x9008) | 0xf0000); +  	i915_gem_l3_remap(dev);  	i915_gem_init_swizzling(dev); @@ -4098,7 +4105,6 @@ i915_gem_entervt_ioctl(struct drm_device *dev, void *data,  	}  	BUG_ON(!list_empty(&dev_priv->mm.active_list)); -	BUG_ON(!list_empty(&dev_priv->mm.inactive_list));  	mutex_unlock(&dev->struct_mutex);  	ret = drm_irq_install(dev);  |