From: Keir Fraser Date: Wed, 3 Oct 2007 14:02:07 +0000 (+0100) Subject: Use module use count on accel plugin to prevent premature unload. X-Git-Tag: xen-3.2.0~21^2^2~28^2^2~22^2^2~9^2~12^2~23^2~22 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=51e2e7d2914825322e8f5a2c156f23efdf828cfd;p=xenclient%2Fkernel.git Use module use count on accel plugin to prevent premature unload. Signed-off-by: Kieran Mansley --- diff --git a/drivers/xen/netback/accel.c b/drivers/xen/netback/accel.c index d34f362c..33f254b8 100644 --- a/drivers/xen/netback/accel.c +++ b/drivers/xen/netback/accel.c @@ -187,8 +187,8 @@ static int netback_accelerator_cleanup_backend(struct device *dev, void *arg) * * 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 backend_info *be, */ 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 backend_info *be, 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 --git a/drivers/xen/netback/common.h b/drivers/xen/netback/common.h index 6346dba6..784b6287 100644 --- a/drivers/xen/netback/common.h +++ b/drivers/xen/netback/common.h @@ -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); };