aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Usyskin <alexander.usyskin@intel.com>2016-07-25 18:06:01 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2016-08-30 08:39:42 -0400
commitdfe5f753d06a4eaf362872a7f30aabe5f5fc968c (patch)
tree58c3cf0bc6cd8ce06e5f62c104d0fe7f7f9ccf03
parentc85dba9e87376aa8e08fa7b024df562d0fda189b (diff)
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: Alexander Usyskin <alexander.usyskin@intel.com> Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/misc/mei/interrupt.c36
1 files 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,
102{ 102{
103 struct mei_device *dev = cl->dev; 103 struct mei_device *dev = cl->dev;
104 struct mei_cl_cb *cb; 104 struct mei_cl_cb *cb;
105 unsigned char *buffer = NULL;
106 size_t buf_sz; 105 size_t buf_sz;
107 106
108 cb = list_first_entry_or_null(&cl->rd_pending, struct mei_cl_cb, list); 107 cb = list_first_entry_or_null(&cl->rd_pending, struct mei_cl_cb, list);
109 if (!cb) { 108 if (!cb) {
110 if (!mei_cl_is_fixed_address(cl)) { 109 if (!mei_cl_is_fixed_address(cl)) {
111 cl_err(dev, cl, "pending read cb not found\n"); 110 cl_err(dev, cl, "pending read cb not found\n");
112 goto out; 111 goto discard;
113 } 112 }
114 cb = mei_cl_alloc_cb(cl, mei_cl_mtu(cl), MEI_FOP_READ, cl->fp); 113 cb = mei_cl_alloc_cb(cl, mei_cl_mtu(cl), MEI_FOP_READ, cl->fp);
115 if (!cb) 114 if (!cb)
116 goto out; 115 goto discard;
117 list_add_tail(&cb->list, &cl->rd_pending); 116 list_add_tail(&cb->list, &cl->rd_pending);
118 } 117 }
119 118
@@ -121,14 +120,7 @@ int mei_cl_irq_read_msg(struct mei_cl *cl,
121 cl_dbg(dev, cl, "not connected\n"); 120 cl_dbg(dev, cl, "not connected\n");
122 list_move_tail(&cb->list, &complete_list->list); 121 list_move_tail(&cb->list, &complete_list->list);
123 cb->status = -ENODEV; 122 cb->status = -ENODEV;
124 goto out; 123 goto discard;
125 }
126
127 if (cb->buf.size == 0 || cb->buf.data == NULL) {
128 cl_err(dev, cl, "response buffer is not allocated.\n");
129 list_move_tail(&cb->list, &complete_list->list);
130 cb->status = -ENOMEM;
131 goto out;
132 } 124 }
133 125
134 buf_sz = mei_hdr->length + cb->buf_idx; 126 buf_sz = mei_hdr->length + cb->buf_idx;
@@ -139,25 +131,19 @@ int mei_cl_irq_read_msg(struct mei_cl *cl,
139 131
140 list_move_tail(&cb->list, &complete_list->list); 132 list_move_tail(&cb->list, &complete_list->list);
141 cb->status = -EMSGSIZE; 133 cb->status = -EMSGSIZE;
142 goto out; 134 goto discard;
143 } 135 }
144 136
145 if (cb->buf.size < buf_sz) { 137 if (cb->buf.size < buf_sz) {
146 cl_dbg(dev, cl, "message overflow. size %zu len %d idx %zu\n", 138 cl_dbg(dev, cl, "message overflow. size %zu len %d idx %zu\n",
147 cb->buf.size, mei_hdr->length, cb->buf_idx); 139 cb->buf.size, mei_hdr->length, cb->buf_idx);
148 buffer = krealloc(cb->buf.data, buf_sz, GFP_KERNEL);
149 140
150 if (!buffer) { 141 list_move_tail(&cb->list, &complete_list->list);
151 cb->status = -ENOMEM; 142 cb->status = -EMSGSIZE;
152 list_move_tail(&cb->list, &complete_list->list); 143 goto discard;
153 goto out;
154 }
155 cb->buf.data = buffer;
156 cb->buf.size = buf_sz;
157 } 144 }
158 145
159 buffer = cb->buf.data + cb->buf_idx; 146 mei_read_slots(dev, cb->buf.data + cb->buf_idx, mei_hdr->length);
160 mei_read_slots(dev, buffer, mei_hdr->length);
161 147
162 cb->buf_idx += mei_hdr->length; 148 cb->buf_idx += mei_hdr->length;
163 149
@@ -169,10 +155,10 @@ int mei_cl_irq_read_msg(struct mei_cl *cl,
169 pm_request_autosuspend(dev->dev); 155 pm_request_autosuspend(dev->dev);
170 } 156 }
171 157
172out: 158 return 0;
173 if (!buffer)
174 mei_irq_discard_msg(dev, mei_hdr);
175 159
160discard:
161 mei_irq_discard_msg(dev, mei_hdr);
176 return 0; 162 return 0;
177} 163}
178 164