
On 03/13/2014 11:27 PM, John Ferlan wrote:
Based on review comments - I've made a few adjustments to the initial patch. This change would be merged with 1/3 once we ensure things work as expected.
Differences to 1/3:
1. Add "break;" in appropriate spots as found by Coverity 2. Add controller fields for : index - Required property of <controller> ports - Optional property of <controller> vectors - Optional property of <controller> queues - Optional property of optional child <driver> of <controller> master - Optional child of <controller> with paired list of properties address - Optional child of <controller> with paired list of properties 3. Adjust the 'cdev->id' to be "controller:" + "type" + ":" + "index" where type, index is sourced from the <controller type='string' index='#'> 4. Change the CIM_RES_TYPE_CONTROLLER to 32771
Signed-off-by: John Ferlan <jferlan@redhat.com> --- libxkutil/device_parsing.c | 51 +++++++++++++++++++++++++++++++++++++++------- libxkutil/device_parsing.h | 6 ++++++ libxkutil/xmlgen.c | 27 ++++++++++++++++++++---- src/svpc_types.h | 2 +- 4 files changed, 74 insertions(+), 12 deletions(-)
diff --git a/libxkutil/device_parsing.c b/libxkutil/device_parsing.c index 12c52dc..41d75b8 100644 --- a/libxkutil/device_parsing.c +++ b/libxkutil/device_parsing.c @@ -313,7 +313,13 @@ static void cleanup_controller_device(struct controller_device *dev) return;
free(dev->type); + free(dev->index); not needed if of type uint64_t free(dev->model); + free(dev->queues); + free(dev->ports); + free(dev->vectors); + cleanup_device_address(&dev->address); + cleanup_device_address(&dev->master); }
void cleanup_virt_device(struct virt_device *dev) @@ -1113,10 +1119,11 @@ static int parse_input_device(xmlNode *node, struct virt_device **vdevs) return 0; }
-static int parse_controller_device(xmlNode *node, struct virt_device **vdevs) +static int parse_controller_device(xmlNode *cnode, struct virt_device **vdevs) { struct virt_device *vdev = NULL; struct controller_device *cdev = NULL; + xmlNode *child = NULL; char *index = NULL;
int ret;
vdev = calloc(1, sizeof(*vdev)); @@ -1125,15 +1132,36 @@ static int parse_controller_device(xmlNode *node, struct virt_device **vdevs)
cdev = &(vdev->dev.controller);
- cdev->type = get_attr_value(node, "type"); - cdev->model = get_attr_value(node, "model"); - - if (cdev->type == NULL) + cdev->type = get_attr_value(cnode, "type"); + if (cdev->type == NULL) { + CU_DEBUG("No type"); goto err; - + } + cdev->index = get_attr_value(cnode, "index"); + if (cdev->index == NULL) { + CU_DEBUG("No index"); + goto err; + }
index = get_attr_value(cnode, "index"); if (index != NULL) { sscanf(index, "%" PRIu64, &cdev->index); free(index); } else { CU_DEBUG("No index"); goto err; }
+ cdev->model = get_attr_value(cnode, "model"); + cdev->ports = get_attr_value(cnode, "ports"); + cdev->vectors = get_attr_value(cnode, "vectors"); + + for (child = cnode->children; child != NULL; child = child->next) { + if (XSTREQ(child->name, "address")) { + parse_device_address(child, &cdev->address); + } else if (XSTREQ(child->name, "master")) { + /* Although technically not an address it is similar + * insomuch as it's a paired list of attributes that + * we're just going to save and write out later + */ + parse_device_address(child, &cdev->master); + } else if (XSTREQ(child->name, "driver")) { + cdev->queues = get_attr_value(child, "queues"); + } + } vdev->type = CIM_RES_TYPE_CONTROLLER;
- ret = asprintf(&vdev->id, "%s", cdev->type); + ret = asprintf(&vdev->id, "controller:%s:%s", cdev->type, cdev->index); if (ret == -1) { CU_DEBUG("Failed to create controller id string"); goto err; @@ -1275,6 +1303,7 @@ static int parse_devices(const char *xml, struct virt_device **_list, int type) case CIM_RES_TYPE_CONTROLLER: xpathstr = CONTROLLER_XPATH; func = &parse_controller_device; + break;
default: CU_DEBUG("Unrecognized device type. Returning."); @@ -1397,7 +1426,15 @@ struct virt_device *virt_device_dup(struct virt_device *_dev) &_dev->dev.console); } else if (dev->type == CIM_RES_TYPE_CONTROLLER) { DUP_FIELD(dev, _dev, dev.controller.type); + DUP_FIELD(dev, _dev, dev.controller.index); dev->dev.controller.index = _dev->dev.controller.index;
DUP_FIELD(dev, _dev, dev.controller.model); + DUP_FIELD(dev, _dev, dev.controller.ports); + DUP_FIELD(dev, _dev, dev.controller.vectors); + DUP_FIELD(dev, _dev, dev.controller.queues); + duplicate_device_address(&dev->dev.controller.master, + &_dev->dev.controller.master); + duplicate_device_address(&dev->dev.controller.address, + &_dev->dev.controller.address); }
return dev; diff --git a/libxkutil/device_parsing.h b/libxkutil/device_parsing.h index 556b9f2..e3d5616 100644 --- a/libxkutil/device_parsing.h +++ b/libxkutil/device_parsing.h @@ -163,7 +163,13 @@ struct input_device {
#define CONTROLLER_INDEX_NOT_SET -1
struct controller_device { char *type; + char *index;
this is an uint64 in the mof and I would suggest to at least for the index use uint64_t since it is good to have a number when things like hostdev are to be support in the future. The numbers for ports, vectors and queues are just handed from RASDs into xml and vice versa.
char *model; + char *ports; + char *vectors; + char *queues; + struct device_address address; + struct device_address master; };
struct virt_device { diff --git a/libxkutil/xmlgen.c b/libxkutil/xmlgen.c index 96e1c28..2326b1f 100644 --- a/libxkutil/xmlgen.c +++ b/libxkutil/xmlgen.c @@ -799,6 +799,7 @@ static const char *controller_xml(xmlNodePtr root, struct domain *dominfo) int i;
for (i = 0; i < dominfo->dev_controller_ct; i++) { + xmlNodePtr ctlr; xmlNodePtr tmp; struct virt_device *_dev = &dominfo->dev_controller[i]; if (_dev->type == CIM_RES_TYPE_UNKNOWN) @@ -806,12 +807,29 @@ static const char *controller_xml(xmlNodePtr root, struct domain *dominfo)
struct controller_device *dev = &_dev->dev.controller;
- tmp = xmlNewChild(root, NULL, BAD_CAST "controller", NULL); - if (tmp == NULL) + ctlr = xmlNewChild(root, NULL, BAD_CAST "controller", NULL); + if (ctlr == NULL) return XML_ERROR;
- xmlNewProp(tmp, BAD_CAST "type", BAD_CAST dev->type); - xmlNewProp(tmp, BAD_CAST "model", BAD_CAST dev->model); + /* Required */ + xmlNewProp(ctlr, BAD_CAST "type", BAD_CAST dev->type); + xmlNewProp(ctlr, BAD_CAST "index", BAD_CAST dev->index);
if (cdev->index != CONTROLLER_INDEX_NOT_SET) { char *string = NULL; if (asprintf(&string, "%" PRIu64, cdev->index) == -1) return XML_ERROR; xmlNewProp(ctlr, BAD_CAST "index", BAD_CAST string); free(string); }
+ + /* Optional */ + if (dev->model) + xmlNewProp(ctlr, BAD_CAST "model", BAD_CAST dev->model); + if (dev->ports) + xmlNewProp(ctlr, BAD_CAST "ports", BAD_CAST dev->ports); + if (dev->vectors) + xmlNewProp(ctlr, BAD_CAST "vectors", BAD_CAST dev->vectors); + if (dev->queues) { + tmp = xmlNewChild(ctlr, NULL, BAD_CAST "driver", NULL); + xmlNewProp(tmp, BAD_CAST "queueus", BAD_CAST dev->queues); + } + if (dev->master.ct > 0) + return device_address_xml(ctlr, &dev->master); + if (dev->address.ct > 0) + return device_address_xml(ctlr, &dev->address); }
-- Mit freundlichen Grüßen/Kind regards Boris Fiuczynski IBM Deutschland Research & Development GmbH Vorsitzender des Aufsichtsrats: Martina Köderitz Geschäftsführung: Dirk Wittkopp Sitz der Gesellschaft: Böblingen Registergericht: Amtsgericht Stuttgart, HRB 243294