mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-11-02 11:21:12 +00:00
e9f468d3f9
The Xen code for making HVM VT-d PCI passthrough attach and detach wasn't working properly: 1) In xenDaemonAttachDevice(), we were always trying to reconfigure a PCI passthrough device, even the first time we added it. This was because the code in virDomainXMLDevID() was not checking xenstore for the existence of the device, and always returning 0 (meaning that the device already existed). 2) In xenDaemonDetachDevice(), we were trying to use "device_destroy" to detach a PCI device. While you would think that is the right method to call, it's actually wrong for PCI devices. In particular, in upstream Xen (and soon in RHEL-5 Xen), device_configure is actually used to destroy a PCI device. To fix the attach problem I add a lookup into xenstore to see if the device we are trying to attach already exists. To fix the detach problem I change it so that for PCI detach (only), we use device_configure with the appropriate sxpr to do the detachment. * src/xen/xend_internal.c: don't use device_destroy for PCI devices and fix the other issues. * src/xen/xs_internal.c src/xen/xs_internal.h: add xenStoreDomainGetPCIID()
105 lines
4.0 KiB
C
105 lines
4.0 KiB
C
/*
|
|
* xs_internal.h: internal API for access to XenStore
|
|
*
|
|
* Copyright (C) 2006 Red Hat, Inc.
|
|
*
|
|
* See COPYING.LIB for the License of this software
|
|
*
|
|
* Daniel Veillard <veillard@redhat.com>
|
|
*/
|
|
|
|
#ifndef __VIR_XS_INTERNAL_H__
|
|
#define __VIR_XS_INTERNAL_H__
|
|
|
|
#include "internal.h"
|
|
#include "driver.h"
|
|
|
|
extern struct xenUnifiedDriver xenStoreDriver;
|
|
int xenStoreInit (void);
|
|
|
|
virDrvOpenStatus xenStoreOpen (virConnectPtr conn,
|
|
virConnectAuthPtr auth,
|
|
int flags);
|
|
int xenStoreClose (virConnectPtr conn);
|
|
int xenStoreGetDomainInfo (virDomainPtr domain,
|
|
virDomainInfoPtr info);
|
|
int xenStoreNumOfDomains (virConnectPtr conn);
|
|
int xenStoreListDomains (virConnectPtr conn,
|
|
int *ids,
|
|
int maxids);
|
|
virDomainPtr xenStoreLookupByName(virConnectPtr conn,
|
|
const char *name);
|
|
unsigned long xenStoreGetMaxMemory (virDomainPtr domain);
|
|
int xenStoreDomainSetMemory (virDomainPtr domain,
|
|
unsigned long memory);
|
|
unsigned long xenStoreDomainGetMaxMemory(virDomainPtr domain);
|
|
int xenStoreDomainShutdown (virDomainPtr domain);
|
|
int xenStoreDomainReboot (virDomainPtr domain,
|
|
unsigned int flags);
|
|
|
|
/* those are entry point for the proxy */
|
|
int xenStoreDomainGetVNCPort(virConnectPtr conn,
|
|
int domid);
|
|
char * xenStoreDomainGetConsolePath(virConnectPtr conn,
|
|
int domid);
|
|
char * xenStoreDomainGetOSTypeID(virConnectPtr conn,
|
|
int id);
|
|
char * xenStoreDomainGetNetworkID(virConnectPtr conn,
|
|
int id,
|
|
const char *mac);
|
|
char * xenStoreDomainGetDiskID(virConnectPtr conn,
|
|
int id,
|
|
const char *dev);
|
|
char * xenStoreDomainGetPCIID(virConnectPtr conn,
|
|
int domid,
|
|
const char *bdf);
|
|
char * xenStoreDomainGetName(virConnectPtr conn,
|
|
int id);
|
|
int xenStoreDomainGetUUID(virConnectPtr conn,
|
|
int id,
|
|
unsigned char *uuid);
|
|
|
|
typedef int (*xenStoreWatchCallback)(virConnectPtr conn,
|
|
const char *path,
|
|
const char *token,
|
|
void *opaque);
|
|
|
|
struct _xenStoreWatch {
|
|
char *path;
|
|
char *token;
|
|
xenStoreWatchCallback cb;
|
|
void *opaque;
|
|
};
|
|
typedef struct _xenStoreWatch xenStoreWatch;
|
|
typedef xenStoreWatch *xenStoreWatchPtr;
|
|
|
|
struct _xenStoreWatchList {
|
|
unsigned int count;
|
|
xenStoreWatchPtr *watches;
|
|
};
|
|
typedef struct _xenStoreWatchList xenStoreWatchList;
|
|
typedef xenStoreWatchList *xenStoreWatchListPtr;
|
|
|
|
|
|
int xenStoreAddWatch(virConnectPtr conn,
|
|
const char *path,
|
|
const char *token,
|
|
xenStoreWatchCallback cb,
|
|
void *opaque);
|
|
int xenStoreRemoveWatch(virConnectPtr conn,
|
|
const char *path,
|
|
const char *token);
|
|
|
|
/* domain events */
|
|
int xenStoreDomainIntroduced(virConnectPtr conn,
|
|
const char *path,
|
|
const char *token,
|
|
void *opaque);
|
|
int xenStoreDomainReleased(virConnectPtr conn,
|
|
const char *path,
|
|
const char *token,
|
|
void *opaque);
|
|
|
|
int xenStoreDomainEventEmitted(virDomainEventType evt);
|
|
#endif /* __VIR_XS_INTERNAL_H__ */
|