|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 3/3] libxc/PV: save/restore data breakpoint extension registers
On Mon, Apr 7, 2014 at 10:39 AM, Jan Beulich <JBeulich@xxxxxxxx> wrote:
> Requiring the handling of the generic MSR extension to
> XEN_DOMCTL_[gs]et_ext_vcpucontext.
>
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
> ---
> v3: Split off of hypervisor patch and address review comments:
> - check XEN_DOMCTL_get_ext_vcpucontext size output before looking
> at msr_count field
> - scrub xen_domctl_ext_vcpucontext_t's msrs field on the sending
> side
> - clear xen_domctl_ext_vcpucontext_t's msr_count field on the
> restore side if the size field doesn't cover the msrs one
> - make use of hypercall buffer bouncing interfaces on the restore
> side (on the save side this would seem to complicate the code
> rather than simplifying it)
> - add documenting note to tools/libxc/xg_save_restore.h
>
> --- a/tools/libxc/xc_domain_restore.c
> +++ b/tools/libxc/xc_domain_restore.c
> @@ -38,6 +38,7 @@
>
> #include <stdlib.h>
> #include <unistd.h>
> +#include <assert.h>
>
> #include "xg_private.h"
> #include "xg_save_restore.h"
> @@ -590,8 +591,13 @@ static int buffer_tail_pv(xc_interface *
> uint32_t vcpuextstate_size)
> {
> unsigned int i;
> - size_t pfnlen, vcpulen;
> + size_t pfnlen, vcpulen, total;
> + int alloc = 0;
> struct domain_info_context *dinfo = &ctx->dinfo;
> + union {
> + const unsigned char *raw;
> + xen_domctl_ext_vcpucontext_t *evc;
> + } ptr;
>
> /* TODO: handle changing pfntab and vcpu counts */
> /* PFN tab */
> @@ -634,11 +640,42 @@ static int buffer_tail_pv(xc_interface *
> ERROR("Error allocating VCPU ctxt tail buffer");
> goto free_pfntab;
> }
> + alloc = 1;
> }
> // DPRINTF("Reading VCPUS: %d bytes\n", vcpulen);
> - if ( RDEXACT(fd, buf->vcpubuf, vcpulen) ) {
> - PERROR("Error when reading ctxt");
> - goto free_vcpus;
> + for ( total = i = 0, ptr.raw = buf->vcpubuf; ext_vcpucontext; ) {
This isn't actually a for loop. Would it really be so terrible to do
if(ext_vcpucontext) { while(1) {}}?
> + if ( RDEXACT(fd, buf->vcpubuf + total, vcpulen) ) {
> + PERROR("Error when reading ctxt");
> + goto free_vcpus;
> + }
> + total += vcpulen;
> + for ( vcpulen = 0; i < buf->vcpucount; ++i ) {
> + size_t msrlen;
> +
> + if ( (const unsigned char *)(ptr.evc + 1) > buf->vcpubuf + total
> )
> + break;
> + if ( ptr.evc->size <
> + (offsetof(xen_domctl_ext_vcpucontext_t, msrs) +
> + sizeof(ptr.evc->msrs)) )
> + ptr.evc->msr_count = 0;
> + msrlen = ptr.evc->msr_count * sizeof(xen_domctl_ext_vcpu_msr_t);
> + vcpulen += msrlen;
> + ptr.raw += 128 + msrlen + vcpuextstate_size;
> + }
> + if ( !vcpulen ) {
> + assert(i == buf->vcpucount);
> + break;
> + }
If you're going to write such twisted logic, you absolutely must
comment it -- at very least you need to give a high level description
of what it's doing. I've been staring at this for an hour now, and I
only have a vague idea what it's supposed to be doing. Seriously, is
this any better than spaghetti code?
> --- a/tools/libxc/xc_domain_save.c
> +++ b/tools/libxc/xc_domain_save.c
[snip]
> @@ -1960,16 +1963,42 @@ int xc_domain_save(xc_interface *xch, in
> domctl.domain = dom;
> memset(&domctl.u, 0, sizeof(domctl.u));
> domctl.u.ext_vcpucontext.vcpu = i;
> - if ( xc_domctl(xch, &domctl) < 0 )
> + frc = xc_domctl(xch, &domctl);
> + if ( frc < 0 && errno == ENOBUFS &&
> + domctl.u.ext_vcpucontext.size >=
> + (offsetof(xen_domctl_ext_vcpucontext_t, msrs) +
> + sizeof(domctl.u.ext_vcpucontext.msrs)) &&
> + domctl.u.ext_vcpucontext.msr_count )
> + {
> + msrs = xc_hypercall_buffer_alloc(xch, msrs,
> +
> domctl.u.ext_vcpucontext.msr_count *
> + sizeof(*msrs));
> + set_xen_guest_handle(domctl.u.ext_vcpucontext.msrs, msrs);
> + frc = msrs ? xc_domctl(xch, &domctl) : -1;
> + /* Don't save the actual pointer. */
> + set_xen_guest_handle_raw(domctl.u.ext_vcpucontext.msrs, NULL);
> + }
I think this could use a comment as well.
-George
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |