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

[Xen-devel] Re: [PATCH v2] Use ballooned pages for gntdev



On Thu, 2011-03-10 at 16:10 +0000, Daniel De Graaf wrote:
> On 03/10/2011 10:57 AM, Ian Campbell wrote:
> > On Thu, 2011-03-10 at 14:56 +0000, Daniel De Graaf wrote:
> >> On 03/10/2011 04:18 AM, Ian Campbell wrote:
> >>> On Wed, 2011-03-09 at 23:07 +0000, Daniel De Graaf wrote:
> >>>> Split up the balloon module, similar to how grants and events are
> >>>> handled. This allow gntdev to use ballooned pages without adding a
> >>>> dependency on the balloon module.
> >>>>
> >>>> The interface is slightly different from that exposed in 2.6.32; the
> >>>> page vector is allocated by the caller, not by the balloon driver. This
> >>>> allows more freedom in how the returned pages are used, since they do
> >>>> not all have to be returned to the balloon driver at the same time. It
> >>>> also tries to reuse already ballooned pages rather than always
> >>>> ballooning new pages to ensure they are in low memory as the 2.6.32
> >>>> version did.
> >>>>
> >>>> Changes since v1:
> >>>>  * Rebased on konrad/devel/{balloon-hotplug,next-2.6.38} merge
> >>>>  * Better function names
> >>>>  * Adjust balloon stats for requested pages
> >>>>
> >>>> [PATCH 1/3] xen-balloon: Move core balloon functionality out of module
> >>>> [PATCH 2/3] xen-balloon: Add interface to retrieve ballooned pages
> >>>> [PATCH 3/3] xen-gntdev: Use ballooned pages for grant mappings
> >>>
> >>> Does this introduces a new potential failure case? When a normal balloon
> >>> operation takes place is it is now possible for the ballooned_pages list
> >>> to be empty (because gntdev has stolen stuff from it) where before we
> >>> knew the list was non-empty at that point?
> >>>
> >>> e.g. increase_reservation includes:
> >>>           page = balloon_retrieve();
> >>>           BUG_ON(page == NULL);
> >>> as well as:
> >>>   page = balloon_first_page();
> >>>   for (i = 0; i < nr_pages; i++) {
> >>>           BUG_ON(page == NULL);
> >>>           frame_list[i] = page_to_pfn(page);
> >>>           page = balloon_next_page(page);
> >>>   }
> >>>
> >>> Are we sure we aren't about to exercise those BUG_ONs?
> >>
> >> This is safe because increase_reservation is protected by the balloon
> >> mutex. There is a loop just before the hypercall that verifies that
> >> there are enough pages in the list.
> > 
> > Which loop? I don't see anything like that in either
> > increase_reservation or the caller (balloon process).
> > 
> 
> In increase_reservation:
>         page = balloon_first_page();
>         for (i = 0; i < nr_pages; i++) {
>                 if (!page) {
>                         nr_pages = i;
>                         break;
>                 }
>                 frame_list[i] = page_to_pfn(page);
>                 page = balloon_next_page(page);
>         }
> 
> This ensures that the balloon size is at least nr_pages.

I must be missing a patch, on my version this is exactly the loop with
the BUG_ON in it that I was referring to:
        page = balloon_first_page();
        for (i = 0; i < nr_pages; i++) {
                BUG_ON(page == NULL);
                frame_list[i] = page_to_pfn(page);
                page = balloon_next_page(page);
        }

Ian


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

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