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

Re: [PATCH v4 05/16] libs/guest: allocate various migration arrays just once


  • To: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
  • From: Frediano Ziglio <freddy77@xxxxxxxxx>
  • Date: Tue, 9 Jun 2026 10:32:55 +0100
  • Arc-authentication-results: i=1; mx.google.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=GjhGXc3wdtzca4RHEQjHYpjSQng78zDhCNN28ncA3l0=; fh=YXyOrzbbuBMjB1laPSTTaglkJ9ItuXSXF5B6orWbM3Y=; b=cmYzHcfyT0a7pT4e8io+WboW33veVSCDH9wBZXXQ1BGk0G9ADBJeyKGR6X5tf3N4Yo XL6BURqXZrynuV/xU2RWdcA/K5cJsboYJazoEdQBdNXWaltZ0fhVgM1+cocfE+KnZ1Lk M/7j1PHYhPMewWXlCxUSjeBVvbmldH7JSvkF2vBYDua74Z08B5cZ+sDALSZ2NzRuF7wX uaTNrbVzHEXCdpChVbLRZHEcx0Tw1snsUtupillHinN9kQaDJ6bPOKvujsfxwGpma0O1 wlVmp+Y6h0S6N4U3Jz1Op/YWfqIBjc+ctph+dupPvdgJpLCx6aarkRKzPdFjk2htQFO+ VYJQ==; darn=lists.xenproject.org
  • Arc-seal: i=1; a=rsa-sha256; t=1780997587; cv=none; d=google.com; s=arc-20240605; b=N9j7MH/eAkcmHuJyK4Hs/wZ9XtkyaRBrRQA884tGHgHX+RqIrzT2JHkeH+qur2ZbaF LdX1oxBjKghdnZP70txv0QhM64wwPhvK/4IRsJYvaVmGOTtgYd7gG9ecSnLtQZ6bG/wS HDKfSvIppkhpkPddTI8kHwIhU1cGByLabJkY6gOIN4P7qhKNKHdHwm4uneQ26x8wsvbC qIsjEn+OqFcKOUjy5XD3Pm1UEwUC8pOFNgtMYveu9Zklo3scWHd7mTJ891m9nkR1lBfc NkNexzvRA+j3rR6UJ/1Z7O6N6b/mm6rjZtuZVn9jh8KB2i0VxigNNDnLDRnUQJ1ndQkA ARdw==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=20251104 header.d=gmail.com header.i="@gmail.com" header.h="Content-Transfer-Encoding:Cc:To:Subject:Message-ID:Date:From:In-Reply-To:References:MIME-Version"
  • Cc: xen-devel@xxxxxxxxxxxxxxxxxxxx, Edwin Török <edwin.torok@xxxxxxxxxx>, Jan Beulich <jbeulich@xxxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>, Teddy Astie <teddy.astie@xxxxxxxxxx>, Anthony PERARD <anthony.perard@xxxxxxxxxx>, Juergen Gross <jgross@xxxxxxxx>, Frediano Ziglio <frediano.ziglio@xxxxxxxxxx>
  • Delivery-date: Tue, 09 Jun 2026 09:33:26 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On Mon, 8 Jun 2026 at 16:37, Andrew Cooper <andrew.cooper3@xxxxxxxxxx> wrote:
>
> On 03/06/2026 2:05 pm, Frediano Ziglio wrote:
> > From: Edwin Török <edwin.torok@xxxxxxxxxx>
> >
> > Allocate these array just once at the start of migration,
> > using the maximum batch size, and free them at the end.
> >
> > Signed-off-by: Edwin Török <edwin.torok@xxxxxxxxxx>
> > Signed-off-by: Frediano Ziglio <frediano.ziglio@xxxxxxxxxx>
> > --
> > Changes since v2:
> > - change prefix in subject.
> >
> > Changes since v3:
> > - fix comment style
>
> These are intentionally freed/reallocated so valgrind can find overflows.
>
> ~Andrew

I understand the value of checking for possible overflow. But this
should not make the programs less efficient.

What about something like this (not tested, just to get the gist):

#if CONFIG_DEBUG && valgrind && whatever
#define MEM_NOACCESS_BUFFER(name, size) uint8_t name[size];
#define MEM_NOACCESS_INIT(field) VALGRIND_MAKE_MEM_NOACCESS(field,
sizeof(field))
#define MEM_UNDEFINED_INIT(field) VALGRIND_MAKE_MEM_UNDEFINED(field,
sizeof(field))
#else
#define MEM_NOACCESS_BUFFER(name, size)
#define MEM_NOACCESS_INIT(field) do {} while(0)
#define MEM_UNDEFINED_INIT(field) do {} while(0)
#endif
...

struct xc_sr_context_save_buffers
{
    MEM_NOACCESS_BUFFER(na0, 16)
    xen_pfn_t batch_pfns[MAX_BATCH_SIZE];
    MEM_NOACCESS_BUFFER(na1, 16)
    xen_pfn_t mfns[MAX_BATCH_SIZE];
    MEM_NOACCESS_BUFFER(na2, 16)
    xen_pfn_t types[MAX_BATCH_SIZE];
    MEM_NOACCESS_BUFFER(na3, 16)
    void *local_pages[MAX_BATCH_SIZE];
    MEM_NOACCESS_BUFFER(na4, 16)
    struct iovec iov[MAX_BATCH_SIZE + 2]; /* Headers + data. */
    MEM_NOACCESS_BUFFER(na5, 16)
    uint64_t rec_pfns[MAX_BATCH_SIZE];
    MEM_NOACCESS_BUFFER(na6, 16)
};
...

    ctx->save.buffers = calloc(1, sizeof(*ctx->save.buffers));

    if ( !dirty_bitmap || !ctx->save.deferred_pages ||
!ctx->save.buffers || !dest_buf )
    {
        ERROR("Unable to allocate memory for dirty bitmaps, deferred pages"
              " and various batch buffers");
        rc = -1;
        errno = ENOMEM;
        goto err;
    }
    ctx->save.batch_pfns = ctx->save.buffers->batch_pfns;
    MEM_NOACCESS_INIT(ctx->save.buffers->na0);
    MEM_NOACCESS_INIT(ctx->save.buffers->na1);
    MEM_NOACCESS_INIT(ctx->save.buffers->na2);
    MEM_NOACCESS_INIT(ctx->save.buffers->na3);
    MEM_NOACCESS_INIT(ctx->save.buffers->na4);
    MEM_NOACCESS_INIT(ctx->save.buffers->na5);
    MEM_NOACCESS_INIT(ctx->save.buffers->na6);
...

    /* Mfns of the batch pfns. */
    MEM_UNDEFINED_INIT(ctx->save.buffers->mfns);
    mfns = ctx->save.buffers->mfns;
    /* Types of the batch pfns. */
    MEM_UNDEFINED_INIT(ctx->save.buffers->types);
    types = ctx->save.buffers->types;
    /* Pointers to locally allocated pages.  Need freeing. */
    MEM_UNDEFINED_INIT(ctx->save.buffers->local_pages);
    local_pages = ctx->save.buffers->local_pages;
    memset(local_pages, 0, sizeof(*local_pages) * nr_pfns);
...

Frediano



 


Rackspace

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