--- libvirt.orig/include/libvirt/libvirt.h 2007-03-17 07:26:55.000000000 +0900 +++ libvirt.schedname/include/libvirt/libvirt.h 2007-04-03 20:47:59.000000000 +0900 @@ -303,6 +303,11 @@ int virDomainGetInfo (virDomainPtr dom virDomainInfoPtr info); /* + * Return scheduler type in effect 'sedf', 'credit', 'linux' + */ +const char * virDomainGetSchedulerType (virDomainPtr domain); + +/* * Dynamic control of domains */ const char * virDomainGetName (virDomainPtr domain); --- libvirt.orig/include/libvirt/libvirt.h.in 2007-03-16 02:24:57.000000000 +0900 +++ libvirt.schedname/include/libvirt/libvirt.h.in 2007-04-03 20:49:35.000000000 +0900 @@ -303,6 +303,11 @@ int virDomainGetInfo (virDomainPtr dom virDomainInfoPtr info); /* + * Return scheduler type in effect 'sedf', 'credit', 'linux' + */ +const char * virDomainGetSchedulerType (virDomainPtr domain); + +/* * Dynamic control of domains */ const char * virDomainGetName (virDomainPtr domain); --- libvirt.orig/src/driver.h 2007-03-16 02:24:57.000000000 +0900 +++ libvirt.schedname/src/driver.h 2007-04-03 17:16:36.000000000 +0900 @@ -147,6 +147,9 @@ typedef int (*virDrvDomainSetAutostart) (virDomainPtr domain, int autostart); +typedef const char * + (*virDrvDomainGetSchedulerType) (virDomainPtr domain); + typedef struct _virDriver virDriver; typedef virDriver *virDriverPtr; @@ -200,6 +203,7 @@ struct _virDriver { virDrvDomainDetachDevice domainDetachDevice; virDrvDomainGetAutostart domainGetAutostart; virDrvDomainSetAutostart domainSetAutostart; + virDrvDomainGetSchedulerType domainGetSchedulerType; }; typedef int --- libvirt.orig/src/libvirt.c 2007-03-23 03:30:57.000000000 +0900 +++ libvirt.schedname/src/libvirt.c 2007-04-03 20:54:03.000000000 +0900 @@ -1740,6 +1740,43 @@ virConnectGetCapabilities (virConnectPtr return NULL; } +/** + * virDomainGetSchedulerType: + * @dom: pointer to the hypervisor connection + * + * Get the scheduler type. + * + * Returns NULL in case of error. + */ +const char * +virDomainGetSchedulerType(virDomainPtr domain) +{ + int i; + virConnectPtr conn; + + if (domain == NULL) { + TODO + return NULL; + } + 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; + } + + for (i = 0; i < conn->nb_drivers; i++) { + if (conn->drivers[i] && conn->drivers[i]->domainGetSchedulerType) { + return conn->drivers[i]->domainGetSchedulerType (domain); + } + } + + return NULL; +} /************************************************************************ * * * Handling of defined but not running domains * --- libvirt.orig/src/libvirt_sym.version 2007-03-16 02:24:57.000000000 +0900 +++ libvirt.schedname/src/libvirt_sym.version 2007-04-03 18:33:46.000000000 +0900 @@ -59,6 +59,7 @@ virDomainPinVcpu; virDomainGetVcpus; virDomainGetMaxVcpus; + virDomainGetSchedulerType; virDomainAttachDevice; virDomainDetachDevice; --- libvirt.orig/src/proxy_internal.c 2007-03-16 02:24:57.000000000 +0900 +++ libvirt.schedname/src/proxy_internal.c 2007-04-03 17:59:02.000000000 +0900 @@ -86,6 +86,7 @@ static virDriver xenProxyDriver = { NULL, /* domainDetachDevice */ NULL, /* domainGetAutostart */ NULL, /* domainSetAutostart */ + NULL, /* domainGetSchedulerType */ }; /** --- libvirt.orig/src/qemu_internal.c 2007-03-16 03:23:00.000000000 +0900 +++ libvirt.schedname/src/qemu_internal.c 2007-04-03 17:57:35.000000000 +0900 @@ -1233,6 +1233,7 @@ static virDriver qemuDriver = { NULL, /* domainDetachDevice */ qemuDomainGetAutostart, /* domainGetAutostart */ qemuDomainSetAutostart, /* domainSetAutostart */ + NULL, /* domainGetSchedulerType */ }; static virNetworkDriver qemuNetworkDriver = { --- libvirt.orig/src/test.c 2007-03-17 00:03:21.000000000 +0900 +++ libvirt.schedname/src/test.c 2007-04-03 17:55:14.000000000 +0900 @@ -132,6 +132,7 @@ static virDriver testDriver = { NULL, /* domainDetachDevice */ NULL, /* domainGetAutostart */ NULL, /* domainSetAutostart */ + NULL, /* domainGetSchedulerType */ }; typedef struct _testDev { --- libvirt.orig/src/virsh.c 2007-04-03 09:05:52.000000000 +0900 +++ libvirt.schedname/src/virsh.c 2007-04-03 18:51:30.000000000 +0900 @@ -1150,6 +1150,7 @@ cmdDominfo(vshControl * ctl, vshCmd * cm int ret = TRUE; unsigned int id; char *str, uuid[VIR_UUID_STRING_BUFLEN]; + const char *schedulertype; if (!vshConnectionUsability(ctl, ctl->conn, TRUE)) return FALSE; @@ -1196,10 +1197,15 @@ cmdDominfo(vshControl * ctl, vshCmd * cm vshPrint(ctl, "%-15s %lu kB\n", _("Used memory:"), info.memory); + schedulertype = virDomainGetSchedulerType(dom); + if (schedulertype != NULL) + vshPrint(ctl, "%-15s %s\n", _("Scheduler:"), + schedulertype); } else { ret = FALSE; } + virDomainFree(dom); return ret; } --- libvirt.orig/src/xen_internal.h 2007-03-27 23:45:17.000000000 +0900 +++ libvirt.schedname/src/xen_internal.h 2007-04-03 17:21:46.000000000 +0900 @@ -62,6 +62,8 @@ int xenHypervisorGetVcpus (virDomainPtr int maplen); int xenHypervisorGetVcpuMax (virDomainPtr domain); +const char * xenHypervisorGetSchedulerType (virDomainPtr domain); + #ifdef __cplusplus } #endif --- libvirt.orig/src/xen_internal.c 2007-03-28 17:48:53.000000000 +0900 +++ libvirt.schedname/src/xen_internal.c 2007-04-03 18:29:58.000000000 +0900 @@ -158,6 +158,19 @@ union 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) \ (hypervisor_version < 2 ? \ ((domlist.v0 = malloc(sizeof(xen_v0_getdomaininfo)*(size))) != NULL) : \ @@ -377,6 +390,13 @@ typedef struct xen_v2_vcpuinfo xen_v2_vc typedef struct xen_v2_setvcpumap xen_v2_getvcpumap; /* + * from V2 we get the scheduler information + */ +#define XEN_V2_OP_GETSCHEDULERID 4 + + + +/* * The hypercall operation structures also have changed on * changeset 86d26e6ec89b */ @@ -403,6 +423,7 @@ struct xen_op_v2_sys { uint32_t interface_version; union { xen_v2_getdomaininfolistop getdomaininfolist; + xen_v2_getschedulerid getschedulerid; uint8_t padding[128]; } u; }; @@ -482,6 +503,7 @@ static virDriver xenHypervisorDriver = { NULL, /* domainDetachDevice */ NULL, /* domainGetAutostart */ NULL, /* domainSetAutostart */ + xenHypervisorGetSchedulerType, /* domainGetSchedulerType */ }; #endif /* !PROXY */ @@ -781,6 +803,45 @@ virXen_getdomaininfo(int handle, int fir } +/** + * xenHypervisorGetSchedulerType: + * @conn: pointer to the Xen Hypervisor block + * + * Do a low level hypercall to get scheduler type + * + * Returns 0 or -1 in case of failure + */ +const char * +xenHypervisorGetSchedulerType(virDomainPtr domain) +{ + const char *schedulertype = NULL; + + if (hypervisor_version > 1) { + virConnectPtr conn; + conn = domain->conn; + xen_op_v2_sys op; + int ret; + + memset(&op, 0, sizeof(op)); + op.cmd = XEN_V2_OP_GETSCHEDULERID; + ret = xenHypervisorDoV2Sys(conn->handle, &op); + + switch (op.u.getschedulerid.sched_id){ + case 4: + schedulertype = "sedf"; + break; + case 5: + schedulertype = "credit"; + break; + default: + break; + } + } + return(schedulertype); + +} + + #ifndef PROXY /** * virXen_pausedomain: --- libvirt.orig/src/xend_internal.c 2007-03-24 01:15:07.000000000 +0900 +++ libvirt.schedname/src/xend_internal.c 2007-04-03 17:56:00.000000000 +0900 @@ -106,6 +106,7 @@ static virDriver xenDaemonDriver = { xenDaemonDetachDevice, /* domainDetachDevice */ NULL, /* domainGetAutostart */ NULL, /* domainSetAutostart */ + NULL, /* domainGetSchedulerType */ }; /** --- libvirt.orig/src/xm_internal.c 2007-03-23 03:30:58.000000000 +0900 +++ libvirt.schedname/src/xm_internal.c 2007-04-03 17:55:45.000000000 +0900 @@ -112,6 +112,7 @@ static virDriver xenXMDriver = { NULL, /* domainDetachDevice */ NULL, /* domainGetAutostart */ NULL, /* domainSetAutostart */ + NULL, /* domainGetSchedulerType */ }; static void --- libvirt.orig/src/xs_internal.c 2007-03-24 01:15:07.000000000 +0900 +++ libvirt.schedname/src/xs_internal.c 2007-04-03 17:57:12.000000000 +0900 @@ -81,6 +81,7 @@ static virDriver xenStoreDriver = { NULL, /* domainDetachDevice */ NULL, /* domainGetAutostart */ NULL, /* domainSetAutostart */ + NULL, /* domainGetSchedulerType */ }; /**