From: Gavin Shan <gshan@redhat.com>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: qemu-arm@nongnu.org, qemu-devel@nongnu.org, pbonzini@redhat.com,
peterx@redhat.com, david@redhat.com, philmd@linaro.org,
mst@redhat.com, cohuck@redhat.com, quintela@redhat.com,
dgilbert@redhat.com, maz@kernel.org, zhenyzha@redhat.com,
shan.gavin@gmail.com
Subject: Re: [PATCH v1 5/6] hw/arm/virt: Enable backup bitmap for dirty ring
Date: Wed, 22 Feb 2023 15:35:53 +1100 [thread overview]
Message-ID: <0db2764b-7d27-ee6a-c7e4-7d7821986c16@redhat.com> (raw)
In-Reply-To: <CAFEAcA_6pYvot1AGKfOQA89M9tdH-e6+9jkd3RtXJkGhSLdihA@mail.gmail.com>
On 2/22/23 3:27 AM, Peter Maydell wrote:
> On Mon, 13 Feb 2023 at 00:40, Gavin Shan <gshan@redhat.com> wrote:
>>
>> When KVM device "kvm-arm-gicv3" or "arm-its-kvm" is used, we have to
>> enable the backup bitmap for the dirty ring. Otherwise, the migration
>> will fail because those two devices are using the backup bitmap to track
>> dirty guest memory, corresponding to various hardware tables.
>>
>> Signed-off-by: Gavin Shan <gshan@redhat.com>
>> Reviewed-by: Juan Quintela <quintela@redhat.com>
>> ---
>> hw/arm/virt.c | 26 ++++++++++++++++++++++++++
>> target/arm/kvm64.c | 25 +++++++++++++++++++++++++
>> target/arm/kvm_arm.h | 12 ++++++++++++
>> 3 files changed, 63 insertions(+)
>>
>> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
>> index 75f28947de..ea9bd98a65 100644
>> --- a/hw/arm/virt.c
>> +++ b/hw/arm/virt.c
>> @@ -2024,6 +2024,8 @@ static void machvirt_init(MachineState *machine)
>> VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(machine);
>> MachineClass *mc = MACHINE_GET_CLASS(machine);
>> const CPUArchIdList *possible_cpus;
>> + const char *gictype = NULL;
>> + const char *itsclass = NULL;
>> MemoryRegion *sysmem = get_system_memory();
>> MemoryRegion *secure_sysmem = NULL;
>> MemoryRegion *tag_sysmem = NULL;
>> @@ -2071,6 +2073,30 @@ static void machvirt_init(MachineState *machine)
>> */
>> finalize_gic_version(vms);
>>
>> + /*
>> + * When "kvm-arm-gicv3" or "arm-its-kvm" is used, the backup dirty
>> + * bitmap has to be enabled for KVM dirty ring, before any memory
>> + * slot is added. Otherwise, the migration will fail with the dirty
>> + * ring.
>> + */
>> + if (kvm_enabled()) {
>> + if (vms->gic_version != VIRT_GIC_VERSION_2) {
>> + gictype = gicv3_class_name();
>> + }
>> +
>> + if (vms->gic_version != VIRT_GIC_VERSION_2 && vms->its) {
>> + itsclass = its_class_name();
>> + }
>> +
>> + if (((gictype && !strcmp(gictype, "kvm-arm-gicv3")) ||
>> + (itsclass && !strcmp(itsclass, "arm-its-kvm"))) &&
>> + !kvm_arm_enable_dirty_ring_with_bitmap()) {
>> + error_report("Failed to enable the backup bitmap for "
>> + "KVM dirty ring");
>> + exit(1);
>> + }
>> + }
>
> Why does this need to be board-specific code? Is there
> some way we can just do the right thing automatically?
> Why does the GIC/ITS matter?
>
> The kernel should already know whether we have asked it
> to do something that needs this extra extension, so
> I think we ought to be able in the generic "enable the
> dirty ring" code say "if the kernel says we need this
> extra thing, also enable this extra thing". Or if that's
> too early, we can do the extra part in a generic hook a
> bit later.
>
> In the future there might be other things, presumably,
> that need the backup bitmap, so it would be more future
> proof not to need to also change QEMU to add extra
> logic checks that duplicate the logic the kernel already has.
>
When the dirty ring is enabled, a per-vcpu buffer is used to track the dirty pages.
The prerequisite to use the per-vcpu buffer is existing running VCPU context. There
are two cases where no running VCPU context exists and the backup bitmap extension
is needed, as we know until now: (a) save/restore GICv3 tables; (b) save/restore ITS
tables; These two cases are related to KVM device "kvm-arm-gicv3" and "arm-its-kvm",
which are only needed by virt machine at present. So we needn't the backup bitmap
extension for other boards.
The host kernel always exports the capability KVM_CAP_DIRTY_LOG_RING_WITH_BITMAP
for ARM64. The capability isn't exported for x86 because we needn't it there. The
generic path to enable the extension would be in kvm_init(). I think the extension
is enabled unconditionally if it has been exported by host kernel. It means there
will be unnecessary overhead to synchronize the backup bitmap when the aforementioned
KVM devices aren't used, but the overhead should be very small and acceptable. The
only concern is host kernel has to allocate the backup bitmap, which is totally no
use. Please let me know your thoughts, Peter.
qemu_init
qemu_create_machine
:
:
configure_accelerators
do_configure_accelerator
accel_init_machine
kvm_init // Where the dirty ring is eanbled. Would be best
kvm_arch_init // place to enable the backup bitmap extension regardless
: // of 'kvm-arm-gicv3' and 'arm-its-kvm' are used
:
qmp_x_exit_preconfig
qemu_init_board
machine_run_board_init
machvirt_init // memory slots are added here and where we know the KVM devices
: // are used
:
accel_setup_post // no backend for KVM yet, xen only
Note that the capability KVM_CAP_DIRTY_LOG_RING_WITH_BITMAP can't be enabled if
the dirty ring isn't enabled or memory slots have been added.
Thanks,
Gavin
next prev parent reply other threads:[~2023-02-22 4:36 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-13 0:39 [PATCH v1 0/6] hw/arm/virt: Support dirty ring Gavin Shan
2023-02-13 0:39 ` [PATCH v1 1/6] linux-headers: Update for " Gavin Shan
2023-02-21 16:30 ` Peter Maydell
2023-02-21 23:18 ` Gavin Shan
2023-02-22 8:49 ` Cornelia Huck
2023-02-22 9:03 ` Gavin Shan
2023-02-13 0:39 ` [PATCH v1 2/6] migration: Add last stage indicator to global dirty log synchronization Gavin Shan
2023-02-21 17:36 ` Peter Xu
2023-02-21 23:20 ` Gavin Shan
2023-02-13 0:39 ` [PATCH v1 3/6] kvm: Synchronize the backup bitmap in the last stage Gavin Shan
2023-02-21 17:46 ` Peter Xu
2023-02-21 23:44 ` Gavin Shan
2023-02-21 23:58 ` Peter Xu
2023-02-22 6:06 ` Gavin Shan
2023-02-13 0:39 ` [PATCH v1 4/6] kvm: Add helper kvm_dirty_ring_init() Gavin Shan
2023-02-21 20:12 ` Peter Xu
2023-02-13 0:39 ` [PATCH v1 5/6] hw/arm/virt: Enable backup bitmap for dirty ring Gavin Shan
2023-02-21 16:27 ` Peter Maydell
2023-02-22 4:35 ` Gavin Shan [this message]
2023-02-22 15:54 ` Peter Maydell
2023-02-23 0:52 ` Gavin Shan
2023-02-23 11:51 ` Peter Maydell
2023-02-24 10:19 ` Gavin Shan
2023-02-13 0:39 ` [PATCH v1 6/6] kvm: Enable dirty ring for arm64 Gavin Shan
2023-02-17 1:59 ` [PATCH v1 0/6] hw/arm/virt: Support dirty ring Zhenyu Zhang
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=0db2764b-7d27-ee6a-c7e4-7d7821986c16@redhat.com \
--to=gshan@redhat.com \
--cc=cohuck@redhat.com \
--cc=david@redhat.com \
--cc=dgilbert@redhat.com \
--cc=maz@kernel.org \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=peterx@redhat.com \
--cc=philmd@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=shan.gavin@gmail.com \
--cc=zhenyzha@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).