[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [linux-2.6.18-xen] netfront/back: Configure network acceleration using ethernet device name.



# 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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.