[libvirt] [PATCHv4 2/5] S390: domain_conf support for CCW

Han Cheng hanc.fnst at cn.fujitsu.com
Wed Mar 6 11:57:24 UTC 2013



On 03/05/2013 11:44 PM, Viktor Mihajlovski wrote:
> Add necessary handling code for the new s390 CCW address type to
> virDomainDeviceInfo. Further, introduce  memory management, XML
> parsing, output formatting and range validation for the new
> virDomainDeviceCCWAddress type.
>
> Signed-off-by: Viktor Mihajlovski<mihajlov at linux.vnet.ibm.com>
> ---
> V2 Changes
>   - adapted virDomainDeviceCCWAddressParseXML to handle the new
>     set of CCW address attributes
>
> V4 Changes
>   - replace attribute 'schid' with 'devno', same for CCW address
>     field name
>
>   src/conf/domain_conf.c   |  107 +++++++++++++++++++++++++++++++++++++++++++++-
>   src/conf/domain_conf.h   |   16 +++++++
>   src/libvirt_private.syms |    1 +
>   3 files changed, 123 insertions(+), 1 deletion(-)
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 9c96cf1..9bf025f 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -186,7 +186,8 @@ VIR_ENUM_IMPL(virDomainDeviceAddress, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST,
>                 "ccid",
>                 "usb",
>                 "spapr-vio",
> -              "virtio-s390")
> +              "virtio-s390",
> +              "ccw")
>
>   VIR_ENUM_IMPL(virDomainDisk, VIR_DOMAIN_DISK_TYPE_LAST,
>                 "block",
> @@ -2138,6 +2139,13 @@ void virDomainObjListRemove(virDomainObjListPtr doms,
>       virObjectUnlock(doms);
>   }
>
> +static int
> +virDomainDeviceCCWAddressIsValid(virDomainDeviceCCWAddressPtr addr)
> +{
> +    return addr->cssid<= VIR_DOMAIN_DEVICE_CCW_MAX_CSSID&&
> +        addr->ssid<= VIR_DOMAIN_DEVICE_CCW_MAX_SSID&&
> +        addr->devno<= VIR_DOMAIN_DEVICE_CCW_MAX_DEVNO;
> +}
>
>   int virDomainDeviceAddressIsValid(virDomainDeviceInfoPtr info,
>                                     int type)
> @@ -2152,6 +2160,12 @@ int virDomainDeviceAddressIsValid(virDomainDeviceInfoPtr info,
>       case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE:
>           return 1;
>
> +    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390:
> +        return 1;
> +
> +    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW:
> +        return virDomainDeviceCCWAddressIsValid(&info->addr.ccw);
> +
>       case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB:
>           return 1;
>       }
> @@ -2233,6 +2247,19 @@ static int virDomainDeviceInfoClearPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUS
>       return 0;
>   }
>
> +static int
> +virDomainDeviceInfoClearCCWAddress(virDomainDefPtr def ATTRIBUTE_UNUSED,
> +                                   virDomainDeviceDefPtr device ATTRIBUTE_UNUSED,
> +                                   virDomainDeviceInfoPtr info,
> +                                   void *opaque ATTRIBUTE_UNUSED)
> +{
> +    if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW) {
> +        memset(&info->addr, 0, sizeof(info->addr));
> +        info->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE;
> +    }
> +    return 0;
> +}
> +
>   int virDomainDeviceInfoIterate(virDomainDefPtr def,
>                                  virDomainDeviceInfoCallback cb,
>                                  void *opaque)
> @@ -2381,6 +2408,11 @@ void virDomainDefClearPCIAddresses(virDomainDefPtr def)
>       virDomainDeviceInfoIterate(def, virDomainDeviceInfoClearPCIAddress, NULL);
>   }
>
> +void virDomainDefClearCCWAddresses(virDomainDefPtr def)
> +{
> +    virDomainDeviceInfoIterate(def, virDomainDeviceInfoClearCCWAddress, NULL);
> +}
> +
>   void virDomainDefClearDeviceAliases(virDomainDefPtr def)
>   {
>       virDomainDeviceInfoIterate(def, virDomainDeviceInfoClearAlias, NULL);
> @@ -2482,6 +2514,13 @@ virDomainDeviceInfoFormat(virBufferPtr buf,
>               virBufferAsprintf(buf, " reg='0x%llx'", info->addr.spaprvio.reg);
>           break;
>
> +    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW:
> +        virBufferAsprintf(buf, " cssid='0x%x' ssid='0x%x' devno='0x%04x'",
> +                          info->addr.ccw.cssid,
> +                          info->addr.ccw.ssid,
> +                          info->addr.ccw.devno);
> +        break;
> +
>       default:
>           virReportError(VIR_ERR_INTERNAL_ERROR,
>                          _("unknown address type '%d'"), info->type);
> @@ -2592,6 +2631,64 @@ cleanup:
>   }
>
>   static int
> +virDomainDeviceCCWAddressParseXML(xmlNodePtr node,
> +                                  virDomainDeviceCCWAddressPtr addr)
> +{
> +    int   ret = -1;
> +    char *cssid;
> +    char *ssid;
> +    char *devno;
> +
> +    memset(addr, 0, sizeof(*addr));
> +
> +    cssid = virXMLPropString(node, "cssid");
> +    ssid = virXMLPropString(node, "ssid");
> +    devno = virXMLPropString(node, "devno");
> +
> +    if (cssid&&  ssid&&  devno) {
> +        if (cssid&&
> +            virStrToLong_ui(cssid, NULL, 0,&addr->cssid)<  0) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                           _("Cannot parse<address>  'cssid' attribute"));
> +            goto cleanup;
> +        }
> +        if (ssid&&
> +            virStrToLong_ui(ssid, NULL, 0,&addr->ssid)<  0) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                           _("Cannot parse<address>  'ssid' attribute"));
> +            goto cleanup;
> +        }
> +        if (devno&&
> +            virStrToLong_ui(devno, NULL, 0,&addr->devno)<  0) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                           _("Cannot parse<address>  'devno' attribute"));
> +            goto cleanup;
> +        }
> +        if (!virDomainDeviceCCWAddressIsValid(addr)) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR,
> +                           _("Invalid specification for virtio ccw"
> +                             " address: cssid='%s' ssid='%s' devno='%s'"),
> +                           cssid, ssid, devno);
> +            goto cleanup;
> +        }
> +        addr->assigned = true;
> +    } else if (cssid || ssid || devno) {
This if is duplicate.

> +        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                       _("Invalid partial specification for virtio ccw"
> +                         " address"));
> +        goto cleanup;
> +    }
> +
> +    ret = 0;
> +
> +cleanup:
> +    VIR_FREE(cssid);
> +    VIR_FREE(ssid);
> +    VIR_FREE(devno);
> +    return ret;
> +}
> +
> +static int
>   virDomainDeviceCcidAddressParseXML(xmlNodePtr node,
>                                      virDomainDeviceCcidAddressPtr addr)
>   {
> @@ -2884,6 +2981,12 @@ virDomainDeviceInfoParseXML(xmlNodePtr node,
>               goto cleanup;
>           break;
>
> +    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW:
> +        if (virDomainDeviceCCWAddressParseXML
> +                (address,&info->addr.ccw)<  0)
> +            goto cleanup;
> +        break;
> +
>       default:
>           /* Should not happen */
>           virReportError(VIR_ERR_INTERNAL_ERROR,
> @@ -4755,6 +4858,7 @@ virDomainControllerDefParseXML(xmlNodePtr node,
>
>       if (def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE&&
>           def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO&&
> +        def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW&&
>           def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390&&
>           def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
>           virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> @@ -5352,6 +5456,7 @@ virDomainNetDefParseXML(virCapsPtr caps,
>        * them we should make sure address type is correct */
>       if (def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE&&
>           def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO&&
> +        def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW&&
>           def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390&&
>           def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
>           virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 5828ae2..b07f2be 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -195,6 +195,7 @@ enum virDomainDeviceAddressType {
>       VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB,
>       VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO,
>       VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390,
> +    VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW,
>
>       VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST
>   };
> @@ -224,6 +225,19 @@ struct _virDomainDeviceVirtioSerialAddress {
>       unsigned int port;
>   };
>
> +# define VIR_DOMAIN_DEVICE_CCW_MAX_CSSID    254
> +# define VIR_DOMAIN_DEVICE_CCW_MAX_SSID       3
> +# define VIR_DOMAIN_DEVICE_CCW_MAX_DEVNO  65535
> +
> +typedef struct _virDomainDeviceCCWAddress virDomainDeviceCCWAddress;
> +typedef virDomainDeviceCCWAddress *virDomainDeviceCCWAddressPtr;
> +struct _virDomainDeviceCCWAddress {
> +    unsigned int cssid;
> +    unsigned int ssid;
> +    unsigned int devno;
> +    bool         assigned;
> +};
> +
>   typedef struct _virDomainDeviceCcidAddress virDomainDeviceCcidAddress;
>   typedef virDomainDeviceCcidAddress *virDomainDeviceCcidAddressPtr;
>   struct _virDomainDeviceCcidAddress {
> @@ -274,6 +288,7 @@ struct _virDomainDeviceInfo {
>           virDomainDeviceCcidAddress ccid;
>           virDomainDeviceUSBAddress usb;
>           virDomainDeviceSpaprVioAddress spaprvio;
> +        virDomainDeviceCCWAddress ccw;
>       } addr;
>       int mastertype;
>       union {
> @@ -1987,6 +2002,7 @@ int virDomainDeviceInfoCopy(virDomainDeviceInfoPtr dst,
>                               virDomainDeviceInfoPtr src);
>   void virDomainDeviceInfoClear(virDomainDeviceInfoPtr info);
>   void virDomainDefClearPCIAddresses(virDomainDefPtr def);
> +void virDomainDefClearCCWAddresses(virDomainDefPtr def);
>   void virDomainDefClearDeviceAliases(virDomainDefPtr def);
>
>   typedef int (*virDomainDeviceInfoCallback)(virDomainDefPtr def,
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index ed46479..aed007e 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -110,6 +110,7 @@ virDomainCpuPlacementModeTypeToString;
>   virDomainDefAddImplicitControllers;
>   virDomainDefAddSecurityLabelDef;
>   virDomainDefCheckABIStability;
> +virDomainDefClearCCWAddresses;
>   virDomainDefClearDeviceAliases;
>   virDomainDefClearPCIAddresses;
>   virDomainDefCompatibleDevice;

-- 
--------------------------------------------------
Han Cheng
Nanjing Fujitsu Nanda Software Tech. Co., Ltd.(FNST)
No. 6 Wenzhu Road, Nanjing, 210012, China
TEL: +86+25-86630566-8540
FUJITSU INTERNAL: 79955-8540
FAX: +86+25-83317685
MAIL: hanc.fnst at cn.fujitsu.com
--------------------------------------------------




More information about the libvir-list mailing list