Commit dfe5f753 authored by Alexander Usyskin's avatar Alexander Usyskin Committed by Greg Kroah-Hartman

mei: drop redundant krealloc and checks in irq read

The read callback is always prepared with MTU-sized buffer and the FW
can't send more than the MTU in one message.
Checking for buffer existence and krealloc to increase receive buffer
size are redundant and may be safely discarded.
Signed-off-by: default avatarAlexander Usyskin <alexander.usyskin@intel.com>
Signed-off-by: default avatarTomas Winkler <tomas.winkler@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent c85dba9e
...@@ -102,18 +102,17 @@ int mei_cl_irq_read_msg(struct mei_cl *cl, ...@@ -102,18 +102,17 @@ int mei_cl_irq_read_msg(struct mei_cl *cl,
{ {
struct mei_device *dev = cl->dev; struct mei_device *dev = cl->dev;
struct mei_cl_cb *cb; struct mei_cl_cb *cb;
unsigned char *buffer = NULL;
size_t buf_sz; size_t buf_sz;
cb = list_first_entry_or_null(&cl->rd_pending, struct mei_cl_cb, list); cb = list_first_entry_or_null(&cl->rd_pending, struct mei_cl_cb, list);
if (!cb) { if (!cb) {
if (!mei_cl_is_fixed_address(cl)) { if (!mei_cl_is_fixed_address(cl)) {
cl_err(dev, cl, "pending read cb not found\n"); cl_err(dev, cl, "pending read cb not found\n");
goto out; goto discard;
} }
cb = mei_cl_alloc_cb(cl, mei_cl_mtu(cl), MEI_FOP_READ, cl->fp); cb = mei_cl_alloc_cb(cl, mei_cl_mtu(cl), MEI_FOP_READ, cl->fp);
if (!cb) if (!cb)
goto out; goto discard;
list_add_tail(&cb->list, &cl->rd_pending); list_add_tail(&cb->list, &cl->rd_pending);
} }
...@@ -121,14 +120,7 @@ int mei_cl_irq_read_msg(struct mei_cl *cl, ...@@ -121,14 +120,7 @@ int mei_cl_irq_read_msg(struct mei_cl *cl,
cl_dbg(dev, cl, "not connected\n"); cl_dbg(dev, cl, "not connected\n");
list_move_tail(&cb->list, &complete_list->list); list_move_tail(&cb->list, &complete_list->list);
cb->status = -ENODEV; cb->status = -ENODEV;
goto out; goto discard;
}
if (cb->buf.size == 0 || cb->buf.data == NULL) {
cl_err(dev, cl, "response buffer is not allocated.\n");
list_move_tail(&cb->list, &complete_list->list);
cb->status = -ENOMEM;
goto out;
} }
buf_sz = mei_hdr->length + cb->buf_idx; buf_sz = mei_hdr->length + cb->buf_idx;
...@@ -139,25 +131,19 @@ int mei_cl_irq_read_msg(struct mei_cl *cl, ...@@ -139,25 +131,19 @@ int mei_cl_irq_read_msg(struct mei_cl *cl,
list_move_tail(&cb->list, &complete_list->list); list_move_tail(&cb->list, &complete_list->list);
cb->status = -EMSGSIZE; cb->status = -EMSGSIZE;
goto out; goto discard;
} }
if (cb->buf.size < buf_sz) { if (cb->buf.size < buf_sz) {
cl_dbg(dev, cl, "message overflow. size %zu len %d idx %zu\n", cl_dbg(dev, cl, "message overflow. size %zu len %d idx %zu\n",
cb->buf.size, mei_hdr->length, cb->buf_idx); cb->buf.size, mei_hdr->length, cb->buf_idx);
buffer = krealloc(cb->buf.data, buf_sz, GFP_KERNEL);
if (!buffer) { list_move_tail(&cb->list, &complete_list->list);
cb->status = -ENOMEM; cb->status = -EMSGSIZE;
list_move_tail(&cb->list, &complete_list->list); goto discard;
goto out;
}
cb->buf.data = buffer;
cb->buf.size = buf_sz;
} }
buffer = cb->buf.data + cb->buf_idx; mei_read_slots(dev, cb->buf.data + cb->buf_idx, mei_hdr->length);
mei_read_slots(dev, buffer, mei_hdr->length);
cb->buf_idx += mei_hdr->length; cb->buf_idx += mei_hdr->length;
...@@ -169,10 +155,10 @@ int mei_cl_irq_read_msg(struct mei_cl *cl, ...@@ -169,10 +155,10 @@ int mei_cl_irq_read_msg(struct mei_cl *cl,
pm_request_autosuspend(dev->dev); pm_request_autosuspend(dev->dev);
} }
out: return 0;
if (!buffer)
mei_irq_discard_msg(dev, mei_hdr);
discard:
mei_irq_discard_msg(dev, mei_hdr);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment