Avoid large kmallocs.
parent
f13936f7fc
commit
8a18d123f5
|
@ -1181,7 +1181,6 @@ static int i915_handle_copyback(struct drm_device *dev,
|
||||||
buffers++;
|
buffers++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1272,7 +1271,6 @@ static int i915_execbuffer(struct drm_device *dev, void *data,
|
||||||
struct drm_fence_arg *fence_arg = &exec_buf->fence_arg;
|
struct drm_fence_arg *fence_arg = &exec_buf->fence_arg;
|
||||||
int num_buffers;
|
int num_buffers;
|
||||||
int ret;
|
int ret;
|
||||||
struct drm_i915_validate_buffer *buffers;
|
|
||||||
|
|
||||||
if (!dev_priv->allow_batchbuffer) {
|
if (!dev_priv->allow_batchbuffer) {
|
||||||
DRM_ERROR("Batchbuffer ioctl disabled\n");
|
DRM_ERROR("Batchbuffer ioctl disabled\n");
|
||||||
|
@ -1288,7 +1286,6 @@ static int i915_execbuffer(struct drm_device *dev, void *data,
|
||||||
if (exec_buf->num_buffers > dev_priv->max_validate_buffers)
|
if (exec_buf->num_buffers > dev_priv->max_validate_buffers)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
|
||||||
ret = drm_bo_read_lock(&dev->bm.bm_lock);
|
ret = drm_bo_read_lock(&dev->bm.bm_lock);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1306,8 +1303,12 @@ static int i915_execbuffer(struct drm_device *dev, void *data,
|
||||||
|
|
||||||
num_buffers = exec_buf->num_buffers;
|
num_buffers = exec_buf->num_buffers;
|
||||||
|
|
||||||
buffers = drm_calloc(num_buffers, sizeof(struct drm_i915_validate_buffer), DRM_MEM_DRIVER);
|
if (!dev_priv->val_bufs) {
|
||||||
if (!buffers) {
|
dev_priv->val_bufs =
|
||||||
|
vmalloc(sizeof(struct drm_i915_validate_buffer)*
|
||||||
|
dev_priv->max_validate_buffers);
|
||||||
|
}
|
||||||
|
if (!dev_priv->val_bufs) {
|
||||||
drm_bo_read_unlock(&dev->bm.bm_lock);
|
drm_bo_read_unlock(&dev->bm.bm_lock);
|
||||||
mutex_unlock(&dev_priv->cmdbuf_mutex);
|
mutex_unlock(&dev_priv->cmdbuf_mutex);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -1315,7 +1316,7 @@ static int i915_execbuffer(struct drm_device *dev, void *data,
|
||||||
|
|
||||||
/* validate buffer list + fixup relocations */
|
/* validate buffer list + fixup relocations */
|
||||||
ret = i915_validate_buffer_list(file_priv, 0, exec_buf->ops_list,
|
ret = i915_validate_buffer_list(file_priv, 0, exec_buf->ops_list,
|
||||||
buffers, &num_buffers);
|
dev_priv->val_bufs, &num_buffers);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out_err0;
|
goto out_err0;
|
||||||
|
|
||||||
|
@ -1324,7 +1325,7 @@ static int i915_execbuffer(struct drm_device *dev, void *data,
|
||||||
drm_agp_chipset_flush(dev);
|
drm_agp_chipset_flush(dev);
|
||||||
|
|
||||||
/* submit buffer */
|
/* submit buffer */
|
||||||
batch->start = buffers[num_buffers-1].buffer->offset;
|
batch->start = dev_priv->val_bufs[num_buffers-1].buffer->offset;
|
||||||
|
|
||||||
DRM_DEBUG("i915 exec batchbuffer, start %x used %d cliprects %d\n",
|
DRM_DEBUG("i915 exec batchbuffer, start %x used %d cliprects %d\n",
|
||||||
batch->start, batch->used, batch->num_cliprects);
|
batch->start, batch->used, batch->num_cliprects);
|
||||||
|
@ -1341,13 +1342,11 @@ static int i915_execbuffer(struct drm_device *dev, void *data,
|
||||||
out_err0:
|
out_err0:
|
||||||
|
|
||||||
/* handle errors */
|
/* handle errors */
|
||||||
ret = i915_handle_copyback(dev, buffers, num_buffers, ret);
|
ret = i915_handle_copyback(dev, dev_priv->val_bufs, num_buffers, ret);
|
||||||
mutex_lock(&dev->struct_mutex);
|
mutex_lock(&dev->struct_mutex);
|
||||||
i915_dereference_buffers_locked(buffers, num_buffers);
|
i915_dereference_buffers_locked(dev_priv->val_bufs, num_buffers);
|
||||||
mutex_unlock(&dev->struct_mutex);
|
mutex_unlock(&dev->struct_mutex);
|
||||||
|
|
||||||
drm_free(buffers, (exec_buf->num_buffers * sizeof(struct drm_buffer_object *)), DRM_MEM_DRIVER);
|
|
||||||
|
|
||||||
mutex_unlock(&dev_priv->cmdbuf_mutex);
|
mutex_unlock(&dev_priv->cmdbuf_mutex);
|
||||||
drm_bo_read_unlock(&dev->bm.bm_lock);
|
drm_bo_read_unlock(&dev->bm.bm_lock);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1618,6 +1617,13 @@ void i915_driver_lastclose(struct drm_device * dev)
|
||||||
{
|
{
|
||||||
drm_i915_private_t *dev_priv = dev->dev_private;
|
drm_i915_private_t *dev_priv = dev->dev_private;
|
||||||
|
|
||||||
|
#ifdef I915_HAVE_BUFFER
|
||||||
|
if (dev_priv->val_bufs) {
|
||||||
|
vfree(dev_priv->val_bufs);
|
||||||
|
dev_priv->val_bufs = NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (drm_getsarea(dev) && dev_priv->sarea_priv)
|
if (drm_getsarea(dev) && dev_priv->sarea_priv)
|
||||||
i915_do_cleanup_pageflip(dev);
|
i915_do_cleanup_pageflip(dev);
|
||||||
if (dev_priv->agp_heap)
|
if (dev_priv->agp_heap)
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
|
|
||||||
#ifdef I915_HAVE_BUFFER
|
#ifdef I915_HAVE_BUFFER
|
||||||
#define I915_MAX_VALIDATE_BUFFERS 4096
|
#define I915_MAX_VALIDATE_BUFFERS 4096
|
||||||
|
struct drm_i915_validate_buffer;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct _drm_i915_ring_buffer {
|
typedef struct _drm_i915_ring_buffer {
|
||||||
|
@ -141,6 +142,7 @@ typedef struct drm_i915_private {
|
||||||
void *agp_iomap;
|
void *agp_iomap;
|
||||||
unsigned int max_validate_buffers;
|
unsigned int max_validate_buffers;
|
||||||
struct mutex cmdbuf_mutex;
|
struct mutex cmdbuf_mutex;
|
||||||
|
struct drm_i915_validate_buffer *val_bufs;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
DRM_SPINTYPE swaps_lock;
|
DRM_SPINTYPE swaps_lock;
|
||||||
|
|
Loading…
Reference in New Issue