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

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



I've had a look. The xen.org tree knows about three other OSes: minios, solaris 
and netbsd. None knows about paged out frames. None uses the 
XEN_DOMCTL_PFINFO_PAGEDTAB constant in domctl.h

1. The domctl.h constant can still go away without hurting other OSes.
2. It is trivial to add the PRIVCMD_MMAPBATCH_* constants to the privcmd.h of 
other OSes. It can't hurt. I can do it here. Each OS Xen maintainer would have 
to take care of syncing that up in the respective upstream. However ...
3. Not that trivial to teach all these OSes about paged out frames. Does anyone 
care?

Please advise.
Thanks
Andres

On Oct 18, 2012, at 4:08 AM, Ian Campbell <ian.campbell@xxxxxxxxxx> wrote:

> 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®.