All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Marc-André Lureau" <marcandre.lureau@gmail.com>
To: Eric Blake <eblake@redhat.com>
Cc: QEMU <qemu-devel@nongnu.org>, Paolo Bonzini <pbonzini@redhat.com>,
	Markus Armbruster <armbru@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v6 5/5] qobject: modify qobject_ref() to assert on NULL
Date: Thu, 19 Apr 2018 18:04:14 +0200	[thread overview]
Message-ID: <CAJ+F1C+F7+Ndgbb10oOdUNtg+v1Pxg79Lrn_1x27v5ARtLQw6w@mail.gmail.com> (raw)
In-Reply-To: <316596cd-46f1-4422-dbd3-8ca16b39b798@redhat.com>

Hi

On Thu, Apr 19, 2018 at 5:39 PM, Eric Blake <eblake@redhat.com> wrote:
> On 04/19/2018 10:01 AM, Marc-André Lureau wrote:
>> While it may be convenient to accept NULL value in
>> qobject_unref() (for similar reasons as free() accepts NULL), it is
>> not such a good idea for qobject_ref(): now assert() on NULL.
>>
>> Some places relied on that behaviour (the monitor request id for
>> example), and it's best to be explicit that NULL is accepted there.
>> We have to rely on testing, and manual inspection of qobject_ref()
>> usage:
>>
>
>> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
>> Reviewed-by: Eric Blake <eblake@redhat.com>
>
> Again, you've made a substantial change since v5 (more hunks added, and
> justification in the commit message that needs double-checking that your
> audit was sane), so I would have dropped R-b.

ok

>
>> ---
>>  include/qapi/qmp/qobject.h | 7 ++++---
>>  block.c                    | 9 +++++----
>>  block/blkdebug.c           | 3 ++-
>>  block/quorum.c             | 3 ++-
>>  monitor.c                  | 2 +-
>>  5 files changed, 14 insertions(+), 10 deletions(-)
>>
>
>> @@ -104,6 +103,7 @@ static inline void qobject_unref_impl(QObject *obj)
>>
>>  /**
>>   * qobject_ref(): Increment QObject's reference count
>> + * @obj: a #QObject or child type instance (must not be NULL)
>>   *
>>   * Returns: the same @obj. The type of @obj will be propagated to the
>>   * return type.
>> @@ -117,6 +117,7 @@ static inline void qobject_unref_impl(QObject *obj)
>>  /**
>>   * qobject_unref(): Decrement QObject's reference count, deallocate
>>   * when it reaches zero
>> + * @obj: a #QObject or children type instance (can be NULL)
>
> s/children/child/
>
>> +++ b/block.c
>> @@ -5110,8 +5110,9 @@ static bool append_open_options(QDict *d, BlockDriverState *bs)
>>      const char *p;
>>
>>      for (entry = qdict_first(bs->options); entry;
>> -         entry = qdict_next(bs->options, entry))
>> -    {
>> +         entry = qdict_next(bs->options, entry)) {
>> +        QObject *val;
>> +
>>          /* Exclude options for children */
>>          QLIST_FOREACH(child, &bs->children, next) {
>>              if (strstart(qdict_entry_key(entry), child->name, &p)
>> @@ -5134,8 +5135,8 @@ static bool append_open_options(QDict *d, BlockDriverState *bs)
>>              continue;
>>          }
>>
>> -        qdict_put_obj(d, qdict_entry_key(entry),
>> -                      qobject_ref(qdict_entry_value(entry)));
>> +        val = qdict_entry_value(entry);
>> +        qdict_put_obj(d, qdict_entry_key(entry), val ? qobject_ref(val) : NULL);
>
> I don't think we allow pushing NULL into qdict; we should probably beef
> up the testsuite and/or add asserts to qdict_put_obj(), at which point
> this hunk is spurious.
>
>> +++ b/block/blkdebug.c
>> @@ -845,7 +845,8 @@ static void blkdebug_refresh_filename(BlockDriverState *bs, QDict *options)
>>      opts = qdict_new();
>>      qdict_put_str(opts, "driver", "blkdebug");
>>
>> -    qdict_put(opts, "image", qobject_ref(bs->file->bs->full_open_options));
>> +    qdict_put(opts, "image", bs->file->bs->full_open_options ?
>> +              qobject_ref(bs->file->bs->full_open_options) : NULL);
>
> Likewise, this hunk is spurious if we can't push NULL into a QDict.
>
>> +++ b/block/quorum.c
>> @@ -1083,7 +1083,8 @@ static void quorum_refresh_filename(BlockDriverState *bs, QDict *options)
>>      children = qlist_new();
>>      for (i = 0; i < s->num_children; i++) {
>>          qlist_append(children,
>> -                     qobject_ref(s->children[i]->bs->full_open_options));
>> +                     s->children[i]->bs->full_open_options ?
>> +                     qobject_ref(s->children[i]->bs->full_open_options) : NULL);
>
> And again, but for QList.


Yes, for now I stayed on the safe side. Open-questions in the commit message.

-- 
Marc-André Lureau

  reply	other threads:[~2018-04-19 16:04 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-19 15:01 [Qemu-devel] [PATCH v6 0/5] Simplify qobject refcount Marc-André Lureau
2018-04-19 15:01 ` [Qemu-devel] [PATCH v6 1/5] qobject: ensure base is at offset 0 Marc-André Lureau
2018-04-19 15:20   ` Eric Blake
2018-04-19 15:23     ` Marc-André Lureau
2018-04-24 12:18       ` Markus Armbruster
2018-04-24 12:34         ` Peter Maydell
2018-04-24 15:24           ` Markus Armbruster
2018-04-26 14:50         ` Markus Armbruster
2018-04-27  8:14   ` Markus Armbruster
2018-04-19 15:01 ` [Qemu-devel] [PATCH v6 2/5] qobject: use a QObjectBase_ struct Marc-André Lureau
2018-04-27  8:24   ` Markus Armbruster
2018-04-27 15:29     ` Eric Blake
2018-04-19 15:01 ` [Qemu-devel] [PATCH v6 3/5] qobject: replace qobject_incref/QINCREF qobject_decref/QDECREF Marc-André Lureau
2018-04-19 15:27   ` Eric Blake
2018-04-27  8:59     ` Markus Armbruster
2018-04-19 15:01 ` [Qemu-devel] [PATCH v6 4/5] qobject: modify qobject_ref() to return obj Marc-André Lureau
2018-04-19 15:32   ` Eric Blake
2018-04-27 11:42     ` Markus Armbruster
2018-05-02 13:28       ` Eric Blake
2018-05-02 14:14         ` Markus Armbruster
2018-04-27  8:50   ` Markus Armbruster
2018-04-19 15:01 ` [Qemu-devel] [PATCH v6 5/5] qobject: modify qobject_ref() to assert on NULL Marc-André Lureau
2018-04-19 15:39   ` Eric Blake
2018-04-19 16:04     ` Marc-André Lureau [this message]
2018-04-19 15:45 ` [Qemu-devel] [PATCH v6 0/5] Simplify qobject refcount Eric Blake
2018-04-19 16:02   ` Marc-André Lureau
2018-05-02  8:31 ` Markus Armbruster

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=CAJ+F1C+F7+Ndgbb10oOdUNtg+v1Pxg79Lrn_1x27v5ARtLQw6w@mail.gmail.com \
    --to=marcandre.lureau@gmail.com \
    --cc=armbru@redhat.com \
    --cc=eblake@redhat.com \
    --cc=pbonzini@redhat.com \
    --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.