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 1088 } 1089 1089 1090 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 1091 1104 i915_gem_object_get_page_list(struct drm_gem_object *obj) 1092 1105 { 1093 1106 struct drm_i915_gem_object *obj_priv = obj->driver_private; ··· 1186 1173 1187 1174 ret = i915_gem_evict_something(dev); 1188 1175 if (ret != 0) { 1189 - DRM_ERROR("Failed to evict a buffer %d\n", ret); 1176 + if (ret != -ERESTARTSYS) 1177 + DRM_ERROR("Failed to evict a buffer %d\n", ret); 1190 1178 return ret; 1191 1179 } 1192 1180 goto search_free; ··· 1936 1922 int ret, i, pinned = 0; 1937 1923 uint64_t exec_offset; 1938 1924 uint32_t seqno, flush_domains; 1925 + int pin_tries; 1939 1926 1940 1927 #if WATCH_EXEC 1941 1928 DRM_INFO("buffers_ptr %d buffer_count %d len %08x\n", ··· 1985 1970 return -EBUSY; 1986 1971 } 1987 1972 1988 - /* Look up object handles and perform the relocations */ 1973 + /* Look up object handles */ 1989 1974 for (i = 0; i < args->buffer_count; i++) { 1990 1975 object_list[i] = drm_gem_object_lookup(dev, file_priv, 1991 1976 exec_list[i].handle); ··· 1995 1980 ret = -EBADF; 1996 1981 goto err; 1997 1982 } 1983 + } 1998 1984 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); 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); 2006 2005 goto err; 2007 2006 } 2008 - pinned = i + 1; 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; 2009 2016 } 2010 2017 2011 2018 /* Set the pending read domains for the batch buffer to COMMAND */