]> www.infradead.org Git - users/dwmw2/qemu.git/commitdiff
hw/xen/devconfig: refactor API for creating vbd/nic
authorJoao Martins <joao.m.martins@oracle.com>
Thu, 11 Oct 2018 15:39:06 +0000 (11:39 -0400)
committerJoao Martins <joao.m.martins@oracle.com>
Tue, 19 Feb 2019 14:00:57 +0000 (09:00 -0500)
This allows a device to create devices and point out the
backend id and type. Which consequently will allow orchestration
via driver domains, via qemu or via hypervisor.

Signed-off-by: Joao Martins <joao.m.martins@oracle.com>
hw/xen/xen_devconfig.c
hw/xen/xen_pvdev.c
include/hw/xen/xen-legacy-backend.h

index 315dbc9c515333f25d0d52a436f7f81607ee8408..a33a943cc06944d5e40ed0e07b84fe6d1b9ad934 100644 (file)
@@ -5,8 +5,8 @@
 
 /* ------------------------------------------------------------- */
 
-static int xen_config_dev_dirs(const char *ftype, const char *btype, int vdev,
-                               char *fe, char *be, int len)
+static int xen_config_dev_dirs(const char *ftype, const char *btype, int be_id,
+                               int vdev, char *fe, char *be, int len)
 {
     char *dom;
 
@@ -14,23 +14,23 @@ static int xen_config_dev_dirs(const char *ftype, const char *btype, int vdev,
     snprintf(fe, len, "%s/device/%s/%d", dom, ftype, vdev);
     free(dom);
 
-    dom = xs_get_domain_path(xenstore, 0);
+    dom = xs_get_domain_path(xenstore, be_id);
     snprintf(be, len, "%s/backend/%s/%d/%d", dom, btype, xen_domid, vdev);
     free(dom);
 
-    xenstore_mkdir(fe, XS_PERM_READ | XS_PERM_WRITE);
-    xenstore_mkdir(be, XS_PERM_READ);
+    xenstore_mkdir_other(fe, be_id, XS_PERM_READ | XS_PERM_WRITE);
+    xenstore_mkdir_other(be, be_id, XS_PERM_READ);
     return 0;
 }
 
-static int xen_config_dev_all(char *fe, char *be)
+static int xen_config_dev_all(char *fe, char *be, int be_id)
 {
     /* frontend */
     if (xen_protocol)
         xenstore_write_str(fe, "protocol", xen_protocol);
 
     xenstore_write_int(fe, "state",           XenbusStateInitialising);
-    xenstore_write_int(fe, "backend-id",      0);
+    xenstore_write_int(fe, "backend-id",      be_id);
     xenstore_write_str(fe, "backend",         be);
 
     /* backend */
@@ -45,7 +45,7 @@ static int xen_config_dev_all(char *fe, char *be)
 
 /* ------------------------------------------------------------- */
 
-int xen_config_dev_blk(DriveInfo *disk)
+static int __xen_config_dev_blk(DriveInfo *disk, XenBackendType *bk)
 {
     char fe[256], be[256], device_name[32];
     int vdev = 202 * 256 + 16 * disk->unit;
@@ -57,7 +57,7 @@ int xen_config_dev_blk(DriveInfo *disk)
     snprintf(device_name, sizeof(device_name), "xvd%c", 'a' + disk->unit);
     xen_pv_printf(NULL, 1, "config disk %d [%s]: %s\n",
                   disk->unit, device_name, filename);
-    xen_config_dev_dirs("vbd", "qdisk", vdev, fe, be, sizeof(fe));
+    xen_config_dev_dirs("vbd", bk->type, bk->domid, vdev, fe, be, sizeof(fe));
 
     /* frontend */
     xenstore_write_int(fe, "virtual-device",  vdev);
@@ -70,12 +70,46 @@ int xen_config_dev_blk(DriveInfo *disk)
     xenstore_write_str(be, "mode",            mode);
 
     /* common stuff */
-    return xen_config_dev_all(fe, be);
+    return xen_config_dev_all(fe, be, 0);
 }
 
-int xen_config_dev_nic(NICInfo *nic)
+int xen_config_dev_blk(DriveInfo *disk)
+{
+    char type[16] = "qdisk";
+    XenBackendType be = { .type = type, .domid = 0 };
+
+    return __xen_config_dev_blk(disk, &be);
+}
+
+int xen_config_dev_blk_by_conf(DriveInfo *disk, XenBackendType *be)
+{
+    return __xen_config_dev_blk(disk, be);
+}
+
+static int __xen_config_dev_nic(char *mac, int dev_id, XenBackendType *bk)
 {
     char fe[256], be[256];
+
+    xen_pv_printf(NULL, 1, "config nic %d: mac=\"%s\"\n", dev_id, mac);
+    xen_config_dev_dirs("vif", bk->type, bk->domid, dev_id, fe, be, sizeof(fe));
+
+    /* frontend */
+    xenstore_write_int(fe, "handle",     dev_id);
+    xenstore_write_str(fe, "mac",        mac);
+
+    /* backend */
+    xenstore_write_str(be, "script",     "");
+    xenstore_write_int(be, "handle",     dev_id);
+    xenstore_write_str(be, "mac",        mac);
+
+    /* common stuff */
+    return xen_config_dev_all(fe, be, bk->domid);
+}
+
+int xen_config_dev_nic(NICInfo *nic)
+{
+    char type[16] = "qnic";
+    XenBackendType be = { .type = type, .domid = 0 };
     char mac[20];
     int vlan_id = -1;
 
@@ -83,46 +117,51 @@ int xen_config_dev_nic(NICInfo *nic)
     snprintf(mac, sizeof(mac), "%02x:%02x:%02x:%02x:%02x:%02x",
              nic->macaddr.a[0], nic->macaddr.a[1], nic->macaddr.a[2],
              nic->macaddr.a[3], nic->macaddr.a[4], nic->macaddr.a[5]);
-    xen_pv_printf(NULL, 1, "config nic %d: mac=\"%s\"\n", vlan_id, mac);
-    xen_config_dev_dirs("vif", "qnic", vlan_id, fe, be, sizeof(fe));
 
-    /* frontend */
-    xenstore_write_int(fe, "handle",     vlan_id);
-    xenstore_write_str(fe, "mac",        mac);
+    return __xen_config_dev_nic(mac, vlan_id, &be);
+}
 
-    /* backend */
-    xenstore_write_int(be, "handle",     vlan_id);
-    xenstore_write_str(be, "mac",        mac);
+int xen_config_dev_nic_by_conf(NetClientState *netdev, MACAddr macaddr,
+                               XenBackendType *be)
+{
+    static int dev_id = -1;
+    char mac[20];
 
-    /* common stuff */
-    return xen_config_dev_all(fe, be);
+    dev_id++;
+
+    snprintf(mac, sizeof(mac), "%02x:%02x:%02x:%02x:%02x:%02x",
+             macaddr.a[0], macaddr.a[1], macaddr.a[2],
+             macaddr.a[3], macaddr.a[4], macaddr.a[5]);
+    xen_pv_printf(NULL, 1, "config nic %d: mac=\"%s\"\n", dev_id, mac);
+
+    return __xen_config_dev_nic(mac, dev_id, be);
 }
 
 int xen_config_dev_vfb(int vdev, const char *type)
 {
     char fe[256], be[256];
 
-    xen_config_dev_dirs("vfb", "vfb", vdev, fe, be, sizeof(fe));
+    xen_config_dev_dirs("vfb", "vfb", 0, vdev, fe, be, sizeof(fe));
 
     /* backend */
     xenstore_write_str(be, "type",  type);
 
     /* common stuff */
-    return xen_config_dev_all(fe, be);
+    return xen_config_dev_all(fe, be, 0);
 }
 
 int xen_config_dev_vkbd(int vdev)
 {
     char fe[256], be[256];
 
-    xen_config_dev_dirs("vkbd", "vkbd", vdev, fe, be, sizeof(fe));
-    return xen_config_dev_all(fe, be);
+    xen_config_dev_dirs("vkbd", "vkbd", 0, vdev, fe, be, sizeof(fe));
+    return xen_config_dev_all(fe, be, 0);
 }
 
 int xen_config_dev_console(int vdev)
 {
     char fe[256], be[256];
 
-    xen_config_dev_dirs("console", "console", vdev, fe, be, sizeof(fe));
-    return xen_config_dev_all(fe, be);
+    xen_config_dev_dirs("console", "console", 0, vdev, fe, be, sizeof(fe));
+    return xen_config_dev_all(fe, be, 0);
 }
index e9c2ca0159485ee194d5c33e0d434c3d8909d967..47a05fae4632a69cf8d77afe400a072be88a7ee8 100644 (file)
@@ -57,11 +57,12 @@ void xen_config_cleanup(void)
     }
 }
 
-int xenstore_mkdir(char *path, int p)
+int xenstore_mkdir_other(char *path, int domid, int p)
 {
     struct xs_permissions perms[2] = {
         {
-            .id    = 0, /* set owner: dom0 */
+            .id    = domid, /* set owner: dom0 */
+            .perms = XS_PERM_READ | XS_PERM_WRITE,
         }, {
             .id    = xen_domid,
             .perms = p,
@@ -81,6 +82,11 @@ int xenstore_mkdir(char *path, int p)
     return 0;
 }
 
+int xenstore_mkdir(char *path, int p)
+{
+    return xenstore_mkdir_other(path, 0, p);
+}
+
 int xenstore_write_str(const char *base, const char *node, const char *val)
 {
     char abspath[XEN_BUFSIZE];
index 901edbc272853c2e2a9cdd80cf71855bb4ebf662..8117b98318c6281a48817a733cd0f0a89ba95afb 100644 (file)
@@ -25,6 +25,7 @@ extern BusState *xen_sysbus;
 extern XenEvtchnHandler *xen_legacy_handler;
 
 int xenstore_mkdir(char *path, int p);
+int xenstore_mkdir_other(char *path, int be_id, int p);
 int xenstore_write_be_str(struct XenLegacyDevice *xendev, const char *node,
                           const char *val);
 int xenstore_write_be_int(struct XenLegacyDevice *xendev, const char *node,
@@ -116,10 +117,22 @@ extern struct XenDevOps xen_netdev_ops;       /* xen_nic.c         */
 extern struct XenDevOps xen_usb_ops;          /* xen-usb.c         */
 #endif
 
+typedef struct XenBackendType {
+    char                *type;
+    uint16_t            domid;
+} XenBackendType;
+
+#define DEFINE_XEN_PROPERTIES(_state, _conf)                  \
+    DEFINE_PROP_STRING("backendtype", _state, _conf.type),    \
+    DEFINE_PROP_UINT16("backend", _state, _conf.domid, 0)
+
 /* configuration (aka xenbus setup) */
 void xen_config_cleanup(void);
 int xen_config_dev_blk(DriveInfo *disk);
+int xen_config_dev_blk_by_conf(DriveInfo *disk, XenBackendType *be);
 int xen_config_dev_nic(NICInfo *nic);
+int xen_config_dev_nic_by_conf(NetClientState *netdev, MACAddr macaddr,
+                               XenBackendType *be);
 int xen_config_dev_vfb(int vdev, const char *type);
 int xen_config_dev_vkbd(int vdev);
 int xen_config_dev_console(int vdev);