[libvirt] [PATCH 16/18] cpu: Parse and use PVR masks in the ppc64 driver

Andrea Bolognani abologna at redhat.com
Thu Aug 6 14:53:28 UTC 2015


On Thu, 2015-08-06 at 16:42 +0200, Jiri Denemark wrote:
> 
> > @@ -364,6 +358,24 @@ ppc64ModelLoad(xmlXPathContextPtr ctxt,
> >          model->data->pvr[i].value = pvr;
> >  
> >          VIR_FREE(prop);
> > +
> > +        if (!(prop = virXMLPropString(nodes[i], "mask"))) {
> > +            virReportError(VIR_ERR_INTERNAL_ERROR,
> > +                           _("Missing PVR mask in CPU model %s"),
> > +                           model->name);
> > +            goto ignore;
> > +        }
> > +
> > +        if (virStrToLong_ul(prop, NULL, 16, &pvr) < 0) {
> > +            virReportError(VIR_ERR_INTERNAL_ERROR,
> > +                           _("Invalid PVR mask in CPU model %s"),
> > +                           model->name);
> > +            goto ignore;
> > +        }
> > +
> > +        model->data->pvr[i].mask = pvr;
> 
> Wouldn't virXPathULongHex be good enough?

See the replay to the same remark in patch 13/18.

> > +
> > +        VIR_FREE(prop);
> >      }
> >  
> >      if (!map->models) {
> > @@ -607,33 +619,33 @@ ppc64DriverFree(virCPUDataPtr data)
> >  static virCPUDataPtr
> >  ppc64DriverNodeData(virArch arch)
> >  {
> > -    virCPUDataPtr cpuData;
> > -
> > -    if (VIR_ALLOC(cpuData) < 0)
> > -        goto error;
> > -
> > -    if (VIR_ALLOC(cpuData->data.ppc64) < 0)
> > -        goto error;
> > -
> > -    if (VIR_ALLOC_N(cpuData->data.ppc64->pvr, 1) < 0)
> > -        goto error;
> > -
> > -    cpuData->data.ppc64->len = 1;
> > -
> > -    cpuData->arch = arch;
> > +    virCPUDataPtr nodeData = NULL;
> > +    struct ppc64_map *map = NULL;
> > +    struct ppc64_model *model = NULL;
> > +    uint32_t pvr = 0;
> >  
> >  #if defined(__powerpc__) || defined(__powerpc64__)
> >      asm("mfpvr %0"
> > -        : "=r" (cpuData->data.ppc64->pvr[0].value));
> > +        : "=r" (pvr));
> >  #endif
> >  
> > -    return cpuData;
> > +    if (!(map = ppc64LoadMap()))
> > +        goto cleanup;
> >  
> > - error:
> > -    if (cpuData)
> > -        ppc64DataFree(cpuData->data.ppc64);
> > -    VIR_FREE(cpuData);
> > -    return NULL;
> > +    if (!(model = ppc64ModelFindPVR(map, pvr))) {
> > +        virReportError(VIR_ERR_OPERATION_FAILED,
> > +                       _("Cannot find CPU model with PVR 0x%08x"),
> > +                       pvr);
> > +        goto cleanup;
> > +    }
> > +
> > +    if (!(nodeData = ppc64MakeCPUData(arch, model->data)))
> > +        goto cleanup;
> > +
> > + cleanup:
> > +    ppc64MapFree(map);
> > +
> > +    return nodeData;
> >  }
> 
> The ppc64DriverNodeData API is supposed to return raw data from the
> host, which is then passed to ppc64DriverDecode to be translated into 
> a
> CPU model name. In other words, you copied most of the internals of
> ppc64DriverDecode here while you in fact only need to add a single 
> line
> 
>     cpuData->data.ppc64->pvr[0].mask = 0xffffffff;

Done.

Cheers.

-- 
Andrea Bolognani
Software Engineer - Virtualization Team




More information about the libvir-list mailing list