| From 6e7eb1783be7f19eb071c96ddda0bbf22279ff46 Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?Micha=C5=82=20Winiarski?= <michal.winiarski@intel.com> |
| Date: Tue, 7 Feb 2017 20:55:59 +0100 |
| Subject: drm/i915: Always convert incoming exec offsets to non-canonical |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Michał Winiarski <michal.winiarski@intel.com> |
| |
| commit 6e7eb1783be7f19eb071c96ddda0bbf22279ff46 upstream. |
| |
| We're using non-canonical addresses in drm_mm, and we're making sure that |
| userspace is using canonical addressing - both in case of softpin |
| (verifying incoming offset) and when relocating (converting to canonical |
| when updating offset returned to userspace). |
| Unfortunately when considering the need for relocations, we're comparing |
| offset from userspace (in canonical form) with drm_mm node (in |
| non-canonical form), and as a result, we end up always relocating if our |
| offsets are in the "problematic" range. |
| Let's always convert the offsets to avoid the performance impact of |
| relocations. |
| |
| Fixes: a5f0edf63bdf ("drm/i915: Avoid writing relocs with addresses in non-canonical form") |
| Cc: Chris Wilson <chris@chris-wilson.co.uk> |
| Cc: Michel Thierry <michel.thierry@intel.com> |
| Reported-by: Michał Pyrzowski <michal.pyrzowski@intel.com> |
| Signed-off-by: Michał Winiarski <michal.winiarski@intel.com> |
| Link: http://patchwork.freedesktop.org/patch/msgid/20170207195559.18798-1-michal.winiarski@intel.com |
| Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> |
| Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> |
| (cherry picked from commit 038c95a313e4ca954ee5ab8a0c7559a646b0f462) |
| Signed-off-by: Jani Nikula <jani.nikula@intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/gpu/drm/i915/i915_gem_execbuffer.c | 12 ++++++------ |
| 1 file changed, 6 insertions(+), 6 deletions(-) |
| |
| --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c |
| +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c |
| @@ -1215,14 +1215,14 @@ validate_exec_list(struct drm_device *de |
| if (exec[i].offset != |
| gen8_canonical_addr(exec[i].offset & PAGE_MASK)) |
| return -EINVAL; |
| - |
| - /* From drm_mm perspective address space is continuous, |
| - * so from this point we're always using non-canonical |
| - * form internally. |
| - */ |
| - exec[i].offset = gen8_noncanonical_addr(exec[i].offset); |
| } |
| |
| + /* From drm_mm perspective address space is continuous, |
| + * so from this point we're always using non-canonical |
| + * form internally. |
| + */ |
| + exec[i].offset = gen8_noncanonical_addr(exec[i].offset); |
| + |
| if (exec[i].alignment && !is_power_of_2(exec[i].alignment)) |
| return -EINVAL; |
| |