From: Yang Hongyang <yanghy@cn.fujitsu.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: thuth@redhat.com, zhang.zhanghailiang@huawei.com,
lizhijian@cn.fujitsu.com, jasowang@redhat.com,
qemu-devel@nongnu.org, stefanha@redhat.com,
Paolo Bonzini <pbonzini@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v11 01/12] qmp: delete qemu opts when delete an object
Date: Fri, 25 Sep 2015 09:12:16 +0800 [thread overview]
Message-ID: <56049F70.20402@cn.fujitsu.com> (raw)
In-Reply-To: <878u7wnj56.fsf@blackfin.pond.sub.org>
On 09/24/2015 07:36 PM, Markus Armbruster wrote:
> Yang Hongyang <yanghy@cn.fujitsu.com> writes:
>
>> On 09/24/2015 05:42 PM, Markus Armbruster wrote:
>>> Yang Hongyang <yanghy@cn.fujitsu.com> writes:
>>>
>>>> On 09/24/2015 03:43 PM, Markus Armbruster wrote:
>>>>> This has finally reached the front of my review queue. I apologize for
>>>>> the loooong delay.
>>>>>
>>>>> Copying Paolo for another pair of eyeballs (he wrote this code).
>>>>>
>>>> [...]
>>>>>> +
>>>>>> + opts = qemu_opts_find(qemu_find_opts_err("object", NULL), id);
>>>>>> + qemu_opts_del(opts);
>>>>>
>>>>> qemu_find_opts_err("object", &error_abort) please, because when it
>>>>> fails, we want to die right away, not when the null pointer it returns
>>>>> gets dereferenced.
>>>>
>>>> Thanks for the review.
>>>> Jason, do you want me to propose a fix on top of this series or simply drop
>>>> this for now because this patch is an independent bug fix and won't
>>>> affect the
>>>> other filter patch series.
>>>>
>>>>>
>>>>> Same sloppiness in netdev_del_completion() and qmp_netdev_del(), not
>>>>> your patch's fault.
>>>>>
>>>>> Elsewhere, we store the QemuOpts in the object just so we can delete it:
>>>>> DeviceState, DriveInfo. Paolo, what do you think?
>>>>
>>>> I don't get it. Currently, only objects created at the beginning through
>>>> QEMU command line will be stored in the QemuOpts, objects that created
>>>> with object_add won't stored in QemuOpts. Do you mean for DeviceState,
>>>> DriveInfo they store there QemuOpts explicity so that they can delete it?
>>>> Why don't we just delete it from objects directly instead?
>>>
>>> Let me elaborate.
>>>
>>> We have the same pattern in multiple places: some kind of object gets
>>> configured via QemuOpts, and an object's QemuOpts need to stay around
>>> until the object dies.
>>>
>>> Example 1: Block device backends
>>>
>>> DriveInfo has a member opts.
>>>
>>> drive_new() stores the QemuOpts in dinfo->opts.
>>>
>>> drive_info_del() destroys dinfo->opts.
>>>
>>> Note: DriveInfo member opts is always non-null. But not every
>>> BlockBackend has a DriveInfo.
>>>
>>> Example 2: Device frontends
>>>
>>> DeviceState has a member opts.
>>>
>>> qdev_device_add() stores the QemuOpts in dev->opts.
>>>
>>> device_finalize() destroys dev->opts.
>>>
>>> Note: DeviceState member opts may be null (not every device is
>>> created by qdev_device_add()). Fine, because qemu_opts_del(NULL) is
>>> a no-op.
>>>
>>> Example 3: Character device backends
>>>
>>> CharDriverState has a member opts.
>>>
>>> qemu_chr_new_from_opts() stores the QemuOpts in chr->opts.
>>>
>>> qemu_chr_delete() destroys chr->opts.
>>>
>>> Example 4: Network device backends
>>>
>>> Two cases
>>>
>>> A. netdev
>>>
>>> qmp_netdev_add() does not store the QemuOpts.
>>
>> The QemuOpts stored by qmp_netdev_add() and also hmp_netdev_add().
>> through this function:
>> net/net.c: qmp_netdev_add()
>> 1134 opts = qemu_opts_from_qdict(opts_list, qdict, &local_err);
>>
>> hmp.c: hmp_netdev_add()
>> 1579 opts = qemu_opts_from_qdict(qemu_find_opts("netdev"), qdict, &err);
>
> That's where the QemuOpts are created. By "does not store" I mean "does
> not store in its own state, unlike example 1-3".
Understand, thank you.
>
>>>
>>> qmp_netdev_del() still needs to destroy it. It has to find it
>>> somehow. Here's how it does it:
>>>
>>> opts = qemu_opts_find(qemu_find_opts_err("netdev", NULL), id);
>>> if (!opts) {
>>> error_setg(errp, "Device '%s' is not a netdev", id);
>>> return;
>>> }
>>>
>>> The !opts condition is a non-obvious way to test "not created
>>> with -netdev", see commit 645c949. Note that the commit's claim
>>> that qemu_opts_del(NULL) crashes is no longer true since commit
>>> 4782183.
>>>
>>> B. Legacy net
>>>
>>> hmp_host_net_add() does not store the QemuOpts.
>>>
>>> hmp_host_net_remove() still needs to destroy it. I can't see
>>> where that happens, and I'm not sure it does.
>>>
>>> Example 5: Generic object
>>>
>>> object_create() does not store the QemuOpts.
>>>
>>> It still needs to be destroyed along with the object. It isn't, and
>>> your patch fixes it.
>>>
>>> Personally, I find the technique in example 1-3 easier to understand
>>> than the one in example 4-5.
>>> .
>>>
> .
>
--
Thanks,
Yang.
next prev parent reply other threads:[~2015-09-25 1:12 UTC|newest]
Thread overview: 70+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-16 12:15 [Qemu-devel] [PATCH v11 00/12] Add a netfilter object and netbuffer filter Yang Hongyang
2015-09-16 12:15 ` [Qemu-devel] [PATCH v11 01/12] qmp: delete qemu opts when delete an object Yang Hongyang
2015-09-24 7:43 ` Markus Armbruster
2015-09-24 8:35 ` Yang Hongyang
2015-09-24 9:42 ` Markus Armbruster
2015-09-24 9:59 ` Yang Hongyang
2015-09-24 11:35 ` Markus Armbruster
2015-09-25 1:11 ` Yang Hongyang
2015-09-24 10:06 ` Yang Hongyang
2015-09-24 11:36 ` Markus Armbruster
2015-09-25 1:12 ` Yang Hongyang [this message]
2015-09-25 6:40 ` Jason Wang
2015-09-16 12:15 ` [Qemu-devel] [PATCH v11 02/12] init/cleanup of netfilter object Yang Hongyang
2015-09-16 21:09 ` Eric Blake
2015-09-17 1:23 ` Yang Hongyang
2015-09-17 16:09 ` Eric Blake
2015-09-18 1:14 ` Yang Hongyang
2015-09-24 8:41 ` Markus Armbruster
2015-09-24 8:47 ` Yang Hongyang
2015-09-24 11:40 ` Markus Armbruster
2015-09-25 1:13 ` Yang Hongyang
2015-09-24 8:57 ` Yang Hongyang
2015-09-24 11:52 ` Markus Armbruster
2015-09-25 6:45 ` Jason Wang
2015-09-25 14:10 ` Markus Armbruster
2015-09-28 5:47 ` Jason Wang
2015-09-28 5:53 ` Yang Hongyang
2015-09-16 12:15 ` [Qemu-devel] [PATCH v11 03/12] netfilter: hook packets before net queue send Yang Hongyang
2015-09-16 12:16 ` [Qemu-devel] [PATCH v11 04/12] net: merge qemu_deliver_packet and qemu_deliver_packet_iov Yang Hongyang
2015-09-22 7:30 ` Jason Wang
2015-09-22 7:44 ` Yang Hongyang
2015-09-22 8:14 ` Jason Wang
2015-09-22 8:21 ` Yang Hongyang
2015-09-22 9:19 ` Jason Wang
2015-09-22 9:26 ` Yang Hongyang
2015-09-22 9:42 ` Jason Wang
2015-09-16 12:16 ` [Qemu-devel] [PATCH v11 05/12] net/queue: introduce NetQueueDeliverFunc Yang Hongyang
2015-09-16 12:16 ` [Qemu-devel] [PATCH v11 06/12] netfilter: add an API to pass the packet to next filter Yang Hongyang
2015-09-16 12:16 ` [Qemu-devel] [PATCH v11 07/12] netfilter: print filter info associate with the netdev Yang Hongyang
2015-09-16 12:16 ` [Qemu-devel] [PATCH v11 08/12] net/queue: export qemu_net_queue_append_iov Yang Hongyang
2015-09-16 12:16 ` [Qemu-devel] [PATCH v11 09/12] netfilter: add a netbuffer filter Yang Hongyang
2015-09-24 9:12 ` Markus Armbruster
2015-09-25 7:18 ` Yang Hongyang
2015-09-25 8:18 ` Jason Wang
2015-09-25 15:13 ` Markus Armbruster
2015-09-25 15:07 ` Markus Armbruster
2015-09-28 6:12 ` Jason Wang
2015-09-28 7:38 ` Markus Armbruster
2015-09-28 6:42 ` Yang Hongyang
2015-09-25 8:03 ` Yang Hongyang
2015-09-25 8:18 ` Thomas Huth
2015-09-25 8:22 ` Yang Hongyang
2015-09-25 15:26 ` Markus Armbruster
2015-09-28 6:40 ` Yang Hongyang
2015-09-16 12:16 ` [Qemu-devel] [PATCH v11 10/12] tests: add test cases for netfilter object Yang Hongyang
2015-09-16 12:16 ` [Qemu-devel] [PATCH v11 11/12] netfilter/multiqueue: introduce netfilter name Yang Hongyang
2015-09-16 12:16 ` [Qemu-devel] [PATCH v11 12/12] netfilter: add multiqueue support Yang Hongyang
2015-09-22 7:36 ` Jason Wang
2015-09-22 7:49 ` Yang Hongyang
2015-09-22 8:31 ` Jason Wang
2015-09-22 8:35 ` Yang Hongyang
2015-09-22 9:19 ` Jason Wang
2015-09-22 8:07 ` Yang Hongyang
2015-09-22 8:32 ` Jason Wang
2015-09-22 8:43 ` Yang Hongyang
2015-09-22 9:30 ` Jason Wang
2015-09-22 9:47 ` Yang Hongyang
2015-09-22 7:39 ` [Qemu-devel] [PATCH v11 00/12] Add a netfilter object and netbuffer filter Jason Wang
2015-09-22 7:59 ` Yang Hongyang
2015-09-24 4:22 ` Jason Wang
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=56049F70.20402@cn.fujitsu.com \
--to=yanghy@cn.fujitsu.com \
--cc=armbru@redhat.com \
--cc=jasowang@redhat.com \
--cc=lizhijian@cn.fujitsu.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
--cc=thuth@redhat.com \
--cc=zhang.zhanghailiang@huawei.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.