Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1448573

[char-misc-next 05/12] mei: drop redundant krealloc and checks in irq read

From Tomas Winkler <tomas.winkler@intel.com>
Newsgroups linux.kernel
Subject [char-misc-next 05/12] mei: drop redundant krealloc and checks in irq read
Date 2016-07-22 15:00 +0200
Message-ID <rXIdA-5YC-19@gated-at.bofh.it> (permalink)
References <rXIdz-5YC-3@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


From: Alexander Usyskin <alexander.usyskin@intel.com>

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: Alexander Usyskin <alexander.usyskin@intel.com>
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
---
 drivers/misc/mei/interrupt.c | 36 +++++++++++-------------------------
 1 file changed, 11 insertions(+), 25 deletions(-)

diff --git a/drivers/misc/mei/interrupt.c b/drivers/misc/mei/interrupt.c
index 44ba90140725..36382d782e20 100644
--- a/drivers/misc/mei/interrupt.c
+++ b/drivers/misc/mei/interrupt.c
@@ -102,18 +102,17 @@ int mei_cl_irq_read_msg(struct mei_cl *cl,
 {
 	struct mei_device *dev = cl->dev;
 	struct mei_cl_cb *cb;
-	unsigned char *buffer = NULL;
 	size_t buf_sz;
 
 	cb = list_first_entry_or_null(&cl->rd_pending, struct mei_cl_cb, list);
 	if (!cb) {
 		if (!mei_cl_is_fixed_address(cl)) {
 			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);
 		if (!cb)
-			goto out;
+			goto discard;
 		list_add_tail(&cb->list, &cl->rd_pending);
 	}
 
@@ -121,14 +120,7 @@ int mei_cl_irq_read_msg(struct mei_cl *cl,
 		cl_dbg(dev, cl, "not connected\n");
 		list_move_tail(&cb->list, &complete_list->list);
 		cb->status = -ENODEV;
-		goto out;
-	}
-
-	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;
+		goto discard;
 	}
 
 	buf_sz = mei_hdr->length + cb->buf_idx;
@@ -139,25 +131,19 @@ int mei_cl_irq_read_msg(struct mei_cl *cl,
 
 		list_move_tail(&cb->list, &complete_list->list);
 		cb->status = -EMSGSIZE;
-		goto out;
+		goto discard;
 	}
 
 	if (cb->buf.size < buf_sz) {
 		cl_dbg(dev, cl, "message overflow. size %zu len %d idx %zu\n",
 			cb->buf.size, mei_hdr->length, cb->buf_idx);
-		buffer = krealloc(cb->buf.data, buf_sz, GFP_KERNEL);
 
-		if (!buffer) {
-			cb->status = -ENOMEM;
-			list_move_tail(&cb->list, &complete_list->list);
-			goto out;
-		}
-		cb->buf.data = buffer;
-		cb->buf.size = buf_sz;
+		list_move_tail(&cb->list, &complete_list->list);
+		cb->status = -EMSGSIZE;
+		goto discard;
 	}
 
-	buffer = cb->buf.data + cb->buf_idx;
-	mei_read_slots(dev, buffer, mei_hdr->length);
+	mei_read_slots(dev, cb->buf.data + 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,
 		pm_request_autosuspend(dev->dev);
 	}
 
-out:
-	if (!buffer)
-		mei_irq_discard_msg(dev, mei_hdr);
+	return 0;
 
+discard:
+	mei_irq_discard_msg(dev, mei_hdr);
 	return 0;
 }
 
-- 
2.7.4

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[char-misc-next 00/12] mei: rx enhancements Tomas Winkler <tomas.winkler@intel.com> - 2016-07-22 15:00 +0200
  [char-misc-next 02/12] mei: add file pointer to the host client structure Tomas Winkler <tomas.winkler@intel.com> - 2016-07-22 15:00 +0200
  [char-misc-next 09/12] mei: add wrapper for queuing control commands. Tomas Winkler <tomas.winkler@intel.com> - 2016-07-22 15:00 +0200
  [char-misc-next 04/12] mei: amthif: drop mei_clear_lists function Tomas Winkler <tomas.winkler@intel.com> - 2016-07-22 15:00 +0200
  [char-misc-next 05/12] mei: drop redundant krealloc and checks in irq read Tomas Winkler <tomas.winkler@intel.com> - 2016-07-22 15:00 +0200
  [char-misc-next 11/12] mei: amthif: drop mei_amthif_read Tomas Winkler <tomas.winkler@intel.com> - 2016-07-22 15:00 +0200
  [char-misc-next 01/12] mei: move read cb to complete queue if not connected Tomas Winkler <tomas.winkler@intel.com> - 2016-07-22 15:00 +0200
  [char-misc-next 08/12] mei: use consistent naming for TX control flow credits Tomas Winkler <tomas.winkler@intel.com> - 2016-07-22 15:00 +0200
  [char-misc-next 07/12] mei: rx flow control counter Tomas Winkler <tomas.winkler@intel.com> - 2016-07-22 15:00 +0200
  [char-misc-next 12/12] mei: drop unused file transaction states Tomas Winkler <tomas.winkler@intel.com> - 2016-07-22 15:00 +0200
  [char-misc-next 10/12] mei: enqueue consecutive reads Tomas Winkler <tomas.winkler@intel.com> - 2016-07-22 15:00 +0200
  [char-misc-next 06/12] mei: prepare read cb for fixed address clients on the receive path only. Tomas Winkler <tomas.winkler@intel.com> - 2016-07-22 15:10 +0200
  RE: [char-misc-next 00/12] mei: rx enhancements "Winkler, Tomas" <tomas.winkler@intel.com> - 2016-07-25 01:00 +0200
    Re: [char-misc-next 00/12] mei: rx enhancements Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2016-07-25 01:30 +0200

csiph-web