mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
* include/libvirt/libvirt.h include/libvirt/libvirt.h.in
src/driver.h src/libvirt.c src/libvirt_sym.version src/proxy_internal.c src/qemu_internal.c src/test.c src/virsh.c src/xen_internal.c src/xen_internal.h src/xen_unified.c src/xend_internal.c src/xm_internal.c src/xs_internal.c: Applied patches from Atsushi SAKAI to add the scheduler API, with patch from Rich Jones for error handing, and a number of cleanups and more error checking from me Daniel
This commit is contained in:
parent
c6e2ef60df
commit
652f3bb13b
11
ChangeLog
11
ChangeLog
@ -1,3 +1,14 @@
|
|||||||
|
Tue Jun 5 14:03:38 CEST 2007 Daniel Veillard <veillard@redhat.com>
|
||||||
|
|
||||||
|
* include/libvirt/libvirt.h include/libvirt/libvirt.h.in
|
||||||
|
src/driver.h src/libvirt.c src/libvirt_sym.version
|
||||||
|
src/proxy_internal.c src/qemu_internal.c src/test.c
|
||||||
|
src/virsh.c src/xen_internal.c src/xen_internal.h src/xen_unified.c
|
||||||
|
src/xend_internal.c src/xm_internal.c src/xs_internal.c:
|
||||||
|
Applied patches from Atsushi SAKAI to add the scheduler API,
|
||||||
|
with patch from Rich Jones for error handing, and a number
|
||||||
|
of cleanups and more error checking from me
|
||||||
|
|
||||||
Mon Jun 4 10:41:25 CEST 2007 Daniel Veillard <veillard@redhat.com>
|
Mon Jun 4 10:41:25 CEST 2007 Daniel Veillard <veillard@redhat.com>
|
||||||
|
|
||||||
* src/xml.c: apply patch from Masayuki Sunou about an uninitialized
|
* src/xml.c: apply patch from Masayuki Sunou about an uninitialized
|
||||||
|
@ -168,6 +168,71 @@ struct _virNodeInfo {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* virDomainSchedParameterType:
|
||||||
|
*
|
||||||
|
* A scheduler parameter field type
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
VIR_DOMAIN_SCHED_FIELD_INT = 1, /* integer case */
|
||||||
|
VIR_DOMAIN_SCHED_FIELD_UINT = 2, /* unsigned integer case */
|
||||||
|
VIR_DOMAIN_SCHED_FIELD_LLONG = 3, /* long long case */
|
||||||
|
VIR_DOMAIN_SCHED_FIELD_ULLONG = 4, /* unsigned long long case */
|
||||||
|
VIR_DOMAIN_SCHED_FIELD_DOUBLE = 5, /* double case */
|
||||||
|
VIR_DOMAIN_SCHED_FIELD_BOOLEAN = 6 /* boolean(character) case */
|
||||||
|
} virSchedParameterType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* VIR_DOMAIN_SCHED_FIELD_LENGTH:
|
||||||
|
*
|
||||||
|
* Macro providing the field length of virSchedParameter
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define VIR_DOMAIN_SCHED_FIELD_LENGTH 80
|
||||||
|
|
||||||
|
/**
|
||||||
|
* virDomainSchedParameter:
|
||||||
|
*
|
||||||
|
* a virDomainSchedParameter is the set of scheduler parameters
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct _virSchedParameter virSchedParameter;
|
||||||
|
|
||||||
|
struct _virSchedParameter {
|
||||||
|
char field[VIR_DOMAIN_SCHED_FIELD_LENGTH]; /* parameter name */
|
||||||
|
int type; /* parameter type */
|
||||||
|
union {
|
||||||
|
int i; /* data for integer case */
|
||||||
|
unsigned int ui; /* data for unsigned integer case */
|
||||||
|
long long int l; /* data for long long integer case */
|
||||||
|
unsigned long long int ul; /* data for unsigned long long integer case */
|
||||||
|
double d; /* data for double case */
|
||||||
|
char b; /* data for char case */
|
||||||
|
} value; /* parameter value */
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* virSchedParameterPtr:
|
||||||
|
*
|
||||||
|
* a virSchedParameterPtr is a pointer to a virSchedParameter structure.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef virSchedParameter *virSchedParameterPtr;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Fetch scheduler parameters, caller allocates 'params' field of size 'nparams'
|
||||||
|
*/
|
||||||
|
int virDomainGetSchedulerParameters (virDomainPtr domain,
|
||||||
|
virSchedParameterPtr params,
|
||||||
|
int *nparams);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Change scheduler parameters
|
||||||
|
*/
|
||||||
|
int virDomainSetSchedulerParameters (virDomainPtr domain,
|
||||||
|
virSchedParameterPtr params,
|
||||||
|
int nparams);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* VIR_NODEINFO_MAXCPUS:
|
* VIR_NODEINFO_MAXCPUS:
|
||||||
* @nodeinfo: virNodeInfo instance
|
* @nodeinfo: virNodeInfo instance
|
||||||
@ -302,6 +367,12 @@ int virDomainCoreDump (virDomainPtr domain,
|
|||||||
int virDomainGetInfo (virDomainPtr domain,
|
int virDomainGetInfo (virDomainPtr domain,
|
||||||
virDomainInfoPtr info);
|
virDomainInfoPtr info);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return scheduler type in effect 'sedf', 'credit', 'linux'
|
||||||
|
*/
|
||||||
|
char * virDomainGetSchedulerType(virDomainPtr domain,
|
||||||
|
int *nparams);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Dynamic control of domains
|
* Dynamic control of domains
|
||||||
*/
|
*/
|
||||||
|
@ -168,6 +168,71 @@ struct _virNodeInfo {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* virDomainSchedParameterType:
|
||||||
|
*
|
||||||
|
* A scheduler parameter field type
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
VIR_DOMAIN_SCHED_FIELD_INT = 1, /* integer case */
|
||||||
|
VIR_DOMAIN_SCHED_FIELD_UINT = 2, /* unsigned integer case */
|
||||||
|
VIR_DOMAIN_SCHED_FIELD_LLONG = 3, /* long long case */
|
||||||
|
VIR_DOMAIN_SCHED_FIELD_ULLONG = 4, /* unsigned long long case */
|
||||||
|
VIR_DOMAIN_SCHED_FIELD_DOUBLE = 5, /* double case */
|
||||||
|
VIR_DOMAIN_SCHED_FIELD_BOOLEAN = 6 /* boolean(character) case */
|
||||||
|
} virSchedParameterType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* VIR_DOMAIN_SCHED_FIELD_LENGTH:
|
||||||
|
*
|
||||||
|
* Macro providing the field length of virSchedParameter
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define VIR_DOMAIN_SCHED_FIELD_LENGTH 80
|
||||||
|
|
||||||
|
/**
|
||||||
|
* virDomainSchedParameter:
|
||||||
|
*
|
||||||
|
* a virDomainSchedParameter is the set of scheduler parameters
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct _virSchedParameter virSchedParameter;
|
||||||
|
|
||||||
|
struct _virSchedParameter {
|
||||||
|
char field[VIR_DOMAIN_SCHED_FIELD_LENGTH]; /* parameter name */
|
||||||
|
int type; /* parameter type */
|
||||||
|
union {
|
||||||
|
int i; /* data for integer case */
|
||||||
|
unsigned int ui; /* data for unsigned integer case */
|
||||||
|
long long int l; /* data for long long integer case */
|
||||||
|
unsigned long long int ul; /* data for unsigned long long integer case */
|
||||||
|
double d; /* data for double case */
|
||||||
|
char b; /* data for char case */
|
||||||
|
} value; /* parameter value */
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* virSchedParameterPtr:
|
||||||
|
*
|
||||||
|
* a virSchedParameterPtr is a pointer to a virSchedParameter structure.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef virSchedParameter *virSchedParameterPtr;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Fetch scheduler parameters, caller allocates 'params' field of size 'nparams'
|
||||||
|
*/
|
||||||
|
int virDomainGetSchedulerParameters (virDomainPtr domain,
|
||||||
|
virSchedParameterPtr params,
|
||||||
|
int *nparams);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Change scheduler parameters
|
||||||
|
*/
|
||||||
|
int virDomainSetSchedulerParameters (virDomainPtr domain,
|
||||||
|
virSchedParameterPtr params,
|
||||||
|
int nparams);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* VIR_NODEINFO_MAXCPUS:
|
* VIR_NODEINFO_MAXCPUS:
|
||||||
* @nodeinfo: virNodeInfo instance
|
* @nodeinfo: virNodeInfo instance
|
||||||
@ -302,6 +367,12 @@ int virDomainCoreDump (virDomainPtr domain,
|
|||||||
int virDomainGetInfo (virDomainPtr domain,
|
int virDomainGetInfo (virDomainPtr domain,
|
||||||
virDomainInfoPtr info);
|
virDomainInfoPtr info);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return scheduler type in effect 'sedf', 'credit', 'linux'
|
||||||
|
*/
|
||||||
|
char * virDomainGetSchedulerType(virDomainPtr domain,
|
||||||
|
int *nparams);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Dynamic control of domains
|
* Dynamic control of domains
|
||||||
*/
|
*/
|
||||||
|
40
src/driver.h
40
src/driver.h
@ -43,9 +43,9 @@ typedef enum {
|
|||||||
} virDrvOpenStatus;
|
} virDrvOpenStatus;
|
||||||
|
|
||||||
typedef virDrvOpenStatus
|
typedef virDrvOpenStatus
|
||||||
(*virDrvOpen) (virConnectPtr conn,
|
(*virDrvOpen) (virConnectPtr conn,
|
||||||
const char *name,
|
const char *name,
|
||||||
int flags);
|
int flags);
|
||||||
typedef int
|
typedef int
|
||||||
(*virDrvClose) (virConnectPtr conn);
|
(*virDrvClose) (virConnectPtr conn);
|
||||||
typedef const char *
|
typedef const char *
|
||||||
@ -54,7 +54,8 @@ typedef int
|
|||||||
(*virDrvGetVersion) (virConnectPtr conn,
|
(*virDrvGetVersion) (virConnectPtr conn,
|
||||||
unsigned long *hvVer);
|
unsigned long *hvVer);
|
||||||
typedef int
|
typedef int
|
||||||
(*virDrvGetMaxVcpus) (virConnectPtr conn, const char *type);
|
(*virDrvGetMaxVcpus) (virConnectPtr conn,
|
||||||
|
const char *type);
|
||||||
typedef int
|
typedef int
|
||||||
(*virDrvNodeGetInfo) (virConnectPtr conn,
|
(*virDrvNodeGetInfo) (virConnectPtr conn,
|
||||||
virNodeInfoPtr info);
|
virNodeInfoPtr info);
|
||||||
@ -123,11 +124,12 @@ typedef int
|
|||||||
typedef int
|
typedef int
|
||||||
(*virDrvNumOfDefinedDomains) (virConnectPtr conn);
|
(*virDrvNumOfDefinedDomains) (virConnectPtr conn);
|
||||||
typedef int
|
typedef int
|
||||||
(*virDrvDomainCreate) (virDomainPtr dom);
|
(*virDrvDomainCreate) (virDomainPtr dom);
|
||||||
typedef virDomainPtr
|
typedef virDomainPtr
|
||||||
(*virDrvDomainDefineXML)(virConnectPtr conn, const char *xml);
|
(*virDrvDomainDefineXML) (virConnectPtr conn,
|
||||||
|
const char *xml);
|
||||||
typedef int
|
typedef int
|
||||||
(*virDrvDomainUndefine) (virDomainPtr dom);
|
(*virDrvDomainUndefine) (virDomainPtr dom);
|
||||||
typedef int
|
typedef int
|
||||||
(*virDrvDomainSetVcpus) (virDomainPtr domain,
|
(*virDrvDomainSetVcpus) (virDomainPtr domain,
|
||||||
unsigned int nvcpus);
|
unsigned int nvcpus);
|
||||||
@ -157,6 +159,22 @@ typedef int
|
|||||||
(*virDrvDomainSetAutostart) (virDomainPtr domain,
|
(*virDrvDomainSetAutostart) (virDomainPtr domain,
|
||||||
int autostart);
|
int autostart);
|
||||||
|
|
||||||
|
typedef char *
|
||||||
|
(*virDrvDomainGetSchedulerType) (virDomainPtr domain,
|
||||||
|
int *nparams);
|
||||||
|
|
||||||
|
typedef int
|
||||||
|
(*virDrvDomainGetSchedulerParameters)
|
||||||
|
(virDomainPtr domain,
|
||||||
|
virSchedParameterPtr params,
|
||||||
|
int *nparams);
|
||||||
|
|
||||||
|
typedef int
|
||||||
|
(*virDrvDomainSetSchedulerParameters)
|
||||||
|
(virDomainPtr domain,
|
||||||
|
virSchedParameterPtr params,
|
||||||
|
int nparams);
|
||||||
|
|
||||||
typedef struct _virDriver virDriver;
|
typedef struct _virDriver virDriver;
|
||||||
typedef virDriver *virDriverPtr;
|
typedef virDriver *virDriverPtr;
|
||||||
|
|
||||||
@ -182,7 +200,7 @@ struct _virDriver {
|
|||||||
virDrvGetVersion version;
|
virDrvGetVersion version;
|
||||||
virDrvGetMaxVcpus getMaxVcpus;
|
virDrvGetMaxVcpus getMaxVcpus;
|
||||||
virDrvNodeGetInfo nodeGetInfo;
|
virDrvNodeGetInfo nodeGetInfo;
|
||||||
virDrvGetCapabilities getCapabilities;
|
virDrvGetCapabilities getCapabilities;
|
||||||
virDrvListDomains listDomains;
|
virDrvListDomains listDomains;
|
||||||
virDrvNumOfDomains numOfDomains;
|
virDrvNumOfDomains numOfDomains;
|
||||||
virDrvDomainCreateLinux domainCreateLinux;
|
virDrvDomainCreateLinux domainCreateLinux;
|
||||||
@ -216,6 +234,9 @@ struct _virDriver {
|
|||||||
virDrvDomainDetachDevice domainDetachDevice;
|
virDrvDomainDetachDevice domainDetachDevice;
|
||||||
virDrvDomainGetAutostart domainGetAutostart;
|
virDrvDomainGetAutostart domainGetAutostart;
|
||||||
virDrvDomainSetAutostart domainSetAutostart;
|
virDrvDomainSetAutostart domainSetAutostart;
|
||||||
|
virDrvDomainGetSchedulerType domainGetSchedulerType;
|
||||||
|
virDrvDomainGetSchedulerParameters domainGetSchedulerParameters;
|
||||||
|
virDrvDomainSetSchedulerParameters domainSetSchedulerParameters;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef int
|
typedef int
|
||||||
@ -240,7 +261,8 @@ typedef virNetworkPtr
|
|||||||
(*virDrvNetworkCreateXML) (virConnectPtr conn,
|
(*virDrvNetworkCreateXML) (virConnectPtr conn,
|
||||||
const char *xmlDesc);
|
const char *xmlDesc);
|
||||||
typedef virNetworkPtr
|
typedef virNetworkPtr
|
||||||
(*virDrvNetworkDefineXML) (virConnectPtr conn, const char *xml);
|
(*virDrvNetworkDefineXML) (virConnectPtr conn,
|
||||||
|
const char *xml);
|
||||||
typedef int
|
typedef int
|
||||||
(*virDrvNetworkUndefine) (virNetworkPtr network);
|
(*virDrvNetworkUndefine) (virNetworkPtr network);
|
||||||
typedef int
|
typedef int
|
||||||
|
112
src/libvirt.c
112
src/libvirt.c
@ -1427,6 +1427,118 @@ virConnectGetCapabilities (virConnectPtr conn)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* virDomainGetSchedulerType:
|
||||||
|
* @domain: pointer to domain object
|
||||||
|
* @nparams: number of scheduler parameters(return value)
|
||||||
|
*
|
||||||
|
* Get the scheduler type.
|
||||||
|
*
|
||||||
|
* Returns NULL in case of error. The caller must free the returned string.
|
||||||
|
*/
|
||||||
|
char *
|
||||||
|
virDomainGetSchedulerType(virDomainPtr domain, int *nparams)
|
||||||
|
{
|
||||||
|
virConnectPtr conn;
|
||||||
|
char *schedtype;
|
||||||
|
|
||||||
|
if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
|
||||||
|
virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
conn = domain->conn;
|
||||||
|
|
||||||
|
if (!VIR_IS_CONNECT (conn)) {
|
||||||
|
virLibConnError (conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (conn->driver->domainGetSchedulerType){
|
||||||
|
schedtype = conn->driver->domainGetSchedulerType (domain, nparams);
|
||||||
|
return schedtype;
|
||||||
|
}
|
||||||
|
|
||||||
|
virLibConnError (conn, VIR_ERR_CALL_FAILED, __FUNCTION__);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* virDomainGetSchedulerParameters:
|
||||||
|
* @domain: pointer to domain object
|
||||||
|
* @params: pointer to scheduler parameter object
|
||||||
|
* (return value)
|
||||||
|
* @nparams: pointer to number of scheduler parameter
|
||||||
|
* (this value should be same than the returned value
|
||||||
|
* nparams of virDomainGetSchedulerType)
|
||||||
|
*
|
||||||
|
* Get the scheduler parameters, the @params array will be filled with the
|
||||||
|
* values.
|
||||||
|
*
|
||||||
|
* Returns -1 in case of error, 0 in case of success.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
virDomainGetSchedulerParameters(virDomainPtr domain,
|
||||||
|
virSchedParameterPtr params, int *nparams)
|
||||||
|
{
|
||||||
|
virConnectPtr conn;
|
||||||
|
|
||||||
|
if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
|
||||||
|
virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
conn = domain->conn;
|
||||||
|
|
||||||
|
if (!VIR_IS_CONNECT (conn)) {
|
||||||
|
virLibConnError (conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (conn->driver->domainGetSchedulerParameters)
|
||||||
|
return conn->driver->domainGetSchedulerParameters (domain, params, nparams);
|
||||||
|
|
||||||
|
virLibConnError (conn, VIR_ERR_CALL_FAILED, __FUNCTION__);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* virDomainSetSchedulerParameters:
|
||||||
|
* @domain: pointer to domain object
|
||||||
|
* @params: pointer to scheduler parameter objects
|
||||||
|
* @nparams: number of scheduler parameter
|
||||||
|
* (this value should be same or less than the returned value
|
||||||
|
* nparams of virDomainGetSchedulerType)
|
||||||
|
*
|
||||||
|
* Change the scheduler parameters
|
||||||
|
*
|
||||||
|
* Returns -1 in case of error, 0 in case of success.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
virDomainSetSchedulerParameters(virDomainPtr domain,
|
||||||
|
virSchedParameterPtr params, int nparams)
|
||||||
|
{
|
||||||
|
virConnectPtr conn;
|
||||||
|
|
||||||
|
if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
|
||||||
|
virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
conn = domain->conn;
|
||||||
|
|
||||||
|
if (!VIR_IS_CONNECT (conn)) {
|
||||||
|
virLibConnError (conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (conn->driver->domainSetSchedulerParameters)
|
||||||
|
return conn->driver->domainSetSchedulerParameters (domain, params, nparams);
|
||||||
|
|
||||||
|
virLibConnError (conn, VIR_ERR_CALL_FAILED, __FUNCTION__);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* *
|
* *
|
||||||
* Handling of defined but not running domains *
|
* Handling of defined but not running domains *
|
||||||
|
@ -59,6 +59,9 @@
|
|||||||
virDomainPinVcpu;
|
virDomainPinVcpu;
|
||||||
virDomainGetVcpus;
|
virDomainGetVcpus;
|
||||||
virDomainGetMaxVcpus;
|
virDomainGetMaxVcpus;
|
||||||
|
virDomainGetSchedulerType;
|
||||||
|
virDomainGetSchedulerParameters;
|
||||||
|
virDomainSetSchedulerParameters;
|
||||||
|
|
||||||
virDomainAttachDevice;
|
virDomainAttachDevice;
|
||||||
virDomainDetachDevice;
|
virDomainDetachDevice;
|
||||||
|
@ -88,6 +88,9 @@ virDriver xenProxyDriver = {
|
|||||||
NULL, /* domainDetachDevice */
|
NULL, /* domainDetachDevice */
|
||||||
NULL, /* domainGetAutostart */
|
NULL, /* domainGetAutostart */
|
||||||
NULL, /* domainSetAutostart */
|
NULL, /* domainSetAutostart */
|
||||||
|
NULL, /* domainGetSchedulerType */
|
||||||
|
NULL, /* domainGetSchedulerParameters */
|
||||||
|
NULL, /* domainSetSchedulerParameters */
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1350,6 +1350,9 @@ static virDriver qemuDriver = {
|
|||||||
NULL, /* domainDetachDevice */
|
NULL, /* domainDetachDevice */
|
||||||
qemuDomainGetAutostart, /* domainGetAutostart */
|
qemuDomainGetAutostart, /* domainGetAutostart */
|
||||||
qemuDomainSetAutostart, /* domainSetAutostart */
|
qemuDomainSetAutostart, /* domainSetAutostart */
|
||||||
|
NULL, /* domainGetSchedulerType */
|
||||||
|
NULL, /* domainGetSchedulerParameters */
|
||||||
|
NULL, /* domainSetSchedulerParameters */
|
||||||
};
|
};
|
||||||
|
|
||||||
static virNetworkDriver qemuNetworkDriver = {
|
static virNetworkDriver qemuNetworkDriver = {
|
||||||
|
@ -132,6 +132,9 @@ static virDriver testDriver = {
|
|||||||
NULL, /* domainDetachDevice */
|
NULL, /* domainDetachDevice */
|
||||||
NULL, /* domainGetAutostart */
|
NULL, /* domainGetAutostart */
|
||||||
NULL, /* domainSetAutostart */
|
NULL, /* domainSetAutostart */
|
||||||
|
NULL, /* domainGetSchedulerType */
|
||||||
|
NULL, /* domainGetSchedulerParameters */
|
||||||
|
NULL, /* domainSetSchedulerParameters */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Per-connection private data. */
|
/* Per-connection private data. */
|
||||||
|
125
src/virsh.c
125
src/virsh.c
@ -29,6 +29,7 @@
|
|||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
#include <libxml/parser.h>
|
#include <libxml/parser.h>
|
||||||
#include <libxml/tree.h>
|
#include <libxml/tree.h>
|
||||||
@ -939,6 +940,129 @@ cmdSave(vshControl * ctl, vshCmd * cmd)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* "schedinfo" command
|
||||||
|
*/
|
||||||
|
static vshCmdInfo info_schedinfo[] = {
|
||||||
|
{"syntax", "sched <domain>"},
|
||||||
|
{"help", gettext_noop("show/set scheduler parameters")},
|
||||||
|
{"desc", gettext_noop("Show/Set scheduler parameters.")},
|
||||||
|
{NULL, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
static vshCmdOptDef opts_schedinfo[] = {
|
||||||
|
{"domain", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("domain name, id or uuid")},
|
||||||
|
{"weight", VSH_OT_INT, VSH_OFLAG_NONE, gettext_noop("weight for XEN_CREDIT")},
|
||||||
|
{"cap", VSH_OT_INT, VSH_OFLAG_NONE, gettext_noop("cap for XEN_CREDIT")},
|
||||||
|
{NULL, 0, 0, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
static int
|
||||||
|
cmdSchedinfo(vshControl * ctl, vshCmd * cmd)
|
||||||
|
{
|
||||||
|
char *schedulertype;
|
||||||
|
virDomainPtr dom;
|
||||||
|
virSchedParameterPtr params;
|
||||||
|
int i, ret;
|
||||||
|
int nparams = 0;
|
||||||
|
int nr_inputparams = 0;
|
||||||
|
int inputparams = 0;
|
||||||
|
int weightfound = 0;
|
||||||
|
int weight;
|
||||||
|
int capfound = 0;
|
||||||
|
int cap;
|
||||||
|
char str_weight[] = "weight";
|
||||||
|
char str_cap[] = "cap";
|
||||||
|
|
||||||
|
if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (!(dom = vshCommandOptDomain(ctl, cmd, "domain", NULL)))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
/* Currently supports Xen Credit only */
|
||||||
|
weight = vshCommandOptInt(cmd, "weight", &weightfound);
|
||||||
|
if (weightfound) nr_inputparams++;
|
||||||
|
|
||||||
|
cap = vshCommandOptInt(cmd, "cap", &capfound);
|
||||||
|
if (capfound) nr_inputparams++;
|
||||||
|
|
||||||
|
params = vshMalloc(ctl, sizeof (virSchedParameter) * nr_inputparams);
|
||||||
|
if (params == NULL) return FALSE;
|
||||||
|
|
||||||
|
if (weightfound) {
|
||||||
|
strncpy(params[inputparams].field,str_weight,sizeof(str_weight));
|
||||||
|
params[inputparams].type = VIR_DOMAIN_SCHED_FIELD_UINT;
|
||||||
|
params[inputparams].value.ui = weight;
|
||||||
|
inputparams++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (capfound) {
|
||||||
|
strncpy(params[inputparams].field,str_cap,sizeof(str_cap));
|
||||||
|
params[inputparams].type = VIR_DOMAIN_SCHED_FIELD_UINT;
|
||||||
|
params[inputparams].value.ui = cap;
|
||||||
|
inputparams++;
|
||||||
|
}
|
||||||
|
/* End Currently supports Xen Credit only */
|
||||||
|
|
||||||
|
assert (inputparams == nr_inputparams);
|
||||||
|
|
||||||
|
/* Set SchedulerParameters */
|
||||||
|
if (inputparams > 0) {
|
||||||
|
ret = virDomainSetSchedulerParameters(dom, params, inputparams);
|
||||||
|
if (ret == -1) return FALSE;
|
||||||
|
}
|
||||||
|
free(params);
|
||||||
|
|
||||||
|
/* Print SchedulerType */
|
||||||
|
schedulertype = virDomainGetSchedulerType(dom, &nparams);
|
||||||
|
if (schedulertype!= NULL){
|
||||||
|
vshPrint(ctl, "%-15s %s\n", _("Scheduler:"),
|
||||||
|
schedulertype);
|
||||||
|
free(schedulertype);
|
||||||
|
} else {
|
||||||
|
vshPrint(ctl, "%-15s %s\n", _("Scheduler:"), _("Unknown"));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get SchedulerParameters */
|
||||||
|
params = vshMalloc(ctl, sizeof(virSchedParameter)* nparams);
|
||||||
|
for (i = 0; i < nparams; i++){
|
||||||
|
params[i].type = 0;
|
||||||
|
memset (params[i].field, 0, sizeof params[i].field);
|
||||||
|
}
|
||||||
|
ret = virDomainGetSchedulerParameters(dom, params, &nparams);
|
||||||
|
if (ret == -1) return FALSE;
|
||||||
|
if(nparams){
|
||||||
|
for (i = 0; i < nparams; i++){
|
||||||
|
switch (params[i].type) {
|
||||||
|
case VIR_DOMAIN_SCHED_FIELD_INT:
|
||||||
|
printf("%-15s: %d\n", params[i].field, params[i].value.i);
|
||||||
|
break;
|
||||||
|
case VIR_DOMAIN_SCHED_FIELD_UINT:
|
||||||
|
printf("%-15s: %u\n", params[i].field, params[i].value.ui);
|
||||||
|
break;
|
||||||
|
case VIR_DOMAIN_SCHED_FIELD_LLONG:
|
||||||
|
printf("%-15s: %Ld\n", params[i].field, params[i].value.l);
|
||||||
|
break;
|
||||||
|
case VIR_DOMAIN_SCHED_FIELD_ULLONG:
|
||||||
|
printf("%-15s: %Lu\n", params[i].field, params[i].value.ul);
|
||||||
|
break;
|
||||||
|
case VIR_DOMAIN_SCHED_FIELD_DOUBLE:
|
||||||
|
printf("%-15s: %f\n", params[i].field, params[i].value.d);
|
||||||
|
break;
|
||||||
|
case VIR_DOMAIN_SCHED_FIELD_BOOLEAN:
|
||||||
|
printf("%-15s: %d\n", params[i].field, params[i].value.b);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("not implemented scheduler parameter type\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(params);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* "restore" command
|
* "restore" command
|
||||||
*/
|
*/
|
||||||
@ -2592,6 +2716,7 @@ static vshCmdDef commands[] = {
|
|||||||
{"restore", cmdRestore, opts_restore, info_restore},
|
{"restore", cmdRestore, opts_restore, info_restore},
|
||||||
{"resume", cmdResume, opts_resume, info_resume},
|
{"resume", cmdResume, opts_resume, info_resume},
|
||||||
{"save", cmdSave, opts_save, info_save},
|
{"save", cmdSave, opts_save, info_save},
|
||||||
|
{"schedinfo", cmdSchedinfo, opts_schedinfo, info_schedinfo},
|
||||||
{"dump", cmdDump, opts_dump, info_dump},
|
{"dump", cmdDump, opts_dump, info_dump},
|
||||||
{"shutdown", cmdShutdown, opts_shutdown, info_shutdown},
|
{"shutdown", cmdShutdown, opts_shutdown, info_shutdown},
|
||||||
{"setmem", cmdSetmem, opts_setmem, info_setmem},
|
{"setmem", cmdSetmem, opts_setmem, info_setmem},
|
||||||
|
@ -180,6 +180,19 @@ union xen_getdomaininfolist {
|
|||||||
};
|
};
|
||||||
typedef union xen_getdomaininfolist xen_getdomaininfolist;
|
typedef union xen_getdomaininfolist xen_getdomaininfolist;
|
||||||
|
|
||||||
|
|
||||||
|
struct xen_v2_getschedulerid {
|
||||||
|
uint32_t sched_id; /* Get Scheduler ID from Xen */
|
||||||
|
};
|
||||||
|
typedef struct xen_v2_getschedulerid xen_v2_getschedulerid;
|
||||||
|
|
||||||
|
|
||||||
|
union xen_getschedulerid {
|
||||||
|
struct xen_v2_getschedulerid *v2;
|
||||||
|
};
|
||||||
|
typedef union xen_getschedulerid xen_getschedulerid;
|
||||||
|
|
||||||
|
|
||||||
#define XEN_GETDOMAININFOLIST_ALLOC(domlist, size) \
|
#define XEN_GETDOMAININFOLIST_ALLOC(domlist, size) \
|
||||||
(hypervisor_version < 2 ? \
|
(hypervisor_version < 2 ? \
|
||||||
((domlist.v0 = malloc(sizeof(xen_v0_getdomaininfo)*(size))) != NULL) : \
|
((domlist.v0 = malloc(sizeof(xen_v0_getdomaininfo)*(size))) != NULL) : \
|
||||||
@ -468,6 +481,43 @@ typedef struct xen_v2d5_vcpuinfo xen_v2d5_vcpuinfo;
|
|||||||
typedef struct xen_v2_setvcpumap xen_v2_getvcpumap;
|
typedef struct xen_v2_setvcpumap xen_v2_getvcpumap;
|
||||||
typedef struct xen_v2d5_setvcpumap xen_v2d5_getvcpumap;
|
typedef struct xen_v2d5_setvcpumap xen_v2d5_getvcpumap;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* from V2 we get the scheduler information
|
||||||
|
*/
|
||||||
|
#define XEN_V2_OP_GETSCHEDULERID 4
|
||||||
|
|
||||||
|
/*
|
||||||
|
* from V2 we get the scheduler parameter
|
||||||
|
*/
|
||||||
|
#define XEN_V2_OP_SCHEDULER 16
|
||||||
|
/* Scheduler types. */
|
||||||
|
#define XEN_SCHEDULER_SEDF 4
|
||||||
|
#define XEN_SCHEDULER_CREDIT 5
|
||||||
|
/* get/set scheduler parameters */
|
||||||
|
#define XEN_DOMCTL_SCHEDOP_putinfo 0
|
||||||
|
#define XEN_DOMCTL_SCHEDOP_getinfo 1
|
||||||
|
|
||||||
|
struct xen_v2_setschedinfo {
|
||||||
|
uint32_t sched_id;
|
||||||
|
uint32_t cmd;
|
||||||
|
union {
|
||||||
|
struct xen_domctl_sched_sedf {
|
||||||
|
uint64_t period ALIGN_64;
|
||||||
|
uint64_t slice ALIGN_64;
|
||||||
|
uint64_t latency ALIGN_64;
|
||||||
|
uint32_t extratime;
|
||||||
|
uint32_t weight;
|
||||||
|
} sedf;
|
||||||
|
struct xen_domctl_sched_credit {
|
||||||
|
uint16_t weight;
|
||||||
|
uint16_t cap;
|
||||||
|
} credit;
|
||||||
|
} u;
|
||||||
|
};
|
||||||
|
typedef struct xen_v2_setschedinfo xen_v2_setschedinfo;
|
||||||
|
typedef struct xen_v2_setschedinfo xen_v2_getschedinfo;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The hypercall operation structures also have changed on
|
* The hypercall operation structures also have changed on
|
||||||
* changeset 86d26e6ec89b
|
* changeset 86d26e6ec89b
|
||||||
@ -496,6 +546,7 @@ struct xen_op_v2_sys {
|
|||||||
union {
|
union {
|
||||||
xen_v2_getdomaininfolistop getdomaininfolist;
|
xen_v2_getdomaininfolistop getdomaininfolist;
|
||||||
xen_v2s3_getdomaininfolistop getdomaininfolists3;
|
xen_v2s3_getdomaininfolistop getdomaininfolists3;
|
||||||
|
xen_v2_getschedulerid getschedulerid;
|
||||||
uint8_t padding[128];
|
uint8_t padding[128];
|
||||||
} u;
|
} u;
|
||||||
};
|
};
|
||||||
@ -516,6 +567,8 @@ struct xen_op_v2_dom {
|
|||||||
xen_v2d5_vcpuinfo getvcpuinfod5;
|
xen_v2d5_vcpuinfo getvcpuinfod5;
|
||||||
xen_v2_getvcpumap getvcpumap;
|
xen_v2_getvcpumap getvcpumap;
|
||||||
xen_v2d5_getvcpumap getvcpumapd5;
|
xen_v2d5_getvcpumap getvcpumapd5;
|
||||||
|
xen_v2_setschedinfo setschedinfo;
|
||||||
|
xen_v2_getschedinfo getschedinfo;
|
||||||
uint8_t padding[128];
|
uint8_t padding[128];
|
||||||
} u;
|
} u;
|
||||||
};
|
};
|
||||||
@ -580,6 +633,9 @@ virDriver xenHypervisorDriver = {
|
|||||||
NULL, /* domainDetachDevice */
|
NULL, /* domainDetachDevice */
|
||||||
NULL, /* domainGetAutostart */
|
NULL, /* domainGetAutostart */
|
||||||
NULL, /* domainSetAutostart */
|
NULL, /* domainSetAutostart */
|
||||||
|
xenHypervisorGetSchedulerType, /* domainGetSchedulerType */
|
||||||
|
xenHypervisorGetSchedulerParameters, /* domainGetSchedulerParameters */
|
||||||
|
xenHypervisorSetSchedulerParameters, /* domainSetSchedulerParameters */
|
||||||
};
|
};
|
||||||
#endif /* !PROXY */
|
#endif /* !PROXY */
|
||||||
|
|
||||||
@ -604,6 +660,38 @@ virXenError(virErrorNumber error, const char *info, int value)
|
|||||||
errmsg, info, NULL, value, 0, errmsg, info);
|
errmsg, info, NULL, value, 0, errmsg, info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* virXenErrorFunc:
|
||||||
|
* @error: the error number
|
||||||
|
* @func: the function failing
|
||||||
|
* @info: extra information string
|
||||||
|
* @value: extra information number
|
||||||
|
*
|
||||||
|
* Handle an error at the xend daemon interface
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
virXenErrorFunc(virErrorNumber error, const char *func, const char *info,
|
||||||
|
int value)
|
||||||
|
{
|
||||||
|
char fullinfo[1000]
|
||||||
|
const char *errmsg;
|
||||||
|
|
||||||
|
if ((error == VIR_ERR_OK) || (in_init != 0))
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
errmsg = __virErrorMsg(error, info);
|
||||||
|
if (func != NULL) {
|
||||||
|
snprintf(fullinfo, 999, "%s: %s", func, info);
|
||||||
|
fullinfo[999] = 0;
|
||||||
|
__virRaiseError(NULL, NULL, NULL, VIR_FROM_XEN, error, VIR_ERR_ERROR,
|
||||||
|
errmsg, fullinfo, NULL, value, 0, errmsg, fullinfo);
|
||||||
|
} else {
|
||||||
|
__virRaiseError(NULL, NULL, NULL, VIR_FROM_XEN, error, VIR_ERR_ERROR,
|
||||||
|
errmsg, info, NULL, value, 0, errmsg, info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* virXenPerror:
|
* virXenPerror:
|
||||||
* @conn: the connection (if available)
|
* @conn: the connection (if available)
|
||||||
@ -739,7 +827,7 @@ xenHypervisorDoV2Sys(int handle, xen_op_v2_sys* op)
|
|||||||
|
|
||||||
ret = ioctl(handle, xen_ioctl_hypercall_cmd, (unsigned long) &hc);
|
ret = ioctl(handle, xen_ioctl_hypercall_cmd, (unsigned long) &hc);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
virXenError(VIR_ERR_XEN_CALL, " ioctl ", xen_ioctl_hypercall_cmd);
|
virXenError(VIR_ERR_XEN_CALL, " sys ioctl ", xen_ioctl_hypercall_cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (munlock(op, sizeof(dom0_op_t)) < 0) {
|
if (munlock(op, sizeof(dom0_op_t)) < 0) {
|
||||||
@ -893,6 +981,278 @@ virXen_getdomaininfo(int handle, int first_domain,
|
|||||||
|
|
||||||
|
|
||||||
#ifndef PROXY
|
#ifndef PROXY
|
||||||
|
/**
|
||||||
|
* xenHypervisorGetSchedulerType:
|
||||||
|
* @domain: pointer to the Xen Hypervisor block
|
||||||
|
* @nparams:give a number of scheduler parameters.
|
||||||
|
*
|
||||||
|
* Do a low level hypercall to get scheduler type
|
||||||
|
*
|
||||||
|
* Returns scheduler name or NULL in case of failure
|
||||||
|
*/
|
||||||
|
char *
|
||||||
|
xenHypervisorGetSchedulerType(virDomainPtr domain, int *nparams)
|
||||||
|
{
|
||||||
|
char *schedulertype = NULL;
|
||||||
|
xenUnifiedPrivatePtr priv;
|
||||||
|
|
||||||
|
if ((domain == NULL) || (domain->conn == NULL)) {
|
||||||
|
virXenErrorFunc(VIR_ERR_INTERNAL_ERROR, __FUNCTION__,
|
||||||
|
"domain or conn is NULL", 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
|
||||||
|
if (priv->handle < 0 || domain->id < 0) {
|
||||||
|
virXenErrorFunc(VIR_ERR_INTERNAL_ERROR, __FUNCTION__,
|
||||||
|
"priv->handle or domain->id invalid", 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Support only dom_interface_version >=5
|
||||||
|
* (Xen3.1.0 or later)
|
||||||
|
*/
|
||||||
|
if (dom_interface_version < 5) {
|
||||||
|
virXenErrorFunc(VIR_ERR_NO_XEN, __FUNCTION__,
|
||||||
|
"unsupported in dom interface < 5", 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hypervisor_version > 1) {
|
||||||
|
xen_op_v2_sys op;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
memset(&op, 0, sizeof(op));
|
||||||
|
op.cmd = XEN_V2_OP_GETSCHEDULERID;
|
||||||
|
ret = xenHypervisorDoV2Sys(priv->handle, &op);
|
||||||
|
if (ret < 0)
|
||||||
|
return(NULL);
|
||||||
|
|
||||||
|
switch (op.u.getschedulerid.sched_id){
|
||||||
|
case XEN_SCHEDULER_SEDF:
|
||||||
|
schedulertype = strdup("sedf");
|
||||||
|
if (nparams)
|
||||||
|
*nparams = 6;
|
||||||
|
break;
|
||||||
|
case XEN_SCHEDULER_CREDIT:
|
||||||
|
schedulertype = strdup("credit");
|
||||||
|
if (nparams)
|
||||||
|
*nparams = 2;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return schedulertype;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xenHypervisorGetSchedulerParameters:
|
||||||
|
* @domain: pointer to the Xen Hypervisor block
|
||||||
|
* @params: pointer to scheduler parameters.
|
||||||
|
* This memory area should be allocated before calling.
|
||||||
|
* @nparams:this parameter should be same as
|
||||||
|
* a given number of scheduler parameters.
|
||||||
|
* from xenHypervisorGetSchedulerType().
|
||||||
|
*
|
||||||
|
* Do a low level hypercall to get scheduler parameters
|
||||||
|
*
|
||||||
|
* Returns 0 or -1 in case of failure
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
xenHypervisorGetSchedulerParameters(virDomainPtr domain,
|
||||||
|
virSchedParameterPtr params, int *nparams)
|
||||||
|
{
|
||||||
|
xenUnifiedPrivatePtr priv;
|
||||||
|
char str_weight[] ="weight";
|
||||||
|
char str_cap[] ="cap";
|
||||||
|
|
||||||
|
if ((domain == NULL) || (domain->conn == NULL)) {
|
||||||
|
virXenErrorFunc(VIR_ERR_INTERNAL_ERROR, __FUNCTION__,
|
||||||
|
"domain or conn is NULL", 0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
|
||||||
|
if (priv->handle < 0 || domain->id < 0) {
|
||||||
|
virXenErrorFunc(VIR_ERR_INTERNAL_ERROR, __FUNCTION__,
|
||||||
|
"priv->handle or domain->id invalid", 0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Support only dom_interface_version >=5
|
||||||
|
* (Xen3.1.0 or later)
|
||||||
|
* TODO: check on Xen 3.0.3
|
||||||
|
*/
|
||||||
|
if (dom_interface_version < 5) {
|
||||||
|
virXenErrorFunc(VIR_ERR_NO_XEN, __FUNCTION__,
|
||||||
|
"unsupported in dom interface < 5", 0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hypervisor_version > 1) {
|
||||||
|
xen_op_v2_sys op_sys;
|
||||||
|
xen_op_v2_dom op_dom;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
memset(&op_sys, 0, sizeof(op_sys));
|
||||||
|
op_sys.cmd = XEN_V2_OP_GETSCHEDULERID;
|
||||||
|
ret = xenHypervisorDoV2Sys(priv->handle, &op_sys);
|
||||||
|
if (ret < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
switch (op_sys.u.getschedulerid.sched_id){
|
||||||
|
case XEN_SCHEDULER_SEDF:
|
||||||
|
/* TODO: Implement for Xen/SEDF */
|
||||||
|
TODO
|
||||||
|
return(-1);
|
||||||
|
case XEN_SCHEDULER_CREDIT:
|
||||||
|
if (*nparams < 2)
|
||||||
|
return(-1);
|
||||||
|
memset(&op_dom, 0, sizeof(op_dom));
|
||||||
|
op_dom.cmd = XEN_V2_OP_SCHEDULER;
|
||||||
|
op_dom.domain = (domid_t) domain->id;
|
||||||
|
op_dom.u.getschedinfo.sched_id = XEN_SCHEDULER_CREDIT;
|
||||||
|
op_dom.u.getschedinfo.cmd = XEN_DOMCTL_SCHEDOP_getinfo;
|
||||||
|
ret = xenHypervisorDoV2Dom(priv->handle, &op_dom);
|
||||||
|
if (ret < 0)
|
||||||
|
return(-1);
|
||||||
|
|
||||||
|
strncpy(params[0].field, str_weight, strlen(str_weight));
|
||||||
|
params[0].type = VIR_DOMAIN_SCHED_FIELD_UINT;
|
||||||
|
params[0].value.ui = op_dom.u.getschedinfo.u.credit.weight;
|
||||||
|
|
||||||
|
strncpy(params[1].field, str_cap, strlen(str_cap));
|
||||||
|
params[1].type = VIR_DOMAIN_SCHED_FIELD_UINT;
|
||||||
|
params[1].value.ui = op_dom.u.getschedinfo.u.credit.cap;
|
||||||
|
|
||||||
|
*nparams = 2;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
virXenErrorFunc(VIR_ERR_INVALID_ARG, __FUNCTION__,
|
||||||
|
"Unknown scheduler", op_sys.u.getschedulerid.sched_id);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xenHypervisorSetSchedulerParameters:
|
||||||
|
* @domain: pointer to the Xen Hypervisor block
|
||||||
|
* @nparams:give a number of scheduler setting parameters .
|
||||||
|
*
|
||||||
|
* Do a low level hypercall to set scheduler parameters
|
||||||
|
*
|
||||||
|
* Returns 0 or -1 in case of failure
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
xenHypervisorSetSchedulerParameters(virDomainPtr domain,
|
||||||
|
virSchedParameterPtr params, int nparams)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
xenUnifiedPrivatePtr priv;
|
||||||
|
char str_weight[] ="weight";
|
||||||
|
char str_cap[] ="cap";
|
||||||
|
|
||||||
|
if ((domain == NULL) || (domain->conn == NULL)) {
|
||||||
|
virXenErrorFunc (VIR_ERR_INTERNAL_ERROR, __FUNCTION__,
|
||||||
|
"domain or conn is NULL", 0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((nparams == 0) || (params == NULL)) {
|
||||||
|
virXenErrorFunc (VIR_ERR_INVALID_ARG, __FUNCTION__,
|
||||||
|
"Noparameters given", 0);
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
|
||||||
|
if (priv->handle < 0 || domain->id < 0) {
|
||||||
|
virXenErrorFunc (VIR_ERR_INTERNAL_ERROR, __FUNCTION__,
|
||||||
|
"priv->handle or domain->id invalid", 0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Support only dom_interface_version >=5
|
||||||
|
* (Xen3.1.0 or later)
|
||||||
|
* TODO: check on Xen 3.0.3
|
||||||
|
*/
|
||||||
|
if (dom_interface_version < 5) {
|
||||||
|
virXenError(VIR_ERR_NO_XEN, __FUNCTION__,
|
||||||
|
"unsupported in dom interface < 5", 0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hypervisor_version > 1) {
|
||||||
|
xen_op_v2_sys op_sys;
|
||||||
|
xen_op_v2_dom op_dom;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
memset(&op_sys, 0, sizeof(op_sys));
|
||||||
|
op_sys.cmd = XEN_V2_OP_GETSCHEDULERID;
|
||||||
|
ret = xenHypervisorDoV2Sys(priv->handle, &op_sys);
|
||||||
|
if (ret == -1) return -1;
|
||||||
|
|
||||||
|
switch (op_sys.u.getschedulerid.sched_id){
|
||||||
|
case XEN_SCHEDULER_SEDF:
|
||||||
|
/* TODO: Implement for Xen/SEDF */
|
||||||
|
TODO
|
||||||
|
return(-1);
|
||||||
|
case XEN_SCHEDULER_CREDIT: {
|
||||||
|
int weight_set = 0;
|
||||||
|
int cap_set = 0;
|
||||||
|
|
||||||
|
memset(&op_dom, 0, sizeof(op_dom));
|
||||||
|
op_dom.cmd = XEN_V2_OP_SCHEDULER;
|
||||||
|
op_dom.domain = (domid_t) domain->id;
|
||||||
|
op_dom.u.getschedinfo.sched_id = XEN_SCHEDULER_CREDIT;
|
||||||
|
op_dom.u.getschedinfo.cmd = XEN_DOMCTL_SCHEDOP_putinfo;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* credit scheduler parameters
|
||||||
|
* following values do not change the parameters
|
||||||
|
*/
|
||||||
|
op_dom.u.getschedinfo.u.credit.weight = 0;
|
||||||
|
op_dom.u.getschedinfo.u.credit.cap = (uint16_t)~0U;
|
||||||
|
|
||||||
|
for (i = 0; i < nparams; i++) {
|
||||||
|
if (!strncmp(params[i].field,str_weight,strlen(str_weight)) &&
|
||||||
|
params[i].type == VIR_DOMAIN_SCHED_FIELD_UINT) {
|
||||||
|
op_dom.u.getschedinfo.u.credit.weight = params[i].value.ui;
|
||||||
|
weight_set = 1;
|
||||||
|
} else if (!strncmp(params[i].field,str_cap,strlen(str_cap)) &&
|
||||||
|
params[i].type == VIR_DOMAIN_SCHED_FIELD_UINT) {
|
||||||
|
op_dom.u.getschedinfo.u.credit.cap = params[i].value.ui;
|
||||||
|
cap_set = 1;
|
||||||
|
} else {
|
||||||
|
virXenErrorFunc (VIR_ERR_INVALID_ARG, __FUNCTION__,
|
||||||
|
"Credit scheduler accepts 'cap' and 'weight' integer parameters",
|
||||||
|
0);
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = xenHypervisorDoV2Dom(priv->handle, &op_dom);
|
||||||
|
if (ret < 0)
|
||||||
|
return -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
virXenErrorFunc(VIR_ERR_INVALID_ARG, __FUNCTION__,
|
||||||
|
"Unknown scheduler", op_sys.u.getschedulerid.sched_id);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* virXen_pausedomain:
|
* virXen_pausedomain:
|
||||||
* @handle: the hypervisor handle
|
* @handle: the hypervisor handle
|
||||||
|
@ -66,6 +66,17 @@ int xenHypervisorGetVcpus (virDomainPtr domain,
|
|||||||
int maplen);
|
int maplen);
|
||||||
int xenHypervisorGetVcpuMax (virDomainPtr domain);
|
int xenHypervisorGetVcpuMax (virDomainPtr domain);
|
||||||
|
|
||||||
|
char * xenHypervisorGetSchedulerType (virDomainPtr domain,
|
||||||
|
int *nparams);
|
||||||
|
|
||||||
|
int xenHypervisorGetSchedulerParameters (virDomainPtr domain,
|
||||||
|
virSchedParameterPtr params,
|
||||||
|
int *nparams);
|
||||||
|
|
||||||
|
int xenHypervisorSetSchedulerParameters (virDomainPtr domain,
|
||||||
|
virSchedParameterPtr params,
|
||||||
|
int nparams);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -775,6 +775,58 @@ xenUnifiedDomainSetAutostart (virDomainPtr dom, int autostart)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
xenUnifiedDomainGetSchedulerType (virDomainPtr dom, int *nparams)
|
||||||
|
{
|
||||||
|
GET_PRIVATE(dom->conn);
|
||||||
|
int i;
|
||||||
|
char *schedulertype;
|
||||||
|
|
||||||
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; i++) {
|
||||||
|
if (priv->opened[i] && drivers[i]->domainGetSchedulerType) {
|
||||||
|
schedulertype = drivers[i]->domainGetSchedulerType (dom, nparams);
|
||||||
|
if (schedulertype != NULL)
|
||||||
|
return(schedulertype);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
xenUnifiedDomainGetSchedulerParameters (virDomainPtr dom,
|
||||||
|
virSchedParameterPtr params, int *nparams)
|
||||||
|
{
|
||||||
|
GET_PRIVATE(dom->conn);
|
||||||
|
int i, ret;
|
||||||
|
|
||||||
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i) {
|
||||||
|
if (priv->opened[i] && drivers[i]->domainGetSchedulerParameters) {
|
||||||
|
ret = drivers[i]->domainGetSchedulerParameters(dom, params, nparams);
|
||||||
|
if (ret == 0)
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
xenUnifiedDomainSetSchedulerParameters (virDomainPtr dom,
|
||||||
|
virSchedParameterPtr params, int nparams)
|
||||||
|
{
|
||||||
|
GET_PRIVATE(dom->conn);
|
||||||
|
int i, ret;
|
||||||
|
|
||||||
|
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i) {
|
||||||
|
if (priv->opened[i] && drivers[i]->domainSetSchedulerParameters) {
|
||||||
|
ret = drivers[i]->domainSetSchedulerParameters(dom, params, nparams);
|
||||||
|
if (ret == 0)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
/*----- Register with libvirt.c, and initialise Xen drivers. -----*/
|
/*----- Register with libvirt.c, and initialise Xen drivers. -----*/
|
||||||
|
|
||||||
#define VERSION ((DOM0_INTERFACE_VERSION >> 24) * 1000000 + \
|
#define VERSION ((DOM0_INTERFACE_VERSION >> 24) * 1000000 + \
|
||||||
@ -826,6 +878,9 @@ static virDriver xenUnifiedDriver = {
|
|||||||
.domainDetachDevice = xenUnifiedDomainDetachDevice,
|
.domainDetachDevice = xenUnifiedDomainDetachDevice,
|
||||||
.domainGetAutostart = xenUnifiedDomainGetAutostart,
|
.domainGetAutostart = xenUnifiedDomainGetAutostart,
|
||||||
.domainSetAutostart = xenUnifiedDomainSetAutostart,
|
.domainSetAutostart = xenUnifiedDomainSetAutostart,
|
||||||
|
.domainGetSchedulerType = xenUnifiedDomainGetSchedulerType,
|
||||||
|
.domainGetSchedulerParameters = xenUnifiedDomainGetSchedulerParameters,
|
||||||
|
.domainSetSchedulerParameters = xenUnifiedDomainSetSchedulerParameters,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -108,6 +108,9 @@ virDriver xenDaemonDriver = {
|
|||||||
xenDaemonDetachDevice, /* domainDetachDevice */
|
xenDaemonDetachDevice, /* domainDetachDevice */
|
||||||
NULL, /* domainGetAutostart */
|
NULL, /* domainGetAutostart */
|
||||||
NULL, /* domainSetAutostart */
|
NULL, /* domainSetAutostart */
|
||||||
|
NULL, /* domainGetSchedulerType */
|
||||||
|
NULL, /* domainGetSchedulerParameters */
|
||||||
|
NULL, /* domainSetSchedulerParameters */
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -113,6 +113,9 @@ virDriver xenXMDriver = {
|
|||||||
NULL, /* domainDetachDevice */
|
NULL, /* domainDetachDevice */
|
||||||
NULL, /* domainGetAutostart */
|
NULL, /* domainGetAutostart */
|
||||||
NULL, /* domainSetAutostart */
|
NULL, /* domainSetAutostart */
|
||||||
|
NULL, /* domainGetSchedulerType */
|
||||||
|
NULL, /* domainGetSchedulerParameters */
|
||||||
|
NULL, /* domainSetSchedulerParameters */
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -82,6 +82,9 @@ virDriver xenStoreDriver = {
|
|||||||
NULL, /* domainDetachDevice */
|
NULL, /* domainDetachDevice */
|
||||||
NULL, /* domainGetAutostart */
|
NULL, /* domainGetAutostart */
|
||||||
NULL, /* domainSetAutostart */
|
NULL, /* domainSetAutostart */
|
||||||
|
NULL, /* domainGetSchedulerType */
|
||||||
|
NULL, /* domainGetSchedulerParameters */
|
||||||
|
NULL, /* domainSetSchedulerParameters */
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user