]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
platform/chrome: cros_ec_ishtp: free ishtp buffer before sending event
authorJett Rink <jettrink@chromium.org>
Fri, 10 Apr 2020 16:23:05 +0000 (10:23 -0600)
committerEnric Balletbo i Serra <enric.balletbo@collabora.com>
Mon, 13 Apr 2020 14:38:39 +0000 (16:38 +0200)
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 <jettrink@chromium.org>
Signed-off-by: Mathew King <mathewk@chromium.org>
Signed-off-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
drivers/platform/chrome/cros_ec_ishtp.c

index e673a7f738fc524f7848b2319cdb14fac9d3c9fd..ed794a7ddba9b5024f86fe62fc5b391d4dcecfd3 100644 (file)
@@ -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);
 }