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

Re: [Xen-devel] [PATCH 6 of 6] x86/mm: Don't claim a slot on the paging ring if we might not need it



On Feb 23, 2012, at 11:34 AM, Tim Deegan wrote:

> # HG changeset patch
> # User Tim Deegan <tim@xxxxxxx>
> # Date 1330013929 0
> # Node ID 516f96172e67ff463c371357e0ab93724c8b9048
> # Parent  510d80343793227bd39b9a5d4d3b61b9a3f776e4
> x86/mm: Don't claim a slot on the paging ring if we might not need it.
> 
> This avoids the possibility of hitting a wait queue for a slot and then
> finding out later that it wasn't necessary.
> 
> Signed-off-by: Tim Deegan <tim@xxxxxxx>
> 
> diff -r 510d80343793 -r 516f96172e67 xen/arch/x86/mm/p2m.c
> --- a/xen/arch/x86/mm/p2m.c   Thu Feb 23 16:18:09 2012 +0000
> +++ b/xen/arch/x86/mm/p2m.c   Thu Feb 23 16:18:49 2012 +0000
> @@ -1001,19 +1001,23 @@ void p2m_mem_paging_populate(struct doma
>     p2m_access_t a;
>     mfn_t mfn;
>     struct p2m_domain *p2m = p2m_get_hostp2m(d);
> -    int send_request = 0;
> +    int rc, send_request = 0;
> 
> -    /* We're paging. There should be a ring */
> -    int rc = mem_event_claim_slot(d, &d->mem_event->paging);
> -    if ( rc == -ENOSYS )
> +    if ( !d->mem_event->paging.ring_page )

There is a trivial call to do this in non open-coded fashion
bool_t mem_event_check_ring(struct mem_event_domain *med);
I don't use it frequently myself…otherwise
Acked-by: Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx>

>     {
>         gdprintk(XENLOG_ERR, "Domain %hu paging gfn %lx yet no ring "
>                              "in place\n", d->domain_id, gfn);
>         domain_crash(d);
>         return;
>     }
> -    else if ( rc < 0 )
> -        return;
> +
> +    /* Foreign users must grab a ring entry before doing any work since
> +     * they might not be able to get one later.  Local users shouldn't
> +     * grab a slot until they know they need it, to avoid going on a
> +     * wait-queue unnecessarily. */
> +    if ( d != current->domain )
> +        if ( mem_event_claim_slot(d, &d->mem_event->paging) < 0 )
> +            return;
> 
>     /* Fix p2m mapping */
>     gfn_lock(p2m, gfn, 0);
> @@ -1042,10 +1046,18 @@ void p2m_mem_paging_populate(struct doma
>     if ( p2mt != p2m_ram_paging_out && p2mt != p2m_ram_paged )
>     {
>         /* gfn is already on its way back and vcpu is not paused */
> -        mem_event_cancel_slot(d, &d->mem_event->paging);
> +        if ( d != current->domain )
> +            mem_event_cancel_slot(d, &d->mem_event->paging);
>         return;
>     }
> 
> +    /* Now local users should claim a slot. */
> +    if ( d == current->domain ) 
> +    {
> +        rc = mem_event_claim_slot(d, &d->mem_event->paging);
> +        ASSERT(rc == 0);
> +    }
> +
>     /* Send request to pager */
>     req.p2mt = p2mt;
>     req.vcpu_id = v->vcpu_id;


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