aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJett Rink <[email protected]>2020-04-10 10:23:05 -0600
committerEnric Balletbo i Serra <[email protected]>2020-04-13 16:38:39 +0200
commitfd167f7a4a6079c14a0c940e9103495b171279fb (patch)
tree3ef6473e76ec31155046a063e14774e552ca864d
parent0f706b4fac8b19fd0a4b4fef24dbadb23a3eb0c1 (diff)
platform/chrome: cros_ec_ishtp: free ishtp buffer before sending event
Recycle the ISH buffer before notifying of a response or an event. Often a new message is sent in response to an event and in high traffic scenarios this can lead to exhausting all available buffers. We can ensure we are using the fewest buffers possible by freeing buffers as soon as they are used. Signed-off-by: Jett Rink <[email protected]> Signed-off-by: Mathew King <[email protected]> Signed-off-by: Enric Balletbo i Serra <[email protected]>
-rw-r--r--drivers/platform/chrome/cros_ec_ishtp.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/platform/chrome/cros_ec_ishtp.c b/drivers/platform/chrome/cros_ec_ishtp.c
index e673a7f738fc..ed794a7ddba9 100644
--- a/drivers/platform/chrome/cros_ec_ishtp.c
+++ b/drivers/platform/chrome/cros_ec_ishtp.c
@@ -303,6 +303,10 @@ static void process_recv(struct ishtp_cl *cros_ish_cl,
rb_in_proc->buffer.data, data_len);
error_wake_up:
+ /* Free the buffer since we copied data or didn't need it */
+ ishtp_cl_io_rb_recycle(rb_in_proc);
+ rb_in_proc = NULL;
+
/* Set flag before waking up the caller */
client_data->response.received = true;
@@ -312,12 +316,14 @@ error_wake_up:
break;
case CROS_MKBP_EVENT:
+ /* Free the buffer. This is just an event without data */
+ ishtp_cl_io_rb_recycle(rb_in_proc);
+ rb_in_proc = NULL;
/*
* Set timestamp from beginning of function since we actually
* got an incoming MKBP event
*/
client_data->ec_dev->last_event_time = timestamp;
- /* The event system doesn't send any data in buffer */
schedule_work(&client_data->work_ec_evt);
break;
@@ -327,8 +333,9 @@ error_wake_up:
}
end_error:
- /* Free the buffer */
- ishtp_cl_io_rb_recycle(rb_in_proc);
+ /* Free the buffer if we already haven't */
+ if (rb_in_proc)
+ ishtp_cl_io_rb_recycle(rb_in_proc);
up_read(&init_lock);
}