|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 4/4] vm_event: Add support for multi-page ring buffer
On Mon, 2018-09-17 at 15:41 +0100, Andrew Cooper wrote:
> On 13/09/18 16:02, Petre Pircalabu wrote:
> > In high throughput introspection scenarios where lots of monitor
> > vm_events are generated, the ring buffer can fill up before the
> > monitor
> > application gets a chance to handle all the requests thus blocking
> > other vcpus which will have to wait for a slot to become available.
> >
> > This patch adds support for extending the ring buffer by allocating
> > a
> > number of pages from domheap and mapping them to the monitor
> > application's domain using the foreignmemory_map_resource
> > interface.
> > Unlike the current implementation, the ring buffer pages are not
> > part of
> > the introspected DomU, so they will not be reclaimed when the
> > monitor is
> > disabled.
> >
> > Signed-off-by: Petre Pircalabu <ppircalabu@xxxxxxxxxxxxxxx>
>
> What about the slotted format for the synchronous events? While this
> is
> fine for the async bits, I don't think we want to end up changing the
> mapping API twice.
>
> Simply increasing the size of the ring puts more pressure on the
I'm currently investigating this approach and I will send an
inplementation proposal with the next version of the patch.
>
> > diff --git a/xen/arch/x86/domain_page.c
> > b/xen/arch/x86/domain_page.c
> > index 0d23e52..2a9cbf3 100644
> > --- a/xen/arch/x86/domain_page.c
> > +++ b/xen/arch/x86/domain_page.c
> > @@ -331,10 +331,9 @@ void *__map_domain_pages_global(const struct
> > page_info *pg, unsigned int nr)
> > {
> > mfn_t mfn[nr];
> > int i;
> > - struct page_info *cur_pg = (struct page_info *)&pg[0];
> >
> > for (i = 0; i < nr; i++)
> > - mfn[i] = page_to_mfn(cur_pg++);
> > + mfn[i] = page_to_mfn(pg++);
>
> This hunk looks like it should be in the previous patch? That
> said...
Yep. I've completely missed it. This piece of code will be removed
along with the map_domain_pages_global patch.
>
> >
> > return map_domain_pages_global(mfn, nr);
> > }
> > diff --git a/xen/common/vm_event.c b/xen/common/vm_event.c
> > index 4793aac..faece3c 100644
> > --- a/xen/common/vm_event.c
> > +++ b/xen/common/vm_event.c
> > @@ -39,16 +39,66 @@
> > #define vm_event_ring_lock(_ved) spin_lock(&(_ved)-
> > >ring_lock)
> > #define vm_event_ring_unlock(_ved) spin_unlock(&(_ved)-
> > >ring_lock)
> >
> > +#define XEN_VM_EVENT_ALLOC_FROM_DOMHEAP 0xFFFFFFFF
> > +
> > +static int vm_event_alloc_ring(struct domain *d, struct
> > vm_event_domain *ved)
> > +{
> > + struct page_info *page;
> > + void *va = NULL;
> > + int i, rc = -ENOMEM;
> > +
> > + page = alloc_domheap_pages(d, ved->ring_order,
> > MEMF_no_refcount);
> > + if ( !page )
> > + return -ENOMEM;
>
> ... what is wrong with vzalloc()?
>
> You don't want to be making a ring_order allocation, especially as
> the
> order grows. All you need are some mappings which are virtually
> contiguous, not physically contiguous.
Unfortunately, vzalloc doesn't work here (the acquire_resource
succeeds, but the subsequent mapping fails:
(XEN) mm.c:1024:d0v5 pg_owner d0 l1e_owner d0, but real_pg_owner d-1
(XEN) mm.c:1100:d0v5 Error getting mfn dd24d (pfn ffffffffffffffff)
from L1 entry 80000000dd24d227 for l1e_owner d0, pg_owner d0
(XEN) mm.c:1024:d0v5 pg_owner d0 l1e_owner d0, but real_pg_owner d-1
(XEN) mm.c:1100:d0v5 Error getting mfn dd24c (pfn ffffffffffffffff)
from L1 entry 80000000dd24c227 for l1e_owner d0, pg_owner d0
However, allocating each page with alloc_domheap_page and then mapping
them using vmap does the trick.
Until the next version is ready (slotted format for synchronous events)
I have pushed an intermediate version which addresses the issues
signaled by you an Jan to my github fork of the xen repository:
https://github.com/petrepircalabu/xen/tree/multi_page_ring_buffer/devel
_new
> ~Andrew
Many thanks for your support,
Petre
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |