[PATCH 21/22] Input: rotary_encoder - use guard notation when acquiring mutex

Dmitry Torokhov posted 22 patches 1 year, 3 months ago
[PATCH 21/22] Input: rotary_encoder - use guard notation when acquiring mutex
Posted by Dmitry Torokhov 1 year, 3 months ago
Using guard notation makes the code more compact and error handling
more robust by ensuring that mutexes are released in all code paths
when control leaves critical section.

Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
 drivers/input/misc/rotary_encoder.c | 23 ++++++++---------------
 1 file changed, 8 insertions(+), 15 deletions(-)

diff --git a/drivers/input/misc/rotary_encoder.c b/drivers/input/misc/rotary_encoder.c
index 6628fe540834..52761da9f999 100644
--- a/drivers/input/misc/rotary_encoder.c
+++ b/drivers/input/misc/rotary_encoder.c
@@ -113,7 +113,7 @@ static irqreturn_t rotary_encoder_irq(int irq, void *dev_id)
 	struct rotary_encoder *encoder = dev_id;
 	unsigned int state;
 
-	mutex_lock(&encoder->access_mutex);
+	guard(mutex)(&encoder->access_mutex);
 
 	state = rotary_encoder_get_state(encoder);
 
@@ -136,8 +136,6 @@ static irqreturn_t rotary_encoder_irq(int irq, void *dev_id)
 		break;
 	}
 
-	mutex_unlock(&encoder->access_mutex);
-
 	return IRQ_HANDLED;
 }
 
@@ -146,7 +144,7 @@ static irqreturn_t rotary_encoder_half_period_irq(int irq, void *dev_id)
 	struct rotary_encoder *encoder = dev_id;
 	unsigned int state;
 
-	mutex_lock(&encoder->access_mutex);
+	guard(mutex)(&encoder->access_mutex);
 
 	state = rotary_encoder_get_state(encoder);
 
@@ -159,8 +157,6 @@ static irqreturn_t rotary_encoder_half_period_irq(int irq, void *dev_id)
 		}
 	}
 
-	mutex_unlock(&encoder->access_mutex);
-
 	return IRQ_HANDLED;
 }
 
@@ -169,22 +165,19 @@ static irqreturn_t rotary_encoder_quarter_period_irq(int irq, void *dev_id)
 	struct rotary_encoder *encoder = dev_id;
 	unsigned int state;
 
-	mutex_lock(&encoder->access_mutex);
+	guard(mutex)(&encoder->access_mutex);
 
 	state = rotary_encoder_get_state(encoder);
 
-	if ((encoder->last_stable + 1) % 4 == state)
+	if ((encoder->last_stable + 1) % 4 == state) {
 		encoder->dir = 1;
-	else if (encoder->last_stable == (state + 1) % 4)
+		rotary_encoder_report_event(encoder);
+	} else if (encoder->last_stable == (state + 1) % 4) {
 		encoder->dir = -1;
-	else
-		goto out;
-
-	rotary_encoder_report_event(encoder);
+		rotary_encoder_report_event(encoder);
+	}
 
-out:
 	encoder->last_stable = state;
-	mutex_unlock(&encoder->access_mutex);
 
 	return IRQ_HANDLED;
 }
-- 
2.46.0.469.g59c65b2a67-goog
Re: [PATCH 21/22] Input: rotary_encoder - use guard notation when acquiring mutex
Posted by Javier Carrasco 1 year, 3 months ago
On 04/09/2024 06:49, Dmitry Torokhov wrote:
> Using guard notation makes the code more compact and error handling
> more robust by ensuring that mutexes are released in all code paths
> when control leaves critical section.
> 
> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
> ---
>  drivers/input/misc/rotary_encoder.c | 23 ++++++++---------------
>  1 file changed, 8 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/input/misc/rotary_encoder.c b/drivers/input/misc/rotary_encoder.c
> index 6628fe540834..52761da9f999 100644
> --- a/drivers/input/misc/rotary_encoder.c
> +++ b/drivers/input/misc/rotary_encoder.c
> @@ -113,7 +113,7 @@ static irqreturn_t rotary_encoder_irq(int irq, void *dev_id)
>  	struct rotary_encoder *encoder = dev_id;
>  	unsigned int state;
>  
> -	mutex_lock(&encoder->access_mutex);
> +	guard(mutex)(&encoder->access_mutex);
>  
>  	state = rotary_encoder_get_state(encoder);
>  
> @@ -136,8 +136,6 @@ static irqreturn_t rotary_encoder_irq(int irq, void *dev_id)
>  		break;
>  	}
>  
> -	mutex_unlock(&encoder->access_mutex);
> -
>  	return IRQ_HANDLED;
>  }
>  
> @@ -146,7 +144,7 @@ static irqreturn_t rotary_encoder_half_period_irq(int irq, void *dev_id)
>  	struct rotary_encoder *encoder = dev_id;
>  	unsigned int state;
>  
> -	mutex_lock(&encoder->access_mutex);
> +	guard(mutex)(&encoder->access_mutex);
>  
>  	state = rotary_encoder_get_state(encoder);
>  
> @@ -159,8 +157,6 @@ static irqreturn_t rotary_encoder_half_period_irq(int irq, void *dev_id)
>  		}
>  	}
>  
> -	mutex_unlock(&encoder->access_mutex);
> -
>  	return IRQ_HANDLED;
>  }
>  
> @@ -169,22 +165,19 @@ static irqreturn_t rotary_encoder_quarter_period_irq(int irq, void *dev_id)
>  	struct rotary_encoder *encoder = dev_id;
>  	unsigned int state;
>  
> -	mutex_lock(&encoder->access_mutex);
> +	guard(mutex)(&encoder->access_mutex);
>  
>  	state = rotary_encoder_get_state(encoder);
>  
> -	if ((encoder->last_stable + 1) % 4 == state)
> +	if ((encoder->last_stable + 1) % 4 == state) {
>  		encoder->dir = 1;
> -	else if (encoder->last_stable == (state + 1) % 4)
> +		rotary_encoder_report_event(encoder);
> +	} else if (encoder->last_stable == (state + 1) % 4) {
>  		encoder->dir = -1;
> -	else
> -		goto out;
> -
> -	rotary_encoder_report_event(encoder);
> +		rotary_encoder_report_event(encoder);
> +	}
>  
> -out:
>  	encoder->last_stable = state;
> -	mutex_unlock(&encoder->access_mutex);
>  
>  	return IRQ_HANDLED;
>  }

Reviewed-by: Javier Carrasco <javier.carrasco.cruz@gmail.com>