drm/nouveau: use interruptible waits during pushbuf validation
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
@@ -299,13 +299,14 @@ retry:
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = ttm_bo_reserve(&nvbo->bo, false, false, true, sequence);
|
ret = ttm_bo_reserve(&nvbo->bo, true, false, true, sequence);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
validate_fini(op, NULL);
|
validate_fini(op, NULL);
|
||||||
if (ret == -EAGAIN)
|
if (unlikely(ret == -EAGAIN))
|
||||||
ret = ttm_bo_wait_unreserved(&nvbo->bo, false);
|
ret = ttm_bo_wait_unreserved(&nvbo->bo, true);
|
||||||
drm_gem_object_unreference_unlocked(gem);
|
drm_gem_object_unreference_unlocked(gem);
|
||||||
if (ret) {
|
if (unlikely(ret)) {
|
||||||
|
if (ret != -ERESTARTSYS)
|
||||||
NV_ERROR(dev, "fail reserve\n");
|
NV_ERROR(dev, "fail reserve\n");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -365,9 +366,10 @@ validate_list(struct nouveau_channel *chan, struct list_head *list,
|
|||||||
|
|
||||||
nvbo->channel = (b->read_domains & (1 << 31)) ? NULL : chan;
|
nvbo->channel = (b->read_domains & (1 << 31)) ? NULL : chan;
|
||||||
ret = ttm_bo_validate(&nvbo->bo, &nvbo->placement,
|
ret = ttm_bo_validate(&nvbo->bo, &nvbo->placement,
|
||||||
false, false, false);
|
true, false, false);
|
||||||
nvbo->channel = NULL;
|
nvbo->channel = NULL;
|
||||||
if (unlikely(ret)) {
|
if (unlikely(ret)) {
|
||||||
|
if (ret != -ERESTARTSYS)
|
||||||
NV_ERROR(dev, "fail ttm_validate\n");
|
NV_ERROR(dev, "fail ttm_validate\n");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -420,12 +422,14 @@ nouveau_gem_pushbuf_validate(struct nouveau_channel *chan,
|
|||||||
|
|
||||||
ret = validate_init(chan, file_priv, pbbo, nr_buffers, op);
|
ret = validate_init(chan, file_priv, pbbo, nr_buffers, op);
|
||||||
if (unlikely(ret)) {
|
if (unlikely(ret)) {
|
||||||
|
if (ret != -ERESTARTSYS)
|
||||||
NV_ERROR(dev, "validate_init\n");
|
NV_ERROR(dev, "validate_init\n");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = validate_list(chan, &op->vram_list, pbbo, user_buffers);
|
ret = validate_list(chan, &op->vram_list, pbbo, user_buffers);
|
||||||
if (unlikely(ret < 0)) {
|
if (unlikely(ret < 0)) {
|
||||||
|
if (ret != -ERESTARTSYS)
|
||||||
NV_ERROR(dev, "validate vram_list\n");
|
NV_ERROR(dev, "validate vram_list\n");
|
||||||
validate_fini(op, NULL);
|
validate_fini(op, NULL);
|
||||||
return ret;
|
return ret;
|
||||||
@@ -434,6 +438,7 @@ nouveau_gem_pushbuf_validate(struct nouveau_channel *chan,
|
|||||||
|
|
||||||
ret = validate_list(chan, &op->gart_list, pbbo, user_buffers);
|
ret = validate_list(chan, &op->gart_list, pbbo, user_buffers);
|
||||||
if (unlikely(ret < 0)) {
|
if (unlikely(ret < 0)) {
|
||||||
|
if (ret != -ERESTARTSYS)
|
||||||
NV_ERROR(dev, "validate gart_list\n");
|
NV_ERROR(dev, "validate gart_list\n");
|
||||||
validate_fini(op, NULL);
|
validate_fini(op, NULL);
|
||||||
return ret;
|
return ret;
|
||||||
@@ -442,6 +447,7 @@ nouveau_gem_pushbuf_validate(struct nouveau_channel *chan,
|
|||||||
|
|
||||||
ret = validate_list(chan, &op->both_list, pbbo, user_buffers);
|
ret = validate_list(chan, &op->both_list, pbbo, user_buffers);
|
||||||
if (unlikely(ret < 0)) {
|
if (unlikely(ret < 0)) {
|
||||||
|
if (ret != -ERESTARTSYS)
|
||||||
NV_ERROR(dev, "validate both_list\n");
|
NV_ERROR(dev, "validate both_list\n");
|
||||||
validate_fini(op, NULL);
|
validate_fini(op, NULL);
|
||||||
return ret;
|
return ret;
|
||||||
@@ -628,6 +634,7 @@ nouveau_gem_ioctl_pushbuf(struct drm_device *dev, void *data,
|
|||||||
ret = nouveau_gem_pushbuf_validate(chan, file_priv, bo, req->buffers,
|
ret = nouveau_gem_pushbuf_validate(chan, file_priv, bo, req->buffers,
|
||||||
req->nr_buffers, &op, &do_reloc);
|
req->nr_buffers, &op, &do_reloc);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
if (ret != -ERESTARTSYS)
|
||||||
NV_ERROR(dev, "validate: %d\n", ret);
|
NV_ERROR(dev, "validate: %d\n", ret);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user