On 04/09/2024 20:21, Dmitry Torokhov wrote: > Hi Javier, > > On Wed, Sep 04, 2024 at 03:53:40PM +0200, Javier Carrasco wrote: >> On 04/09/2024 06:47, 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@xxxxxxxxx> >>> --- >>> drivers/input/misc/iqs269a.c | 46 +++++++++++++----------------------- >>> 1 file changed, 16 insertions(+), 30 deletions(-) >>> >>> diff --git a/drivers/input/misc/iqs269a.c b/drivers/input/misc/iqs269a.c >>> index 843f8a3f3410..c34d847fa4af 100644 >>> --- a/drivers/input/misc/iqs269a.c >>> +++ b/drivers/input/misc/iqs269a.c >> >> ... >> >>> @@ -453,9 +449,9 @@ static int iqs269_ati_base_get(struct iqs269_private *iqs269, >>> if (ch_num >= IQS269_NUM_CH) >>> return -EINVAL; >>> >>> - mutex_lock(&iqs269->lock); >>> + guard(mutex)(&iqs269->lock); >>> + >>> engine_b = be16_to_cpu(ch_reg[ch_num].engine_b); >> >> maybe scoped_guard() to keep the scope of the mutex as it used to be? > > Thank you for looking over patches. > > It is just a few computations extra, so I decided not to use > scoped_guard(). Note that original code was forced to release mutex > early to avoid having to unlock it in all switch branches. > >> >>> - mutex_unlock(&iqs269->lock); >>> >>> switch (engine_b & IQS269_CHx_ENG_B_ATI_BASE_MASK) { >>> case IQS269_CHx_ENG_B_ATI_BASE_75: >>> @@ -491,7 +487,7 @@ static int iqs269_ati_target_set(struct iqs269_private *iqs269, >>> if (target > IQS269_CHx_ENG_B_ATI_TARGET_MAX) >>> return -EINVAL; >>> >>> - mutex_lock(&iqs269->lock); >>> + guard(mutex)(&iqs269->lock); >>> >>> engine_b = be16_to_cpu(ch_reg[ch_num].engine_b); >>> >>> @@ -501,8 +497,6 @@ static int iqs269_ati_target_set(struct iqs269_private *iqs269, >>> ch_reg[ch_num].engine_b = cpu_to_be16(engine_b); >>> iqs269->ati_current = false; >>> >>> - mutex_unlock(&iqs269->lock); >>> - >>> return 0; >>> } >>> >>> @@ -515,10 +509,9 @@ static int iqs269_ati_target_get(struct iqs269_private *iqs269, >>> if (ch_num >= IQS269_NUM_CH) >>> return -EINVAL; >>> >>> - mutex_lock(&iqs269->lock); >>> - engine_b = be16_to_cpu(ch_reg[ch_num].engine_b); >>> - mutex_unlock(&iqs269->lock); >>> + guard(mutex)(&iqs269->lock); >> >> same here? >> >>> >>> + engine_b = be16_to_cpu(ch_reg[ch_num].engine_b); >>> *target = (engine_b & IQS269_CHx_ENG_B_ATI_TARGET_MASK) * 32; > > Same here, calculating the line above will take no time at all... > > Thanks. > As you pointed out, in reality the extra locked instructions will not make any difference. But as the conversion added instructions to be locked by the mutex without mentioning it, I thought it should be either left as it used to be with scoped_guard(), or explicitly mentioned in the description. No strong feelings against it, but out of curiosity, why would you rather use guard()? I think scoped_guard() is a better way to self-document what has to be accessed via mutex, and what not. Best regards, Javier Carrasco