drm/i915: Retry execbuffer pinning after clearing the GTT

If we fail to pin all of the buffers in an execbuffer request, go through
and clear the GTT and try again to see if its just a matter of fragmentation

Signed-off-by: Keith Packard <keithp@keithp.com>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>

authored by

Keith Packard and committed by
Dave Airlie
ac94a962 646f0f6e

+47 -10
+47 -10
drivers/gpu/drm/i915/i915_gem.c
··· 1088 } 1089 1090 static int 1091 i915_gem_object_get_page_list(struct drm_gem_object *obj) 1092 { 1093 struct drm_i915_gem_object *obj_priv = obj->driver_private; ··· 1186 1187 ret = i915_gem_evict_something(dev); 1188 if (ret != 0) { 1189 - DRM_ERROR("Failed to evict a buffer %d\n", ret); 1190 return ret; 1191 } 1192 goto search_free; ··· 1936 int ret, i, pinned = 0; 1937 uint64_t exec_offset; 1938 uint32_t seqno, flush_domains; 1939 1940 #if WATCH_EXEC 1941 DRM_INFO("buffers_ptr %d buffer_count %d len %08x\n", ··· 1985 return -EBUSY; 1986 } 1987 1988 - /* Look up object handles and perform the relocations */ 1989 for (i = 0; i < args->buffer_count; i++) { 1990 object_list[i] = drm_gem_object_lookup(dev, file_priv, 1991 exec_list[i].handle); ··· 1995 ret = -EBADF; 1996 goto err; 1997 } 1998 1999 - object_list[i]->pending_read_domains = 0; 2000 - object_list[i]->pending_write_domain = 0; 2001 - ret = i915_gem_object_pin_and_relocate(object_list[i], 2002 - file_priv, 2003 - &exec_list[i]); 2004 - if (ret) { 2005 - DRM_ERROR("object bind and relocate failed %d\n", ret); 2006 goto err; 2007 } 2008 - pinned = i + 1; 2009 } 2010 2011 /* Set the pending read domains for the batch buffer to COMMAND */
··· 1088 } 1089 1090 static int 1091 + i915_gem_evict_everything(struct drm_device *dev) 1092 + { 1093 + int ret; 1094 + 1095 + for (;;) { 1096 + ret = i915_gem_evict_something(dev); 1097 + if (ret != 0) 1098 + break; 1099 + } 1100 + return ret; 1101 + } 1102 + 1103 + static int 1104 i915_gem_object_get_page_list(struct drm_gem_object *obj) 1105 { 1106 struct drm_i915_gem_object *obj_priv = obj->driver_private; ··· 1173 1174 ret = i915_gem_evict_something(dev); 1175 if (ret != 0) { 1176 + if (ret != -ERESTARTSYS) 1177 + DRM_ERROR("Failed to evict a buffer %d\n", ret); 1178 return ret; 1179 } 1180 goto search_free; ··· 1922 int ret, i, pinned = 0; 1923 uint64_t exec_offset; 1924 uint32_t seqno, flush_domains; 1925 + int pin_tries; 1926 1927 #if WATCH_EXEC 1928 DRM_INFO("buffers_ptr %d buffer_count %d len %08x\n", ··· 1970 return -EBUSY; 1971 } 1972 1973 + /* Look up object handles */ 1974 for (i = 0; i < args->buffer_count; i++) { 1975 object_list[i] = drm_gem_object_lookup(dev, file_priv, 1976 exec_list[i].handle); ··· 1980 ret = -EBADF; 1981 goto err; 1982 } 1983 + } 1984 1985 + /* Pin and relocate */ 1986 + for (pin_tries = 0; ; pin_tries++) { 1987 + ret = 0; 1988 + for (i = 0; i < args->buffer_count; i++) { 1989 + object_list[i]->pending_read_domains = 0; 1990 + object_list[i]->pending_write_domain = 0; 1991 + ret = i915_gem_object_pin_and_relocate(object_list[i], 1992 + file_priv, 1993 + &exec_list[i]); 1994 + if (ret) 1995 + break; 1996 + pinned = i + 1; 1997 + } 1998 + /* success */ 1999 + if (ret == 0) 2000 + break; 2001 + 2002 + /* error other than GTT full, or we've already tried again */ 2003 + if (ret != -ENOMEM || pin_tries >= 1) { 2004 + DRM_ERROR("Failed to pin buffers %d\n", ret); 2005 goto err; 2006 } 2007 + 2008 + /* unpin all of our buffers */ 2009 + for (i = 0; i < pinned; i++) 2010 + i915_gem_object_unpin(object_list[i]); 2011 + 2012 + /* evict everyone we can from the aperture */ 2013 + ret = i915_gem_evict_everything(dev); 2014 + if (ret) 2015 + goto err; 2016 } 2017 2018 /* Set the pending read domains for the batch buffer to COMMAND */