diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2020-01-14 23:34:22 +0300 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2020-01-15 03:50:29 +0300 |
commit | e9602a1bd7e996aca5c231bc07cad41fff9b290b (patch) | |
tree | 037d3fcb14f18ba7158d6cf85f3a1574c0a318e2 | |
parent | f09a3ee36bdc097d197e5188b6d0fd5354ddfa1a (diff) | |
download | linux-e9602a1bd7e996aca5c231bc07cad41fff9b290b.tar.xz |
drm/nouveau/flcn/msgq: simplify msg_queue_pop() error handling
We always want at least requested size, make anything less a more direct
error condition.
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/falcon/msgq.c | 25 |
1 files changed, 7 insertions, 18 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/falcon/msgq.c b/drivers/gpu/drm/nouveau/nvkm/falcon/msgq.c index ea3e7c73e990..15299ff45685 100644 --- a/drivers/gpu/drm/nouveau/nvkm/falcon/msgq.c +++ b/drivers/gpu/drm/nouveau/nvkm/falcon/msgq.c @@ -67,20 +67,14 @@ msg_queue_pop(struct nvkm_msgqueue *priv, struct nvkm_msgqueue_queue *queue, tail = queue->position; available = head - tail; - - if (available == 0) { - nvkm_warn(subdev, "no message data available\n"); - return 0; - } - if (size > available) { nvkm_warn(subdev, "message data smaller than read request\n"); - size = available; + return -EINVAL; } nvkm_falcon_read_dmem(priv->falcon, tail, size, 0, data); queue->position += ALIGN(size, QUEUE_ALIGNMENT); - return size; + return 0; } static int @@ -88,19 +82,15 @@ msg_queue_read(struct nvkm_msgqueue *priv, struct nvkm_msgqueue_queue *queue, struct nv_falcon_msg *hdr) { const struct nvkm_subdev *subdev = priv->falcon->owner; - int ret; + int ret = 0; msg_queue_open(priv, queue); - if (msg_queue_empty(priv, queue)) { - ret = 0; + if (msg_queue_empty(priv, queue)) goto close; - } ret = msg_queue_pop(priv, queue, hdr, HDR_SIZE); - if (ret >= 0 && ret != HDR_SIZE) - ret = -EINVAL; - if (ret < 0) { + if (ret) { nvkm_error(subdev, "failed to read message header: %d\n", ret); goto close; } @@ -115,14 +105,13 @@ msg_queue_read(struct nvkm_msgqueue *priv, struct nvkm_msgqueue_queue *queue, u32 read_size = hdr->size - HDR_SIZE; ret = msg_queue_pop(priv, queue, (hdr + 1), read_size); - if (ret >= 0 && ret != read_size) - ret = -EINVAL; - if (ret < 0) { + if (ret) { nvkm_error(subdev, "failed to read message: %d\n", ret); goto close; } } + ret = 1; close: msg_queue_close(priv, queue, (ret >= 0)); return ret; |