i915_gem_execbuffer.c 34.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
/*
 * Copyright © 2008,2010 Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 * IN THE SOFTWARE.
 *
 * Authors:
 *    Eric Anholt <eric@anholt.net>
 *    Chris Wilson <chris@chris-wilson.co.uk>
 *
 */

29 30
#include <drm/drmP.h>
#include <drm/i915_drm.h>
31 32 33
#include "i915_drv.h"
#include "i915_trace.h"
#include "intel_drv.h"
34
#include <linux/dma_remapping.h>
35

36
struct eb_objects {
37
	struct list_head objects;
38
	int and;
39 40 41 42
	union {
		struct drm_i915_gem_object *lut[0];
		struct hlist_head buckets[0];
	};
43 44 45
};

static struct eb_objects *
46
eb_create(struct drm_i915_gem_execbuffer2 *args)
47
{
48 49 50 51 52 53 54 55 56 57 58 59
	struct eb_objects *eb = NULL;

	if (args->flags & I915_EXEC_HANDLE_LUT) {
		int size = args->buffer_count;
		size *= sizeof(struct drm_i915_gem_object *);
		size += sizeof(struct eb_objects);
		eb = kmalloc(size, GFP_TEMPORARY | __GFP_NOWARN | __GFP_NORETRY);
	}

	if (eb == NULL) {
		int size = args->buffer_count;
		int count = PAGE_SIZE / sizeof(struct hlist_head) / 2;
L
Lauri Kasanen 已提交
60
		BUILD_BUG_ON_NOT_POWER_OF_2(PAGE_SIZE / sizeof(struct hlist_head));
61 62 63 64 65 66 67 68 69 70 71 72
		while (count > 2*size)
			count >>= 1;
		eb = kzalloc(count*sizeof(struct hlist_head) +
			     sizeof(struct eb_objects),
			     GFP_TEMPORARY);
		if (eb == NULL)
			return eb;

		eb->and = count - 1;
	} else
		eb->and = -args->buffer_count;

73
	INIT_LIST_HEAD(&eb->objects);
74 75 76 77 78 79
	return eb;
}

static void
eb_reset(struct eb_objects *eb)
{
80 81
	if (eb->and >= 0)
		memset(eb->buckets, 0, (eb->and+1)*sizeof(struct hlist_head));
82 83
}

84 85 86
static int
eb_lookup_objects(struct eb_objects *eb,
		  struct drm_i915_gem_exec_object2 *exec,
87
		  const struct drm_i915_gem_execbuffer2 *args,
88
		  struct drm_file *file)
89 90 91 92
{
	int i;

	spin_lock(&file->table_lock);
93
	for (i = 0; i < args->buffer_count; i++) {
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
		struct drm_i915_gem_object *obj;

		obj = to_intel_bo(idr_find(&file->object_idr, exec[i].handle));
		if (obj == NULL) {
			spin_unlock(&file->table_lock);
			DRM_DEBUG("Invalid object handle %d at index %d\n",
				   exec[i].handle, i);
			return -ENOENT;
		}

		if (!list_empty(&obj->exec_list)) {
			spin_unlock(&file->table_lock);
			DRM_DEBUG("Object %p [handle %d, index %d] appears more than once in object list\n",
				   obj, exec[i].handle, i);
			return -EINVAL;
		}

		drm_gem_object_reference(&obj->base);
112
		list_add_tail(&obj->exec_list, &eb->objects);
113 114

		obj->exec_entry = &exec[i];
115 116 117 118 119 120 121 122
		if (eb->and < 0) {
			eb->lut[i] = obj;
		} else {
			uint32_t handle = args->flags & I915_EXEC_HANDLE_LUT ? i : exec[i].handle;
			obj->exec_handle = handle;
			hlist_add_head(&obj->exec_node,
				       &eb->buckets[handle & eb->and]);
		}
123 124 125 126 127 128
	}
	spin_unlock(&file->table_lock);

	return 0;
}

129 130 131
static struct drm_i915_gem_object *
eb_get_object(struct eb_objects *eb, unsigned long handle)
{
132 133 134 135 136 137 138
	if (eb->and < 0) {
		if (handle >= -eb->and)
			return NULL;
		return eb->lut[handle];
	} else {
		struct hlist_head *head;
		struct hlist_node *node;
139

140 141 142
		head = &eb->buckets[handle & eb->and];
		hlist_for_each(node, head) {
			struct drm_i915_gem_object *obj;
143

144 145 146 147 148 149
			obj = hlist_entry(node, struct drm_i915_gem_object, exec_node);
			if (obj->exec_handle == handle)
				return obj;
		}
		return NULL;
	}
150 151 152 153 154
}

static void
eb_destroy(struct eb_objects *eb)
{
155 156 157 158 159 160 161 162 163
	while (!list_empty(&eb->objects)) {
		struct drm_i915_gem_object *obj;

		obj = list_first_entry(&eb->objects,
				       struct drm_i915_gem_object,
				       exec_list);
		list_del_init(&obj->exec_list);
		drm_gem_object_unreference(&obj->base);
	}
164 165 166
	kfree(eb);
}

167 168 169
static inline int use_cpu_reloc(struct drm_i915_gem_object *obj)
{
	return (obj->base.write_domain == I915_GEM_DOMAIN_CPU ||
170
		!obj->map_and_fenceable ||
171 172 173
		obj->cache_level != I915_CACHE_NONE);
}

174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
static int
relocate_entry_cpu(struct drm_i915_gem_object *obj,
		   struct drm_i915_gem_relocation_entry *reloc)
{
	uint32_t page_offset = offset_in_page(reloc->offset);
	char *vaddr;
	int ret = -EINVAL;

	ret = i915_gem_object_set_to_cpu_domain(obj, 1);
	if (ret)
		return ret;

	vaddr = kmap_atomic(i915_gem_object_get_page(obj,
				reloc->offset >> PAGE_SHIFT));
	*(uint32_t *)(vaddr + page_offset) = reloc->delta;
	kunmap_atomic(vaddr);

	return 0;
}

static int
relocate_entry_gtt(struct drm_i915_gem_object *obj,
		   struct drm_i915_gem_relocation_entry *reloc)
{
	struct drm_device *dev = obj->base.dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
	uint32_t __iomem *reloc_entry;
	void __iomem *reloc_page;
	int ret = -EINVAL;

	ret = i915_gem_object_set_to_gtt_domain(obj, true);
	if (ret)
		return ret;

	ret = i915_gem_object_put_fence(obj);
	if (ret)
		return ret;

	/* Map the page containing the relocation we're going to perform.  */
	reloc->offset += i915_gem_obj_ggtt_offset(obj);
	reloc_page = io_mapping_map_atomic_wc(dev_priv->gtt.mappable,
			reloc->offset & PAGE_MASK);
	reloc_entry = (uint32_t __iomem *)
		(reloc_page + offset_in_page(reloc->offset));
	iowrite32(reloc->delta, reloc_entry);
	io_mapping_unmap_atomic(reloc_page);

	return 0;
}

224 225
static int
i915_gem_execbuffer_relocate_entry(struct drm_i915_gem_object *obj,
226
				   struct eb_objects *eb,
227 228
				   struct drm_i915_gem_relocation_entry *reloc,
				   struct i915_address_space *vm)
229 230 231
{
	struct drm_device *dev = obj->base.dev;
	struct drm_gem_object *target_obj;
232
	struct drm_i915_gem_object *target_i915_obj;
233 234 235
	uint32_t target_offset;
	int ret = -EINVAL;

236 237 238
	/* we've already hold a reference to all valid objects */
	target_obj = &eb_get_object(eb, reloc->target_handle)->base;
	if (unlikely(target_obj == NULL))
239 240
		return -ENOENT;

241
	target_i915_obj = to_intel_bo(target_obj);
242
	target_offset = i915_gem_obj_ggtt_offset(target_i915_obj);
243

244 245 246 247 248 249 250 251 252 253
	/* Sandybridge PPGTT errata: We need a global gtt mapping for MI and
	 * pipe_control writes because the gpu doesn't properly redirect them
	 * through the ppgtt for non_secure batchbuffers. */
	if (unlikely(IS_GEN6(dev) &&
	    reloc->write_domain == I915_GEM_DOMAIN_INSTRUCTION &&
	    !target_i915_obj->has_global_gtt_mapping)) {
		i915_gem_gtt_bind_object(target_i915_obj,
					 target_i915_obj->cache_level);
	}

254
	/* Validate that the target is in a valid r/w GPU domain */
255
	if (unlikely(reloc->write_domain & (reloc->write_domain - 1))) {
256
		DRM_DEBUG("reloc with multiple write domains: "
257 258 259 260 261 262
			  "obj %p target %d offset %d "
			  "read %08x write %08x",
			  obj, reloc->target_handle,
			  (int) reloc->offset,
			  reloc->read_domains,
			  reloc->write_domain);
263
		return ret;
264
	}
265 266
	if (unlikely((reloc->write_domain | reloc->read_domains)
		     & ~I915_GEM_GPU_DOMAINS)) {
267
		DRM_DEBUG("reloc with read/write non-GPU domains: "
268 269 270 271 272 273
			  "obj %p target %d offset %d "
			  "read %08x write %08x",
			  obj, reloc->target_handle,
			  (int) reloc->offset,
			  reloc->read_domains,
			  reloc->write_domain);
274
		return ret;
275 276 277 278 279 280 281 282 283
	}

	target_obj->pending_read_domains |= reloc->read_domains;
	target_obj->pending_write_domain |= reloc->write_domain;

	/* If the relocation already has the right value in it, no
	 * more work needs to be done.
	 */
	if (target_offset == reloc->presumed_offset)
284
		return 0;
285 286

	/* Check that the relocation address is valid... */
287
	if (unlikely(reloc->offset > obj->base.size - 4)) {
288
		DRM_DEBUG("Relocation beyond object bounds: "
289 290 291 292
			  "obj %p target %d offset %d size %d.\n",
			  obj, reloc->target_handle,
			  (int) reloc->offset,
			  (int) obj->base.size);
293
		return ret;
294
	}
295
	if (unlikely(reloc->offset & 3)) {
296
		DRM_DEBUG("Relocation not 4-byte aligned: "
297 298 299
			  "obj %p target %d offset %d.\n",
			  obj, reloc->target_handle,
			  (int) reloc->offset);
300
		return ret;
301 302
	}

303 304 305 306
	/* We can't wait for rendering with pagefaults disabled */
	if (obj->active && in_atomic())
		return -EFAULT;

307
	reloc->delta += target_offset;
308 309 310 311
	if (use_cpu_reloc(obj))
		ret = relocate_entry_cpu(obj, reloc);
	else
		ret = relocate_entry_gtt(obj, reloc);
312

313 314 315
	if (ret)
		return ret;

316 317 318
	/* and update the user's relocation entry */
	reloc->presumed_offset = target_offset;

319
	return 0;
320 321 322 323
}

static int
i915_gem_execbuffer_relocate_object(struct drm_i915_gem_object *obj,
324 325
				    struct eb_objects *eb,
				    struct i915_address_space *vm)
326
{
327 328
#define N_RELOC(x) ((x) / sizeof(struct drm_i915_gem_relocation_entry))
	struct drm_i915_gem_relocation_entry stack_reloc[N_RELOC(512)];
329
	struct drm_i915_gem_relocation_entry __user *user_relocs;
330
	struct drm_i915_gem_exec_object2 *entry = obj->exec_entry;
331
	int remain, ret;
332

V
Ville Syrjälä 已提交
333
	user_relocs = to_user_ptr(entry->relocs_ptr);
334

335 336 337 338 339 340 341 342 343
	remain = entry->relocation_count;
	while (remain) {
		struct drm_i915_gem_relocation_entry *r = stack_reloc;
		int count = remain;
		if (count > ARRAY_SIZE(stack_reloc))
			count = ARRAY_SIZE(stack_reloc);
		remain -= count;

		if (__copy_from_user_inatomic(r, user_relocs, count*sizeof(r[0])))
344 345
			return -EFAULT;

346 347
		do {
			u64 offset = r->presumed_offset;
348

349 350
			ret = i915_gem_execbuffer_relocate_entry(obj, eb, r,
								 vm);
351 352 353 354 355 356 357 358 359 360 361 362 363
			if (ret)
				return ret;

			if (r->presumed_offset != offset &&
			    __copy_to_user_inatomic(&user_relocs->presumed_offset,
						    &r->presumed_offset,
						    sizeof(r->presumed_offset))) {
				return -EFAULT;
			}

			user_relocs++;
			r++;
		} while (--count);
364 365 366
	}

	return 0;
367
#undef N_RELOC
368 369 370 371
}

static int
i915_gem_execbuffer_relocate_object_slow(struct drm_i915_gem_object *obj,
372
					 struct eb_objects *eb,
373 374
					 struct drm_i915_gem_relocation_entry *relocs,
					 struct i915_address_space *vm)
375
{
376
	const struct drm_i915_gem_exec_object2 *entry = obj->exec_entry;
377 378 379
	int i, ret;

	for (i = 0; i < entry->relocation_count; i++) {
380 381
		ret = i915_gem_execbuffer_relocate_entry(obj, eb, &relocs[i],
							 vm);
382 383 384 385 386 387 388 389
		if (ret)
			return ret;
	}

	return 0;
}

static int
390 391
i915_gem_execbuffer_relocate(struct eb_objects *eb,
			     struct i915_address_space *vm)
392
{
393
	struct drm_i915_gem_object *obj;
394 395 396 397 398 399 400 401 402 403
	int ret = 0;

	/* This is the fast path and we cannot handle a pagefault whilst
	 * holding the struct mutex lest the user pass in the relocations
	 * contained within a mmaped bo. For in such a case we, the page
	 * fault handler would call i915_gem_fault() and we would try to
	 * acquire the struct mutex again. Obviously this is bad and so
	 * lockdep complains vehemently.
	 */
	pagefault_disable();
404
	list_for_each_entry(obj, &eb->objects, exec_list) {
405
		ret = i915_gem_execbuffer_relocate_object(obj, eb, vm);
406
		if (ret)
407
			break;
408
	}
409
	pagefault_enable();
410

411
	return ret;
412 413
}

414 415
#define  __EXEC_OBJECT_HAS_PIN (1<<31)
#define  __EXEC_OBJECT_HAS_FENCE (1<<30)
416

417 418 419 420 421 422 423
static int
need_reloc_mappable(struct drm_i915_gem_object *obj)
{
	struct drm_i915_gem_exec_object2 *entry = obj->exec_entry;
	return entry->relocation_count && !use_cpu_reloc(obj);
}

424
static int
425
i915_gem_execbuffer_reserve_object(struct drm_i915_gem_object *obj,
426
				   struct intel_ring_buffer *ring,
427
				   struct i915_address_space *vm,
428
				   bool *need_reloc)
429
{
430
	struct drm_i915_private *dev_priv = obj->base.dev->dev_private;
431 432 433 434 435 436 437 438 439
	struct drm_i915_gem_exec_object2 *entry = obj->exec_entry;
	bool has_fenced_gpu_access = INTEL_INFO(ring->dev)->gen < 4;
	bool need_fence, need_mappable;
	int ret;

	need_fence =
		has_fenced_gpu_access &&
		entry->flags & EXEC_OBJECT_NEEDS_FENCE &&
		obj->tiling_mode != I915_TILING_NONE;
440
	need_mappable = need_fence || need_reloc_mappable(obj);
441

442 443
	ret = i915_gem_object_pin(obj, vm, entry->alignment, need_mappable,
				  false);
444 445 446
	if (ret)
		return ret;

447 448
	entry->flags |= __EXEC_OBJECT_HAS_PIN;

449 450
	if (has_fenced_gpu_access) {
		if (entry->flags & EXEC_OBJECT_NEEDS_FENCE) {
451
			ret = i915_gem_object_get_fence(obj);
452
			if (ret)
453
				return ret;
454

455
			if (i915_gem_object_pin_fence(obj))
456
				entry->flags |= __EXEC_OBJECT_HAS_FENCE;
457

458
			obj->pending_fenced_gpu_access = true;
459 460 461
		}
	}

462 463 464 465 466 467 468 469
	/* Ensure ppgtt mapping exists if needed */
	if (dev_priv->mm.aliasing_ppgtt && !obj->has_aliasing_ppgtt_mapping) {
		i915_ppgtt_bind_object(dev_priv->mm.aliasing_ppgtt,
				       obj, obj->cache_level);

		obj->has_aliasing_ppgtt_mapping = 1;
	}

470 471
	if (entry->offset != i915_gem_obj_offset(obj, vm)) {
		entry->offset = i915_gem_obj_offset(obj, vm);
472 473 474 475 476 477 478 479 480 481 482 483
		*need_reloc = true;
	}

	if (entry->flags & EXEC_OBJECT_WRITE) {
		obj->base.pending_read_domains = I915_GEM_DOMAIN_RENDER;
		obj->base.pending_write_domain = I915_GEM_DOMAIN_RENDER;
	}

	if (entry->flags & EXEC_OBJECT_NEEDS_GTT &&
	    !obj->has_global_gtt_mapping)
		i915_gem_gtt_bind_object(obj, obj->cache_level);

484
	return 0;
485
}
486

487 488 489 490 491
static void
i915_gem_execbuffer_unreserve_object(struct drm_i915_gem_object *obj)
{
	struct drm_i915_gem_exec_object2 *entry;

492
	if (!i915_gem_obj_bound_any(obj))
493 494 495 496 497 498 499 500 501 502 503
		return;

	entry = obj->exec_entry;

	if (entry->flags & __EXEC_OBJECT_HAS_FENCE)
		i915_gem_object_unpin_fence(obj);

	if (entry->flags & __EXEC_OBJECT_HAS_PIN)
		i915_gem_object_unpin(obj);

	entry->flags &= ~(__EXEC_OBJECT_HAS_FENCE | __EXEC_OBJECT_HAS_PIN);
504 505
}

506
static int
507
i915_gem_execbuffer_reserve(struct intel_ring_buffer *ring,
508
			    struct list_head *objects,
509
			    struct i915_address_space *vm,
510
			    bool *need_relocs)
511
{
512
	struct drm_i915_gem_object *obj;
513
	struct list_head ordered_objects;
514 515
	bool has_fenced_gpu_access = INTEL_INFO(ring->dev)->gen < 4;
	int retry;
516 517 518 519 520 521 522 523 524 525 526 527 528 529 530

	INIT_LIST_HEAD(&ordered_objects);
	while (!list_empty(objects)) {
		struct drm_i915_gem_exec_object2 *entry;
		bool need_fence, need_mappable;

		obj = list_first_entry(objects,
				       struct drm_i915_gem_object,
				       exec_list);
		entry = obj->exec_entry;

		need_fence =
			has_fenced_gpu_access &&
			entry->flags & EXEC_OBJECT_NEEDS_FENCE &&
			obj->tiling_mode != I915_TILING_NONE;
531
		need_mappable = need_fence || need_reloc_mappable(obj);
532 533 534 535 536

		if (need_mappable)
			list_move(&obj->exec_list, &ordered_objects);
		else
			list_move_tail(&obj->exec_list, &ordered_objects);
537

538
		obj->base.pending_read_domains = I915_GEM_GPU_DOMAINS & ~I915_GEM_DOMAIN_COMMAND;
539
		obj->base.pending_write_domain = 0;
540
		obj->pending_fenced_gpu_access = false;
541 542
	}
	list_splice(&ordered_objects, objects);
543 544 545 546 547 548 549 550 551 552

	/* Attempt to pin all of the buffers into the GTT.
	 * This is done in 3 phases:
	 *
	 * 1a. Unbind all objects that do not match the GTT constraints for
	 *     the execbuffer (fenceable, mappable, alignment etc).
	 * 1b. Increment pin count for already bound objects.
	 * 2.  Bind new objects.
	 * 3.  Decrement pin count.
	 *
553
	 * This avoid unnecessary unbinding of later objects in order to make
554 555 556 557
	 * room for the earlier objects *unless* we need to defragment.
	 */
	retry = 0;
	do {
558
		int ret = 0;
559 560

		/* Unbind any ill-fitting objects or pin. */
561
		list_for_each_entry(obj, objects, exec_list) {
562
			struct drm_i915_gem_exec_object2 *entry = obj->exec_entry;
563
			bool need_fence, need_mappable;
564
			u32 obj_offset;
565

566
			if (!i915_gem_obj_bound(obj, vm))
567 568
				continue;

569
			obj_offset = i915_gem_obj_offset(obj, vm);
570
			need_fence =
571
				has_fenced_gpu_access &&
572 573
				entry->flags & EXEC_OBJECT_NEEDS_FENCE &&
				obj->tiling_mode != I915_TILING_NONE;
574
			need_mappable = need_fence || need_reloc_mappable(obj);
575

576 577 578
			WARN_ON((need_mappable || need_fence) &&
				!i915_is_ggtt(vm));

579
			if ((entry->alignment &&
580
			     obj_offset & (entry->alignment - 1)) ||
581
			    (need_mappable && !obj->map_and_fenceable))
582
				ret = i915_vma_unbind(i915_gem_obj_to_vma(obj, vm));
583
			else
584
				ret = i915_gem_execbuffer_reserve_object(obj, ring, vm, need_relocs);
585
			if (ret)
586 587 588 589
				goto err;
		}

		/* Bind fresh objects */
590
		list_for_each_entry(obj, objects, exec_list) {
591
			if (i915_gem_obj_bound(obj, vm))
592
				continue;
593

594
			ret = i915_gem_execbuffer_reserve_object(obj, ring, vm, need_relocs);
595 596
			if (ret)
				goto err;
597 598
		}

599 600 601
err:		/* Decrement pin count for bound objects */
		list_for_each_entry(obj, objects, exec_list)
			i915_gem_execbuffer_unreserve_object(obj);
602

C
Chris Wilson 已提交
603
		if (ret != -ENOSPC || retry++)
604 605
			return ret;

C
Chris Wilson 已提交
606
		ret = i915_gem_evict_everything(ring->dev);
607 608 609 610 611 612 613
		if (ret)
			return ret;
	} while (1);
}

static int
i915_gem_execbuffer_relocate_slow(struct drm_device *dev,
614
				  struct drm_i915_gem_execbuffer2 *args,
615
				  struct drm_file *file,
616
				  struct intel_ring_buffer *ring,
617
				  struct eb_objects *eb,
618 619
				  struct drm_i915_gem_exec_object2 *exec,
				  struct i915_address_space *vm)
620 621
{
	struct drm_i915_gem_relocation_entry *reloc;
622
	struct drm_i915_gem_object *obj;
623
	bool need_relocs;
624
	int *reloc_offset;
625
	int i, total, ret;
626
	int count = args->buffer_count;
627

628
	/* We may process another execbuffer during the unlock... */
629 630
	while (!list_empty(&eb->objects)) {
		obj = list_first_entry(&eb->objects,
631 632 633 634 635 636
				       struct drm_i915_gem_object,
				       exec_list);
		list_del_init(&obj->exec_list);
		drm_gem_object_unreference(&obj->base);
	}

637 638 639 640
	mutex_unlock(&dev->struct_mutex);

	total = 0;
	for (i = 0; i < count; i++)
641
		total += exec[i].relocation_count;
642

643
	reloc_offset = drm_malloc_ab(count, sizeof(*reloc_offset));
644
	reloc = drm_malloc_ab(total, sizeof(*reloc));
645 646 647
	if (reloc == NULL || reloc_offset == NULL) {
		drm_free_large(reloc);
		drm_free_large(reloc_offset);
648 649 650 651 652 653 654
		mutex_lock(&dev->struct_mutex);
		return -ENOMEM;
	}

	total = 0;
	for (i = 0; i < count; i++) {
		struct drm_i915_gem_relocation_entry __user *user_relocs;
655 656
		u64 invalid_offset = (u64)-1;
		int j;
657

V
Ville Syrjälä 已提交
658
		user_relocs = to_user_ptr(exec[i].relocs_ptr);
659 660

		if (copy_from_user(reloc+total, user_relocs,
661
				   exec[i].relocation_count * sizeof(*reloc))) {
662 663 664 665 666
			ret = -EFAULT;
			mutex_lock(&dev->struct_mutex);
			goto err;
		}

667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685
		/* As we do not update the known relocation offsets after
		 * relocating (due to the complexities in lock handling),
		 * we need to mark them as invalid now so that we force the
		 * relocation processing next time. Just in case the target
		 * object is evicted and then rebound into its old
		 * presumed_offset before the next execbuffer - if that
		 * happened we would make the mistake of assuming that the
		 * relocations were valid.
		 */
		for (j = 0; j < exec[i].relocation_count; j++) {
			if (copy_to_user(&user_relocs[j].presumed_offset,
					 &invalid_offset,
					 sizeof(invalid_offset))) {
				ret = -EFAULT;
				mutex_lock(&dev->struct_mutex);
				goto err;
			}
		}

686
		reloc_offset[i] = total;
687
		total += exec[i].relocation_count;
688 689 690 691 692 693 694 695
	}

	ret = i915_mutex_lock_interruptible(dev);
	if (ret) {
		mutex_lock(&dev->struct_mutex);
		goto err;
	}

696 697
	/* reacquire the objects */
	eb_reset(eb);
698
	ret = eb_lookup_objects(eb, exec, args, file);
699 700
	if (ret)
		goto err;
701

702
	need_relocs = (args->flags & I915_EXEC_NO_RELOC) == 0;
703
	ret = i915_gem_execbuffer_reserve(ring, &eb->objects, vm, &need_relocs);
704 705 706
	if (ret)
		goto err;

707
	list_for_each_entry(obj, &eb->objects, exec_list) {
708
		int offset = obj->exec_entry - exec;
709
		ret = i915_gem_execbuffer_relocate_object_slow(obj, eb,
710 711
							       reloc + reloc_offset[offset],
							       vm);
712 713 714 715 716 717 718 719 720 721 722 723
		if (ret)
			goto err;
	}

	/* Leave the user relocations as are, this is the painfully slow path,
	 * and we want to avoid the complication of dropping the lock whilst
	 * having buffers reserved in the aperture and so causing spurious
	 * ENOSPC for random operations.
	 */

err:
	drm_free_large(reloc);
724
	drm_free_large(reloc_offset);
725 726 727 728
	return ret;
}

static int
729 730
i915_gem_execbuffer_move_to_gpu(struct intel_ring_buffer *ring,
				struct list_head *objects)
731
{
732
	struct drm_i915_gem_object *obj;
733
	uint32_t flush_domains = 0;
734
	bool flush_chipset = false;
735
	int ret;
736

737 738
	list_for_each_entry(obj, objects, exec_list) {
		ret = i915_gem_object_sync(obj, ring);
739 740
		if (ret)
			return ret;
741 742

		if (obj->base.write_domain & I915_GEM_DOMAIN_CPU)
743
			flush_chipset |= i915_gem_clflush_object(obj, false);
744 745

		flush_domains |= obj->base.write_domain;
746 747
	}

748
	if (flush_chipset)
749
		i915_gem_chipset_flush(ring->dev);
750 751 752 753

	if (flush_domains & I915_GEM_DOMAIN_GTT)
		wmb();

754 755 756
	/* Unconditionally invalidate gpu caches and ensure that we do flush
	 * any residual writes from the previous batch.
	 */
757
	return intel_ring_invalidate_all_caches(ring);
758 759
}

760 761
static bool
i915_gem_check_execbuffer(struct drm_i915_gem_execbuffer2 *exec)
762
{
763 764 765
	if (exec->flags & __I915_EXEC_UNKNOWN_FLAGS)
		return false;

766
	return ((exec->batch_start_offset | exec->batch_len) & 0x7) == 0;
767 768 769 770 771 772 773
}

static int
validate_exec_list(struct drm_i915_gem_exec_object2 *exec,
		   int count)
{
	int i;
774 775
	int relocs_total = 0;
	int relocs_max = INT_MAX / sizeof(struct drm_i915_gem_relocation_entry);
776 777

	for (i = 0; i < count; i++) {
V
Ville Syrjälä 已提交
778
		char __user *ptr = to_user_ptr(exec[i].relocs_ptr);
779 780
		int length; /* limited by fault_in_pages_readable() */

781 782 783
		if (exec[i].flags & __EXEC_OBJECT_UNKNOWN_FLAGS)
			return -EINVAL;

784 785 786 787 788
		/* First check for malicious input causing overflow in
		 * the worst case where we need to allocate the entire
		 * relocation tree as a single array.
		 */
		if (exec[i].relocation_count > relocs_max - relocs_total)
789
			return -EINVAL;
790
		relocs_total += exec[i].relocation_count;
791 792 793

		length = exec[i].relocation_count *
			sizeof(struct drm_i915_gem_relocation_entry);
794 795 796 797 798
		/*
		 * We must check that the entire relocation array is safe
		 * to read, but since we may need to update the presumed
		 * offsets during execution, check for full write access.
		 */
799 800 801
		if (!access_ok(VERIFY_WRITE, ptr, length))
			return -EFAULT;

802 803 804 805
		if (likely(!i915_prefault_disable)) {
			if (fault_in_multipages_readable(ptr, length))
				return -EFAULT;
		}
806 807 808 809 810
	}

	return 0;
}

811 812
static void
i915_gem_execbuffer_move_to_active(struct list_head *objects,
813
				   struct i915_address_space *vm,
814
				   struct intel_ring_buffer *ring)
815 816 817 818
{
	struct drm_i915_gem_object *obj;

	list_for_each_entry(obj, objects, exec_list) {
819 820
		u32 old_read = obj->base.read_domains;
		u32 old_write = obj->base.write_domain;
C
Chris Wilson 已提交
821

822
		obj->base.write_domain = obj->base.pending_write_domain;
823 824 825
		if (obj->base.write_domain == 0)
			obj->base.pending_read_domains |= obj->base.read_domains;
		obj->base.read_domains = obj->base.pending_read_domains;
826 827
		obj->fenced_gpu_access = obj->pending_fenced_gpu_access;

B
Ben Widawsky 已提交
828 829
		/* FIXME: This lookup gets fixed later <-- danvet */
		list_move_tail(&i915_gem_obj_to_vma(obj, vm)->mm_list, &vm->active_list);
830
		i915_gem_object_move_to_active(obj, ring);
831 832
		if (obj->base.write_domain) {
			obj->dirty = 1;
833
			obj->last_write_seqno = intel_ring_get_seqno(ring);
834
			if (obj->pin_count) /* check for potential scanout */
835
				intel_mark_fb_busy(obj, ring);
836 837
		}

C
Chris Wilson 已提交
838
		trace_i915_gem_object_change_domain(obj, old_read, old_write);
839 840 841
	}
}

842 843
static void
i915_gem_execbuffer_retire_commands(struct drm_device *dev,
844
				    struct drm_file *file,
845 846
				    struct intel_ring_buffer *ring,
				    struct drm_i915_gem_object *obj)
847
{
848 849
	/* Unconditionally force add_request to emit a full flush. */
	ring->gpu_caches_dirty = true;
850

851
	/* Add a breadcrumb for the completion of the batch buffer */
852
	(void)__i915_add_request(ring, file, obj, NULL);
853
}
854

855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879
static int
i915_reset_gen7_sol_offsets(struct drm_device *dev,
			    struct intel_ring_buffer *ring)
{
	drm_i915_private_t *dev_priv = dev->dev_private;
	int ret, i;

	if (!IS_GEN7(dev) || ring != &dev_priv->ring[RCS])
		return 0;

	ret = intel_ring_begin(ring, 4 * 3);
	if (ret)
		return ret;

	for (i = 0; i < 4; i++) {
		intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1));
		intel_ring_emit(ring, GEN7_SO_WRITE_OFFSET(i));
		intel_ring_emit(ring, 0);
	}

	intel_ring_advance(ring);

	return 0;
}

880 881 882 883
static int
i915_gem_do_execbuffer(struct drm_device *dev, void *data,
		       struct drm_file *file,
		       struct drm_i915_gem_execbuffer2 *args,
884 885
		       struct drm_i915_gem_exec_object2 *exec,
		       struct i915_address_space *vm)
886 887
{
	drm_i915_private_t *dev_priv = dev->dev_private;
888
	struct eb_objects *eb;
889 890 891
	struct drm_i915_gem_object *batch_obj;
	struct drm_clip_rect *cliprects = NULL;
	struct intel_ring_buffer *ring;
892
	u32 ctx_id = i915_execbuffer2_get_context_id(*args);
893
	u32 exec_start, exec_len;
894
	u32 mask, flags;
895
	int ret, mode, i;
896
	bool need_relocs;
897

898
	if (!i915_gem_check_execbuffer(args))
899 900 901
		return -EINVAL;

	ret = validate_exec_list(exec, args->buffer_count);
902 903 904
	if (ret)
		return ret;

905 906 907 908 909 910 911
	flags = 0;
	if (args->flags & I915_EXEC_SECURE) {
		if (!file->is_master || !capable(CAP_SYS_ADMIN))
		    return -EPERM;

		flags |= I915_DISPATCH_SECURE;
	}
912 913
	if (args->flags & I915_EXEC_IS_PINNED)
		flags |= I915_DISPATCH_PINNED;
914

915 916 917
	switch (args->flags & I915_EXEC_RING_MASK) {
	case I915_EXEC_DEFAULT:
	case I915_EXEC_RENDER:
918
		ring = &dev_priv->ring[RCS];
919 920
		break;
	case I915_EXEC_BSD:
921
		ring = &dev_priv->ring[VCS];
922
		if (ctx_id != DEFAULT_CONTEXT_ID) {
923 924 925 926
			DRM_DEBUG("Ring %s doesn't support contexts\n",
				  ring->name);
			return -EPERM;
		}
927 928
		break;
	case I915_EXEC_BLT:
929
		ring = &dev_priv->ring[BCS];
930
		if (ctx_id != DEFAULT_CONTEXT_ID) {
931 932 933 934
			DRM_DEBUG("Ring %s doesn't support contexts\n",
				  ring->name);
			return -EPERM;
		}
935
		break;
936 937
	case I915_EXEC_VEBOX:
		ring = &dev_priv->ring[VECS];
938
		if (ctx_id != DEFAULT_CONTEXT_ID) {
939 940 941 942 943 944
			DRM_DEBUG("Ring %s doesn't support contexts\n",
				  ring->name);
			return -EPERM;
		}
		break;

945
	default:
946
		DRM_DEBUG("execbuf with unknown ring: %d\n",
947 948 949
			  (int)(args->flags & I915_EXEC_RING_MASK));
		return -EINVAL;
	}
950 951 952 953 954
	if (!intel_ring_initialized(ring)) {
		DRM_DEBUG("execbuf with invalid ring: %d\n",
			  (int)(args->flags & I915_EXEC_RING_MASK));
		return -EINVAL;
	}
955

956
	mode = args->flags & I915_EXEC_CONSTANTS_MASK;
957
	mask = I915_EXEC_CONSTANTS_MASK;
958 959 960 961 962 963 964 965 966 967 968 969
	switch (mode) {
	case I915_EXEC_CONSTANTS_REL_GENERAL:
	case I915_EXEC_CONSTANTS_ABSOLUTE:
	case I915_EXEC_CONSTANTS_REL_SURFACE:
		if (ring == &dev_priv->ring[RCS] &&
		    mode != dev_priv->relative_constants_mode) {
			if (INTEL_INFO(dev)->gen < 4)
				return -EINVAL;

			if (INTEL_INFO(dev)->gen > 5 &&
			    mode == I915_EXEC_CONSTANTS_REL_SURFACE)
				return -EINVAL;
970 971 972 973

			/* The HW changed the meaning on this bit on gen6 */
			if (INTEL_INFO(dev)->gen >= 6)
				mask &= ~I915_EXEC_CONSTANTS_REL_SURFACE;
974 975 976
		}
		break;
	default:
977
		DRM_DEBUG("execbuf with unknown constants: %d\n", mode);
978 979 980
		return -EINVAL;
	}

981
	if (args->buffer_count < 1) {
982
		DRM_DEBUG("execbuf with %d buffers\n", args->buffer_count);
983 984 985 986
		return -EINVAL;
	}

	if (args->num_cliprects != 0) {
987
		if (ring != &dev_priv->ring[RCS]) {
988
			DRM_DEBUG("clip rectangles are only valid with the render ring\n");
989 990 991
			return -EINVAL;
		}

992 993 994 995 996
		if (INTEL_INFO(dev)->gen >= 5) {
			DRM_DEBUG("clip rectangles are only valid on pre-gen5\n");
			return -EINVAL;
		}

997 998 999 1000 1001
		if (args->num_cliprects > UINT_MAX / sizeof(*cliprects)) {
			DRM_DEBUG("execbuf with %u cliprects\n",
				  args->num_cliprects);
			return -EINVAL;
		}
1002

1003
		cliprects = kmalloc(args->num_cliprects * sizeof(*cliprects),
1004 1005 1006 1007 1008 1009
				    GFP_KERNEL);
		if (cliprects == NULL) {
			ret = -ENOMEM;
			goto pre_mutex_err;
		}

1010
		if (copy_from_user(cliprects,
V
Ville Syrjälä 已提交
1011 1012
				   to_user_ptr(args->cliprects_ptr),
				   sizeof(*cliprects)*args->num_cliprects)) {
1013 1014 1015 1016 1017 1018 1019 1020 1021
			ret = -EFAULT;
			goto pre_mutex_err;
		}
	}

	ret = i915_mutex_lock_interruptible(dev);
	if (ret)
		goto pre_mutex_err;

1022
	if (dev_priv->ums.mm_suspended) {
1023 1024 1025 1026 1027
		mutex_unlock(&dev->struct_mutex);
		ret = -EBUSY;
		goto pre_mutex_err;
	}

1028
	eb = eb_create(args);
1029 1030 1031 1032 1033 1034
	if (eb == NULL) {
		mutex_unlock(&dev->struct_mutex);
		ret = -ENOMEM;
		goto pre_mutex_err;
	}

1035
	/* Look up object handles */
1036
	ret = eb_lookup_objects(eb, exec, args, file);
1037 1038
	if (ret)
		goto err;
1039

1040
	/* take note of the batch buffer before we might reorder the lists */
1041
	batch_obj = list_entry(eb->objects.prev,
1042 1043 1044
			       struct drm_i915_gem_object,
			       exec_list);

1045
	/* Move the objects en-masse into the GTT, evicting if necessary. */
1046
	need_relocs = (args->flags & I915_EXEC_NO_RELOC) == 0;
1047
	ret = i915_gem_execbuffer_reserve(ring, &eb->objects, vm, &need_relocs);
1048 1049 1050 1051
	if (ret)
		goto err;

	/* The objects are in their final locations, apply the relocations. */
1052
	if (need_relocs)
1053
		ret = i915_gem_execbuffer_relocate(eb, vm);
1054 1055
	if (ret) {
		if (ret == -EFAULT) {
1056
			ret = i915_gem_execbuffer_relocate_slow(dev, args, file, ring,
1057
								eb, exec, vm);
1058 1059 1060 1061 1062 1063 1064 1065
			BUG_ON(!mutex_is_locked(&dev->struct_mutex));
		}
		if (ret)
			goto err;
	}

	/* Set the pending read domains for the batch buffer to COMMAND */
	if (batch_obj->base.pending_write_domain) {
1066
		DRM_DEBUG("Attempting to use self-modifying batch buffer\n");
1067 1068 1069 1070 1071
		ret = -EINVAL;
		goto err;
	}
	batch_obj->base.pending_read_domains |= I915_GEM_DOMAIN_COMMAND;

1072 1073 1074 1075 1076 1077 1078
	/* snb/ivb/vlv conflate the "batch in ppgtt" bit with the "non-secure
	 * batch" bit. Hence we need to pin secure batches into the global gtt.
	 * hsw should have this fixed, but let's be paranoid and do it
	 * unconditionally for now. */
	if (flags & I915_DISPATCH_SECURE && !batch_obj->has_global_gtt_mapping)
		i915_gem_gtt_bind_object(batch_obj, batch_obj->cache_level);

1079
	ret = i915_gem_execbuffer_move_to_gpu(ring, &eb->objects);
1080
	if (ret)
1081 1082
		goto err;

1083 1084 1085 1086
	ret = i915_switch_context(ring, file, ctx_id);
	if (ret)
		goto err;

1087 1088 1089 1090 1091 1092 1093 1094 1095
	if (ring == &dev_priv->ring[RCS] &&
	    mode != dev_priv->relative_constants_mode) {
		ret = intel_ring_begin(ring, 4);
		if (ret)
				goto err;

		intel_ring_emit(ring, MI_NOOP);
		intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1));
		intel_ring_emit(ring, INSTPM);
1096
		intel_ring_emit(ring, mask << 16 | mode);
1097 1098 1099 1100 1101
		intel_ring_advance(ring);

		dev_priv->relative_constants_mode = mode;
	}

1102 1103 1104 1105 1106 1107
	if (args->flags & I915_EXEC_GEN7_SOL_RESET) {
		ret = i915_reset_gen7_sol_offsets(dev, ring);
		if (ret)
			goto err;
	}

1108 1109
	exec_start = i915_gem_obj_offset(batch_obj, vm) +
		args->batch_start_offset;
1110 1111 1112 1113 1114 1115 1116 1117 1118
	exec_len = args->batch_len;
	if (cliprects) {
		for (i = 0; i < args->num_cliprects; i++) {
			ret = i915_emit_box(dev, &cliprects[i],
					    args->DR1, args->DR4);
			if (ret)
				goto err;

			ret = ring->dispatch_execbuffer(ring,
1119 1120
							exec_start, exec_len,
							flags);
1121 1122 1123 1124
			if (ret)
				goto err;
		}
	} else {
1125 1126 1127
		ret = ring->dispatch_execbuffer(ring,
						exec_start, exec_len,
						flags);
1128 1129 1130
		if (ret)
			goto err;
	}
1131

1132 1133
	trace_i915_gem_ring_dispatch(ring, intel_ring_get_seqno(ring), flags);

1134
	i915_gem_execbuffer_move_to_active(&eb->objects, vm, ring);
1135
	i915_gem_execbuffer_retire_commands(dev, file, ring, batch_obj);
1136 1137

err:
1138
	eb_destroy(eb);
1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154

	mutex_unlock(&dev->struct_mutex);

pre_mutex_err:
	kfree(cliprects);
	return ret;
}

/*
 * Legacy execbuffer just creates an exec2 list from the original exec object
 * list array and passes it to the real function.
 */
int
i915_gem_execbuffer(struct drm_device *dev, void *data,
		    struct drm_file *file)
{
1155
	struct drm_i915_private *dev_priv = dev->dev_private;
1156 1157 1158 1159 1160 1161 1162
	struct drm_i915_gem_execbuffer *args = data;
	struct drm_i915_gem_execbuffer2 exec2;
	struct drm_i915_gem_exec_object *exec_list = NULL;
	struct drm_i915_gem_exec_object2 *exec2_list = NULL;
	int ret, i;

	if (args->buffer_count < 1) {
1163
		DRM_DEBUG("execbuf with %d buffers\n", args->buffer_count);
1164 1165 1166 1167 1168 1169 1170
		return -EINVAL;
	}

	/* Copy in the exec list from userland */
	exec_list = drm_malloc_ab(sizeof(*exec_list), args->buffer_count);
	exec2_list = drm_malloc_ab(sizeof(*exec2_list), args->buffer_count);
	if (exec_list == NULL || exec2_list == NULL) {
1171
		DRM_DEBUG("Failed to allocate exec list for %d buffers\n",
1172 1173 1174 1175 1176 1177
			  args->buffer_count);
		drm_free_large(exec_list);
		drm_free_large(exec2_list);
		return -ENOMEM;
	}
	ret = copy_from_user(exec_list,
V
Ville Syrjälä 已提交
1178
			     to_user_ptr(args->buffers_ptr),
1179 1180
			     sizeof(*exec_list) * args->buffer_count);
	if (ret != 0) {
1181
		DRM_DEBUG("copy %d exec entries failed %d\n",
1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208
			  args->buffer_count, ret);
		drm_free_large(exec_list);
		drm_free_large(exec2_list);
		return -EFAULT;
	}

	for (i = 0; i < args->buffer_count; i++) {
		exec2_list[i].handle = exec_list[i].handle;
		exec2_list[i].relocation_count = exec_list[i].relocation_count;
		exec2_list[i].relocs_ptr = exec_list[i].relocs_ptr;
		exec2_list[i].alignment = exec_list[i].alignment;
		exec2_list[i].offset = exec_list[i].offset;
		if (INTEL_INFO(dev)->gen < 4)
			exec2_list[i].flags = EXEC_OBJECT_NEEDS_FENCE;
		else
			exec2_list[i].flags = 0;
	}

	exec2.buffers_ptr = args->buffers_ptr;
	exec2.buffer_count = args->buffer_count;
	exec2.batch_start_offset = args->batch_start_offset;
	exec2.batch_len = args->batch_len;
	exec2.DR1 = args->DR1;
	exec2.DR4 = args->DR4;
	exec2.num_cliprects = args->num_cliprects;
	exec2.cliprects_ptr = args->cliprects_ptr;
	exec2.flags = I915_EXEC_RENDER;
1209
	i915_execbuffer2_set_context_id(exec2, 0);
1210

1211 1212
	ret = i915_gem_do_execbuffer(dev, data, file, &exec2, exec2_list,
				     &dev_priv->gtt.base);
1213 1214 1215 1216 1217
	if (!ret) {
		/* Copy the new buffer offsets back to the user's exec list. */
		for (i = 0; i < args->buffer_count; i++)
			exec_list[i].offset = exec2_list[i].offset;
		/* ... and back out to userspace */
V
Ville Syrjälä 已提交
1218
		ret = copy_to_user(to_user_ptr(args->buffers_ptr),
1219 1220 1221 1222
				   exec_list,
				   sizeof(*exec_list) * args->buffer_count);
		if (ret) {
			ret = -EFAULT;
1223
			DRM_DEBUG("failed to copy %d exec entries "
1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237
				  "back to user (%d)\n",
				  args->buffer_count, ret);
		}
	}

	drm_free_large(exec_list);
	drm_free_large(exec2_list);
	return ret;
}

int
i915_gem_execbuffer2(struct drm_device *dev, void *data,
		     struct drm_file *file)
{
1238
	struct drm_i915_private *dev_priv = dev->dev_private;
1239 1240 1241 1242
	struct drm_i915_gem_execbuffer2 *args = data;
	struct drm_i915_gem_exec_object2 *exec2_list = NULL;
	int ret;

1243 1244
	if (args->buffer_count < 1 ||
	    args->buffer_count > UINT_MAX / sizeof(*exec2_list)) {
1245
		DRM_DEBUG("execbuf2 with %d buffers\n", args->buffer_count);
1246 1247 1248
		return -EINVAL;
	}

1249
	exec2_list = kmalloc(sizeof(*exec2_list)*args->buffer_count,
1250
			     GFP_TEMPORARY | __GFP_NOWARN | __GFP_NORETRY);
1251 1252 1253
	if (exec2_list == NULL)
		exec2_list = drm_malloc_ab(sizeof(*exec2_list),
					   args->buffer_count);
1254
	if (exec2_list == NULL) {
1255
		DRM_DEBUG("Failed to allocate exec list for %d buffers\n",
1256 1257 1258 1259
			  args->buffer_count);
		return -ENOMEM;
	}
	ret = copy_from_user(exec2_list,
V
Ville Syrjälä 已提交
1260
			     to_user_ptr(args->buffers_ptr),
1261 1262
			     sizeof(*exec2_list) * args->buffer_count);
	if (ret != 0) {
1263
		DRM_DEBUG("copy %d exec entries failed %d\n",
1264 1265 1266 1267 1268
			  args->buffer_count, ret);
		drm_free_large(exec2_list);
		return -EFAULT;
	}

1269 1270
	ret = i915_gem_do_execbuffer(dev, data, file, args, exec2_list,
				     &dev_priv->gtt.base);
1271 1272
	if (!ret) {
		/* Copy the new buffer offsets back to the user's exec list. */
V
Ville Syrjälä 已提交
1273
		ret = copy_to_user(to_user_ptr(args->buffers_ptr),
1274 1275 1276 1277
				   exec2_list,
				   sizeof(*exec2_list) * args->buffer_count);
		if (ret) {
			ret = -EFAULT;
1278
			DRM_DEBUG("failed to copy %d exec entries "
1279 1280 1281 1282 1283 1284 1285 1286
				  "back to user (%d)\n",
				  args->buffer_count, ret);
		}
	}

	drm_free_large(exec2_list);
	return ret;
}