On Fri, 2016-02-05 at 14:20 -0700, Tamas K Lengyel wrote:
> When xc_map_foreign_batch got deprecated reinitializing vm_event on a domain
> where an event listener was previously active broke as it relied on the flag
> XEN_DOMCTL_PFINFO_XTAB to indicate that the magic page is not in the physmap.
> Manually check the gpfn type, add it to the physmap if needed, and only then
> try to map it.
> 
> Signed-off-by: Tamas K Lengyel <tleng...@novetta.com>
> Cc: Ian Jackson <ian.jack...@eu.citrix.com>
> Cc: Stefano Stabellini <stefano.stabell...@eu.citrix.com>
> Cc: Ian Campbell <ian.campb...@citrix.com>
> Cc: Wei Liu <wei.l...@citrix.com>
> Cc: Andrew Cooper <andrew.coop...@citrix.com>

Sorry for the breakage!

Acked-by: Ian Campbell <ian.campb...@citrix.com>

> ---
>  tools/libxc/xc_vm_event.c | 21 ++++++++++-----------
>  1 file changed, 10 insertions(+), 11 deletions(-)
> 
> diff --git a/tools/libxc/xc_vm_event.c b/tools/libxc/xc_vm_event.c
> index 57abce0..443c73b 100644
> --- a/tools/libxc/xc_vm_event.c
> +++ b/tools/libxc/xc_vm_event.c
> @@ -72,11 +72,10 @@ void *xc_vm_event_enable(xc_interface *xch, domid_t
> domain_id, int param,
>  
>      ring_pfn = pfn;
>      mmap_pfn = pfn;
> -    ring_page = xc_map_foreign_pages(xch, domain_id, PROT_READ |
> PROT_WRITE,
> -                                     &mmap_pfn, 1);
> -    if ( !ring_page )
> +    rc1 = xc_get_pfn_type_batch(xch, domain_id, 1, &mmap_pfn);
> +    if ( rc1 || mmap_pfn & XEN_DOMCTL_PFINFO_XTAB )
>      {
> -        /* Map failed, populate ring page */
> +        /* Page not in the physmap, try to populate it */
>          rc1 = xc_domain_populate_physmap_exact(xch, domain_id, 1, 0, 0,
>                                                &ring_pfn);
>          if ( rc1 != 0 )
> @@ -84,15 +83,15 @@ void *xc_vm_event_enable(xc_interface *xch, domid_t
> domain_id, int param,
>              PERROR("Failed to populate ring pfn\n");
>              goto out;
>          }
> +    }
>  
> -        mmap_pfn = ring_pfn;
> -        ring_page = xc_map_foreign_pages(xch, domain_id, PROT_READ |
> PROT_WRITE,
> +    mmap_pfn = ring_pfn;
> +    ring_page = xc_map_foreign_pages(xch, domain_id, PROT_READ |
> PROT_WRITE,
>                                           &mmap_pfn, 1);
> -        if ( !ring_page )
> -        {
> -            PERROR("Could not map the ring page\n");
> -            goto out;
> -        }
> +    if ( !ring_page )
> +    {
> +        PERROR("Could not map the ring page\n");
> +        goto out;
>      }
>  
>      switch ( param )
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

Reply via email to