Commit 78033844 authored by Johan Hovold's avatar Johan Hovold Committed by Greg Kroah-Hartman

greybus: protocol: warn on bad deregistration

A protocol should be deregistered exactly once when the protocol module
is being unloaded. This means that protocol deregister will never be
called with active users as we take a module reference when looking up a
protocol.

Remove comment suggesting that we could one day forcefully stop a user
of a protocol, and issue a big warning if a protocol is deregistered
more than once or at some other time than during module unload (e.g.
with active users).
Signed-off-by: default avatarJohan Hovold <johan@hovoldconsulting.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@google.com>
parent 0b1118a9
...@@ -102,36 +102,24 @@ EXPORT_SYMBOL_GPL(__gb_protocol_register); ...@@ -102,36 +102,24 @@ EXPORT_SYMBOL_GPL(__gb_protocol_register);
/* /*
* De-register a previously registered protocol. * De-register a previously registered protocol.
*
* XXX Currently this fails (and reports an error to the caller) if
* XXX the protocol is currently in use. We may want to forcefully
* XXX kill off a protocol and all its active users at some point.
* XXX But I think that's better handled by quiescing modules that
* XXX have users and having those users drop their reference.
*
* Returns true if successful, false otherwise.
*/ */
int gb_protocol_deregister(struct gb_protocol *protocol) void gb_protocol_deregister(struct gb_protocol *protocol)
{ {
u8 protocol_count = 0;
if (!protocol) if (!protocol)
return 0; return;
spin_lock_irq(&gb_protocols_lock); spin_lock_irq(&gb_protocols_lock);
protocol = gb_protocol_find(protocol->id, protocol->major, protocol = gb_protocol_find(protocol->id, protocol->major,
protocol->minor); protocol->minor);
if (protocol) { if (WARN_ON(!protocol || protocol->count)) {
protocol_count = protocol->count; spin_unlock_irq(&gb_protocols_lock);
if (!protocol_count) return;
list_del(&protocol->links);
} }
list_del(&protocol->links);
spin_unlock_irq(&gb_protocols_lock); spin_unlock_irq(&gb_protocols_lock);
if (protocol)
pr_info("Deregistered %s protocol.\n", protocol->name); pr_info("Deregistered %s protocol.\n", protocol->name);
return protocol && !protocol_count;
} }
EXPORT_SYMBOL_GPL(gb_protocol_deregister); EXPORT_SYMBOL_GPL(gb_protocol_deregister);
......
...@@ -46,7 +46,7 @@ struct gb_protocol { ...@@ -46,7 +46,7 @@ struct gb_protocol {
}; };
int __gb_protocol_register(struct gb_protocol *protocol, struct module *module); int __gb_protocol_register(struct gb_protocol *protocol, struct module *module);
int gb_protocol_deregister(struct gb_protocol *protocol); void gb_protocol_deregister(struct gb_protocol *protocol);
#define gb_protocol_register(protocol) \ #define gb_protocol_register(protocol) \
__gb_protocol_register(protocol, THIS_MODULE) __gb_protocol_register(protocol, THIS_MODULE)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment