提交 5db7514d 编写于 作者: T Tomas Winkler 提交者: Greg Kroah-Hartman

mei: use only one buffer in callback

The callback structure is used exclusively for reading or writing
therefore there is no reason to hold both response and request buffers
in the callback structure
Signed-off-by: NTomas Winkler <tomas.winkler@intel.com>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
上级 331e4187
...@@ -213,15 +213,15 @@ int mei_amthif_read(struct mei_device *dev, struct file *file, ...@@ -213,15 +213,15 @@ int mei_amthif_read(struct mei_device *dev, struct file *file,
* remove message from deletion list * remove message from deletion list
*/ */
dev_dbg(dev->dev, "amthif cb->response_buffer size - %d\n", dev_dbg(dev->dev, "amthif cb->buf size - %d\n",
cb->response_buffer.size); cb->buf.size);
dev_dbg(dev->dev, "amthif cb->buf_idx - %lu\n", cb->buf_idx); dev_dbg(dev->dev, "amthif cb->buf_idx - %lu\n", cb->buf_idx);
/* length is being truncated to PAGE_SIZE, however, /* length is being truncated to PAGE_SIZE, however,
* the buf_idx may point beyond */ * the buf_idx may point beyond */
length = min_t(size_t, length, (cb->buf_idx - *offset)); length = min_t(size_t, length, (cb->buf_idx - *offset));
if (copy_to_user(ubuf, cb->response_buffer.data + *offset, length)) { if (copy_to_user(ubuf, cb->buf.data + *offset, length)) {
dev_dbg(dev->dev, "failed to copy data to userland\n"); dev_dbg(dev->dev, "failed to copy data to userland\n");
rets = -EFAULT; rets = -EFAULT;
} else { } else {
...@@ -260,7 +260,7 @@ static int mei_amthif_read_start(struct mei_cl *cl, struct file *file) ...@@ -260,7 +260,7 @@ static int mei_amthif_read_start(struct mei_cl *cl, struct file *file)
goto err; goto err;
} }
rets = mei_io_cb_alloc_resp_buf(cb, length); rets = mei_io_cb_alloc_buf(cb, length);
if (rets) if (rets)
goto err; goto err;
......
...@@ -261,11 +261,11 @@ static ssize_t ___mei_cl_send(struct mei_cl *cl, u8 *buf, size_t length, ...@@ -261,11 +261,11 @@ static ssize_t ___mei_cl_send(struct mei_cl *cl, u8 *buf, size_t length,
goto out; goto out;
} }
rets = mei_io_cb_alloc_req_buf(cb, length); rets = mei_io_cb_alloc_buf(cb, length);
if (rets < 0) if (rets < 0)
goto out; goto out;
memcpy(cb->request_buffer.data, buf, length); memcpy(cb->buf.data, buf, length);
rets = mei_cl_write(cl, cb, blocking); rets = mei_cl_write(cl, cb, blocking);
...@@ -328,7 +328,7 @@ ssize_t __mei_cl_recv(struct mei_cl *cl, u8 *buf, size_t length) ...@@ -328,7 +328,7 @@ ssize_t __mei_cl_recv(struct mei_cl *cl, u8 *buf, size_t length)
} }
r_length = min_t(size_t, length, cb->buf_idx); r_length = min_t(size_t, length, cb->buf_idx);
memcpy(buf, cb->response_buffer.data, r_length); memcpy(buf, cb->buf.data, r_length);
rets = r_length; rets = r_length;
free: free:
......
...@@ -376,8 +376,7 @@ void mei_io_cb_free(struct mei_cl_cb *cb) ...@@ -376,8 +376,7 @@ void mei_io_cb_free(struct mei_cl_cb *cb)
if (cb == NULL) if (cb == NULL)
return; return;
kfree(cb->request_buffer.data); kfree(cb->buf.data);
kfree(cb->response_buffer.data);
kfree(cb); kfree(cb);
} }
...@@ -406,7 +405,7 @@ struct mei_cl_cb *mei_io_cb_init(struct mei_cl *cl, struct file *fp) ...@@ -406,7 +405,7 @@ struct mei_cl_cb *mei_io_cb_init(struct mei_cl *cl, struct file *fp)
} }
/** /**
* mei_io_cb_alloc_req_buf - allocate request buffer * mei_io_cb_alloc_buf - allocate callback buffer
* *
* @cb: io callback structure * @cb: io callback structure
* @length: size of the buffer * @length: size of the buffer
...@@ -415,7 +414,7 @@ struct mei_cl_cb *mei_io_cb_init(struct mei_cl *cl, struct file *fp) ...@@ -415,7 +414,7 @@ struct mei_cl_cb *mei_io_cb_init(struct mei_cl *cl, struct file *fp)
* -EINVAL if cb is NULL * -EINVAL if cb is NULL
* -ENOMEM if allocation failed * -ENOMEM if allocation failed
*/ */
int mei_io_cb_alloc_req_buf(struct mei_cl_cb *cb, size_t length) int mei_io_cb_alloc_buf(struct mei_cl_cb *cb, size_t length)
{ {
if (!cb) if (!cb)
return -EINVAL; return -EINVAL;
...@@ -423,38 +422,12 @@ int mei_io_cb_alloc_req_buf(struct mei_cl_cb *cb, size_t length) ...@@ -423,38 +422,12 @@ int mei_io_cb_alloc_req_buf(struct mei_cl_cb *cb, size_t length)
if (length == 0) if (length == 0)
return 0; return 0;
cb->request_buffer.data = kmalloc(length, GFP_KERNEL); cb->buf.data = kmalloc(length, GFP_KERNEL);
if (!cb->request_buffer.data) if (!cb->buf.data)
return -ENOMEM; return -ENOMEM;
cb->request_buffer.size = length; cb->buf.size = length;
return 0; return 0;
} }
/**
* mei_io_cb_alloc_resp_buf - allocate response buffer
*
* @cb: io callback structure
* @length: size of the buffer
*
* Return: 0 on success
* -EINVAL if cb is NULL
* -ENOMEM if allocation failed
*/
int mei_io_cb_alloc_resp_buf(struct mei_cl_cb *cb, size_t length)
{
if (!cb)
return -EINVAL;
if (length == 0)
return 0;
cb->response_buffer.data = kmalloc(length, GFP_KERNEL);
if (!cb->response_buffer.data)
return -ENOMEM;
cb->response_buffer.size = length;
return 0;
}
/** /**
* mei_cl_flush_queues - flushes queue lists belonging to cl. * mei_cl_flush_queues - flushes queue lists belonging to cl.
...@@ -1005,7 +978,7 @@ int mei_cl_read_start(struct mei_cl *cl, size_t length) ...@@ -1005,7 +978,7 @@ int mei_cl_read_start(struct mei_cl *cl, size_t length)
goto out; goto out;
} }
rets = mei_io_cb_alloc_resp_buf(cb, length); rets = mei_io_cb_alloc_buf(cb, length);
if (rets) if (rets)
goto out; goto out;
...@@ -1059,7 +1032,7 @@ int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb, ...@@ -1059,7 +1032,7 @@ int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb,
dev = cl->dev; dev = cl->dev;
buf = &cb->request_buffer; buf = &cb->buf;
rets = mei_cl_flow_ctrl_creds(cl); rets = mei_cl_flow_ctrl_creds(cl);
if (rets < 0) if (rets < 0)
...@@ -1094,7 +1067,7 @@ int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb, ...@@ -1094,7 +1067,7 @@ int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb,
} }
cl_dbg(dev, cl, "buf: size = %d idx = %lu\n", cl_dbg(dev, cl, "buf: size = %d idx = %lu\n",
cb->request_buffer.size, cb->buf_idx); cb->buf.size, cb->buf_idx);
rets = mei_write_message(dev, &mei_hdr, buf->data + cb->buf_idx); rets = mei_write_message(dev, &mei_hdr, buf->data + cb->buf_idx);
if (rets) { if (rets) {
...@@ -1144,7 +1117,7 @@ int mei_cl_write(struct mei_cl *cl, struct mei_cl_cb *cb, bool blocking) ...@@ -1144,7 +1117,7 @@ int mei_cl_write(struct mei_cl *cl, struct mei_cl_cb *cb, bool blocking)
dev = cl->dev; dev = cl->dev;
buf = &cb->request_buffer; buf = &cb->buf;
cl_dbg(dev, cl, "size=%d\n", buf->size); cl_dbg(dev, cl, "size=%d\n", buf->size);
......
...@@ -49,8 +49,7 @@ void mei_me_cl_rm_all(struct mei_device *dev); ...@@ -49,8 +49,7 @@ void mei_me_cl_rm_all(struct mei_device *dev);
*/ */
struct mei_cl_cb *mei_io_cb_init(struct mei_cl *cl, struct file *fp); struct mei_cl_cb *mei_io_cb_init(struct mei_cl *cl, struct file *fp);
void mei_io_cb_free(struct mei_cl_cb *priv_cb); void mei_io_cb_free(struct mei_cl_cb *priv_cb);
int mei_io_cb_alloc_req_buf(struct mei_cl_cb *cb, size_t length); int mei_io_cb_alloc_buf(struct mei_cl_cb *cb, size_t length);
int mei_io_cb_alloc_resp_buf(struct mei_cl_cb *cb, size_t length);
/** /**
......
...@@ -134,19 +134,17 @@ int mei_cl_irq_read_msg(struct mei_cl *cl, ...@@ -134,19 +134,17 @@ int mei_cl_irq_read_msg(struct mei_cl *cl,
cl->reading_state = MEI_READING; cl->reading_state = MEI_READING;
if (cb->response_buffer.size == 0 || if (cb->buf.size == 0 || cb->buf.data == NULL) {
cb->response_buffer.data == NULL) {
cl_err(dev, cl, "response buffer is not allocated.\n"); cl_err(dev, cl, "response buffer is not allocated.\n");
list_move_tail(&cb->list, &complete_list->list); list_move_tail(&cb->list, &complete_list->list);
cb->status = -ENOMEM; cb->status = -ENOMEM;
goto out; goto out;
} }
if (cb->response_buffer.size < mei_hdr->length + cb->buf_idx) { if (cb->buf.size < mei_hdr->length + cb->buf_idx) {
cl_dbg(dev, cl, "message overflow. size %d len %d idx %ld\n", cl_dbg(dev, cl, "message overflow. size %d len %d idx %ld\n",
cb->response_buffer.size, mei_hdr->length, cb->buf_idx); cb->buf.size, mei_hdr->length, cb->buf_idx);
buffer = krealloc(cb->response_buffer.data, buffer = krealloc(cb->buf.data, mei_hdr->length + cb->buf_idx,
mei_hdr->length + cb->buf_idx,
GFP_KERNEL); GFP_KERNEL);
if (!buffer) { if (!buffer) {
...@@ -154,11 +152,11 @@ int mei_cl_irq_read_msg(struct mei_cl *cl, ...@@ -154,11 +152,11 @@ 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);
goto out; goto out;
} }
cb->response_buffer.data = buffer; cb->buf.data = buffer;
cb->response_buffer.size = mei_hdr->length + cb->buf_idx; cb->buf.size = mei_hdr->length + cb->buf_idx;
} }
buffer = cb->response_buffer.data + cb->buf_idx; buffer = cb->buf.data + cb->buf_idx;
mei_read_slots(dev, buffer, mei_hdr->length); mei_read_slots(dev, buffer, mei_hdr->length);
cb->buf_idx += mei_hdr->length; cb->buf_idx += mei_hdr->length;
......
...@@ -264,7 +264,7 @@ static ssize_t mei_read(struct file *file, char __user *ubuf, ...@@ -264,7 +264,7 @@ static ssize_t mei_read(struct file *file, char __user *ubuf,
} }
dev_dbg(dev->dev, "buf.size = %d buf.idx= %ld\n", dev_dbg(dev->dev, "buf.size = %d buf.idx= %ld\n",
cb->response_buffer.size, cb->buf_idx); cb->buf.size, cb->buf_idx);
if (length == 0 || ubuf == NULL || *offset > cb->buf_idx) { if (length == 0 || ubuf == NULL || *offset > cb->buf_idx) {
rets = -EMSGSIZE; rets = -EMSGSIZE;
goto free; goto free;
...@@ -274,7 +274,7 @@ static ssize_t mei_read(struct file *file, char __user *ubuf, ...@@ -274,7 +274,7 @@ static ssize_t mei_read(struct file *file, char __user *ubuf,
* however buf_idx may point beyond that */ * however buf_idx may point beyond that */
length = min_t(size_t, length, cb->buf_idx - *offset); length = min_t(size_t, length, cb->buf_idx - *offset);
if (copy_to_user(ubuf, cb->response_buffer.data + *offset, length)) { if (copy_to_user(ubuf, cb->buf.data + *offset, length)) {
dev_dbg(dev->dev, "failed to copy data to userland\n"); dev_dbg(dev->dev, "failed to copy data to userland\n");
rets = -EFAULT; rets = -EFAULT;
goto free; goto free;
...@@ -389,11 +389,11 @@ static ssize_t mei_write(struct file *file, const char __user *ubuf, ...@@ -389,11 +389,11 @@ static ssize_t mei_write(struct file *file, const char __user *ubuf,
rets = -ENOMEM; rets = -ENOMEM;
goto out; goto out;
} }
rets = mei_io_cb_alloc_req_buf(write_cb, length); rets = mei_io_cb_alloc_buf(write_cb, length);
if (rets) if (rets)
goto out; goto out;
rets = copy_from_user(write_cb->request_buffer.data, ubuf, length); rets = copy_from_user(write_cb->buf.data, ubuf, length);
if (rets) { if (rets) {
dev_dbg(dev->dev, "failed to copy data from userland\n"); dev_dbg(dev->dev, "failed to copy data from userland\n");
rets = -EFAULT; rets = -EFAULT;
......
...@@ -194,8 +194,7 @@ struct mei_cl; ...@@ -194,8 +194,7 @@ struct mei_cl;
* @list: link in callback queue * @list: link in callback queue
* @cl: file client who is running this operation * @cl: file client who is running this operation
* @fop_type: file operation type * @fop_type: file operation type
* @request_buffer: buffer to store request data * @buf: buffer for data associated with the callback
* @response_buffer: buffer to store response data
* @buf_idx: last read index * @buf_idx: last read index
* @read_time: last read operation time stamp (iamthif) * @read_time: last read operation time stamp (iamthif)
* @file_object: pointer to file structure * @file_object: pointer to file structure
...@@ -207,8 +206,7 @@ struct mei_cl_cb { ...@@ -207,8 +206,7 @@ struct mei_cl_cb {
struct list_head list; struct list_head list;
struct mei_cl *cl; struct mei_cl *cl;
enum mei_cb_file_ops fop_type; enum mei_cb_file_ops fop_type;
struct mei_msg_data request_buffer; struct mei_msg_data buf;
struct mei_msg_data response_buffer;
unsigned long buf_idx; unsigned long buf_idx;
unsigned long read_time; unsigned long read_time;
struct file *file_object; struct file *file_object;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册