# HG changeset patch
# User Keir Fraser <keir@xxxxxxxxxxxxx>
# Date 1191420127 -3600
# Node ID d4f9453a3de751296bbab1438f337becfd115b8a
# Parent e7a3f045cb60f2db1e38f65d9cca5934e4234f53
Use module use count on accel plugin to prevent premature unload.
Signed-off-by: Kieran Mansley <kmansley@xxxxxxxxxxxxxx>
---
drivers/xen/netback/accel.c | 10 ++++++----
drivers/xen/netback/common.h | 1 +
2 files changed, 7 insertions(+), 4 deletions(-)
diff -r e7a3f045cb60 -r d4f9453a3de7 drivers/xen/netback/accel.c
--- a/drivers/xen/netback/accel.c Wed Oct 03 15:01:30 2007 +0100
+++ b/drivers/xen/netback/accel.c Wed Oct 03 15:02:07 2007 +0100
@@ -187,8 +187,8 @@ static int netback_accelerator_cleanup_b
*
* This should only be allowed when there are no remaining users -
* i.e. it is not necessary to go through and clear all the hooks, as
- * they should have already been removed. This is enforced through a
- * usage count and BUG_ON(use!=0), but should be made more user-friendly
+ * they should have already been removed. This is enforced by taking
+ * a module reference to the plugin while the interfaces are in use
*/
void netback_disconnect_accelerator(int id, const char *eth_name)
{
@@ -227,7 +227,8 @@ void netback_probe_accelerators(struct b
*/
spin_lock_irqsave(&accelerators_lock, flags);
list_for_each_entry(accelerator, &accelerators_list, link) {
- if (match_accelerator(dev, be, accelerator)) {
+ if (match_accelerator(dev, be, accelerator) &&
+ try_module_get(accelerator->hooks->owner)) {
be->accelerator = accelerator;
atomic_inc(&be->accelerator->use_count);
be->accelerator->hooks->probe(dev);
@@ -242,9 +243,10 @@ void netback_remove_accelerators(struct
struct xenbus_device *dev)
{
/* Notify the accelerator (if any) of this device's removal */
- if ( be->accelerator ) {
+ if (be->accelerator) {
be->accelerator->hooks->remove(dev);
atomic_dec(&be->accelerator->use_count);
+ module_put(be->accelerator->hooks->owner);
}
be->accelerator = NULL;
}
diff -r e7a3f045cb60 -r d4f9453a3de7 drivers/xen/netback/common.h
--- a/drivers/xen/netback/common.h Wed Oct 03 15:01:30 2007 +0100
+++ b/drivers/xen/netback/common.h Wed Oct 03 15:02:07 2007 +0100
@@ -125,6 +125,7 @@ extern int netbk_copy_skb_mode;
/* Function pointers into netback accelerator plugin modules */
struct netback_accel_hooks {
+ struct module *owner;
int (*probe)(struct xenbus_device *dev);
int (*remove)(struct xenbus_device *dev);
};
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|