libvirt/src/util/virmdev.h
Jonathon Jongsma ab29ddfdf8 nodedev: support 'mtty' device for testing
It would be nice to be able to test the mediated device capabilities
without having physical hardware which supports it. The 'mtty' kernel
module presents a virtual parent device which is capable of creating
'fake' mediated devices, and as such it would be useful for testing.

However, the 'mtty' device is not part of an existing device subsystem
(e.g. PCI, etc), so libvirt ignores it and it does not get added to the
node device list. And because it does not get added to the node device
list, it cannot be used to create child mdevs using `virsh
nodedev-create`.

There is already a node device type capability
VIR_NODE_DEV_CAP_MDEV_TYPES that indicates whether a device supports
creating child mediated devices, but libvirt assumes that this is a
nested capability (in other words, it assumes that the primary
capability of a device is something like PCI). If we allow this
MDEV_TYPES capability to be a primary device capability, then we can
support virtual devices like 'mtty' as a parent for mediated devices.

See https://bugzilla.redhat.com/show_bug.cgi?id=2107031

Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
2022-08-10 11:19:03 -05:00

158 lines
4.6 KiB
C

/*
* virmdev.h: helper APIs for managing host mediated devices
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see
* <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "internal.h"
#include "virobject.h"
#include "virenum.h"
typedef enum {
VIR_MDEV_MODEL_TYPE_VFIO_PCI = 0,
VIR_MDEV_MODEL_TYPE_VFIO_CCW = 1,
VIR_MDEV_MODEL_TYPE_VFIO_AP = 2,
VIR_MDEV_MODEL_TYPE_LAST
} virMediatedDeviceModelType;
VIR_ENUM_DECL(virMediatedDeviceModel);
typedef struct _virMediatedDevice virMediatedDevice;
typedef struct _virMediatedDeviceList virMediatedDeviceList;
typedef struct _virMediatedDeviceAttr virMediatedDeviceAttr;
struct _virMediatedDeviceAttr {
char *name;
char *value;
};
virMediatedDeviceAttr *virMediatedDeviceAttrNew(void);
void virMediatedDeviceAttrFree(virMediatedDeviceAttr *attr);
G_DEFINE_AUTOPTR_CLEANUP_FUNC(virMediatedDeviceAttr, virMediatedDeviceAttrFree);
G_DEFINE_AUTOPTR_CLEANUP_FUNC(virMediatedDeviceList, virObjectUnref);
typedef struct _virMediatedDeviceType virMediatedDeviceType;
struct _virMediatedDeviceType {
char *id;
char *name;
char *device_api;
unsigned int available_instances;
};
typedef int (*virMediatedDeviceCallback)(virMediatedDevice *dev,
const char *path, void *opaque);
virMediatedDevice *
virMediatedDeviceNew(const char *uuidstr, virMediatedDeviceModelType model);
virMediatedDevice *
virMediatedDeviceCopy(virMediatedDevice *dev);
void
virMediatedDeviceFree(virMediatedDevice *dev);
const char *
virMediatedDeviceGetPath(virMediatedDevice *dev);
void
virMediatedDeviceGetUsedBy(virMediatedDevice *dev,
const char **drvname, const char **domname);
int
virMediatedDeviceSetUsedBy(virMediatedDevice *dev,
const char *drvname,
const char *domname);
char *
virMediatedDeviceGetIOMMUGroupDev(const char *uuidstr);
int
virMediatedDeviceGetIOMMUGroupNum(const char *uuidstr);
char *
virMediatedDeviceGetSysfsPath(const char *uuidstr);
bool
virMediatedDeviceIsUsed(virMediatedDevice *dev,
virMediatedDeviceList *list);
bool
virMediatedDeviceIsUsed(virMediatedDevice *dev,
virMediatedDeviceList *list);
virMediatedDeviceList *
virMediatedDeviceListNew(void);
int
virMediatedDeviceListAdd(virMediatedDeviceList *list,
virMediatedDevice **dev);
virMediatedDevice *
virMediatedDeviceListGet(virMediatedDeviceList *list,
ssize_t idx);
size_t
virMediatedDeviceListCount(virMediatedDeviceList *list);
virMediatedDevice *
virMediatedDeviceListSteal(virMediatedDeviceList *list,
virMediatedDevice *dev);
virMediatedDevice *
virMediatedDeviceListStealIndex(virMediatedDeviceList *list,
ssize_t idx);
void
virMediatedDeviceListDel(virMediatedDeviceList *list,
virMediatedDevice *dev);
virMediatedDevice *
virMediatedDeviceListFind(virMediatedDeviceList *list,
const char *sysfspath);
int
virMediatedDeviceListFindIndex(virMediatedDeviceList *list,
const char *sysfspath);
int
virMediatedDeviceListMarkDevices(virMediatedDeviceList *dst,
virMediatedDeviceList *src,
const char *drvname,
const char *domname);
void
virMediatedDeviceTypeFree(virMediatedDeviceType *type);
int
virMediatedDeviceTypeReadAttrs(const char *sysfspath,
virMediatedDeviceType **type);
ssize_t
virMediatedDeviceGetMdevTypes(const char *sysfspath,
virMediatedDeviceType ***types,
size_t *ntypes);
int
virMediatedDeviceParentGetAddress(const char *sysfspath,
char **address);
G_DEFINE_AUTOPTR_CLEANUP_FUNC(virMediatedDevice, virMediatedDeviceFree);
G_DEFINE_AUTOPTR_CLEANUP_FUNC(virMediatedDeviceType, virMediatedDeviceTypeFree);