[libvirt] [PATCHv2.5 03/10] conf: Add device address type for dimm devices

John Ferlan jferlan at redhat.com
Fri Mar 13 03:46:58 UTC 2015



On 03/04/2015 11:24 AM, Peter Krempa wrote:
> Dimm devices are described by the slot and base address. Add a new
> address type to be able to describe such address.
> ---
>  docs/schemas/domaincommon.rng | 18 +++++++++++
>  src/conf/domain_conf.c        | 74 ++++++++++++++++++++++++++++++++++++++++++-
>  src/conf/domain_conf.h        |  9 ++++++
>  3 files changed, 100 insertions(+), 1 deletion(-)
> 
> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> index 8e107e6..c1c02e4 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -4028,6 +4028,18 @@
>        </attribute>
>      </optional>
>    </define>
> +  <define name="dimmaddress">
> +    <optional>
> +      <attribute name="slot">
> +        <ref name="unsignedInt"/>
> +      </attribute>
> +    </optional>
> +    <optional>
> +      <attribute name="base">
> +        <ref name="hexuint"/>
> +      </attribute>
> +    </optional>
> +  </define>
>    <define name="devices">
>      <element name="devices">
>        <interleave>
> @@ -4447,6 +4459,12 @@
>              <value>virtio-mmio</value>
>            </attribute>
>          </group>
> +        <group>
> +          <attribute name="type">
> +            <value>dimm</value>
> +          </attribute>
> +          <ref name="dimmaddress"/>
> +        </group>
>        </choice>
>      </element>
>    </define>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 4d765f9..3be52a7 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -249,7 +249,8 @@ VIR_ENUM_IMPL(virDomainDeviceAddress, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST,
>                "virtio-s390",
>                "ccw",
>                "virtio-mmio",
> -              "isa")
> +              "isa",
> +              "dimm")
> 
>  VIR_ENUM_IMPL(virDomainDiskDevice, VIR_DOMAIN_DISK_DEVICE_LAST,
>                "disk",
> @@ -2828,6 +2829,11 @@ virDomainDeviceInfoAddressIsEqual(const virDomainDeviceInfo *a,
>          if (memcmp(&a->addr.isa, &b->addr.isa, sizeof(a->addr.isa)))
>              return false;
>          break;
> +
> +    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM:
> +        if (memcmp(&a->addr.dimm, &b->addr.dimm, sizeof(a->addr.dimm)))
> +            return false;
> +        break;
>      }
> 
>      return true;
> @@ -3657,6 +3663,12 @@ virDomainDeviceInfoFormat(virBufferPtr buf,
>              virBufferAsprintf(buf, " irq='0x%x'", info->addr.isa.irq);
>          break;
> 
> +    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM:
> +        virBufferAsprintf(buf, " slot='%u'", info->addr.dimm.slot);
> +        virBufferAsprintf(buf, " base='0x%llx'", info->addr.dimm.base);
> +
> +        break;
> +
>      case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390:
>      case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE:
>      case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST:
> @@ -4026,6 +4038,41 @@ virDomainDeviceISAAddressParseXML(xmlNodePtr node,
>      return ret;
>  }
> 
> +
> +static int
> +virDomainDeviceDimmAddressParseXML(xmlNodePtr node,
> +                                   virDomainDeviceDimmAddressPtr addr)
> +{
> +    int ret = -1;
> +    char *tmp = NULL;
> +
> +    if (!(tmp = virXMLPropString(node, "slot")) ||
> +        virStrToLong_uip(tmp, NULL, 10, &addr->slot) < 0) {
> +        virReportError(VIR_ERR_XML_ERROR,
> +                       _("invalid or missing dimm slot id '%s'"),
> +                       NULLSTR(tmp));
> +        goto cleanup;
> +    }
> +    VIR_FREE(tmp);
> +
> +    if (!(tmp = virXMLPropString(node, "base")) ||
> +        virStrToLong_ullp(tmp, NULL, 16, &addr->base) < 0) {
> +        virReportError(VIR_ERR_XML_ERROR,
> +                       _("invalid or missing dimm base address '%s'"),
> +                       NULLSTR(tmp));
> +        goto cleanup;
> +    }
> +    VIR_FREE(tmp);
> +
> +    ret = 0;
> +
> + cleanup:
> +    VIR_FREE(tmp);
> +
> +    return ret;
> +}
> +
> +
>  /* Parse the XML definition for a device address
>   * @param node XML nodeset to parse for device address definition
>   */
> @@ -4167,6 +4214,11 @@ virDomainDeviceInfoParseXML(xmlNodePtr node,
>                         _("virtio-s390 bus doesn't have an address"));
>          goto cleanup;
> 
> +    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM:
> +        if (virDomainDeviceDimmAddressParseXML(address, &info->addr.dimm) < 0)
> +            goto cleanup;
> +        break;
> +
>      case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE:
>      case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST:
>          break;
> @@ -15295,6 +15347,26 @@ virDomainDeviceInfoCheckABIStability(virDomainDeviceInfoPtr src,
>          }
>          break;
> 
> +    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM:
> +        if (src->addr.dimm.slot != dst->addr.dimm.slot) {
> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                           _("Target device dimm slot %d does not match "
> +                             "source %d"),
> +                           dst->addr.dimm.slot,
> +                           src->addr.dimm.slot);

Both are %u not %d

ACK - with the adjustment.

John

> +            return false;
> +        }
> +
> +        if (src->addr.dimm.base != dst->addr.dimm.base) {
> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                           _("Target device dimm base addres '%llx' does "
> +                             "not match source '%llx'"),
> +                           dst->addr.dimm.base,
> +                           src->addr.dimm.base);
> +            return false;
> +        }
> +        break;
> +
>      case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB:
>      case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO:
>      case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390:
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 3537b32..da13bf6 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -235,6 +235,7 @@ typedef enum {
>      VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW,
>      VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO,
>      VIR_DOMAIN_DEVICE_ADDRESS_TYPE_ISA,
> +    VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM,
> 
>      VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST
>  } virDomainDeviceAddressType;
> @@ -310,6 +311,13 @@ struct _virDomainDeviceISAAddress {
>      unsigned int irq;
>  };
> 
> +typedef struct _virDomainDeviceDimmAddress virDomainDeviceDimmAddress;
> +typedef virDomainDeviceDimmAddress *virDomainDeviceDimmAddressPtr;
> +struct _virDomainDeviceDimmAddress {
> +    unsigned int slot;
> +    unsigned long long base;
> +};
> +
>  typedef struct _virDomainDeviceInfo virDomainDeviceInfo;
>  typedef virDomainDeviceInfo *virDomainDeviceInfoPtr;
>  struct _virDomainDeviceInfo {
> @@ -328,6 +336,7 @@ struct _virDomainDeviceInfo {
>          virDomainDeviceSpaprVioAddress spaprvio;
>          virDomainDeviceCCWAddress ccw;
>          virDomainDeviceISAAddress isa;
> +        virDomainDeviceDimmAddress dimm;
>      } addr;
>      int mastertype;
>      union {
> 




More information about the libvir-list mailing list