]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
drm/msm/dp: Shrink locking area of dp_aux_transfer()
authorStephen Boyd <swboyd@chromium.org>
Fri, 7 May 2021 21:25:04 +0000 (14:25 -0700)
committerRob Clark <robdclark@chromium.org>
Wed, 23 Jun 2021 14:32:15 +0000 (07:32 -0700)
We don't need to hold the lock to inspect the message we're going to
transfer, and we don't need to clear the busy flag either. Take the lock
later and bail out earlier if conditions aren't met.

Cc: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Cc: Abhinav Kumar <abhinavk@codeaurora.org>
Cc: Kuogee Hsieh <khsieh@codeaurora.org>
Cc: aravindh@codeaurora.org
Cc: Sean Paul <sean@poorly.run>
Signed-off-by: Stephen Boyd <swboyd@chromium.org>
Reviewed-by: Kuogee Hsieh <khsieh@codeaurora.org>
Link: https://lore.kernel.org/r/20210507212505.1224111-3-swboyd@chromium.org
Signed-off-by: Rob Clark <robdclark@chromium.org>
drivers/gpu/drm/msm/dp/dp_aux.c

index 91188466cecec9be9416e8faf796516d5a3d62cd..b498103965138d8435a6ac80a68fdf5ab7f13202 100644 (file)
@@ -329,30 +329,29 @@ static ssize_t dp_aux_transfer(struct drm_dp_aux *dp_aux,
        ssize_t ret;
        int const aux_cmd_native_max = 16;
        int const aux_cmd_i2c_max = 128;
-       struct dp_aux_private *aux = container_of(dp_aux,
-               struct dp_aux_private, dp_aux);
+       struct dp_aux_private *aux;
 
-       mutex_lock(&aux->mutex);
+       aux = container_of(dp_aux, struct dp_aux_private, dp_aux);
 
        aux->native = msg->request & (DP_AUX_NATIVE_WRITE & DP_AUX_NATIVE_READ);
 
        /* Ignore address only message */
-       if ((msg->size == 0) || (msg->buffer == NULL)) {
+       if (msg->size == 0 || !msg->buffer) {
                msg->reply = aux->native ?
                        DP_AUX_NATIVE_REPLY_ACK : DP_AUX_I2C_REPLY_ACK;
-               ret = msg->size;
-               goto unlock_exit;
+               return msg->size;
        }
 
        /* msg sanity check */
-       if ((aux->native && (msg->size > aux_cmd_native_max)) ||
-               (msg->size > aux_cmd_i2c_max)) {
+       if ((aux->native && msg->size > aux_cmd_native_max) ||
+           msg->size > aux_cmd_i2c_max) {
                DRM_ERROR("%s: invalid msg: size(%zu), request(%x)\n",
                        __func__, msg->size, msg->request);
-               ret = -EINVAL;
-               goto unlock_exit;
+               return -EINVAL;
        }
 
+       mutex_lock(&aux->mutex);
+
        dp_aux_update_offset_and_segment(aux, msg);
        dp_aux_transfer_helper(aux, msg, true);