# HG changeset patch
# User Keir Fraser <keir@xxxxxxxxxxxxx>
# Date 1191419925 -3600
# Node ID 9c9881c9037b04957dfbb93c9c2556f0c824049c
# Parent 01ad7d0797c6819e5b4c6cbcc4d205a6ac6a7a16
netfront/back: Configure network acceleration using ethernet device name.
Signed-off-by: Kieran Mansley <kmansley@xxxxxxxxxxxxxx>
---
drivers/xen/netback/accel.c | 71 ++++++++++++++++++++++++++++------------
drivers/xen/netback/common.h | 8 ++--
drivers/xen/netfront/netfront.c | 2 -
3 files changed, 56 insertions(+), 25 deletions(-)
diff -r 01ad7d0797c6 -r 9c9881c9037b drivers/xen/netback/accel.c
--- a/drivers/xen/netback/accel.c Wed Oct 03 14:53:41 2007 +0100
+++ b/drivers/xen/netback/accel.c Wed Oct 03 14:58:45 2007 +0100
@@ -55,15 +55,24 @@ static spinlock_t accelerators_lock;
* compatible (i.e. if the accelerator should be used by the
* backend)
*/
-static int match_accelerator(struct backend_info *be,
+static int match_accelerator(struct xenbus_device *xendev,
+ struct backend_info *be,
struct netback_accelerator *accelerator)
{
- /*
- * This could do with being more sophisticated. For example,
- * determine which hardware is being used by each backend from
- * the bridge and network topology of the domain
- */
- return be->accelerator == NULL;
+ int rc = 0;
+ char *eth_name = xenbus_read(XBT_NIL, xendev->nodename, "accel", NULL);
+
+ if (IS_ERR(eth_name)) {
+ /* Probably means not present */
+ DPRINTK("%s: no match due to xenbus_read accel error %d\n",
+ __FUNCTION__, PTR_ERR(eth_name));
+ return 0;
+ } else {
+ if (!strcmp(eth_name, accelerator->eth_name))
+ rc = 1;
+ kfree(eth_name);
+ return rc;
+ }
}
/*
@@ -80,7 +89,7 @@ static int netback_accelerator_tell_back
if (!strcmp("vif", xendev->devicetype)) {
struct backend_info *be = xendev->dev.driver_data;
- if (match_accelerator(be, accelerator)) {
+ if (match_accelerator(xendev, be, accelerator)) {
be->accelerator = accelerator;
atomic_inc(&be->accelerator->use_count);
be->accelerator->hooks->probe(xendev);
@@ -94,12 +103,12 @@ static int netback_accelerator_tell_back
* Entry point for an netback accelerator plugin module. Called to
* advertise its presence, and connect to any suitable backends.
*/
-void netback_connect_accelerator(int id, const char *frontend,
+void netback_connect_accelerator(int id, const char *eth_name,
struct netback_accel_hooks *hooks)
{
struct netback_accelerator *new_accelerator =
kmalloc(sizeof(struct netback_accelerator), GFP_KERNEL);
- unsigned frontend_len, flags;
+ unsigned eth_name_len, flags;
if (!new_accelerator) {
DPRINTK("%s: failed to allocate memory for accelerator\n",
@@ -109,15 +118,15 @@ void netback_connect_accelerator(int id,
new_accelerator->id = id;
- frontend_len = strlen(frontend)+1;
- new_accelerator->frontend = kmalloc(frontend_len, GFP_KERNEL);
- if (!new_accelerator->frontend) {
- DPRINTK("%s: failed to allocate memory for frontend string\n",
+ eth_name_len = strlen(eth_name)+1;
+ new_accelerator->eth_name = kmalloc(eth_name_len, GFP_KERNEL);
+ if (!new_accelerator->eth_name) {
+ DPRINTK("%s: failed to allocate memory for eth_name string\n",
__FUNCTION__);
kfree(new_accelerator);
return;
}
- strlcpy(new_accelerator->frontend, frontend, frontend_len);
+ strlcpy(new_accelerator->eth_name, eth_name, eth_name_len);
new_accelerator->hooks = hooks;
@@ -136,7 +145,25 @@ EXPORT_SYMBOL_GPL(netback_connect_accele
/*
- * Disconnect an accerator plugin module that has previously been
+ * Remove the link from backend state to a particular accelerator
+ */
+static int netback_accelerator_cleanup_backend(struct device *dev, void *arg)
+{
+ struct netback_accelerator *accelerator =
+ (struct netback_accelerator *)arg;
+ struct xenbus_device *xendev = to_xenbus_device(dev);
+
+ if (!strcmp("vif", xendev->devicetype)) {
+ struct backend_info *be = xendev->dev.driver_data;
+ if (be->accelerator == accelerator)
+ be->accelerator = NULL;
+ }
+ return 0;
+}
+
+
+/*
+ * Disconnect an accelerator plugin module that has previously been
* connected.
*
* This should only be allowed when there are no remaining users -
@@ -144,18 +171,22 @@ EXPORT_SYMBOL_GPL(netback_connect_accele
* 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
*/
-void netback_disconnect_accelerator(int id, const char *frontend)
+void netback_disconnect_accelerator(int id, const char *eth_name)
{
struct netback_accelerator *accelerator, *next;
unsigned flags;
spin_lock_irqsave(&accelerators_lock, flags);
list_for_each_entry_safe(accelerator, next, &accelerators_list, link) {
- if (strcmp(frontend, accelerator->frontend)) {
+ if (strcmp(eth_name, accelerator->eth_name)) {
BUG_ON(atomic_read(&accelerator->use_count) != 0);
list_del(&accelerator->link);
spin_unlock_irqrestore(&accelerators_lock, flags);
- kfree(accelerator->frontend);
+
+ xenbus_for_each_backend(accelerator,
+
netback_accelerator_cleanup_backend);
+
+ kfree(accelerator->eth_name);
kfree(accelerator);
return;
}
@@ -177,7 +208,7 @@ void netback_probe_accelerators(struct b
*/
spin_lock_irqsave(&accelerators_lock, flags);
list_for_each_entry(accelerator, &accelerators_list, link) {
- if (match_accelerator(be, accelerator)) {
+ if (match_accelerator(dev, be, accelerator)) {
be->accelerator = accelerator;
atomic_inc(&be->accelerator->use_count);
be->accelerator->hooks->probe(dev);
diff -r 01ad7d0797c6 -r 9c9881c9037b drivers/xen/netback/common.h
--- a/drivers/xen/netback/common.h Wed Oct 03 14:53:41 2007 +0100
+++ b/drivers/xen/netback/common.h Wed Oct 03 14:58:45 2007 +0100
@@ -133,7 +133,7 @@ struct netback_accelerator {
struct netback_accelerator {
struct list_head link;
int id;
- char *frontend;
+ char *eth_name;
atomic_t use_count;
struct netback_accel_hooks *hooks;
};
@@ -150,10 +150,10 @@ struct backend_info {
};
/* Connect an accelerator plugin module to netback */
-extern void netback_connect_accelerator(int id, const char *frontend,
+extern void netback_connect_accelerator(int id, const char *eth_name,
struct netback_accel_hooks *hooks);
-/* Disconnect a previously connected accelerator pluging module */
-extern void netback_disconnect_accelerator(int id, const char *frontend);
+/* Disconnect a previously connected accelerator plugin module */
+extern void netback_disconnect_accelerator(int id, const char *eth_name);
extern
diff -r 01ad7d0797c6 -r 9c9881c9037b drivers/xen/netfront/netfront.c
--- a/drivers/xen/netfront/netfront.c Wed Oct 03 14:53:41 2007 +0100
+++ b/drivers/xen/netfront/netfront.c Wed Oct 03 14:58:45 2007 +0100
@@ -1761,7 +1761,7 @@ static int network_connect(struct net_de
feature_accel = 1;
accel_frontend = xenbus_read(XBT_NIL, np->xbdev->otherend,
- "accel", &accel_len);
+ "accel-frontend", &accel_len);
if (IS_ERR(accel_frontend))
feature_accel = 0;
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|