From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: "Philippe Mathieu-Daudé" <philmd@redhat.com>
Cc: Kevin Wolf <kwolf@redhat.com>,
qemu-block@nongnu.org, John Snow <jsnow@redhat.com>,
qemu-devel@nongnu.org, Max Reitz <mreitz@redhat.com>,
Alistair Francis <alistair.francis@wdc.com>,
Laszlo Ersek <lersek@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v3 2/9] hw/block/pflash_cfi01: Use the correct READ_ARRAY value
Date: Tue, 9 Jul 2019 18:10:02 +0100 [thread overview]
Message-ID: <20190709171002.GJ2725@work-vm> (raw)
In-Reply-To: <dd8dd585-9774-78d4-17ee-89b30c81a0c4@redhat.com>
* Philippe Mathieu-Daudé (philmd@redhat.com) wrote:
> Hi David,
>
> On 7/9/19 12:30 PM, Dr. David Alan Gilbert wrote:
> > * Philippe Mathieu-Daudé (philmd@redhat.com) wrote:
> >> In the "Read Array Flowchart" the command has a value of 0xFF.
> >>
> >> In the document [*] the "Read Array Flowchart", the READ_ARRAY
> >> command has a value of 0xff.
> >>
> >> Use the correct value in the pflash model.
> >>
> >> There is no change of behavior in the guest, because:
> >> - when the guest were sending 0xFF, the reset_flash label
> >> was setting the command value as 0x00
> >> - 0x00 was used internally for READ_ARRAY
> >>
> >> To keep migration behaving correctly, we have to increase
> >> the VMState version. When migrating from an older version,
> >> we use the correct command value.
> >
> > The problem is that incrementing the version will break backwards
> > compatibility; so you won't be able to migrate this back to an older
> > QEMU version; so for example a q35/uefi with this won't be able
> > to migrate backwards to a 4.0.0 or older qemu.
> >
> > So instead of bumping the version_id you probably need to wire
> > the behaviour to a machine type and then on your new type
> > wire a subsection containing a flag; the reception of that subsection
> > tells you to use the new/correct semantics.
>
> I'm starting to understand VMState subsections, but it might be overkill
> for this change...
>
> Subsections
> -----------
>
> The most common structure change is adding new data, e.g. when adding
> a newer form of device, or adding that state that you previously
> forgot to migrate. This is best solved using a subsection.
>
> This is not the case here, the field is already present and migrated.
>
> It seems I can use a simple pre_save hook, always migrating the
> READ_ARRAY using the incorrect value:
>
> -- >8 --
> --- a/hw/block/pflash_cfi01.c
> +++ b/hw/block/pflash_cfi01.c
> @@ -97,12 +97,29 @@ struct PFlashCFI01 {
> bool incorrect_read_array_command;
> };
>
> +static int pflash_pre_save(void *opaque)
> +{
> + PFlashCFI01 *s = opaque;
> +
> + /*
> + * Previous to QEMU v4.1 an incorrect value of 0x00 was used for the
> + * READ_ARRAY command. To preserve migrating to these older version,
> + * always migrate the READ_ARRAY command as 0x00.
> + */
> + if (s->cmd == 0xff) {
> + s->cmd = 0x00;
> + }
> +
> + return 0;
> +}
Be careful what happens if migration fails and you continue on the
source - is that OK - or are you going to have to flip that back somehow
(in a post_save).
Another way to do the same is to have a dummy field; tmp_cmd, and the
tmp_cmd is the thing that's actually migrated and filled by pre_save
(or use VMSTATE_WITH_TMP )
> static int pflash_post_load(void *opaque, int version_id);
>
> static const VMStateDescription vmstate_pflash = {
> .name = "pflash_cfi01",
> .version_id = 1,
> .minimum_version_id = 1,
> + .pre_save = pflash_pre_save,
> .post_load = pflash_post_load,
> .fields = (VMStateField[]) {
> VMSTATE_UINT8(wcycle, PFlashCFI01),
> @@ -1001,5 +1018,14 @@ static int pflash_post_load(void *opaque, int
> version_id)
> pfl->vmstate = qemu_add_vm_change_state_handler(postload_update_cb,
> pfl);
> }
> +
> + /*
> + * Previous to QEMU v4.1 an incorrect value of 0x00 was used for the
> + * READ_ARRAY command.
> + */
> + if (pfl->cmd == 0x00) {
> + pfl->cmd = 0xff;
> + }
> +
> return 0;
> }
> ---
>
> Being simpler and less intrusive (no new property in hw/core/machine.c),
> is this acceptable?
From the migration point of view yes; I don't know enough about pflash
to say if it makes sense; for example could there ever be a 00 command
really used and then you'd have to distinguish that somehow?
> Thanks,
>
> Phil.
>
> [...]
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
next prev parent reply other threads:[~2019-07-09 17:17 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-07-05 15:46 [Qemu-devel] [PATCH v3 0/9] hw/block/pflash_cfi01: Add DeviceReset() handler Philippe Mathieu-Daudé
2019-07-05 15:46 ` [Qemu-devel] [PATCH v3 1/9] hw/block/pflash_cfi01: Removed an unused timer Philippe Mathieu-Daudé
2019-07-05 15:46 ` [Qemu-devel] [PATCH v3 2/9] hw/block/pflash_cfi01: Use the correct READ_ARRAY value Philippe Mathieu-Daudé
2019-07-05 16:46 ` Laszlo Ersek
2019-07-09 10:30 ` Dr. David Alan Gilbert
2019-07-09 13:22 ` Philippe Mathieu-Daudé
2019-07-09 17:10 ` Dr. David Alan Gilbert [this message]
2019-07-09 18:36 ` Philippe Mathieu-Daudé
2019-07-05 15:46 ` [Qemu-devel] [PATCH v3 3/9] hw/block/pflash_cfi01: Extract pflash_mode_read_array() Philippe Mathieu-Daudé
2019-07-05 15:46 ` [Qemu-devel] [PATCH v3 4/9] hw/block/pflash_cfi01: Start state machine as READY to accept commands Philippe Mathieu-Daudé
2019-07-05 15:46 ` [Qemu-devel] [PATCH v3 5/9] hw/block/pflash_cfi01: Add the DeviceReset() handler Philippe Mathieu-Daudé
2019-07-08 20:50 ` Alistair Francis
2019-07-05 15:46 ` [Qemu-devel] [PATCH v3 6/9] hw/block/pflash_cfi01: Simplify CFI_QUERY processing Philippe Mathieu-Daudé
2019-07-05 15:46 ` [Qemu-devel] [PATCH v3 7/9] hw/block/pflash_cfi01: Improve command comments Philippe Mathieu-Daudé
2019-07-05 15:46 ` [Qemu-devel] [PATCH v3 8/9] hw/block/pflash_cfi01: Replace DPRINTF by qemu_log_mask(GUEST_ERROR) Philippe Mathieu-Daudé
2019-07-05 15:46 ` [Qemu-devel] [PATCH v3 9/9] hw/block/pflash_cfi01: Hold the PRI table offset in a variable 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=20190709171002.GJ2725@work-vm \
--to=dgilbert@redhat.com \
--cc=alistair.francis@wdc.com \
--cc=jsnow@redhat.com \
--cc=kwolf@redhat.com \
--cc=lersek@redhat.com \
--cc=mreitz@redhat.com \
--cc=philmd@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/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.