From patchwork Thu Mar 11 22:19:56 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Owain Ainsworth X-Patchwork-Id: 85131 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by demeter.kernel.org (8.14.3/8.14.3) with ESMTP id o2BMK7fu027943 for ; Thu, 11 Mar 2010 22:20:43 GMT Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id B67969E801; Thu, 11 Mar 2010 14:20:06 -0800 (PST) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mail-bw0-f215.google.com (mail-bw0-f215.google.com [209.85.218.215]) by gabe.freedesktop.org (Postfix) with ESMTP id 42A629E7FE for ; Thu, 11 Mar 2010 14:20:03 -0800 (PST) Received: by bwz7 with SMTP id 7so464939bwz.24 for ; Thu, 11 Mar 2010 14:20:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=gamma; h=domainkey-signature:received:received:received:from:to:cc:subject :date:message-id:x-mailer:in-reply-to:references; bh=5deSXfUQTFHRJ5Hj/Sxim5rGCb5oUjKz4TRApiD7cPY=; b=RfApOSwXo2x5BQryMSY7k2un/L3F3jX8tWQgAJmt92OORuhA4iUd48RCxCjF3r5aaM K5PGCjCijBAbXaacMrv9bgP03K/MqDLcquQVb5Du2jO1dK3TYxHN1sj2XWO9ocEZ+lEE nCNb08cMwUFHmvfEATOAfPp+edv8zod/7HlmU= DomainKey-Signature: a=rsa-sha1; c=nofws; d=googlemail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; b=rzcRw9adxMLxCNXeFlEpVUdbqy7aIF7Pr77iHy81MCGiUU7lnsTKCpAgl/zVL5xwR5 ghufzkKTiAiJAQQZ6PthcUNgAqH8oHUuIyjKBNOXcOqpi9p64fZhfBIc6Z2BYZ8kHRpP W3R4QLzhD+AsqmOX6mGy0axLWJqR+KPp7j3QU= Received: by 10.204.152.218 with SMTP id h26mr107977bkw.113.1268346001653; Thu, 11 Mar 2010 14:20:01 -0800 (PST) Received: from stephanie.nicotinebsd.org (ns1.nicotinebsd.org [93.97.176.184]) by mx.google.com with ESMTPS id s17sm1861651bkd.16.2010.03.11.14.20.00 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 11 Mar 2010 14:20:01 -0800 (PST) Received: from localhost (1000@localhost [IPv6:::1]) by stephanie.nicotinebsd.org (OpenSMTPD) with ESMTP id 1268345999.f97NNYPlL30LnYXh; Thu, 11 Mar 2010 22:19:59 +0000 (GMT) From: "Owain G. Ainsworth" To: intel-gfx@lists.freedesktop.org Date: Thu, 11 Mar 2010 22:19:56 +0000 Message-Id: <1268345996-21989-1-git-send-email-oga@openbsd.org> X-Mailer: git-send-email 1.6.5.7 In-Reply-To: <89k304@orsmga001.jf.intel.com> References: <89k304@orsmga001.jf.intel.com> Cc: "Owain G. Ainsworth" Subject: [Intel-gfx] [PATCH] drm/i915: check execbuffer for validity earlier to save on work. X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.11 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: intel-gfx-bounces@lists.freedesktop.org Errors-To: intel-gfx-bounces@lists.freedesktop.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Thu, 11 Mar 2010 22:20:43 +0000 (UTC) diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index e52a277..aa21ce1 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -3653,23 +3653,6 @@ err: return ret; } -static int -i915_gem_check_execbuffer (struct drm_i915_gem_execbuffer2 *exec, - uint64_t exec_offset) -{ - uint32_t exec_start, exec_len; - - exec_start = (uint32_t) exec_offset + exec->batch_start_offset; - exec_len = (uint32_t) exec->batch_len; - - if ((exec_start | exec_len) & 0x7) - return -EINVAL; - - if (!exec_start) - return -EINVAL; - - return 0; -} static int i915_gem_wait_for_pending_flip(struct drm_device *dev, @@ -3719,7 +3702,6 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data, struct drm_clip_rect *cliprects = NULL; struct drm_i915_gem_relocation_entry *relocs = NULL; int ret = 0, ret2, i, pinned = 0; - uint64_t exec_offset; uint32_t seqno, flush_domains, reloc_index; int pin_tries, flips; @@ -3727,6 +3709,13 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data, DRM_INFO("buffers_ptr %d buffer_count %d len %08x\n", (int) args->buffers_ptr, args->buffer_count, args->batch_len); #endif + /* + * check for valid execbuffer offset. We can do this early because + * bound objects are always page aligned, so only the start offset + * matters. + */ + if ((args->batch_start_offset | args->batch_len) & 0x7) + return -EINVAL; if (args->buffer_count < 1) { DRM_ERROR("execbuf with %d buffers\n", args->buffer_count); @@ -3875,16 +3864,13 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data, ret = -EINVAL; goto err; } - batch_obj->pending_read_domains |= I915_GEM_DOMAIN_COMMAND; - - /* Sanity check the batch buffer, prior to moving objects */ - exec_offset = exec_list[args->buffer_count - 1].offset; - ret = i915_gem_check_execbuffer (args, exec_offset); - if (ret != 0) { - DRM_ERROR("execbuf with invalid offset/length\n"); + if (args->batch_start_offset + args->batch_len > batch_obj->size) { + DRM_ERROR("batchbuffer shorter than program length\n"); + ret = EINVAL; goto err; } + batch_obj->pending_read_domains |= I915_GEM_DOMAIN_COMMAND; i915_verify_inactive(dev, __FILE__, __LINE__); /* Zero the global flush/invalidate flags. These @@ -3952,7 +3939,8 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data, #endif /* Exec the batchbuffer */ - ret = i915_dispatch_gem_execbuffer(dev, args, cliprects, exec_offset); + ret = i915_dispatch_gem_execbuffer(dev, args, cliprects, + exec_list[args->buffer_count - 1].offset); if (ret) { DRM_ERROR("dispatch failed %d\n", ret); goto err;