[Libvirt-cim] [PATCH 6/6] VSMS: Determine if default controller exists for KVM

John Ferlan jferlan at redhat.com
Wed Mar 19 02:49:10 UTC 2014


If a default controller for 'pci' with model 'pci-root' doesn't exist,
create one for any add/modify type event.

Signed-off-by: John Ferlan <jferlan at redhat.com>
---
 src/Virt_VirtualSystemManagementService.c | 106 +++++++++++++++++++++++++++++-
 1 file changed, 103 insertions(+), 3 deletions(-)

diff --git a/src/Virt_VirtualSystemManagementService.c b/src/Virt_VirtualSystemManagementService.c
index 3e7785e..4610374 100644
--- a/src/Virt_VirtualSystemManagementService.c
+++ b/src/Virt_VirtualSystemManagementService.c
@@ -659,6 +659,82 @@ static bool default_input_device(struct domain *domain)
         return true;
 }
 
+static bool check_default_controller_device(struct domain *domain)
+{
+        int i;
+        struct controller_device *cdev = NULL;
+
+        CU_DEBUG("Domain '%s' type=%d", domain->name, domain->type);
+
+        /* Only QEMU/KVM devices need controllers */
+        if (domain->type != DOMAIN_KVM && domain->type != DOMAIN_QEMU)
+                return true;
+
+        /* Do we find a 'pci' device with 'pci-root' model on the system?
+         * If not, create one.
+         */
+        for (i = 0; i < domain->dev_controller_ct; i++) {
+                struct virt_device *_dev = &domain->dev_controller[i];
+                if (_dev->type == CIM_RES_TYPE_UNKNOWN) {
+                        CU_DEBUG("controller _dev->type is unknown")
+                        continue;
+                }
+
+                cdev = &_dev->dev.controller;
+
+                CU_DEBUG("controller type=%d model=%s",
+                         cdev->type, cdev->model ? cdev->model : "unknown");
+
+                if (cdev->type == CIM_CONTROLLER_PROTOCOL_TYPE_PCI &&
+                        cdev->model != NULL &&
+                        STREQC(cdev->model, "pci-root")) {
+                        CU_DEBUG("Found 'pci-root' for %s", domain->name);
+                        break;
+                }
+                cdev = NULL;
+        }
+
+        /* Didn't find 'pci'/'pci-root', let's add it */
+        if (cdev == NULL) {
+                char *model;
+                struct virt_device *_list;
+                struct virt_device *_dev;
+
+                CU_DEBUG("Domain '%s' missing 'pci-root'", domain->name);
+
+                model = strdup("pci-root");
+                if (model == NULL) {
+                        CU_DEBUG("Fail to allocate default controller model");
+                        return false;
+                }
+
+                if (domain->dev_controller == NULL)
+                        _list = calloc(1, sizeof(*domain->dev_controller));
+                else
+                        _list = realloc(domain->dev_controller,
+                                        (domain->dev_controller_ct + 1) *
+                                        sizeof(struct virt_device));
+                if (_list == NULL) {
+                        CU_DEBUG("Fail to allocate controller model");
+                        free(model);
+                        return false;
+                }
+                domain->dev_controller = _list;
+
+                _dev = &domain->dev_controller[domain->dev_controller_ct];
+                _dev->type = CIM_RES_TYPE_CONTROLLER;
+
+                cdev = &_dev->dev.controller;
+                memset(cdev, 0, sizeof(*cdev));
+                cdev->type = CIM_CONTROLLER_PROTOCOL_TYPE_PCI;
+                cdev->index = 0; /* By definition it must be 0 */
+                cdev->model = model;
+                domain->dev_controller_ct += 1;
+        }
+
+        return true;
+}
+
 static bool add_default_devs(struct domain *domain)
 {
         if (domain->dev_graphics_ct < 1 &&
@@ -2545,8 +2621,16 @@ static CMPIInstance *create_system(const CMPIContext *context,
                 goto out;
         }
 
+        if (!check_default_controller_device(domain)) {
+                CU_DEBUG("Failed to check default controller");
+                cu_statusf(_BROKER, s,
+                           CMPI_RC_ERR_FAILED,
+                           "Failed to create default controller");
+                goto out;
+        }
+
         xml = system_to_xml(domain);
-        CU_DEBUG("System XML:\n%s", xml);
+        CU_DEBUG("create_system XML:\n%s", xml);
 
         inst = connect_and_create(xml, ref, s);
         if (inst != NULL) {
@@ -2815,9 +2899,17 @@ static CMPIStatus update_system_settings(const CMPIContext *context,
                 goto out;
         }
 
+        if (!check_default_controller_device(dominfo)) {
+                CU_DEBUG("Failed to check default controller");
+                cu_statusf(_BROKER, &s,
+                           CMPI_RC_ERR_FAILED,
+                           "Failed to create default controller");
+                goto out;
+        }
+
         xml = system_to_xml(dominfo);
         if (xml != NULL) {
-                CU_DEBUG("New XML is:\n%s", xml);
+                CU_DEBUG("update_system_settings XML:\n%s", xml);
                 connect_and_create(xml, ref, &s);
         }
 
@@ -3310,9 +3402,17 @@ static CMPIStatus _update_resources_for(const CMPIContext *context,
                 goto out;
         }
 
+        if (!check_default_controller_device(dominfo)) {
+                CU_DEBUG("Failed to check default controller");
+                cu_statusf(_BROKER, &s,
+                           CMPI_RC_ERR_FAILED,
+                           "Failed to create default controller");
+                goto out;
+        }
+
         xml = system_to_xml(dominfo);
         if (xml != NULL) {
-                CU_DEBUG("New XML:\n%s", xml);
+                CU_DEBUG("_update_resources_for XML:\n%s", xml);
                 connect_and_create(xml, ref, &s);
 
                 if (inst_list_add(&list, rasd) == 0) {
-- 
1.8.5.3




More information about the Libvirt-cim mailing list