diff mbox

[42/49] rc-ir-raw: atomic reads of protocols

Message ID 20140403233448.27099.69654.stgit@zeus.muc.hardeman.nu (mailing list archive)
State New, archived
Headers show

Commit Message

David Härdeman April 3, 2014, 11:34 p.m. UTC
Use atomic reads to avoid having to take a mutex when getting
the bitmask of supported protocols.

Signed-off-by: David Härdeman <david@hardeman.nu>
---
 drivers/media/rc/rc-core-priv.h |    2 +-
 drivers/media/rc/rc-ir-raw.c    |   12 ++++--------
 2 files changed, 5 insertions(+), 9 deletions(-)


--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Mauro Carvalho Chehab July 25, 2014, 11:13 p.m. UTC | #1
Em Fri, 04 Apr 2014 01:34:48 +0200
David Härdeman <david@hardeman.nu> escreveu:

> Use atomic reads to avoid having to take a mutex when getting
> the bitmask of supported protocols.

This also belongs to that RCU change series, and doesn't apply.

> 
> Signed-off-by: David Härdeman <david@hardeman.nu>
> ---
>  drivers/media/rc/rc-core-priv.h |    2 +-
>  drivers/media/rc/rc-ir-raw.c    |   12 ++++--------
>  2 files changed, 5 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/media/rc/rc-core-priv.h b/drivers/media/rc/rc-core-priv.h
> index c3de26b..04776e8 100644
> --- a/drivers/media/rc/rc-core-priv.h
> +++ b/drivers/media/rc/rc-core-priv.h
> @@ -29,7 +29,7 @@ enum rc_driver_type {
>  struct ir_raw_handler {
>  	struct list_head list;
>  
> -	u64 protocols; /* which are handled by this handler */
> +	unsigned protocols; /* which are handled by this handler */
>  	int (*decode)(struct rc_dev *dev, struct ir_raw_event event);
>  
>  	/* These two should only be used by the lirc decoder */
> diff --git a/drivers/media/rc/rc-ir-raw.c b/drivers/media/rc/rc-ir-raw.c
> index 9631825..bf5215b 100644
> --- a/drivers/media/rc/rc-ir-raw.c
> +++ b/drivers/media/rc/rc-ir-raw.c
> @@ -27,7 +27,7 @@ static LIST_HEAD(ir_raw_client_list);
>  static LIST_HEAD(ir_raw_handler_list);
>  
>  /* protocols supported by the currently loaded decoders */
> -static u64 available_protocols;
> +static atomic_t available_protocols = ATOMIC_INIT(0);
>  
>  static int ir_raw_event_thread(void *data)
>  {
> @@ -251,11 +251,7 @@ EXPORT_SYMBOL_GPL(ir_raw_event_handle);
>  /* used internally by the sysfs interface */
>  static u64 ir_raw_get_allowed_protocols(struct rc_dev *dev)
>  {
> -	u64 protocols;
> -	mutex_lock(&ir_raw_mutex);
> -	protocols = available_protocols;
> -	mutex_unlock(&ir_raw_mutex);
> -	return protocols;
> +	return atomic_read(&available_protocols);
>  }
>  
>  static int change_protocol(struct rc_dev *dev, u64 *rc_type) {
> @@ -353,7 +349,7 @@ int ir_raw_handler_register(struct ir_raw_handler *ir_raw_handler)
>  	if (ir_raw_handler->raw_register)
>  		list_for_each_entry_rcu(raw, &ir_raw_client_list, list)
>  			ir_raw_handler->raw_register(raw->dev);
> -	available_protocols |= ir_raw_handler->protocols;
> +	atomic_set_mask(ir_raw_handler->protocols, &available_protocols);
>  	mutex_unlock(&ir_raw_mutex);
>  	synchronize_rcu();
>  
> @@ -370,7 +366,7 @@ void ir_raw_handler_unregister(struct ir_raw_handler *ir_raw_handler)
>  	if (ir_raw_handler->raw_unregister)
>  		list_for_each_entry_rcu(raw, &ir_raw_client_list, list)
>  			ir_raw_handler->raw_unregister(raw->dev);
> -	available_protocols &= ~ir_raw_handler->protocols;
> +	atomic_clear_mask(ir_raw_handler->protocols, &available_protocols);
>  	mutex_unlock(&ir_raw_mutex);
>  	synchronize_rcu();
>  }
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-media" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/media/rc/rc-core-priv.h b/drivers/media/rc/rc-core-priv.h
index c3de26b..04776e8 100644
--- a/drivers/media/rc/rc-core-priv.h
+++ b/drivers/media/rc/rc-core-priv.h
@@ -29,7 +29,7 @@  enum rc_driver_type {
 struct ir_raw_handler {
 	struct list_head list;
 
-	u64 protocols; /* which are handled by this handler */
+	unsigned protocols; /* which are handled by this handler */
 	int (*decode)(struct rc_dev *dev, struct ir_raw_event event);
 
 	/* These two should only be used by the lirc decoder */
diff --git a/drivers/media/rc/rc-ir-raw.c b/drivers/media/rc/rc-ir-raw.c
index 9631825..bf5215b 100644
--- a/drivers/media/rc/rc-ir-raw.c
+++ b/drivers/media/rc/rc-ir-raw.c
@@ -27,7 +27,7 @@  static LIST_HEAD(ir_raw_client_list);
 static LIST_HEAD(ir_raw_handler_list);
 
 /* protocols supported by the currently loaded decoders */
-static u64 available_protocols;
+static atomic_t available_protocols = ATOMIC_INIT(0);
 
 static int ir_raw_event_thread(void *data)
 {
@@ -251,11 +251,7 @@  EXPORT_SYMBOL_GPL(ir_raw_event_handle);
 /* used internally by the sysfs interface */
 static u64 ir_raw_get_allowed_protocols(struct rc_dev *dev)
 {
-	u64 protocols;
-	mutex_lock(&ir_raw_mutex);
-	protocols = available_protocols;
-	mutex_unlock(&ir_raw_mutex);
-	return protocols;
+	return atomic_read(&available_protocols);
 }
 
 static int change_protocol(struct rc_dev *dev, u64 *rc_type) {
@@ -353,7 +349,7 @@  int ir_raw_handler_register(struct ir_raw_handler *ir_raw_handler)
 	if (ir_raw_handler->raw_register)
 		list_for_each_entry_rcu(raw, &ir_raw_client_list, list)
 			ir_raw_handler->raw_register(raw->dev);
-	available_protocols |= ir_raw_handler->protocols;
+	atomic_set_mask(ir_raw_handler->protocols, &available_protocols);
 	mutex_unlock(&ir_raw_mutex);
 	synchronize_rcu();
 
@@ -370,7 +366,7 @@  void ir_raw_handler_unregister(struct ir_raw_handler *ir_raw_handler)
 	if (ir_raw_handler->raw_unregister)
 		list_for_each_entry_rcu(raw, &ir_raw_client_list, list)
 			ir_raw_handler->raw_unregister(raw->dev);
-	available_protocols &= ~ir_raw_handler->protocols;
+	atomic_clear_mask(ir_raw_handler->protocols, &available_protocols);
 	mutex_unlock(&ir_raw_mutex);
 	synchronize_rcu();
 }