[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] Synchronize privcmd header constants



On Fri, 2012-10-12 at 16:30 +0100, Andres Lagar-Cavilla wrote:
> tools/include/xen-sys/Linux/privcmd.h |   3 +++
>  tools/libxc/xc_linux_osdep.c          |  10 +++++-----
>  xen/include/public/domctl.h           |   1 -
>  3 files changed, 8 insertions(+), 6 deletions(-)
> 
> 
> Since Linux's git commit ceb90fa0a8008059ecbbf9114cb89dc71a730bb6, the
> privcmd.h interface between Linux and libxc specifies two new constants,
> PRIVCMD_MMAPBATCH_MFN_ERROR and PRIVCMD_MMAPBATCH_PAGED_ERROR. These constants
> represent the error codes encoded in the top nibble of an mfn slot passed to
> the legacy MMAPBATCH ioctl.
> 
> In particular, libxenctrl checks for the equivalent of the latter constant 
> when
> dealing with paged out frames that might be the target of a foreign map.
> 
> Previously, the relevant constant was defined in the domctl hypervisor
> interface header (XEN_DOMCTL_PFINFO_PAGEDTAB). Because this top-nibble 
> encoding
> is a contract between the dom0 kernel and libxc, a domctl.h definition is
> misplaced.
> 
> - Sync the privcmd.h header to that now available in upstream Linux

Although the ioctl is Linux specific is the top-nibble behaviour (and
therefore the #define) common to other dom0s like *BSD? Can a BSD person
confirm that this change won't breaking things for them please.

> - Update libxc appropriately
> - Remove the unnecessary constant in domctl.h
> 
> Signed-off-by: Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx>
> 
> diff -r 4eed5e64544f -r 5171750d133e tools/include/xen-sys/Linux/privcmd.h
> --- a/tools/include/xen-sys/Linux/privcmd.h
> +++ b/tools/include/xen-sys/Linux/privcmd.h
> @@ -64,6 +64,9 @@ typedef struct privcmd_mmapbatch {
>       xen_pfn_t __user *arr; /* array of mfns - top nibble set on err */
>  } privcmd_mmapbatch_t; 
>  
> +#define PRIVCMD_MMAPBATCH_MFN_ERROR     0xf0000000U
> +#define PRIVCMD_MMAPBATCH_PAGED_ERROR   0x80000000U
> +
>  typedef struct privcmd_mmapbatch_v2 {
>       unsigned int num; /* number of pages to populate */
>       domid_t dom;      /* target domain */
> diff -r 4eed5e64544f -r 5171750d133e tools/libxc/xc_linux_osdep.c
> --- a/tools/libxc/xc_linux_osdep.c
> +++ b/tools/libxc/xc_linux_osdep.c
> @@ -129,7 +129,7 @@ static int xc_map_foreign_batch_single(i
>  
>      do
>      {
> -        *mfn ^= XEN_DOMCTL_PFINFO_PAGEDTAB;
> +        *mfn ^= PRIVCMD_MMAPBATCH_PAGED_ERROR;
>          usleep(100);
>          rc = ioctl(fd, IOCTL_PRIVCMD_MMAPBATCH, &ioctlx);
>      }
> @@ -166,8 +166,8 @@ static void *linux_privcmd_map_foreign_b
>  
>          for ( i = 0; i < num; i++ )
>          {
> -            if ( (arr[i] & XEN_DOMCTL_PFINFO_LTAB_MASK) ==
> -                 XEN_DOMCTL_PFINFO_PAGEDTAB )
> +            if ( (arr[i] & PRIVCMD_MMAPBATCH_MFN_ERROR) ==
> +                           PRIVCMD_MMAPBATCH_PAGED_ERROR )
>              {
>                  unsigned long paged_addr = (unsigned long)addr + (i << 
> XC_PAGE_SHIFT);
>                  rc = xc_map_foreign_batch_single(fd, dom, &arr[i],
> @@ -323,12 +323,12 @@ static void *linux_privcmd_map_foreign_b
>              default:
>                  err[i] = -EINVAL;
>                  continue;
> -            case XEN_DOMCTL_PFINFO_PAGEDTAB:
> +            case PRIVCMD_MMAPBATCH_PAGED_ERROR:
>                  if ( rc != -ENOENT )
>                  {
>                      err[i] = rc ?: -EINVAL;
>                      continue;
> -                 }
> +                }
>                  rc = xc_map_foreign_batch_single(fd, dom, pfn + i,
>                          (unsigned long)addr + ((unsigned 
> long)i<<XC_PAGE_SHIFT));
>                  if ( rc < 0 )
> diff -r 4eed5e64544f -r 5171750d133e xen/include/public/domctl.h
> --- a/xen/include/public/domctl.h
> +++ b/xen/include/public/domctl.h
> @@ -135,7 +135,6 @@ DEFINE_XEN_GUEST_HANDLE(xen_domctl_getme
>  #define XEN_DOMCTL_PFINFO_LPINTAB (0x1U<<31)
>  #define XEN_DOMCTL_PFINFO_XTAB    (0xfU<<28) /* invalid page */
>  #define XEN_DOMCTL_PFINFO_XALLOC  (0xeU<<28) /* allocate-only page */
> -#define XEN_DOMCTL_PFINFO_PAGEDTAB (0x8U<<28)
>  #define XEN_DOMCTL_PFINFO_LTAB_MASK (0xfU<<28)
>  
>  struct xen_domctl_getpageframeinfo {



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.