mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-04-26 15:14:42 +00:00
Add helper APIs for iterating over PCI device resource files
* src/pci.h, src/pci.c: Helper for iterating over PCI device resource files * src/libvirt_private.syms: Export pciDeviceFileIterate
This commit is contained in:
parent
1e060bf2d7
commit
ec31cd76c9
@ -294,6 +294,8 @@ pciDeviceListNew;
|
|||||||
pciDeviceListFree;
|
pciDeviceListFree;
|
||||||
pciDeviceListAdd;
|
pciDeviceListAdd;
|
||||||
pciDeviceListDel;
|
pciDeviceListDel;
|
||||||
|
pciDeviceFileIterate;
|
||||||
|
|
||||||
|
|
||||||
# qparams.h
|
# qparams.h
|
||||||
qparam_get_query;
|
qparam_get_query;
|
||||||
|
52
src/pci.c
52
src/pci.c
@ -1022,3 +1022,55 @@ pciDeviceListFind(pciDeviceList *list, pciDevice *dev)
|
|||||||
return list->devs[i];
|
return list->devs[i];
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int pciDeviceFileIterate(virConnectPtr conn,
|
||||||
|
pciDevice *dev,
|
||||||
|
pciDeviceFileActor actor,
|
||||||
|
void *opaque)
|
||||||
|
{
|
||||||
|
char *pcidir = NULL;
|
||||||
|
char *file = NULL;
|
||||||
|
DIR *dir = NULL;
|
||||||
|
int ret = -1;
|
||||||
|
struct dirent *ent;
|
||||||
|
|
||||||
|
if (virAsprintf(&pcidir, "/sys/bus/pci/devices/%04x:%02x:%02x.%x",
|
||||||
|
dev->domain, dev->bus, dev->slot, dev->function) < 0) {
|
||||||
|
virReportOOMError(conn);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(dir = opendir(pcidir))) {
|
||||||
|
virReportSystemError(conn, errno,
|
||||||
|
_("cannot open %s"), pcidir);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((ent = readdir(dir)) != NULL) {
|
||||||
|
/* Device assignment requires:
|
||||||
|
* $PCIDIR/config, $PCIDIR/resource, $PCIDIR/resourceNNN, $PCIDIR/rom
|
||||||
|
*/
|
||||||
|
if (STREQ(ent->d_name, "config") ||
|
||||||
|
STRPREFIX(ent->d_name, "resource") ||
|
||||||
|
STREQ(ent->d_name, "rom")) {
|
||||||
|
if (virAsprintf(&file, "%s/%s", pcidir, ent->d_name) < 0) {
|
||||||
|
virReportOOMError(conn);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
if ((actor)(conn, dev, file, opaque) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
VIR_FREE(file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
if (dir)
|
||||||
|
closedir(dir);
|
||||||
|
VIR_FREE(file);
|
||||||
|
VIR_FREE(pcidir);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
16
src/pci.h
16
src/pci.h
@ -22,7 +22,6 @@
|
|||||||
#ifndef __VIR_PCI_H__
|
#ifndef __VIR_PCI_H__
|
||||||
#define __VIR_PCI_H__
|
#define __VIR_PCI_H__
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
typedef struct _pciDevice pciDevice;
|
typedef struct _pciDevice pciDevice;
|
||||||
@ -62,4 +61,19 @@ void pciDeviceListDel (virConnectPtr conn,
|
|||||||
pciDevice * pciDeviceListFind (pciDeviceList *list,
|
pciDevice * pciDeviceListFind (pciDeviceList *list,
|
||||||
pciDevice *dev);
|
pciDevice *dev);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Callback that will be invoked once for each file
|
||||||
|
* associated with / used for PCI host device access.
|
||||||
|
*
|
||||||
|
* Should return 0 if successfully processed, or
|
||||||
|
* -1 to indicate error and abort iteration
|
||||||
|
*/
|
||||||
|
typedef int (*pciDeviceFileActor)(virConnectPtr conn, pciDevice *dev,
|
||||||
|
const char *path, void *opaque);
|
||||||
|
|
||||||
|
int pciDeviceFileIterate(virConnectPtr conn,
|
||||||
|
pciDevice *dev,
|
||||||
|
pciDeviceFileActor actor,
|
||||||
|
void *opaque);
|
||||||
|
|
||||||
#endif /* __VIR_PCI_H__ */
|
#endif /* __VIR_PCI_H__ */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user