nodedev: add ccw device state and remove fencing

Instead of fencing offline ccw devices add the state to the ccw
capability.

Resolves: https://issues.redhat.com/browse/RHEL-39497
Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Boris Fiuczynski 2024-06-19 14:29:17 +02:00 committed by Michal Privoznik
parent 69d8a327f1
commit 09cc83dcf6
4 changed files with 66 additions and 3 deletions

View File

@ -86,6 +86,12 @@ VIR_ENUM_IMPL(virNodeDevDRM,
"render", "render",
); );
VIR_ENUM_IMPL(virNodeDevCCWState,
VIR_NODE_DEV_CCW_STATE_LAST,
"offline",
"online",
);
static int static int
virNodeDevCapsDefParseString(const char *xpath, virNodeDevCapsDefParseString(const char *xpath,
xmlXPathContextPtr ctxt, xmlXPathContextPtr ctxt,
@ -743,6 +749,10 @@ virNodeDeviceDefFormat(const virNodeDeviceDef *def, unsigned int flags)
virNodeDeviceCapMdevDefFormat(&buf, data, inactive_state); virNodeDeviceCapMdevDefFormat(&buf, data, inactive_state);
break; break;
case VIR_NODE_DEV_CAP_CCW_DEV: case VIR_NODE_DEV_CAP_CCW_DEV:
if (data->ccw_dev.state != VIR_NODE_DEV_CCW_STATE_LAST) {
const char *state = virNodeDevCCWStateTypeToString(data->ccw_dev.state);
virBufferEscapeString(&buf, "<state>%s</state>\n", state);
}
virNodeDeviceCapCCWDefFormat(&buf, data); virNodeDeviceCapCCWDefFormat(&buf, data);
break; break;
case VIR_NODE_DEV_CAP_CSS_DEV: case VIR_NODE_DEV_CAP_CSS_DEV:
@ -1189,9 +1199,23 @@ virNodeDevCapCCWParseXML(xmlXPathContextPtr ctxt,
{ {
VIR_XPATH_NODE_AUTORESTORE(ctxt) VIR_XPATH_NODE_AUTORESTORE(ctxt)
g_autofree virCCWDeviceAddress *ccw_addr = NULL; g_autofree virCCWDeviceAddress *ccw_addr = NULL;
g_autofree char *state = NULL;
int val;
ctxt->node = node; ctxt->node = node;
/* state is optional */
ccw_dev->state = VIR_NODE_DEV_CCW_STATE_LAST;
if ((state = virXPathString("string(./state[1])", ctxt))) {
if ((val = virNodeDevCCWStateTypeFromString(state)) < 0) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("unknown state '%1$s' for '%2$s'"), state, def->name);
return -1;
}
ccw_dev->state = val;
}
ccw_addr = g_new0(virCCWDeviceAddress, 1); ccw_addr = g_new0(virCCWDeviceAddress, 1);
if (virNodeDevCCWDeviceAddressParseXML(ctxt, node, def->name, ccw_addr) < 0) if (virNodeDevCCWDeviceAddressParseXML(ctxt, node, def->name, ccw_addr) < 0)

View File

@ -112,6 +112,15 @@ typedef enum {
VIR_NODE_DEV_CAP_FLAG_CSS_MDEV = (1 << 0), VIR_NODE_DEV_CAP_FLAG_CSS_MDEV = (1 << 0),
} virNodeDevCCWCapFlags; } virNodeDevCCWCapFlags;
typedef enum {
VIR_NODE_DEV_CCW_STATE_OFFLINE = 0,
VIR_NODE_DEV_CCW_STATE_ONLINE,
VIR_NODE_DEV_CCW_STATE_LAST
} virNodeDevCCWStateType;
VIR_ENUM_DECL(virNodeDevCCWState);
typedef enum { typedef enum {
VIR_NODE_DEV_CAP_FLAG_AP_MATRIX_MDEV = (1 << 0), VIR_NODE_DEV_CAP_FLAG_AP_MATRIX_MDEV = (1 << 0),
} virNodeDevAPMatrixCapFlags; } virNodeDevAPMatrixCapFlags;
@ -279,6 +288,7 @@ struct _virNodeDevCapCCW {
virMediatedDeviceType **mdev_types; virMediatedDeviceType **mdev_types;
size_t nmdev_types; size_t nmdev_types;
virCCWDeviceAddress *channel_dev_addr; virCCWDeviceAddress *channel_dev_addr;
virNodeDevCCWStateType state;
}; };
typedef struct _virNodeDevCapVDPA virNodeDevCapVDPA; typedef struct _virNodeDevCapVDPA virNodeDevCapVDPA;

View File

@ -673,6 +673,14 @@
<attribute name="type"> <attribute name="type">
<value>ccw</value> <value>ccw</value>
</attribute> </attribute>
<optional>
<element name="state">
<choice>
<value>online</value>
<value>offline</value>
</choice>
</element>
</optional>
<ref name="capccwaddress"/> <ref name="capccwaddress"/>
</define> </define>

View File

@ -1201,13 +1201,34 @@ udevGetCCWAddress(const char *sysfs_path,
static int static int
udevProcessCCW(struct udev_device *device, udevCCWGetState(struct udev_device *device,
virNodeDeviceDef *def) virNodeDevCapData *data)
{ {
int online = 0; int online = 0;
if (udevGetIntSysfsAttr(device, "online", &online, 0) < 0 || online < 0)
return -1;
switch (online) {
case VIR_NODE_DEV_CCW_STATE_OFFLINE:
case VIR_NODE_DEV_CCW_STATE_ONLINE:
data->ccw_dev.state = online;
break;
default:
data->ccw_dev.state = VIR_NODE_DEV_CCW_STATE_LAST;
break;
}
return 0;
}
static int
udevProcessCCW(struct udev_device *device,
virNodeDeviceDef *def)
{
/* process only online devices to keep the list sane */ /* process only online devices to keep the list sane */
if (udevGetIntSysfsAttr(device, "online", &online, 0) < 0 || online != 1) if (udevCCWGetState(device, &def->caps->data) < 0)
return -1; return -1;
if (udevGetCCWAddress(def->sysfs_path, &def->caps->data) < 0) if (udevGetCCWAddress(def->sysfs_path, &def->caps->data) < 0)