All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Alex Bennée" <alex.bennee@linaro.org>
To: "Emilio G. Cota" <cota@braap.org>
Cc: fam@euphon.net, Peter Maydell <peter.maydell@linaro.org>,
	berrange@redhat.com, robert.foley@linaro.org,
	Richard Henderson <richard.henderson@linaro.org>,
	qemu-devel@nongnu.org, robhenry@microsoft.com, f4bug@amsat.org,
	aaron@os.amperecomputing.com, Paolo Bonzini <pbonzini@redhat.com>,
	kuhn.chenqun@huawei.com, peter.puhov@linaro.org,
	Eduardo Habkost <ehabkost@redhat.com>,
	aurelien@aurel32.net, Richard Henderson <rth@twiddle.net>
Subject: Re: [PATCH v1 04/13] cputlb: ensure we save the IOTLB data in case of reset
Date: Sun, 12 Jul 2020 10:58:29 +0100	[thread overview]
Message-ID: <87imetqcl6.fsf@linaro.org> (raw)
In-Reply-To: <20200711213039.GD807960@sff>


Emilio G. Cota <cota@braap.org> writes:

> On Fri, Jul 10, 2020 at 14:03:27 -0700, Richard Henderson wrote:
>> On 7/9/20 7:13 AM, Alex Bennée wrote:
>> > Any write to a device might cause a re-arrangement of memory
>> > triggering a TLB flush and potential re-size of the TLB invalidating
>> > previous entries. This would cause users of qemu_plugin_get_hwaddr()
>> > to see the warning:
>> > 
>> >   invalid use of qemu_plugin_get_hwaddr
>> > 
>> > because of the failed tlb_lookup which should always succeed. To
>> > prevent this we save the IOTLB data in case it is later needed by a
>> > plugin doing a lookup.
>> > 
>> > Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
>> > 
>> > ---
>> > v2
>> >   - save the entry instead of re-running the tlb_fill.
>> > v3
>> >   - don't abuse TLS, use CPUState to store data
>> >   - just use g_free_rcu() to avoid ugliness
>> >   - verify addr matches before returning data
>> >   - ws fix
>> > ---
>> >  include/hw/core/cpu.h   |  4 +++
>> >  include/qemu/typedefs.h |  1 +
>> >  accel/tcg/cputlb.c      | 57 +++++++++++++++++++++++++++++++++++++++--
>> >  3 files changed, 60 insertions(+), 2 deletions(-)
>> > 
>> > diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
>> > index b3f4b7931823..bedbf098dc57 100644
>> > --- a/include/hw/core/cpu.h
>> > +++ b/include/hw/core/cpu.h
>> > @@ -417,7 +417,11 @@ struct CPUState {
>> >  
>> >      DECLARE_BITMAP(plugin_mask, QEMU_PLUGIN_EV_MAX);
>> >  
>> > +#ifdef CONFIG_PLUGIN
>> >      GArray *plugin_mem_cbs;
>> > +    /* saved iotlb data from io_writex */
>> > +    SavedIOTLB *saved_iotlb;
>> > +#endif
>> >  
>> >      /* TODO Move common fields from CPUArchState here. */
>> >      int cpu_index;
>> > diff --git a/include/qemu/typedefs.h b/include/qemu/typedefs.h
>> > index 15f5047bf1dc..427027a9707a 100644
>> > --- a/include/qemu/typedefs.h
>> > +++ b/include/qemu/typedefs.h
>> > @@ -116,6 +116,7 @@ typedef struct QObject QObject;
>> >  typedef struct QString QString;
>> >  typedef struct RAMBlock RAMBlock;
>> >  typedef struct Range Range;
>> > +typedef struct SavedIOTLB SavedIOTLB;
>> >  typedef struct SHPCDevice SHPCDevice;
>> >  typedef struct SSIBus SSIBus;
>> >  typedef struct VirtIODevice VirtIODevice;
>> > diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c
>> > index 1e815357c709..8636b66e036a 100644
>> > --- a/accel/tcg/cputlb.c
>> > +++ b/accel/tcg/cputlb.c
>> > @@ -1073,6 +1073,42 @@ static uint64_t io_readx(CPUArchState *env, CPUIOTLBEntry *iotlbentry,
>> >      return val;
>> >  }
>> >  
>> > +#ifdef CONFIG_PLUGIN
>> > +
>> > +typedef struct SavedIOTLB {
>> > +    struct rcu_head rcu;
>> > +    hwaddr addr;
>> > +    MemoryRegionSection *section;
>> > +    hwaddr mr_offset;
>> > +} SavedIOTLB;
>> > +
>> > +/*
>> > + * Save a potentially trashed IOTLB entry for later lookup by plugin.
>> > + *
>> > + * We also need to track the thread storage address because the RCU
>> > + * cleanup that runs when we leave the critical region (the current
>> > + * execution) is actually in a different thread.
>> > + */
>> > +static void save_iotlb_data(CPUState *cs, hwaddr addr, MemoryRegionSection *section, hwaddr mr_offset)
>> 
>> Overlong line.
>> 
>> > +{
>> > +    SavedIOTLB *old, *new = g_new(SavedIOTLB, 1);
>> > +    new->addr = addr;
>> > +    new->section = section;
>> > +    new->mr_offset = mr_offset;
>> > +    old = atomic_rcu_read(&cs->saved_iotlb);
>> > +    atomic_rcu_set(&cs->saved_iotlb, new);
>> > +    if (old) {
>> > +        g_free_rcu(old, rcu);
>> > +    }
>> > +}
>> 
>> I'm a bit confused by this.  Why all the multiple allocation?  How many
>> consumers are you expecting, and more are you expecting multiple memory
>> operations in flight at once?
>> 
>> If multiple memory operations in flight, then why aren't we chaining them
>> together, so that you can search through multiple alternatives.
>> 
>> If only one memory operation in flight, why are you allocating memory at all,
>> much less managing it with rcu?  Just put one structure (or a collection of
>> fields) into CPUState and be done.
>
> Oh I just saw this reply. I subscribe all of the above, please shelve my R-b
> tag until these are resolved.

I was just conscious the data is not always valid - clearing it up with
RCU at least ensured it went away eventually. However we could certainly
just park it in the general CPUState and assert the match on the fall
through case of tlb_plugin_lookup.

My only worry is do we ever see us storing data that is valid but the
re-filled data in the real TLB could still match and be incorrect?

> An alternative is to emit the hwaddr directly in the mem_cb -- IIRC this is
> how I did it originally. The API is a larger/uglier (plugins can subscribe
> to either hwaddr or vaddr callbacks) but there is no state to keep and
> no overhead of calling several functions in a hot path.

I think that is certainly an option for evolving the API but I'd rather
just get this fix in for now while we ponder what else will be in v2 of
the API.

So far my proposal for qemu_plugin_hwaddr_device_name has some mild push
back from Peter which I'd like to resolve first:

  Date: Wed, 3 Jun 2020 16:48:33 +0100
  Message-ID: <CAFEAcA-kPZoumxfLgjxPfCPDmPgsAFCjB-zdicsiGeqSOPOH7Q@mail.gmail.com>

So far I've been adding stuff to solve any particular problems I've had
and I'd like to see what other API/hooks are being proposed so we don't
have browser style version ticks ;-)

>
> Thanks,
> 		E.


-- 
Alex Bennée


  reply	other threads:[~2020-07-12  9:59 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-09 14:13 [PATCH v1 00/13] misc rc0 fixes (docs, plugins, docker) Alex Bennée
2020-07-09 14:13 ` [PATCH v1 01/13] docs/devel: convert and update MTTCG design document Alex Bennée
2020-07-11 20:38   ` Emilio G. Cota
2020-07-09 14:13 ` [PATCH v1 02/13] docs/devel: add some notes on tcg-icount for developers Alex Bennée
2020-07-11 20:41   ` Emilio G. Cota
2020-07-09 14:13 ` [PATCH v1 03/13] docs: Add to gdbstub documentation the PhyMemMode Alex Bennée
2020-07-09 14:40   ` Philippe Mathieu-Daudé
2020-07-09 14:13 ` [PATCH v1 04/13] cputlb: ensure we save the IOTLB data in case of reset Alex Bennée
2020-07-10 21:03   ` Richard Henderson
2020-07-11 21:30     ` Emilio G. Cota
2020-07-12  9:58       ` Alex Bennée [this message]
2020-07-11 21:10   ` Emilio G. Cota
2020-07-09 14:13 ` [PATCH v1 05/13] hw/virtio/pci: include vdev name in registered PCI sections Alex Bennée
2020-07-27 13:32   ` Michael S. Tsirkin
2020-07-27 16:22     ` Alex Bennée
2020-07-09 14:13 ` [PATCH v1 06/13] plugins: add API to return a name for a IO device Alex Bennée
2020-07-09 15:03   ` Philippe Mathieu-Daudé
2020-07-09 16:30     ` Alex Bennée
2020-07-09 14:13 ` [PATCH v1 07/13] plugins: new hwprofile plugin Alex Bennée
2020-07-09 14:13 ` [PATCH v1 08/13] plugins: expand the bb plugin to be thread safe and track per-cpu Alex Bennée
2020-07-09 17:12   ` Robert Foley
2020-07-11 21:56   ` Emilio G. Cota
2020-07-12  9:48     ` Alex Bennée
2020-07-09 14:13 ` [PATCH v1 09/13] target/sh4: revert to using cpu_lduw_code to decode gusa Alex Bennée
2020-07-09 14:42   ` Philippe Mathieu-Daudé
2020-07-10 21:26   ` Richard Henderson
2020-07-09 14:13 ` [PATCH v1 10/13] tests/plugins: add -Wno-unknown-warning-option to handle -Wpsabi Alex Bennée
2020-07-09 17:27   ` Robert Foley
2020-07-10 21:29   ` Richard Henderson
2020-07-13 16:39     ` Alex Bennée
2020-07-13 18:27       ` Thomas Huth
2020-07-13 19:34         ` Alex Bennée
2020-07-09 14:13 ` [PATCH v1 11/13] tests/docker: fall back more gracefully when pull fails Alex Bennée
2020-07-09 14:46   ` Philippe Mathieu-Daudé
2020-07-09 14:13 ` [PATCH v1 12/13] tests/docker: update toolchain set in debian-xtensa-cross Alex Bennée
2020-07-09 14:54   ` Philippe Mathieu-Daudé
2020-07-09 14:13 ` [PATCH v1 13/13] configure: remove all dependencies on a (re)configure Alex Bennée

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87imetqcl6.fsf@linaro.org \
    --to=alex.bennee@linaro.org \
    --cc=aaron@os.amperecomputing.com \
    --cc=aurelien@aurel32.net \
    --cc=berrange@redhat.com \
    --cc=cota@braap.org \
    --cc=ehabkost@redhat.com \
    --cc=f4bug@amsat.org \
    --cc=fam@euphon.net \
    --cc=kuhn.chenqun@huawei.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=peter.puhov@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.org \
    --cc=robert.foley@linaro.org \
    --cc=robhenry@microsoft.com \
    --cc=rth@twiddle.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.