if (vlan > 4095 || qos > 7)
                return -EINVAL;
 
-       mutex_lock(&esw->state_lock);
-
        err = modify_esw_vport_cvlan(esw->dev, vport, vlan, qos, set_flags);
        if (err)
-               goto unlock;
+               return err;
 
        evport->info.vlan = vlan;
        evport->info.qos = qos;
        if (evport->enabled && esw->mode == MLX5_ESWITCH_LEGACY) {
                err = esw_vport_ingress_config(esw, evport);
                if (err)
-                       goto unlock;
+                       return err;
                err = esw_vport_egress_config(esw, evport);
        }
 
-unlock:
-       mutex_unlock(&esw->state_lock);
        return err;
 }
 
                                u16 vport, u16 vlan, u8 qos)
 {
        u8 set_flags = 0;
+       int err;
 
        if (vlan || qos)
                set_flags = SET_VLAN_STRIP | SET_VLAN_INSERT;
 
-       return __mlx5_eswitch_set_vport_vlan(esw, vport, vlan, qos, set_flags);
+       mutex_lock(&esw->state_lock);
+       err = __mlx5_eswitch_set_vport_vlan(esw, vport, vlan, qos, set_flags);
+       mutex_unlock(&esw->state_lock);
+
+       return err;
 }
 
 int mlx5_eswitch_set_vport_spoofchk(struct mlx5_eswitch *esw,
 
        fwd  = !!((attr->action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) &&
                   !attr->dest_chain);
 
+       mutex_lock(&esw->state_lock);
+
        err = esw_add_vlan_action_check(attr, push, pop, fwd);
        if (err)
-               return err;
+               goto unlock;
 
        attr->vlan_handled = false;
 
                        attr->vlan_handled = true;
                }
 
-               return 0;
+               goto unlock;
        }
 
        if (!push && !pop)
-               return 0;
+               goto unlock;
 
        if (!(offloads->vlan_push_pop_refcount)) {
                /* it's the 1st vlan rule, apply global vlan pop policy */
 out:
        if (!err)
                attr->vlan_handled = true;
+unlock:
+       mutex_unlock(&esw->state_lock);
        return err;
 }
 
        pop  = !!(attr->action & MLX5_FLOW_CONTEXT_ACTION_VLAN_POP);
        fwd  = !!(attr->action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST);
 
+       mutex_lock(&esw->state_lock);
+
        vport = esw_vlan_action_get_vport(attr, push, pop);
 
        if (!push && !pop && fwd) {
                if (attr->dests[0].rep->vport == MLX5_VPORT_UPLINK)
                        vport->vlan_refcount--;
 
-               return 0;
+               goto out;
        }
 
        if (push) {
 skip_unset_push:
        offloads->vlan_push_pop_refcount--;
        if (offloads->vlan_push_pop_refcount)
-               return 0;
+               goto out;
 
        /* no more vlan rules, stop global vlan pop policy */
        err = esw_set_global_vlan_pop(esw, 0);
 
 out:
+       mutex_unlock(&esw->state_lock);
        return err;
 }