forked from Minki/linux
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>
This commit is contained in:
parent
f09a3ee36b
commit
e9602a1bd7
@ -67,20 +67,14 @@ msg_queue_pop(struct nvkm_msgqueue *priv, struct nvkm_msgqueue_queue *queue,
|
|||||||
tail = queue->position;
|
tail = queue->position;
|
||||||
|
|
||||||
available = head - tail;
|
available = head - tail;
|
||||||
|
|
||||||
if (available == 0) {
|
|
||||||
nvkm_warn(subdev, "no message data available\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (size > available) {
|
if (size > available) {
|
||||||
nvkm_warn(subdev, "message data smaller than read request\n");
|
nvkm_warn(subdev, "message data smaller than read request\n");
|
||||||
size = available;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
nvkm_falcon_read_dmem(priv->falcon, tail, size, 0, data);
|
nvkm_falcon_read_dmem(priv->falcon, tail, size, 0, data);
|
||||||
queue->position += ALIGN(size, QUEUE_ALIGNMENT);
|
queue->position += ALIGN(size, QUEUE_ALIGNMENT);
|
||||||
return size;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -88,19 +82,15 @@ msg_queue_read(struct nvkm_msgqueue *priv, struct nvkm_msgqueue_queue *queue,
|
|||||||
struct nv_falcon_msg *hdr)
|
struct nv_falcon_msg *hdr)
|
||||||
{
|
{
|
||||||
const struct nvkm_subdev *subdev = priv->falcon->owner;
|
const struct nvkm_subdev *subdev = priv->falcon->owner;
|
||||||
int ret;
|
int ret = 0;
|
||||||
|
|
||||||
msg_queue_open(priv, queue);
|
msg_queue_open(priv, queue);
|
||||||
|
|
||||||
if (msg_queue_empty(priv, queue)) {
|
if (msg_queue_empty(priv, queue))
|
||||||
ret = 0;
|
|
||||||
goto close;
|
goto close;
|
||||||
}
|
|
||||||
|
|
||||||
ret = msg_queue_pop(priv, queue, hdr, HDR_SIZE);
|
ret = msg_queue_pop(priv, queue, hdr, HDR_SIZE);
|
||||||
if (ret >= 0 && ret != HDR_SIZE)
|
if (ret) {
|
||||||
ret = -EINVAL;
|
|
||||||
if (ret < 0) {
|
|
||||||
nvkm_error(subdev, "failed to read message header: %d\n", ret);
|
nvkm_error(subdev, "failed to read message header: %d\n", ret);
|
||||||
goto close;
|
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;
|
u32 read_size = hdr->size - HDR_SIZE;
|
||||||
|
|
||||||
ret = msg_queue_pop(priv, queue, (hdr + 1), read_size);
|
ret = msg_queue_pop(priv, queue, (hdr + 1), read_size);
|
||||||
if (ret >= 0 && ret != read_size)
|
if (ret) {
|
||||||
ret = -EINVAL;
|
|
||||||
if (ret < 0) {
|
|
||||||
nvkm_error(subdev, "failed to read message: %d\n", ret);
|
nvkm_error(subdev, "failed to read message: %d\n", ret);
|
||||||
goto close;
|
goto close;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = 1;
|
||||||
close:
|
close:
|
||||||
msg_queue_close(priv, queue, (ret >= 0));
|
msg_queue_close(priv, queue, (ret >= 0));
|
||||||
return ret;
|
return ret;
|
||||||
|
Loading…
Reference in New Issue
Block a user