From: Alex Elder Date: Wed, 3 Dec 2014 14:35:08 +0000 (-0600) Subject: greybus: make op_cycle atomic (again) X-Git-Tag: v4.9-rc1~119^2~378^2~21^2~1785 X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=commitdiff_plain;h=4afb7fd0154753711e7bc68790f6f5de8dbed39e;p=linux.git greybus: make op_cycle atomic (again) There's no need to protect updating a connections operation id cycle counter with the operations spinlock. That spinlock protects connection lists, which do not interact with the cycle counter. All that we require is that it gets updated atomically, and we can express that requirement in its type. Signed-off-by: Alex Elder Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/staging/greybus/connection.c b/drivers/staging/greybus/connection.c index 7fbfcdc22307..e59a7778c02a 100644 --- a/drivers/staging/greybus/connection.c +++ b/drivers/staging/greybus/connection.c @@ -191,6 +191,7 @@ struct gb_connection *gb_connection_create(struct gb_interface *interface, list_add_tail(&connection->interface_links, &interface->connections); spin_unlock_irq(&gb_connections_lock); + atomic_set(&connection->op_cycle, 0); INIT_LIST_HEAD(&connection->operations); return connection; diff --git a/drivers/staging/greybus/connection.h b/drivers/staging/greybus/connection.h index 035fced12edc..7568161e5dcb 100644 --- a/drivers/staging/greybus/connection.h +++ b/drivers/staging/greybus/connection.h @@ -35,7 +35,7 @@ struct gb_connection { enum gb_connection_state state; - u16 op_cycle; + atomic_t op_cycle; struct list_head operations; void *private; diff --git a/drivers/staging/greybus/operation.c b/drivers/staging/greybus/operation.c index 6ed1d479b117..15a6e3b24a7c 100644 --- a/drivers/staging/greybus/operation.c +++ b/drivers/staging/greybus/operation.c @@ -640,6 +640,7 @@ int gb_operation_request_send(struct gb_operation *operation, struct gb_connection *connection = operation->connection; struct gb_operation_msg_hdr *header; unsigned long timeout; + unsigned int cycle; int ret; if (connection->state != GB_CONNECTION_STATE_ENABLED) @@ -661,9 +662,8 @@ int gb_operation_request_send(struct gb_operation *operation, * Assign the operation's id, and store it in the request header. * Zero is a reserved operation id. */ - spin_lock_irq(&gb_operations_lock); - operation->id = ++connection->op_cycle % U16_MAX + 1; - spin_unlock_irq(&gb_operations_lock); + cycle = (unsigned int)atomic_inc_return(&connection->op_cycle); + operation->id = (u16)(cycle % U16_MAX + 1); header = operation->request->header; header->operation_id = cpu_to_le16(operation->id);