All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Xu <peterx@redhat.com>
To: Jamin Lin <jamin_lin@aspeedtech.com>
Cc: "Cédric Le Goater" <clg@kaod.org>,
	"philmd@linaro.org" <philmd@linaro.org>,
	"Peter Maydell" <peter.maydell@linaro.org>,
	"Steven Lee" <steven_lee@aspeedtech.com>,
	"Troy Lee" <leetroy@gmail.com>,
	"Kane Chen" <kane_chen@aspeedtech.com>,
	"Andrew Jeffery" <andrew@codeconstruct.com.au>,
	"Joel Stanley" <joel@jms.id.au>,
	"open list:ASPEED BMCs" <qemu-arm@nongnu.org>,
	"open list:All patches CC here" <qemu-devel@nongnu.org>,
	"Troy Lee" <troy_lee@aspeedtech.com>,
	"flwu@google.com" <flwu@google.com>,
	"nabihestefan@google.com" <nabihestefan@google.com>,
	"Fabiano Rosas" <farosas@suse.de>
Subject: Re: [PATCH v3 06/17] hw/usb/hcd-ehci: Change descriptor addresses to 64-bit
Date: Wed, 22 Apr 2026 10:37:04 -0400	[thread overview]
Message-ID: <aejdEO2CXg-QuGcL@x1.local> (raw)
In-Reply-To: <TYPPR06MB82066A191FB2B0AD05F7C295FC2D2@TYPPR06MB8206.apcprd06.prod.outlook.com>

On Wed, Apr 22, 2026 at 09:21:55AM +0000, Jamin Lin wrote:
> Hi Peter, Cédric and Philippe
> 
> > Subject: Re: [PATCH v3 06/17] hw/usb/hcd-ehci: Change descriptor addresses to
> > 64-bit
> > 
> > On Mon, Apr 20, 2026 at 05:56:11AM +0000, Jamin Lin wrote:
> > > Hi Peter, Philippe, Cédric
> > 
> > Hi, Jamin,
> > 
> > [...]
> > 
> > > > > > @@ -2501,8 +2515,12 @@ const VMStateDescription vmstate_ehci = {
> > > > > >           /* schedule state */
> > > > > >           VMSTATE_UINT32(astate, EHCIState),
> > > > > >           VMSTATE_UINT32(pstate, EHCIState),
> > > > > > -        VMSTATE_UINT32(a_fetch_addr, EHCIState),
> > > > > > -        VMSTATE_UINT32(p_fetch_addr, EHCIState),
> > > > > > +        VMSTATE_UINT32_TEST(a_fetch_addr_pre_v3, EHCIState,
> > > > > > +                            ehci_core_is_before_version_3),
> > > > > > +        VMSTATE_UINT32_TEST(p_fetch_addr_pre_v3, EHCIState,
> > > > > > +                            ehci_core_is_before_version_3),
> > > > > > +        VMSTATE_UINT64_V(a_fetch_addr, EHCIState, 3),
> > > > > > +        VMSTATE_UINT64_V(p_fetch_addr, EHCIState, 3),
> > > >
> > > > TL;DR: I feel like we still need machine type compat properties.
> > > >
> > >
> > > I don't understand this: Could you please describe it in more detail?
> > 
> > See hw/core/machine.c and entries added into hw_compat_*[] arrays.  IIUC,
> > if this is an important device and if we want to guarantee bidirectional
> > migration (I'll explain later), then we should stick with machine compat
> > properties.
> > 
> > >
> > > > Details:
> > > >
> > > > When a v2 stream arrives, two _TEST()s will do the loading, then
> > > > post_load() extend it to 64bits, looks fine.
> > > >
> > > > When a v3 stream arrives, two _TEST()s got skipped then latter two take
> > effect.
> > > > post_load() skips.  Looks fine.
> > > >
> > > > When migrating to another QEMU, due to the fact saving vmstates
> > > > always take vmsd's version declared (3), I don't see how it can
> > > > migrate back to a v2 stream; it didn't know about v3.
> > > >
> > > > Jiamin, have you tested migrating from a new QEMU binary back to
> > > > another old one?  For upstream and serious devices, we need to
> > > > guarantee bi-directional migrations, back and forth.
> > > >
> > >
> > > Sorry, I am not familiar with the design of QEMU migration, and I don't know
> > how to test it.
> > > I added these hook functions based on Philippe's suggestion and review.
> > > Could you tell me how to test migration to ensure both version 3 and version
> > 2 are workable?
> > 
> > Since this patch already modified VMSDs, I believe migration test should have
> > been carried out at the very minimum..  Logically if vmsd versioning is used,
> > we should also have tested forward migrations, because that's only for that.
> > 
> > What I'm talking about is I think backward migration will fail.
> > 
> > Forward migration describes the case when a VM hosted by an old QEMU
> > binary (e.g. QEMU v10.2.0) is migrated to a new QEMU (e.g., after this patch
> > applied on top of master).
> > 
> > Backward migration describes the case when a VM hosted by a new QEMU
> > binary (e.g., after this patch applied on top of master) is migrated back to an
> > old QEMU binary (e.g. QEMU v10.2.0).
> > 
> > For different devices, we should allow different level of support on migration.
> > Any device that may be important to either upstream QEMU or downstreams
> > should better allow bi-directional migration.  In this case we need to use
> > machine compat properties I mentioned.  I'm not yet sure where EHCI
> > controller falls e.g. v.s. XHCI.. when not sure, we can also just stick with
> > machine compat properties to be on the safe side.
> > 
> > For more info, you can also refer to:
> > 
> > https://www.qemu.org/docs/master/devel/migration/compatibility.html
> > 
> > Thanks,
> > 
> > --
> > Peter Xu
> Thanks for your support and the detailed explanation.
> Following Cédric’s comments, I now understand how to properly test migration. With the changes below, both forward and backward migration tests pass.
> Could you please review these changes, or would you prefer that I resend them as v4?

Per what I read on Phil's reply on the cover letter, he prefers you to
resend anyway.  Better do it.  Comments inline.

> 
> Thanks again for your guidance and support.
> 
> Jamin
> 
> diff --git a/hw/usb/hcd-ehci.h b/hw/usb/hcd-ehci.h
> index 310183bbc4..bd165c793c 100644
> --- a/hw/usb/hcd-ehci.h
> +++ b/hw/usb/hcd-ehci.h
> @@ -264,6 +264,7 @@ struct EHCIState {
>      uint32_t maxframes;
>      bool caps_64bit_addr;
>      uint32_t ctrldssegment_default;
> +    bool migrate_fetch_addr_64bit;
>  
>      /*
>       *  EHCI spec version 1.0 Section 2.3
> @@ -321,7 +322,9 @@ struct EHCIState {
>      DEFINE_PROP_UINT32("maxframes", _state, ehci.maxframes, 128), \
>      DEFINE_PROP_BOOL("caps-64bit-addr", _state, ehci.caps_64bit_addr, false), \
>      DEFINE_PROP_UINT32("ctrldssegment-default", _state, \
> -                       ehci.ctrldssegment_default, 0)
> +                       ehci.ctrldssegment_default, 0), \
> +    DEFINE_PROP_BOOL("x-migrate-fetch-addr-64bit", _state, \
> +                     ehci.migrate_fetch_addr_64bit, true)

The diff looks a bit weird; this chunk is not present in hw/usb/hcd-ehci.h
in master branch, but maybe this series touched it.. in that case it's
fine.

>  
>  extern const VMStateDescription vmstate_ehci;
>  
> diff --git a/hw/core/machine.c b/hw/core/machine.c
> index 0aa77a57e9..e77400c7ab 100644
> --- a/hw/core/machine.c
> +++ b/hw/core/machine.c
> @@ -41,6 +41,8 @@
>  GlobalProperty hw_compat_10_2[] = {
>      { "scsi-block", "migrate-pr", "off" },
>      { "isa-cirrus-vga", "global-vmstate", "true" },
> +    { "sysbus-ehci-usb", "x-migrate-fetch-addr-64bit", "off" },
> +    { "pci-ehci-usb", "x-migrate-fetch-addr-64bit", "off" },

I'm still looking at master branch, vmstate_ehci is referenced in both
"ehci-sysbus" (vmstate_ehci_sysbus) and "ehci" (vmstate_ehci_pci).  Here
you used different names, I'm not sure if it's relevant to your other
patches, please double check.

Also if there're two drivers involved, IIUC we should need to add two bool
properties.. I only saw one above.  Again, not sure if it's relevant to
what your prior patch did, but please double check.

>  };
>  const size_t hw_compat_10_2_len = G_N_ELEMENTS(hw_compat_10_2);
>  
> diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c
> index 983b1731f9..87528ddc02 100644
> --- a/hw/usb/hcd-ehci.c
> +++ b/hw/usb/hcd-ehci.c
> @@ -2469,6 +2469,9 @@ static int usb_ehci_pre_save(void *opaque)
>      ehci->last_run_ns -= (ehci->frindex - new_frindex) * UFRAME_TIMER_NS;
>      ehci->frindex = new_frindex;
>  
> +    ehci->a_fetch_addr_pre_v3 = ehci->a_fetch_addr;
> +    ehci->p_fetch_addr_pre_v3 = ehci->p_fetch_addr;

This looks fine if you always prepare the 32bit versions of the addr, but
it can also be put under a "if (!ehci_fetch_addr_64_needed(...))".  Not a
big deal.

> +
>      return 0;
>  }
>  
> @@ -2489,10 +2492,8 @@ static int usb_ehci_post_load(void *opaque, int version_id)
>          }
>      }
>  
> -    if (version_id < 3) {
> -        s->a_fetch_addr = s->a_fetch_addr_pre_v3;
> -        s->p_fetch_addr = s->p_fetch_addr_pre_v3;
> -    }
> +    s->a_fetch_addr = s->a_fetch_addr_pre_v3;
> +    s->p_fetch_addr = s->p_fetch_addr_pre_v3;

This one looks risky, it will also run on new machine types, I think a "if
(!ehci_fetch_addr_64_needed(...))" is required here (unlike the pre_save),
otherwise I suspect you may overwrite the 64bits with 32bits after
migration.  It may explode when high 32bits have something nonzero?

>  
>      return 0;
>  }
> @@ -2523,14 +2524,29 @@ static void usb_ehci_vm_state_change(void *opaque, bool running, RunState state)
>      }
>  }
>  
> -static bool ehci_core_is_before_version_3(void *opaque, int version_id)
> +static bool ehci_fetch_addr_64_needed(void *opaque)
>  {
> -    return version_id < 3;
> +    EHCIState *s = opaque;
> +
> +    return s->migrate_fetch_addr_64bit;
>  }

Yes this is the traditional way.

>  
> +static const VMStateDescription vmstate_ehci_fetch_addr_64 = {
> +    .name = "ehci-core/fetch-addr64",
> +    .version_id = 1,
> +    .minimum_version_id = 1,
> +    .needed = ehci_fetch_addr_64_needed,
> +    .fields = (const VMStateField[]) {
> +        /* mmio registers */
> +        VMSTATE_UINT64(a_fetch_addr, EHCIState),
> +        VMSTATE_UINT64(p_fetch_addr, EHCIState),
> +        VMSTATE_END_OF_LIST()
> +    }
> +};
> +
>  const VMStateDescription vmstate_ehci = {
>      .name        = "ehci-core",
> -    .version_id  = 3,
> +    .version_id  = 2,
>      .minimum_version_id  = 1,
>      .pre_save    = usb_ehci_pre_save,
>      .post_load   = usb_ehci_post_load,
> @@ -2559,14 +2575,14 @@ const VMStateDescription vmstate_ehci = {
>          /* schedule state */
>          VMSTATE_UINT32(astate, EHCIState),
>          VMSTATE_UINT32(pstate, EHCIState),
> -        VMSTATE_UINT32_TEST(a_fetch_addr_pre_v3, EHCIState,
> -                            ehci_core_is_before_version_3),
> -        VMSTATE_UINT32_TEST(p_fetch_addr_pre_v3, EHCIState,
> -                            ehci_core_is_before_version_3),
> -        VMSTATE_UINT64_V(a_fetch_addr, EHCIState, 3),
> -        VMSTATE_UINT64_V(p_fetch_addr, EHCIState, 3),
> +        VMSTATE_UINT32(a_fetch_addr_pre_v3, EHCIState),
> +        VMSTATE_UINT32(p_fetch_addr_pre_v3, EHCIState),
>          VMSTATE_END_OF_LIST()
> -    }
> +    },
> +    .subsections = (const VMStateDescription * const []) {
> +        &vmstate_ehci_fetch_addr_64,

IMHO you don't need to make it a subsection, you can use
VMSTATE_UINT64_TEST().

Similarly you can also use VMSTATE_UINT32_TEST() to only migrate 32bit
versions in old machine types.

With those you can keep them together and add a comment, may look better
than subsections where you split them apart, it'll be harder to follow in
the future.

Thanks,

> +        NULL,
> +    },
>  };
>  
>  void usb_ehci_realize(EHCIState *s, DeviceState *dev, Error **errp)

-- 
Peter Xu



  reply	other threads:[~2026-04-22 14:37 UTC|newest]

Thread overview: 69+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-16  1:49 [PATCH v3 00/17] hw/usb/ehci: Add 64-bit descriptor addressing support Jamin Lin
2026-04-16  1:49 ` [PATCH v3 01/17] hw/usb/hcd-ehci: Remove unused EHCIfstn structure and dead code Jamin Lin
2026-04-16 12:09   ` BALATON Zoltan
2026-04-17  1:16     ` Jamin Lin
2026-04-17  2:25       ` Jamin Lin
2026-04-17  9:47         ` BALATON Zoltan
2026-04-20  3:46           ` Jamin Lin
2026-04-17  6:30   ` Cédric Le Goater
2026-04-16  1:49 ` [PATCH v3 02/17] hw/usb/hcd-ehci.h: Fix coding style issues reported by checkpatch Jamin Lin
2026-04-17  6:32   ` Philippe Mathieu-Daudé
2026-04-16  1:49 ` [PATCH v3 03/17] hw/usb/hcd-ehci.c: " Jamin Lin
2026-04-17  6:31   ` Cédric Le Goater
2026-04-17  6:32   ` Philippe Mathieu-Daudé
2026-04-16  1:49 ` [PATCH v3 04/17] hw/usb/hcd-ehci.c: Replace fprintf(stderr, ...) with qemu_log_mask(LOG_GUEST_ERROR) Jamin Lin
2026-04-17  6:31   ` Philippe Mathieu-Daudé
2026-04-17  8:41     ` Jamin Lin
2026-04-16  1:49 ` [PATCH v3 05/17] hw/usb/hcd-ehci: Replace DPRINTF debug logs with trace events Jamin Lin
2026-04-17  5:04   ` Philippe Mathieu-Daudé
2026-04-16  1:49 ` [PATCH v3 06/17] hw/usb/hcd-ehci: Change descriptor addresses to 64-bit Jamin Lin
2026-04-17  4:54   ` Philippe Mathieu-Daudé
2026-04-17  7:01   ` Cédric Le Goater
2026-04-17 15:10     ` Peter Xu
2026-04-20  5:56       ` Jamin Lin
2026-04-20 13:34         ` Peter Xu
2026-04-22  9:21           ` Jamin Lin
2026-04-22 14:37             ` Peter Xu [this message]
2026-04-23  1:48               ` Jamin Lin
2026-04-23 16:03                 ` Peter Xu
2026-04-20 16:04         ` Cédric Le Goater
2026-04-22  9:10           ` Jamin Lin
2026-04-16  1:49 ` [PATCH v3 07/17] hw/usb/hcd-ehci: Add property to advertise 64-bit addressing capability Jamin Lin
2026-04-17  4:55   ` Philippe Mathieu-Daudé
2026-04-16  1:49 ` [PATCH v3 08/17] hw/usb/hcd-ehci: Reject CTRLDSSEGMENT writes without 64-bit capability Jamin Lin
2026-04-17  6:33   ` Philippe Mathieu-Daudé
2026-04-17  8:07     ` Jamin Lin
2026-04-16  1:49 ` [PATCH v3 09/17] hw/usb/hcd-ehci: Implement 64-bit QH descriptor addressing Jamin Lin
2026-04-17  5:03   ` Philippe Mathieu-Daudé
2026-04-17  5:40     ` Jamin Lin
2026-04-17  6:14       ` Philippe Mathieu-Daudé
2026-04-17  7:02         ` Jamin Lin
2026-04-16  1:49 ` [PATCH v3 10/17] hw/usb/hcd-ehci: Implement 64-bit qTD " Jamin Lin
2026-04-17  6:14   ` Philippe Mathieu-Daudé
2026-04-16  1:49 ` [PATCH v3 11/17] hw/usb/hcd-ehci: Implement 64-bit iTD " Jamin Lin
2026-04-17  6:15   ` Philippe Mathieu-Daudé
2026-04-16  1:49 ` [PATCH v3 12/17] hw/usb/hcd-ehci: Implement 64-bit siTD " Jamin Lin
2026-04-17  6:27   ` Philippe Mathieu-Daudé
2026-04-17  7:44     ` Jamin Lin
2026-04-17  8:42       ` Philippe Mathieu-Daudé
2026-04-16  1:49 ` [PATCH v3 13/17] hw/usb/hcd-ehci: Add descriptor address offset property Jamin Lin
2026-04-17  6:23   ` Philippe Mathieu-Daudé
2026-04-22  5:00     ` Jamin Lin
2026-04-17  6:45   ` Cédric Le Goater
2026-04-17  7:08     ` Philippe Mathieu-Daudé
2026-04-20  5:47       ` Jamin Lin
2026-04-20  7:08         ` Cédric Le Goater
2026-04-22  6:58           ` Jamin Lin
2026-04-16  1:50 ` [PATCH v3 14/17] hw/arm/aspeed_ast27x0: Enable 64-bit EHCI DMA addressing Jamin Lin
2026-04-17  6:23   ` Philippe Mathieu-Daudé
2026-04-16  1:50 ` [PATCH v3 15/17] hw/arm/aspeed_ast27x0: Set EHCI descriptor address offset Jamin Lin
2026-04-17  6:25   ` Philippe Mathieu-Daudé
2026-04-22  5:03     ` Jamin Lin
2026-04-16  1:50 ` [PATCH v3 16/17] tests/functional/arm/test_aspeed_ast2600_sdk: Add USB EHCI test for AST2600 SDK Jamin Lin
2026-04-17  6:27   ` Philippe Mathieu-Daudé
2026-04-17  7:40     ` Jamin Lin
2026-04-17  8:44       ` Philippe Mathieu-Daudé
2026-04-17  8:50         ` Jamin Lin
2026-04-16  1:50 ` [PATCH v3 17/17] tests/functional/aarch64/test_aspeed_ast2700: Add USB EHCI test for AST2700 A1/A2 Jamin Lin
2026-04-17  6:27   ` Philippe Mathieu-Daudé
2026-04-17  6:35 ` [PATCH v3 00/17] hw/usb/ehci: Add 64-bit descriptor addressing support Philippe Mathieu-Daudé

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=aejdEO2CXg-QuGcL@x1.local \
    --to=peterx@redhat.com \
    --cc=andrew@codeconstruct.com.au \
    --cc=clg@kaod.org \
    --cc=farosas@suse.de \
    --cc=flwu@google.com \
    --cc=jamin_lin@aspeedtech.com \
    --cc=joel@jms.id.au \
    --cc=kane_chen@aspeedtech.com \
    --cc=leetroy@gmail.com \
    --cc=nabihestefan@google.com \
    --cc=peter.maydell@linaro.org \
    --cc=philmd@linaro.org \
    --cc=qemu-arm@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=steven_lee@aspeedtech.com \
    --cc=troy_lee@aspeedtech.com \
    /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.