summaryrefslogtreecommitdiffstats
path: root/drivers/staging/greybus/connection.c
diff options
context:
space:
mode:
authorJohan Hovold <johan@hovoldconsulting.com>2016-01-19 12:51:23 +0100
committerGreg Kroah-Hartman <gregkh@google.com>2016-01-19 12:17:13 -0800
commitc3681f6c92df6c4ec834fc8e3fa1905e73952630 (patch)
treea10e6735badd6039c729bc69eb894a14ec5cae5b /drivers/staging/greybus/connection.c
parent2edbf5ffbf5ef8b92518e57687e96a7d34ddd3c4 (diff)
greybus: connection: destroy workqueue at unregister
Destroy the work queue when the connection is destroyed/deregistered instead of when the last reference is dropped. The work queue is not needed once the connection has been deregistered, and no operations will ever be added to it again (handled by checking connection->state) even if the connection object may not be deallocated until the final reference is dropped. The work-queue name is set based on the host-device name and host-device cport id, something which guarantees a unique name. This would no longer be true if the work queue was not destroyed at connection deregistration as a new connection could then be created for that very same host cport. This is not necessarily a problem unless some work queue features are used that require unique work-queue names, but let's try to be well behaved. Also update an obsolete comment and make explicit that a connection must be disabled before being destroyed. Reviewed-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Johan Hovold <johan@hovoldconsulting.com> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Diffstat (limited to 'drivers/staging/greybus/connection.c')
-rw-r--r--drivers/staging/greybus/connection.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/staging/greybus/connection.c b/drivers/staging/greybus/connection.c
index d1508e21b378..1d7c21e03bfa 100644
--- a/drivers/staging/greybus/connection.c
+++ b/drivers/staging/greybus/connection.c
@@ -73,7 +73,7 @@ static void gb_connection_kref_release(struct kref *kref)
struct gb_connection *connection;
connection = container_of(kref, struct gb_connection, kref);
- destroy_workqueue(connection->wq);
+
kfree(connection);
mutex_unlock(&connection_mutex);
}
@@ -500,9 +500,7 @@ out_unlock:
}
EXPORT_SYMBOL_GPL(gb_connection_disable);
-/*
- * Tear down a previously set up connection.
- */
+/* Caller must have disabled the connection before destroying it. */
void gb_connection_destroy(struct gb_connection *connection)
{
struct ida *id_map;
@@ -515,6 +513,8 @@ void gb_connection_destroy(struct gb_connection *connection)
list_del(&connection->hd_links);
spin_unlock_irq(&gb_connections_lock);
+ destroy_workqueue(connection->wq);
+
id_map = &connection->hd->cport_id_map;
ida_simple_remove(id_map, connection->hd_cport_id);
connection->hd_cport_id = CPORT_ID_BAD;