[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v7 1/8] Introduce yank feature
From: |
Markus Armbruster |
Subject: |
Re: [PATCH v7 1/8] Introduce yank feature |
Date: |
Mon, 31 Aug 2020 09:47:33 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/27.1 (gnu/linux) |
Lukas Straub <lukasstraub2@web.de> writes:
> On Thu, 27 Aug 2020 14:37:00 +0200
> Markus Armbruster <armbru@redhat.com> wrote:
>
>> I apologize for not reviewing this much earlier.
>>
>> Lukas Straub <lukasstraub2@web.de> writes:
>>
>> > The yank feature allows to recover from hanging qemu by "yanking"
>> > at various parts. Other qemu systems can register themselves and
>> > multiple yank functions. Then all yank functions for selected
>> > instances can be called by the 'yank' out-of-band qmp command.
>> > Available instances can be queried by a 'query-yank' oob command.
>> >
>> > Signed-off-by: Lukas Straub <lukasstraub2@web.de>
>> > Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
[...]
>> > diff --git a/qapi/misc.json b/qapi/misc.json
>> > index 9d32820dc1..0d6a8f20b7 100644
>> > --- a/qapi/misc.json
>> > +++ b/qapi/misc.json
>> > @@ -1615,3 +1615,48 @@
>> > ##
>> > { 'command': 'query-vm-generation-id', 'returns': 'GuidInfo' }
>> >
>> > +##
>> > +# @YankInstances:
>> > +#
>> > +# @instances: List of yank instances.
>> > +#
>> > +# Yank instances are named after the following schema:
>> > +# "blockdev:<node-name>", "chardev:<chardev-name>" and "migration"
>> > +#
>> > +# Since: 5.1
>> > +##
>> > +{ 'struct': 'YankInstances', 'data': {'instances': ['str'] } }
>>
>> I'm afraid this is a problematic QMP interface.
>>
>> By making YankInstances a struct, you keep the door open to adding more
>> members, which is good.
>>
>> But by making its 'instances' member a ['str'], you close the door to
>> using anything but a single string for the individual instances. Not so
>> good.
>>
>> The single string encodes information which QMP client will need to
>> parse from the string. We frown on that in QMP. Use QAPI complex types
>> capabilities for structured data.
>>
>> Could you use something like this instead?
>>
>> { 'enum': 'YankInstanceType',
>> 'data': { 'block-node', 'chardev', 'migration' } }
>>
>> { 'struct': 'YankInstanceBlockNode',
>> 'data': { 'node-name': 'str' } }
>>
>> { 'struct': 'YankInstanceChardev',
>> 'data' { 'label': 'str' } }
>>
>> { 'union': 'YankInstance',
>> 'base': { 'type': 'YankInstanceType' },
>> 'discriminator': 'type',
>> 'data': {
>> 'block-node': 'YankInstanceBlockNode',
>> 'chardev': 'YankInstanceChardev' } }
>>
>> { 'command': 'yank',
>> 'data': { 'instances': ['YankInstance'] },
>> 'allow-oob': true }
>>
>> If you're confident nothing will ever be added to YankInstanceBlockNode
>> and YankInstanceChardev, you could use str instead.
>
> As Daniel said, this has already been discussed.
I'll look up that discussion.
[...]
>> The two QMP commands permit out-of-band execution ('allow-oob': true).
>> OOB is easy to get wrong, but I figure you have a legitimate use case.
>> Let's review the restrictions documented in
>> docs/devel/qapi-code-gen.txt:
>>
>> An OOB-capable command handler must satisfy the following conditions:
>>
>> - It terminates quickly.
>> - It does not invoke system calls that may block.
>> - It does not access guest RAM that may block when userfaultfd is
>> enabled for postcopy live migration.
>> - It takes only "fast" locks, i.e. all critical sections protected by
>> any lock it takes also satisfy the conditions for OOB command
>> handler code.
>>
>> Since the command handlers take &lock, the restrictions apply to the
>> other critical sections protected by &lock as well. I believe these are
>> all okay: they do nothing but allocate, initialize and free memory.
>>
>> The restrictions also apply to the YankFn callbacks, but you documented
>> that. Okay.
>>
>> The one such callback included in this patch is
>> yank_generic_iochannel(), which is a thin wrapper around
>> qio_channel_shutdown(), which in turn runs the io_shutdown method.
>> Thus, the restructions also apply to all the io_shutdown methods.
>> That's not documented.
>>
>> Daniel, should it be documented?
>>
> This is already done in patch 6.
Patch 6 adds "This function is thread-safe" to its contract. The
restrictions on OOB-capable handler code are much more severe than
ordinary thread safety. For instance, blocking system calls outside
critical sections are thread safe, but not permitted in OOB-capable
handler code. The contract needs to be more specific.
> Thank you for you review.
Better late than never... you're welcome!
- [PATCH v7 0/8] Introduce 'yank' oob qmp command to recover from hanging qemu, Lukas Straub, 2020/08/04
- [PATCH v7 2/8] block/nbd.c: Add yank feature, Lukas Straub, 2020/08/04
- [PATCH v7 3/8] chardev/char-socket.c: Add yank feature, Lukas Straub, 2020/08/04
- [PATCH v7 4/8] migration: Add yank feature, Lukas Straub, 2020/08/04
- [PATCH v7 5/8] io/channel-tls.c: make qio_channel_tls_shutdown thread-safe, Lukas Straub, 2020/08/04
- [PATCH v7 6/8] io: Document thread-safety of qio_channel_shutdown, Lukas Straub, 2020/08/04
- [PATCH v7 7/8] MAINTAINERS: Add myself as maintainer for yank feature, Lukas Straub, 2020/08/04
- [PATCH v7 8/8] tests/test-char.c: Wait for the chardev to connect in char_socket_client_dupid_test, Lukas Straub, 2020/08/04