All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Stefan Hajnoczi <stefanha@gmail.com>
Cc: Kevin Wolf <kwolf@redhat.com>, Fam Zheng <famz@redhat.com>,
	qemu-devel <qemu-devel@nongnu.org>,
	Stefan Hajnoczi <stefanha@redhat.com>,
	Michael Roth <mdroth@linux.vnet.ibm.com>
Subject: Re: [Qemu-devel] [PATCH v3 5/6] iothread: add "iothread" qdev property type
Date: Fri, 21 Feb 2014 14:01:03 +0100	[thread overview]
Message-ID: <53074E0F.1040006@redhat.com> (raw)
In-Reply-To: <CAJSP0QWCRBba2WT57mNgBuotb72j=A5tesuLSRKoQAxgK2J8Cg@mail.gmail.com>

Il 21/02/2014 13:45, Stefan Hajnoczi ha scritto:
>> This is okay; object_property_add_link reference count takes ownership of
>> the original value of the pointer.
>
> Here's an example:
>
> static void pxa2xx_pcmcia_initfn(Object *obj)
> int pxa2xx_pcmcia_attach(void *opaque, PCMCIACardState *card)
>
> On one hand "card" is a link.  On the other hand we manually assign to
> s->card without using object_property_set_link() and without
> object_ref(card).
>
> This is broken.

Actually, what you showed is fine---ugly, but fine.

It means is that pxa2xx_pcmcia_attach has taken ownership of a reference 
from its caller.  It is ugly because it violates abstraction.  And 
pxa2xx_pcmcia_detach leaks the object because it doesn't object_unref() 
the card.  But it is fine, and no one calls pxa2xx_pcmcia_detach anyway. ;)

> We're abusing the link property because the
> pxa2xx_pcmcia_attach() function is semantically different from
> object_property_set_link().  What's worse is that you can still call
> object_property_set_link() and it will not perform the extra steps
> that pxa2xx_pcmcia_attach() is taking to raise an IRQ and prevent
> attaching to an already attached slot.

*This* is broken, and is exactly why we need link setters.  Adding a 
link setter and using it in pxa2xx_pcmcia_attach/detach would fix all 
the problems here.

Of course, the question is how one would go testing this thing.

>> The real disaster is that links cannot be "locked" at realize time.  For
>> this to happen, links need to have a setter like object_property_add_str
>> (not sure if they need a getter).
>
> Yes, this would allow the weird pxa2xx example to behavior itself
> better because _attach() would become the set() callback function.

Exactly.

>>> The rng device examples don't seem to help because there is no way to
>>> specify the rng backend via a qdev property (we always create a default
>>> backend).  I need to be able to specify the object via a qdev property
>>> to the virtio-blk-pci device.
>>
>>
>> You can do that, see virtio-rng-pci.  It creates a link and forwards that to
>> virtio-rng.
>
> No, virtio-rng-pci has no rng qdev property.  The user cannot set it
> on the command-line:

Sure, it has no *qdev* property, but lo and behold:

     qemu-system-x86_64 \
         -object rng-random,filename=/dev/random,id=rng0 \
         -device virtio-rng-pci,rng=rng0

This is why I believe we want static properties in QOM by the way, not 
just in qdev.  So that this rng property can be documented and not just 
magic.

/me searches for an appropriate Star Wars quote

If once you start down the dark path, forever will it dominate your 
destiny; consume you, it will! As it did Obi-Wan's apprentice.

Paolo

ps: You're fulfilling your destiny, Anakin. Become my apprentice. Learn 
to use the Dark Side of the Force.


>>> Do I need to define a link<> qdev property:
>>> DEFINE_PROP_LINK("iothread", _state, _field.iothread, TYPE_IOTHREAD,
>>> IOThread *)
>>
>>
>> Perhaps, but to do that we need to first fix object_property_add_link.
>
> Okay, I'll start working on that and use "x-iothread" in the meantime
> for this series.
>
> Stefan
>

  reply	other threads:[~2014-02-21 13:01 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-20 12:50 [Qemu-devel] [PATCH v3 0/6] dataplane: switch to N:M devices-per-thread model Stefan Hajnoczi
2014-02-20 12:50 ` [Qemu-devel] [PATCH v3 1/6] rfifolock: add recursive FIFO lock Stefan Hajnoczi
2014-02-20 12:50 ` [Qemu-devel] [PATCH v3 2/6] aio: add aio_context_acquire() and aio_context_release() Stefan Hajnoczi
2014-02-20 12:50 ` [Qemu-devel] [PATCH v3 3/6] iothread: add I/O thread object Stefan Hajnoczi
2014-02-20 12:50 ` [Qemu-devel] [PATCH v3 4/6] qdev: add get_pointer_and_free() for temporary strings Stefan Hajnoczi
2014-02-20 12:50 ` [Qemu-devel] [PATCH v3 5/6] iothread: add "iothread" qdev property type Stefan Hajnoczi
2014-02-20 12:58   ` Paolo Bonzini
2014-02-21 11:03     ` Stefan Hajnoczi
2014-02-21 11:33       ` Paolo Bonzini
2014-02-21 12:45         ` Stefan Hajnoczi
2014-02-21 13:01           ` Paolo Bonzini [this message]
2014-02-21 13:25             ` Stefan Hajnoczi
2014-02-21 13:29               ` Paolo Bonzini
2014-02-21 14:15                 ` Stefan Hajnoczi
2014-02-20 12:50 ` [Qemu-devel] [PATCH v3 6/6] dataplane: replace internal thread with IOThread Stefan Hajnoczi
2014-02-20 12:57   ` Paolo Bonzini

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=53074E0F.1040006@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=famz@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=mdroth@linux.vnet.ibm.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@gmail.com \
    --cc=stefanha@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 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.