]> xenbits.xensource.com Git - people/ssmith/nc2-2.6.27.bak/.git/commitdiff
Add second location for acceleration config option for XenServer
authorSteven Smith <ssmith@weybridge.uk.xensource.com>
Thu, 28 May 2009 10:54:20 +0000 (11:54 +0100)
committerSteven Smith <ssmith@weybridge.uk.xensource.com>
Thu, 28 May 2009 10:54:20 +0000 (11:54 +0100)
drivers/xen/netback/accel.c
drivers/xen/sfc_netback/accel_xenbus.c

index d3c6ece61e1af21695c17ada428ca77a4ed68530..52d5d94549a6f36b0a24e564912d15a8a0e4060b 100644 (file)
@@ -64,16 +64,32 @@ static int match_accelerator(struct xenbus_device *xendev,
        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 %ld\n",
-                       __FUNCTION__, PTR_ERR(eth_name));
-               return 0;
-       } else {
-               if (!strcmp(eth_name, accelerator->eth_name))
-                       rc = 1;
-               kfree(eth_name);
-               return rc;
+               int dom, vif;
+               char *nodename;
+
+               /* Try alternate configuration location */
+               sscanf(xendev->nodename, "backend/vif/%d/%d", &dom, &vif);
+               nodename = kasprintf(GFP_NOIO | __GFP_HIGH, 
+                                    "/local/domain/%d/vm-data/device/vif/%d", 
+                                    dom, vif);
+               if (!nodename)
+                       return 0;
+
+               eth_name = xenbus_read(XBT_NIL, nodename, "accel", NULL);
+
+               kfree(nodename);
+
+               if (IS_ERR(eth_name)) {
+                       /* Probably means not present */
+                       DPRINTK("%s: no match due to xenbus_read accel err %ld\n",
+                               __FUNCTION__, PTR_ERR(eth_name));
+                       return 0;
+               }
        }
+       if (!strcmp(eth_name, accelerator->eth_name))
+               rc = 1;
+       kfree(eth_name);
+       return rc;
 }
 
 
index c98a23503f61f0de318e81f8945cf13de4cd1c7f..3a4fbb4b7fcf5d710f537ba22e85f8ce86d821a7 100644 (file)
@@ -330,8 +330,22 @@ static int read_nicname(struct xenbus_device *dev, struct netback_accel *bend)
 
        /* nic name used to select interface used for acceleration */
        bend->nicname = xenbus_read(XBT_NIL, dev->nodename, "accel", &len);
-       if (IS_ERR(bend->nicname))
-               return PTR_ERR(bend->nicname);
+       if (IS_ERR(bend->nicname)) {
+               /* Try looking in the XenServer5 place */
+               char *nodename = 
+                       kasprintf(GFP_NOIO | __GFP_HIGH, 
+                                 "/local/domain/%d/vm-data/device/vif/%d", 
+                                 bend->far_end, bend->vif_num);
+
+               if (!nodename)
+                       return -ENOMEM;
+
+               bend->nicname = xenbus_read(XBT_NIL, nodename, "accel", &len);
+               kfree(nodename);
+
+               if (IS_ERR(bend->nicname))
+                       return PTR_ERR(bend->nicname);
+       }
 
        return 0;
 }