[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 4/8] [xen] Domain Groups: VMM domain group framework
xen: 1. Create generic support data structures for group information. 2. Add domgrpctl interface (similar to domctl). diff -r ecb6cd61a9cf xen/common/Makefile --- a/xen/common/Makefile Tue Feb 20 12:27:03 2007 +0000 +++ b/xen/common/Makefile Tue Feb 20 12:59:11 2007 -0500 @@ -1,7 +1,9 @@ obj-y += acm_ops.o obj-y += acm_ops.o obj-y += bitmap.o obj-y += domctl.o +obj-y += domgrpctl.o obj-y += domain.o +obj-y += domgrp.o obj-y += event_channel.o obj-y += grant_table.o obj-y += kernel.o diff -r ecb6cd61a9cf xen/common/domain.c --- a/xen/common/domain.c Tue Feb 20 12:27:03 2007 +0000 +++ b/xen/common/domain.c Tue Feb 20 12:59:11 2007 -0500 @@ -11,6 +11,7 @@ #include <xen/errno.h> #include <xen/sched.h> #include <xen/domain.h> +#include <xen/domgrp.h> #include <xen/mm.h> #include <xen/event.h> #include <xen/time.h> @@ -51,6 +52,7 @@ struct domain *alloc_domain(domid_t domi memset(d, 0, sizeof(*d)); d->domain_id = domid; + d->group_id = INVAL_GROUP_ID; atomic_set(&d->refcnt, 1); spin_lock_init(&d->big_lock); spin_lock_init(&d->page_alloc_lock); @@ -184,6 +186,8 @@ struct domain *domain_create(domid_t dom d->next_in_hashbucket = domain_hash[DOMAIN_HASH(domid)]; domain_hash[DOMAIN_HASH(domid)] = d; write_unlock(&domlist_lock); + + add_dom_to_grp(d, NULL_GROUP_ID); } return d; @@ -288,6 +292,8 @@ void domain_shutdown(struct domain *d, u { struct vcpu *v; + del_dom_from_grp(d); + if ( d->domain_id == 0 ) dom0_shutdown(reason); @@ -329,6 +335,8 @@ void domain_destroy(struct domain *d) old = atomic_compareandswap(old, new, &d->refcnt); if ( _atomic_read(old) != 0 ) return; + + del_dom_from_grp(d); /* Delete from task list and task hashtable. */ write_lock(&domlist_lock); diff -r ecb6cd61a9cf xen/common/domctl.c --- a/xen/common/domctl.c Tue Feb 20 12:27:03 2007 +0000 +++ b/xen/common/domctl.c Tue Feb 20 12:59:11 2007 -0500 @@ -12,6 +12,7 @@ #include <xen/mm.h> #include <xen/sched.h> #include <xen/domain.h> +#include <xen/domgrp.h> #include <xen/event.h> #include <xen/domain_page.h> #include <xen/trace.h> @@ -86,8 +87,10 @@ void getdomaininfo(struct domain *d, str u64 cpu_time = 0; int flags = XEN_DOMINF_blocked; struct vcpu_runstate_info runstate; - + struct domain_group *grp; + info->domain = d->domain_id; + info->group = d->group_id; info->nr_online_vcpus = 0; /* @@ -130,6 +133,9 @@ void getdomaininfo(struct domain *d, str info->shared_info_frame = mfn_to_gmfn(d, __pa(d->shared_info)>>PAGE_SHIFT); memcpy(info->handle, d->handle, sizeof(xen_domain_handle_t)); + grp = find_grp_by_id(info->group); + if (grp) + memcpy(info->dg_handle, grp->handle, sizeof(xen_domain_group_handle_t)); } static unsigned int default_vcpu0_location(void) @@ -250,6 +256,7 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domc { struct domain *d = get_domain_by_id(op->domain); ret = -ESRCH; + if ( d != NULL ) { ret = -EINVAL; @@ -267,6 +274,7 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domc { struct domain *d = get_domain_by_id(op->domain); ret = -ESRCH; + if ( d != NULL ) { ret = -EINVAL; @@ -404,6 +412,7 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domc { struct domain *d = get_domain_by_id(op->domain); ret = -ESRCH; + if ( d != NULL ) { ret = -EINVAL; diff -r ecb6cd61a9cf xen/include/public/domctl.h --- a/xen/include/public/domctl.h Tue Feb 20 12:27:03 2007 +0000 +++ b/xen/include/public/domctl.h Tue Feb 20 12:59:11 2007 -0500 @@ -67,6 +67,7 @@ struct xen_domctl_getdomaininfo { struct xen_domctl_getdomaininfo { /* OUT variables. */ domid_t domain; /* Also echoed in domctl.domain */ + dgid_t group; /* Domain is scheduled to die. */ #define _XEN_DOMINF_dying 0 #define XEN_DOMINF_dying (1U<<_XEN_DOMINF_dying) @@ -100,6 +101,7 @@ struct xen_domctl_getdomaininfo { uint32_t max_vcpu_id; /* Maximum VCPUID in use by this domain. */ uint32_t ssidref; xen_domain_handle_t handle; + xen_domain_group_handle_t dg_handle; }; typedef struct xen_domctl_getdomaininfo xen_domctl_getdomaininfo_t; DEFINE_XEN_GUEST_HANDLE(xen_domctl_getdomaininfo_t); diff -r ecb6cd61a9cf xen/include/public/xen.h --- a/xen/include/public/xen.h Tue Feb 20 12:27:03 2007 +0000 +++ b/xen/include/public/xen.h Tue Feb 20 12:59:11 2007 -0500 @@ -80,6 +80,7 @@ #define __HYPERVISOR_sysctl 35 #define __HYPERVISOR_domctl 36 #define __HYPERVISOR_kexec_op 37 +#define __HYPERVISOR_domgrpctl 38 /* Architecture-specific hypercall definitions. */ #define __HYPERVISOR_arch_0 48 @@ -295,6 +296,8 @@ DEFINE_XEN_GUEST_HANDLE(mmuext_op_t); #ifndef __ASSEMBLY__ typedef uint16_t domid_t; + +typedef uint16_t dgid_t; /* Domain ids >= DOMID_FIRST_RESERVED cannot be used for ordinary domains. */ #define DOMID_FIRST_RESERVED (0x7FF0U) @@ -572,6 +575,8 @@ typedef struct dom0_vga_console_info { typedef uint8_t xen_domain_handle_t[16]; +typedef uint8_t xen_domain_group_handle_t[16]; + /* Turn a plain number into a C unsigned long constant. */ #define __mk_unsigned_long(x) x ## UL #define mk_unsigned_long(x) __mk_unsigned_long(x) diff -r ecb6cd61a9cf xen/include/xen/hypercall.h --- a/xen/include/xen/hypercall.h Tue Feb 20 12:27:03 2007 +0000 +++ b/xen/include/xen/hypercall.h Tue Feb 20 12:59:11 2007 -0500 @@ -10,6 +10,7 @@ #include <xen/time.h> #include <public/xen.h> #include <public/domctl.h> +#include <public/domgrpctl.h> #include <public/sysctl.h> #include <public/platform.h> #include <public/acm_ops.h> @@ -33,6 +34,10 @@ extern long extern long do_domctl( XEN_GUEST_HANDLE(xen_domctl_t) u_domctl); + +extern long +do_domgrpctl( + XEN_GUEST_HANDLE(xen_domgrpctl_t) u_domgrpctl); extern long do_sysctl( diff -r ecb6cd61a9cf xen/include/xen/sched.h --- a/xen/include/xen/sched.h Tue Feb 20 12:27:03 2007 +0000 +++ b/xen/include/xen/sched.h Tue Feb 20 12:59:11 2007 -0500 @@ -9,6 +9,7 @@ #include <xen/shared.h> #include <public/xen.h> #include <public/domctl.h> +#include <public/domgrpctl.h> #include <public/vcpu.h> #include <xen/time.h> #include <xen/timer.h> @@ -25,6 +26,7 @@ DEFINE_XEN_GUEST_HANDLE(vcpu_runstate_in extern unsigned long volatile jiffies; extern rwlock_t domlist_lock; +extern rwlock_t domgrplist_lock; /* A global pointer to the initial domain (DOM0). */ extern struct domain *dom0; @@ -124,9 +126,13 @@ struct domain { domid_t domain_id; + dgid_t group_id; /* TODO: replace struct group ptr */ + struct list_head member; + shared_info_t *shared_info; /* shared data area */ spinlock_t big_lock; + spinlock_t *grp_big_lock; spinlock_t page_alloc_lock; /* protects all the following fields */ struct list_head page_list; /* linked list, of size tot_pages */ @@ -193,6 +199,21 @@ struct domain /* OProfile support. */ struct xenoprof *xenoprof; int32_t time_offset_seconds; +}; + +struct domain_group +{ + dgid_t group_id; + uint16_t size; + + struct list_head groups; + + struct list_head member_list; + + spinlock_t grp_big_lock; + rwlock_t member_list_lock; + + xen_domain_group_handle_t handle; }; struct domain_setup_info diff -r ecb6cd61a9cf xen/common/domgrp.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xen/common/domgrp.c Tue Feb 20 12:59:11 2007 -0500 @@ -0,0 +1,317 @@ +/****************************************************************************** + * domgrp.c + * + * Generic domain group-handling functions. + * + * Author: Chris Bookholt (hap10@xxxxxxxxxxxxxx) + */ + +#include <xen/sched.h> +#include <xen/list.h> +#include <xen/xmalloc.h> +#include <public/domgrpctl.h> + +DEFINE_RWLOCK(domgrplist_lock); +struct list_head domgrplist; + +#define SERIALIZE_LINKED_LIST(op_name, list_name) \ + read_lock(&grp->op_name##_lock); \ + memset(&info->op_name, 0, sizeof(domid_t)*MAX_GROUP_SIZE); \ + if (!list_empty(&grp->op_name)) { \ + i = 0; \ + list_for_each_entry(dom, &grp->op_name, list_name) { \ + info->op_name[i] = dom->domain_id; \ + i++; \ + } \ + } else \ + info->op_name[i] = NULL_GROUP_ID; \ + read_unlock(&grp->op_name##_lock); + +void get_grp_info(struct domain_group *grp, xen_domgrpctl_getgrpinfo_t * info) +{ + struct domain *dom; + uint16_t i = 0; + + info->dgid = grp->group_id; + info->size = grp->size; + + SERIALIZE_LINKED_LIST(member_list, member); + + memcpy(info->handle, grp->handle, sizeof(xen_domain_group_handle_t)); +} + +struct domain_group *alloc_domain_group(void) +{ + struct domain_group *grp = NULL; + + if ((grp = xmalloc(struct domain_group)) != NULL) + memset(grp, 0, sizeof(*grp)); + + return grp; +} + +struct domain_group *find_grp_by_id(dgid_t dgid) +{ + struct domain_group *grp; + + read_lock(&domgrplist_lock); + list_for_each_entry(grp, &domgrplist, groups) + if (grp->group_id == dgid) + goto out; + grp = NULL; + out: + read_unlock(&domgrplist_lock); + return grp; +} + +uint16_t get_new_group_id(void) +{ + static DEFINE_SPINLOCK(domgrpcnt_lock); + static dgid_t group_counter = 1; + dgid_t ret; + + if (group_counter < NULL_GROUP_ID - 1) { + spin_lock(&domgrpcnt_lock); + ret = group_counter++; + spin_unlock(&domgrpcnt_lock); + } else + ret = NULL_GROUP_ID; + return ret; +} + +struct domain_group *domain_group_create(dgid_t dgid) +{ + struct domain_group *grp = NULL, *tail; + + grp = alloc_domain_group(); + if (!grp) + goto out; + + grp->group_id = dgid; + grp->size = 0; + if (dgid == 0) + memset(grp->handle, 0, sizeof(xen_domain_group_handle_t)); + else if (dgid == NULL_GROUP_ID) + memset(grp->handle, 0xFF, sizeof(xen_domain_group_handle_t)); + + /* init group's lists */ + INIT_LIST_HEAD(&grp->member_list); + + /* init group's locks */ + spin_lock_init(&grp->grp_big_lock); + rwlock_init(&grp->member_list_lock); + + /* add new group to domgrplist * + * TODO: This is a candidate for optimization. Could + * be optimized by maintaining a ptr to the tail, but + * list size is small, so search isn't expensive */ + if (dgid != 0 && dgid != NULL_GROUP_ID) { + tail = find_grp_by_id(NULL_GROUP_ID); + write_lock(&domgrplist_lock); + list_add_tail(&grp->groups, &tail->groups); + write_unlock(&domgrplist_lock); + } else { + write_lock(&domgrplist_lock); + list_add_tail(&grp->groups, &domgrplist); + write_unlock(&domgrplist_lock); + } + + out: + return grp; +} + +int dom_in_member_list(domid_t domid, struct domain_group *grp) +{ + struct domain *dom; + int ret = 0; + + if (grp == NULL) { + ret = -EINVAL; + goto out; + } + + read_lock(&grp->member_list_lock); + list_for_each_entry(dom, &grp->member_list, member) { + if (dom->domain_id == domid) { + ret = 1; + break; + } + } + read_unlock(&grp->member_list_lock); + out: + return ret; +} + +#define RM_DOM_FROM_LIST(list_name, entry) \ + write_lock(&grp->list_name##_lock); \ + if (!list_empty(&grp->list_name)) \ + list_del(&dom->entry); \ + write_unlock(&grp->list_name##_lock); + +void del_dom_from_grp(struct domain *dom) +{ + struct domain_group *grp; + + grp = find_grp_by_id(dom->group_id); + + if (grp == NULL) + goto out; + + if (dom_in_member_list(dom->domain_id, grp) <= 0) + goto out; + + RM_DOM_FROM_LIST(member_list, member); + dom->group_id = INVAL_GROUP_ID; + grp->size--; + + out: + return; +} + +int add_dom_to_grp(struct domain *dom, dgid_t dgid) +{ + struct domain_group *grp = NULL; + int ret = 0; + + grp = find_grp_by_id(dgid); + if (grp == NULL) { + ret = -ESRCH; + goto out; + } + + if (grp->size >= MAX_GROUP_SIZE) { + ret = -EPERM; + goto out; + } + + /* skip it if dom is already a member */ + if (dom_in_member_list(dom->domain_id, grp)) + goto out; + + /* remove dom from old group */ + if (dom->group_id != INVAL_GROUP_ID) + del_dom_from_grp(dom); + + /* add dom to end of new group list */ + write_lock(&grp->member_list_lock); + list_add_tail(&dom->member, &grp->member_list); + write_unlock(&grp->member_list_lock); + + dom->group_id = dgid; + dom->grp_big_lock = &grp->grp_big_lock; + + grp->size++; + out: + return ret; +} + +int pause_grp(dgid_t dgid) +{ + int ret = 0; + struct domain *member; + struct domain_group *grp; + + if (dgid == 0) { + ret = -EPERM; + goto out; + } + + grp = find_grp_by_id(dgid); + + if (grp == NULL) { + ret = -ESRCH; + goto out; + } + + spin_lock_recursive(&grp->grp_big_lock); + read_lock(&grp->member_list_lock); + /* could ignore interupts during this loop to increase atomicity */ + list_for_each_entry(member, &grp->member_list, member) { + if (member != current->domain + && member->domain_id != 0) + domain_pause_by_systemcontroller + (member); + } + read_unlock(&grp->member_list_lock); + spin_unlock_recursive(&grp->grp_big_lock); + out: + return ret; +} + +int unpause_grp(dgid_t dgid) +{ + int ret = 0; + struct domain *member; + struct domain_group *grp; + + if (dgid == 0) { + ret = -EPERM; + goto out; + } + + grp = find_grp_by_id(dgid); + + if (grp == NULL) { + ret = -ESRCH; + goto out; + } + + spin_lock_recursive(&grp->grp_big_lock); + read_lock(&grp->member_list_lock); + /* could ignore interupts during this loop to increase atomicity */ + list_for_each_entry(member, &grp->member_list, member) { + if (member != current->domain && + member->domain_id != 0 && + test_bit(_VCPUF_initialised, + &member->vcpu[0]->vcpu_flags)) + domain_unpause_by_systemcontroller + (member); + } + read_unlock(&grp->member_list_lock); + spin_unlock_recursive(&grp->grp_big_lock); + out: + return ret; +} + +int domain_group_destroy(dgid_t dgid) +{ + int ret = 0; + struct domain_group *grp; + + grp = find_grp_by_id(dgid); + if (grp == NULL) { + ret = -ESRCH; + goto out; + } + + if (grp->size != 0) { + ret = -EPERM; + printk(KERN_INFO "refusing to destroy non-emtpry group %d\n", grp->group_id); + goto out; + } + + write_lock(&domgrplist_lock); + list_del(&grp->groups); + write_unlock(&domgrplist_lock); + + xfree(grp); + out: + return ret; +} + +int init_domain_groups(void) +{ + struct domain_group *grp0, *nullgrp; + int ret = 0; + INIT_LIST_HEAD(&domgrplist); + + /* order matters for creation of default groups: + * create default groups in order of ascending dgid so they + * are added to the group list in the expected order */ + grp0 = domain_group_create(0); + nullgrp = domain_group_create(NULL_GROUP_ID); + + if (!grp0 || !nullgrp) + ret = -ENOMEM; + return ret; +} diff -r ecb6cd61a9cf xen/common/domgrpctl.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xen/common/domgrpctl.c Tue Feb 20 12:59:11 2007 -0500 @@ -0,0 +1,134 @@ +/****************************************************************************** + * domgrpctl.c + * + * Domain group management operations. For use by node control stack. + * + * Author: Chris Bookholt (hap10@xxxxxxxxxxxxxx) + */ + +#include <xen/sched.h> +#include <xen/domgrp.h> +#include <xen/guest_access.h> +#include <public/domgrpctl.h> +#include <asm/current.h> + +long do_domgrpctl(XEN_GUEST_HANDLE(xen_domgrpctl_t) u_domgrpctl) +{ + long ret = 0; + struct xen_domgrpctl curop, *op = &curop; + static DEFINE_SPINLOCK(domgrpctl_lock); + struct domain_group *grp; + dgid_t dgid; + + if (!IS_PRIV(current->domain)) { + ret = -EPERM; + goto out; + } + + if (copy_from_guest(op, u_domgrpctl, 1)) { + ret = -EFAULT; + goto out; + } + + if (op->interface_version != XEN_DOMGRPCTL_INTERFACE_VERSION) { + ret = -EINVAL; + goto out; + } + + spin_lock(&domgrpctl_lock); + + switch (op->cmd) { + + case XEN_DOMGRPCTL_getgrpinfo: + { + read_lock(&domgrplist_lock); + ret = -ESRCH; + dgid = op->u.get_grp_info.dgid; + + list_for_each_entry(grp, &domgrplist, groups) { + if (grp->group_id >= dgid) { + ret = 0; + break; + } + } + if (ret) + goto getgrpinfo_out; + + get_grp_info(grp, &op->u.get_grp_info); + + if (copy_to_guest(u_domgrpctl, op, 1)) + ret = -EFAULT; + + getgrpinfo_out: + read_unlock(&domgrplist_lock); + break; + } + + case XEN_DOMGRPCTL_creategrp: + { + dgid = get_new_group_id(); + if (dgid == NULL_GROUP_ID) { + ret = -EINVAL; + break; + } + + grp = domain_group_create(dgid); + if (grp == NULL) { + ret = -ENOMEM; + break; + } + + memcpy(grp->handle, op->u.create_grp.handle, + sizeof(xen_domain_group_handle_t)); + + op->u.create_grp.dgid = grp->group_id; + if (copy_to_guest(u_domgrpctl, op, 1)) + ret = -EFAULT; + + break; + } + + case XEN_DOMGRPCTL_joingrp: + { + domid_t domid; + struct domain *dom; + + domid = op->u.join_grp.domid; + dgid = op->u.join_grp.dgid; + + dom = get_domain_by_id(domid); + if (dom == NULL) + ret = -ESRCH; + else + ret = add_dom_to_grp(dom, dgid); + put_domain(dom); + + break; + } + + case XEN_DOMGRPCTL_pausegrp: + { + ret = pause_grp(op->u.pause_grp.dgid); + break; + } + + case XEN_DOMGRPCTL_unpausegrp: + { + ret = unpause_grp(op->u.unpause_grp.dgid); + break; + } + + case XEN_DOMGRPCTL_destroygrp: + { + ret = domain_group_destroy(op->u.destroy_grp.dgid); + break; + } + + default: + ret = -EINVAL; + } + + spin_unlock(&domgrpctl_lock); + out: + return ret; +} diff -r ecb6cd61a9cf xen/include/public/domgrpctl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xen/include/public/domgrpctl.h Tue Feb 20 12:59:11 2007 -0500 @@ -0,0 +1,86 @@ +/****************************************************************************** + * domgrpctl.h + * + * Domain group management operations. For use by node control stack. + * + * Author: Chris Bookholt (hap10@xxxxxxxxxxxxxx) + */ + +#ifndef __XEN_PUBLIC_DOMGRPCTL_H__ +#define __XEN_PUBLIC_DOMGRPCTL_H__ + +#if !defined(__XEN__) && !defined(__XEN_TOOLS__) +#error "domgrpctl operations are intended for use by node control tools only" +#endif + +#include "xen.h" + +#define XEN_DOMGRPCTL_INTERFACE_VERSION 0x00000001 + +#define MAX_GROUP_SIZE 24 +#define NULL_GROUP_ID (0x7FFFU) +#define INVAL_GROUP_ID (0xFFFFU) + +#define XEN_DOMGRPCTL_creategrp 1 +struct xen_domgrpctl_creategrp { + dgid_t dgid; + xen_domain_group_handle_t handle; +}; +typedef struct xen_domgrpctl_creategrp xen_domgrpctl_creategrp_t; +DEFINE_XEN_GUEST_HANDLE(xen_domgrpctl_creategrp_t); + +#define XEN_DOMGRPCTL_joingrp 2 +struct xen_domgrpctl_joingrp { + domid_t domid; + dgid_t dgid; +}; +typedef struct xen_domgrpctl_joingrp xen_domgrpctl_joingrp_t; +DEFINE_XEN_GUEST_HANDLE(xen_domgrpctl_joingrp_t); + +#define XEN_DOMGRPCTL_pausegrp 3 +struct xen_domgrpctl_pausegrp { + dgid_t dgid; +}; +typedef struct xen_domgrpctl_pausegrp xen_domgrpctl_pausegrp_t; +DEFINE_XEN_GUEST_HANDLE(xen_domgrpctl_pausegrp_t); + +#define XEN_DOMGRPCTL_unpausegrp 4 +struct xen_domgrpctl_unpausegrp { + dgid_t dgid; +}; +typedef struct xen_domgrpctl_unpausegrp xen_domgrpctl_unpausegrp_t; +DEFINE_XEN_GUEST_HANDLE(xen_domgrpctl_unpausegrp_t); + +#define XEN_DOMGRPCTL_destroygrp 5 +struct xen_domgrpctl_destroygrp { + dgid_t dgid; +}; +typedef struct xen_domgrpctl_destroygrp xen_domgrpctl_destroygrp_t; +DEFINE_XEN_GUEST_HANDLE(xen_domgrpctl_destroygrp_t); + +#define XEN_DOMGRPCTL_getgrpinfo 6 +struct xen_domgrpctl_getgrpinfo { + dgid_t dgid; + uint16_t size; + domid_t member_list[MAX_GROUP_SIZE]; + xen_domain_group_handle_t handle; +}; +typedef struct xen_domgrpctl_getgrpinfo xen_domgrpctl_getgrpinfo_t; +DEFINE_XEN_GUEST_HANDLE(xen_domgrpctl_getgrpinfo_t); + +struct xen_domgrpctl { + uint32_t cmd; + uint32_t interface_version; + union { + struct xen_domgrpctl_creategrp create_grp; + struct xen_domgrpctl_joingrp join_grp; + struct xen_domgrpctl_pausegrp pause_grp; + struct xen_domgrpctl_unpausegrp unpause_grp; + struct xen_domgrpctl_destroygrp destroy_grp; + struct xen_domgrpctl_getgrpinfo get_grp_info; + } u; +}; +typedef struct xen_domgrpctl xen_domgrpctl_t; +DEFINE_XEN_GUEST_HANDLE(xen_domgrpctl_t); + +#endif /* __XEN_PUBLIC_DOMGRPCTL_H__ */ diff -r ecb6cd61a9cf xen/include/xen/domgrp.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xen/include/xen/domgrp.h Tue Feb 20 12:59:11 2007 -0500 @@ -0,0 +1,36 @@ +/****************************************************************************** + * domgrp.h + * + * Generic domain group-handling functions. + * + * Author: Chris Bookholt (hap10@xxxxxxxxxxxxxx) + */ + +#ifndef __XEN_DOM_GROUP_H__ +#define __XEN_DOM_GROUP_H__ + +#include <public/domgrpctl.h> + +extern struct list_head domgrplist; + +void get_grp_info(struct domain_group *grp, xen_domgrpctl_getgrpinfo_t * info); + +struct domain_group *find_grp_by_id(dgid_t dgid); + +uint16_t get_new_group_id(void); + +struct domain_group *domain_group_create(dgid_t dgid); + +int del_dom_from_grp(struct domain *old_dom); + +int add_dom_to_grp(struct domain *dom, dgid_t dgid); + +int pause_grp(dgid_t dgid); + +int unpause_grp(dgid_t dgid); + +int domain_group_destroy(dgid_t dgid); + +int init_domain_groups(void); + +#endif /* __XEN_DOM_GROUP_H__ */ _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |