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

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



On Oct 19, 2012, at 4:37 AM, Roger Pau Monné <roger.pau@xxxxxxxxxx> wrote:

> On 19/10/12 04:20, Andres Lagar-Cavilla wrote:
>> 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.
> 
> I've checked and NetBSD doesn't use XEN_DOMCTL_PFINFO_PAGEDTAB, so as
> Andres says I guess it's safe to remove it.
> 
>> 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?
> 
> Well, I'm sure the NetBSD community would be interested in this, but
> finding someone to actually work on it is a whole different story…

Thanks Roger. Ian should I expect a response from Solaris?
Andres
> 
>> 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®.