[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Split out context fetching into separate DOM0 op
ChangeSet 1.1441, 2005/05/11 16:05:07+01:00, cl349@xxxxxxxxxxxxxxxxxxxx Split out context fetching into separate DOM0 op make GETDOMAININFO a little more sensible with respect to MP make coredump dump all cpu contexts Signed-off-by: Kip Macy <kmacy@xxxxxxxxxx> Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx> tools/libxc/xc.h | 14 +++--- tools/libxc/xc_core.c | 24 +++++++--- tools/libxc/xc_domain.c | 38 ++++++---------- tools/libxc/xc_linux_build.c | 9 +++ tools/libxc/xc_linux_restore.c | 2 tools/libxc/xc_linux_save.c | 26 +++++++---- tools/libxc/xc_plan9_build.c | 10 +++- tools/libxc/xc_private.c | 15 ++---- tools/libxc/xc_ptrace.c | 11 +--- tools/libxc/xc_vmx_build.c | 9 +++ xen/common/dom0_ops.c | 94 +++++++++++++++++++++++++++++++++-------- xen/include/public/dom0_ops.h | 14 +++++- 12 files changed, 177 insertions(+), 89 deletions(-) diff -Nru a/tools/libxc/xc.h b/tools/libxc/xc.h --- a/tools/libxc/xc.h 2005-05-11 17:04:42 -04:00 +++ b/tools/libxc/xc.h 2005-05-11 17:04:42 -04:00 @@ -110,8 +110,10 @@ typedef struct { u32 domid; - unsigned int cpu; + unsigned int flags; + unsigned int processors; unsigned int vcpus; + u16 n_vcpus; unsigned int dying:1, crashed:1, shutdown:1, paused:1, blocked:1, running:1; unsigned int shutdown_reason; /* only meaningful if shutdown==1 */ @@ -199,11 +201,11 @@ * domain * @return 0 on success, -1 on failure */ -int xc_domain_getfullinfo(int xc_handle, - u32 domid, - u32 vcpu, - xc_domaininfo_t *info, - vcpu_guest_context_t *ctxt); +int xc_domain_get_vcpu_context(int xc_handle, + u32 domid, + u32 vcpu, + vcpu_guest_context_t *ctxt); + int xc_domain_setcpuweight(int xc_handle, u32 domid, float weight); diff -Nru a/tools/libxc/xc_core.c b/tools/libxc/xc_core.c --- a/tools/libxc/xc_core.c 2005-05-11 17:04:42 -04:00 +++ b/tools/libxc/xc_core.c 2005-05-11 17:04:42 -04:00 @@ -7,6 +7,7 @@ /* number of pages to write at a time */ #define DUMP_INCREMENT 4 * 1024 #define round_pgup(_p) (((_p)+(PAGE_SIZE-1))&PAGE_MASK) + static int copy_from_domain_page(int xc_handle, u32 domid, @@ -28,13 +29,14 @@ u32 domid, const char *corename) { - vcpu_guest_context_t st_ctxt, *ctxt = &st_ctxt; unsigned long nr_pages; unsigned long *page_array; - xc_domaininfo_t st_info, *info = &st_info; + xc_dominfo_t info; int i, dump_fd; char *dump_mem, *dump_mem_start = NULL; struct xc_core_header header; + vcpu_guest_context_t ctxt[MAX_VIRT_CPUS]; + if ((dump_fd = open(corename, O_CREAT|O_RDWR, S_IWUSR|S_IRUSR)) < 0) { PERROR("Could not open corefile %s: %s", corename, strerror(errno)); @@ -46,14 +48,22 @@ goto error_out; } - if (xc_domain_getfullinfo(xc_handle, domid, 0/* XXX hardcode */, info, ctxt)) { - PERROR("Could not get full info for domain"); + if (xc_domain_getinfo(xc_handle, domid, 1, &info)) { + PERROR("Could not get info for domain"); goto error_out; } + + for (i = 0; i < info.n_vcpus; i++) { + if (xc_domain_get_vcpu_context(xc_handle, domid, i, &ctxt[i])) { + PERROR("Could not get all vcpu contexts for domain"); + goto error_out; + } + } + + nr_pages = info.nr_pages; - nr_pages = info->tot_pages; header.xch_magic = 0xF00FEBED; - header.xch_nr_vcpus = 1; /* no interface to query at the moment */ + header.xch_nr_vcpus = info.n_vcpus; header.xch_nr_pages = nr_pages; header.xch_ctxt_offset = sizeof(struct xc_core_header); header.xch_index_offset = sizeof(struct xc_core_header) + @@ -62,7 +72,7 @@ sizeof(vcpu_guest_context_t) + nr_pages * sizeof(unsigned long)); write(dump_fd, &header, sizeof(struct xc_core_header)); - write(dump_fd, ctxt, sizeof(st_ctxt)); + write(dump_fd, &ctxt, sizeof(ctxt[0]) * info.n_vcpus); if ((page_array = malloc(nr_pages * sizeof(unsigned long))) == NULL) { printf("Could not allocate memory\n"); diff -Nru a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c --- a/tools/libxc/xc_domain.c 2005-05-11 17:04:42 -04:00 +++ b/tools/libxc/xc_domain.c 2005-05-11 17:04:42 -04:00 @@ -112,14 +112,12 @@ { op.cmd = DOM0_GETDOMAININFO; op.u.getdomaininfo.domain = (domid_t)next_domid; - op.u.getdomaininfo.exec_domain = 0; // FIX ME?!? - op.u.getdomaininfo.ctxt = NULL; /* no exec context info, thanks. */ if ( (rc = do_dom0_op(xc_handle, &op)) < 0 ) break; - info->domid = (u16)op.u.getdomaininfo.domain; - - info->cpu = - (op.u.getdomaininfo.flags>>DOMFLAGS_CPUSHIFT) & DOMFLAGS_CPUMASK; + info->domid = (u16)op.u.getdomaininfo.domain; + info->processors = op.u.getdomaininfo.processors; + info->n_vcpus = op.u.getdomaininfo.n_active_vcpus; + info->flags = op.u.getdomaininfo.flags; info->dying = !!(op.u.getdomaininfo.flags & DOMFLAGS_DYING); info->crashed = !!(op.u.getdomaininfo.flags & DOMFLAGS_CRASHED); @@ -142,28 +140,27 @@ memcpy(&info->cpumap, &op.u.getdomaininfo.cpumap, sizeof(info->cpumap)); - next_domid = (u16)op.u.getdomaininfo.domain + 1; - info++; + next_domid = (u16)op.u.getdomaininfo.domain + 1; + info++; } - if(!nr_doms) return rc; + if( !nr_doms ) return rc; return nr_doms; } -int xc_domain_getfullinfo(int xc_handle, - u32 domid, - u32 vcpu, - xc_domaininfo_t *info, - vcpu_guest_context_t *ctxt) +int xc_domain_get_vcpu_context(int xc_handle, + u32 domid, + u32 vcpu, + vcpu_guest_context_t *ctxt) { int rc, errno_saved; dom0_op_t op; - op.cmd = DOM0_GETDOMAININFO; - op.u.getdomaininfo.domain = (domid_t)domid; - op.u.getdomaininfo.exec_domain = (u16)vcpu; - op.u.getdomaininfo.ctxt = ctxt; + op.cmd = DOM0_GETVCPUCONTEXT; + op.u.getvcpucontext.domain = (domid_t)domid; + op.u.getvcpucontext.exec_domain = (u16)vcpu; + op.u.getvcpucontext.ctxt = ctxt; if ( (ctxt != NULL) && ((rc = mlock(ctxt, sizeof(*ctxt))) != 0) ) @@ -178,10 +175,7 @@ errno = errno_saved; } - if ( info != NULL ) - memcpy(info, &op.u.getdomaininfo, sizeof(*info)); - - if ( ((u16)op.u.getdomaininfo.domain != domid) && (rc > 0) ) + if ( rc > 0 ) return -ESRCH; else return rc; diff -Nru a/tools/libxc/xc_linux_build.c b/tools/libxc/xc_linux_build.c --- a/tools/libxc/xc_linux_build.c 2005-05-11 17:04:42 -04:00 +++ b/tools/libxc/xc_linux_build.c 2005-05-11 17:04:42 -04:00 @@ -356,14 +356,19 @@ op.cmd = DOM0_GETDOMAININFO; op.u.getdomaininfo.domain = (domid_t)domid; - op.u.getdomaininfo.exec_domain = 0; - op.u.getdomaininfo.ctxt = ctxt; if ( (do_dom0_op(xc_handle, &op) < 0) || ((u16)op.u.getdomaininfo.domain != domid) ) { PERROR("Could not get info on domain"); goto error_out; } + + if ( xc_domain_get_vcpu_context(xc_handle, domid, 0, ctxt) ) + { + PERROR("Could not get vcpu context"); + goto error_out; + } + if ( !(op.u.getdomaininfo.flags & DOMFLAGS_PAUSED) || (ctxt->pt_base != 0) ) { diff -Nru a/tools/libxc/xc_linux_restore.c b/tools/libxc/xc_linux_restore.c --- a/tools/libxc/xc_linux_restore.c 2005-05-11 17:04:42 -04:00 +++ b/tools/libxc/xc_linux_restore.c 2005-05-11 17:04:42 -04:00 @@ -181,8 +181,6 @@ /* Get the domain's shared-info frame. */ op.cmd = DOM0_GETDOMAININFO; op.u.getdomaininfo.domain = (domid_t)dom; - op.u.getdomaininfo.exec_domain = 0; - op.u.getdomaininfo.ctxt = NULL; if ( do_dom0_op(xc_handle, &op) < 0 ) { xcio_error(ioctxt, "Could not get information on new domain"); diff -Nru a/tools/libxc/xc_linux_save.c b/tools/libxc/xc_linux_save.c --- a/tools/libxc/xc_linux_save.c 2005-05-11 17:04:42 -04:00 +++ b/tools/libxc/xc_linux_save.c 2005-05-11 17:04:42 -04:00 @@ -324,7 +324,7 @@ int suspend_and_state(int xc_handle, XcIOContext *ioctxt, - xc_domaininfo_t *info, + xc_dominfo_t *info, vcpu_guest_context_t *ctxt) { int i=0; @@ -333,13 +333,18 @@ retry: - if ( xc_domain_getfullinfo(xc_handle, ioctxt->domain, /* FIXME */ 0, - info, ctxt) ) + if ( xc_domain_getinfo(xc_handle, ioctxt->domain, 1, info) ) { xcio_error(ioctxt, "Could not get full domain info"); return -1; } + if ( xc_domain_get_vcpu_context(xc_handle, ioctxt->domain, 0 /* XXX */, + ctxt) ) + { + xcio_error(ioctxt, "Could not get vcpu context"); + } + if ( (info->flags & (DOMFLAGS_SHUTDOWN | (SHUTDOWN_suspend<<DOMFLAGS_SHUTDOWNSHIFT))) == (DOMFLAGS_SHUTDOWN | (SHUTDOWN_suspend<<DOMFLAGS_SHUTDOWNSHIFT)) ) @@ -374,7 +379,7 @@ int xc_linux_save(int xc_handle, XcIOContext *ioctxt) { - xc_domaininfo_t info; + xc_dominfo_t info; int rc = 1, i, j, k, last_iter, iter = 0; unsigned long mfn; @@ -444,13 +449,18 @@ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |