public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
From: Gleb Natapov <gleb@redhat.com>
To: Anthony Liguori <anthony@codemonkey.ws>
Cc: Alexander Graf <agraf@suse.de>, Avi Kivity <avi@redhat.com>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	kvm@vger.kernel.org
Subject: Re: [PATCH kvm-unit-tests 2/4] Introduce a C++ wrapper for the kvm APIs
Date: Wed, 24 Nov 2010 18:12:04 +0200	[thread overview]
Message-ID: <20101124161204.GF15111@redhat.com> (raw)
In-Reply-To: <4CED344B.3030000@codemonkey.ws>

On Wed, Nov 24, 2010 at 09:50:35AM -0600, Anthony Liguori wrote:
> On 11/24/2010 09:40 AM, Gleb Natapov wrote:
> >On Wed, Nov 24, 2010 at 08:41:26AM -0600, Anthony Liguori wrote:
> >>On 11/24/2010 06:59 AM, Alexander Graf wrote:
> >>>On 24.11.2010, at 11:52, Avi Kivity wrote:
> >>>
> >>>>Introduce exception-safe objects for calling system, vm, and vcpu ioctls.
> >>>>
> >>>>Signed-off-by: Avi Kivity<avi@redhat.com>
> >>>FWIW, I still disagree with C++ and believe this code to be hardly readable.
> >>There's a general prettiness that well written C++ code will have
> >>over C when there's heavy object modelling.  This can be subjective
> >>but for me, it's fairly significant.
> >>
> >>The fact that objects are easily created on the stack and on the
> >>heap is also pretty significant.  When considering device models, we
> >>struggle today with device composition.
> >>
> >>In real hardware, the i8042 (keyboard controller) is actually
> >>implemented in the PIIX3 which is a chip that is part of the i440fx.
> >>The i440fx acts as both the memory controller and as the PCI Host
> >>controller.  So you get something that looks like:
> >>
> >>class PIIX3 : public PCIDevice
> >>{
> >>private:
> >>     I8042 i8042;
> >>     RTC rtc;
> >>     // ...
> >>};
> >>
> >The fact that in physical implementation they sit in the same silicon
> >does not mean that logically they belong to the same class. PIIX3
> >is ISA bridge. It doesn't mean it owns devices on the ISA bus it
> >provides. The information that you are trying to convey here belongs to
> >configuration file.
> 
> Why would we specify a PIIX3 device based on a configuration file?
> There is only one PIIX3 device in the world.  I don't see a lot of
> need to create arbitrary types of devices.
> 
Why deny this flexibility from those who need it for modelling
different HW? Besides, as I said, PIIX3 is ISA bridge and this
is what class should implement. We have fw_cfg on ISA bus too
which does not exits on real HW and we may want to have other
devices. We should be able to add them without changing PIIX3
class.

> The real world hierarchy matters when you're trying to model I/O dispatch.
> 
Or build device path. Any time we do something not as "real HW" we
regret it later.

> >  Here I go factory design pattern.
> 
> I think it's a lot of abstraction for very little gain and leads to
> bizarreness like treating any platform device as an ISA device.
> 
Why?

> An RTC is *not* an ISA device.  It may sit *behind* an ISA bus
> because the SuperIO chip happens to be on the ISA bus.  But on
> modern systems, the ISA bus has disappeared in favor of the LPC but
> that doesn't fundamentally change what the RTC is.
Agree. This is a device sitting on the ISA bus on a PC, but it can
sit on other buses too. And it happily does so on other architectures.

> 
> The problem with what you describe is that there are far fewer
> devices that actually sit on busses than what QEMU tries to model
> today.
All devices sit on some buses.

> 
> >>class I440FX : public PCIHostController
> >>{
> >>    I440FX(void) {
> >>         this->slots[1].plug(&this->piix3); // piix3 is always in slot 1
> >>    }
> >>
> >>private:
> >>    Plug<PCIDevice *>  slots[32]; // slot 0 is the PMC
> >>    PIIX3 piix3;
> >>};
> >>
> >>So whereas we have this very complicate machine create function that
> >>attempts to create and composite all of these devices after the
> >>fact, when written in C++, partially due to good design, but
> >>partially due to the fact that the languages forces you to think a
> >>certain way, you get a tremendous simplification.
> >>
> >Forcing to think you in certain way does not make you suddenly make good
> >design decisions (if only programming was so easy). But it makes it even
> >harder to fix bad decision since suddenly all you design depends on it.
> >
> >>A proper C++ device model turns a vast majority of our device
> >>creation complexity into a single new I440FX.  Then it's just a
> >>matter of instantiating and plugging the appropriate set of PCI
> >>devices.
> >That is if you are using code as data. With other design you actually
> >read I440FX configuration from file and build it from smaller parts.
> >You see C++ doesn't stop us from arguing what design is correct.
> 
> That's fair.  I think 90% of what we need is better design.  I think
> a better language only gives us 10%.
> 
> >>Another area that C++ shines is safety.  C++ enables you to inject
> >>safe versions of things that you really can't do in C.  For
> >>instance, the PIT has three channels but the mask to select a
> >>channel is two bits.  There was a kernel exploit that found a way to
> >>trick selection of a forth channel because of a missing check.
> >>
> >>In C++, you can convert:
> >>
> >>PITChannel channnels[3];
> >>
> >>Into:
> >>
> >>Array<PITChannel, 3>  channels;
> >>
> >Any sane modern language gives you that. Why C++?
> 
> Because I don't think we can implement a reasonable device model
> using a garbage collected language.  Garbage collection introduces
> non-determinism and in QEMU we need to ensure that when we're
> running in a VCPU context, we exit back to the guest as quickly as
> possible.
> 
IIRC there are garbage collected languages that allow you to disable garbage
collection for certain part of the code. Garbage collection can be done
while vcpu executes guest code and in proper implementation vcpu thread
should execute device model code for a very brief time and do not sleep
there. All this makes me think that garbage collection shouldn't be a
big issue for kvm userspace.
 
--
			Gleb.

  parent reply	other threads:[~2010-11-24 16:12 UTC|newest]

Thread overview: 130+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-11-24 10:52 [PATCH kvm-unit-tests 0/4] API test framework Avi Kivity
2010-11-24 10:52 ` [PATCH kvm-unit-tests 1/4] Makefile: add support for C++ Avi Kivity
2010-11-24 10:52 ` [PATCH kvm-unit-tests 2/4] Introduce a C++ wrapper for the kvm APIs Avi Kivity
2010-11-24 12:59   ` Alexander Graf
2010-11-24 13:33     ` Gleb Natapov
2010-11-24 14:18     ` Anthony Liguori
2010-11-24 14:24       ` Anthony Liguori
2010-11-24 14:32       ` Avi Kivity
2010-11-24 14:31     ` Avi Kivity
2010-11-24 14:41     ` Anthony Liguori
2010-11-24 15:40       ` Gleb Natapov
2010-11-24 15:50         ` Anthony Liguori
2010-11-24 16:10           ` Avi Kivity
2010-12-02 13:52             ` Mike Day
2010-11-24 16:12           ` Gleb Natapov [this message]
2010-11-24 16:14             ` [PATCH kvm-unit-tests 2/4] " Avi Kivity
2010-11-24 16:21               ` Gleb Natapov
2010-11-24 16:25                 ` Avi Kivity
2010-11-24 16:29                   ` Gleb Natapov
2010-11-24 16:33                     ` Avi Kivity
2010-11-24 16:52                       ` Gleb Natapov
2010-11-24 16:56                         ` Avi Kivity
2010-11-24 17:02                           ` Gleb Natapov
2010-11-24 17:07                             ` Avi Kivity
2010-11-24 17:10                               ` Jes Sorensen
2010-11-24 17:12                                 ` Avi Kivity
2010-11-24 17:14                               ` Anthony Liguori
2010-11-24 16:43                 ` Anthony Liguori
2010-11-24 16:48                   ` Gleb Natapov
2010-11-24 16:56                     ` Anthony Liguori
2010-11-24 17:04                       ` Gleb Natapov
2010-11-24 16:40             ` Anthony Liguori
2010-11-24 17:33               ` Gleb Natapov
2010-11-24 17:39                 ` Avi Kivity
2010-11-24 17:41                   ` Gleb Natapov
2010-11-24 17:50                     ` Avi Kivity
2010-11-24 18:23                       ` Gleb Natapov
2010-11-24 18:50                         ` Avi Kivity
2010-11-24 18:17                 ` Anthony Liguori
2010-11-24 18:34                   ` Gleb Natapov
2010-11-24 18:53                     ` Anthony Liguori
2010-11-25  8:35                       ` Gleb Natapov
2010-11-24 16:40           ` Jes Sorensen
2010-11-24 16:47             ` Avi Kivity
2010-11-24 16:51               ` Jes Sorensen
2010-11-24 16:57                 ` Anthony Liguori
2010-11-24 17:29                   ` Avi Kivity
2010-11-24 16:59                 ` Avi Kivity
2010-11-24 17:06                   ` Jes Sorensen
2010-11-24 17:11                     ` Avi Kivity
2010-11-24 17:17                       ` Jes Sorensen
2010-11-24 17:25                         ` Avi Kivity
2010-11-24 17:28                           ` Jes Sorensen
2010-11-24 17:31                             ` Avi Kivity
2010-11-24 17:36                           ` Gleb Natapov
2010-11-24 17:41                             ` Avi Kivity
2010-11-24 17:27                         ` Anthony Liguori
2010-11-24 17:35                           ` Avi Kivity
2010-11-24 17:36                           ` Jes Sorensen
2010-11-24 17:41                             ` Avi Kivity
2010-11-24 17:43                               ` Gleb Natapov
2010-11-24 17:50                                 ` Avi Kivity
2010-11-24 18:10                                   ` Gleb Natapov
2010-11-24 18:55                                     ` Avi Kivity
2010-11-24 19:29                                       ` Jes Sorensen
2010-11-24 19:33                                         ` Avi Kivity
2010-11-24 17:43                               ` Jes Sorensen
2010-11-24 17:51                                 ` Avi Kivity
2010-11-24 17:43                             ` Anthony Liguori
2010-11-24 17:45                               ` Jes Sorensen
2010-11-24 17:51                                 ` Avi Kivity
2010-11-24 18:01                                 ` Anthony Liguori
2010-11-24 18:56                                   ` Avi Kivity
2010-11-24 16:55               ` Gleb Natapov
2010-11-24 17:01                 ` Avi Kivity
2010-11-24 17:16                   ` Gleb Natapov
2010-11-24 17:26                     ` Avi Kivity
2010-11-24 16:53             ` Anthony Liguori
2010-11-24 17:03               ` Jes Sorensen
2010-11-28 12:27       ` Michael S. Tsirkin
2010-11-28 22:04         ` Anthony Liguori
2010-11-28 22:28           ` Michael S. Tsirkin
2010-11-28 23:13             ` Anthony Liguori
2010-11-29  8:04               ` Michael S. Tsirkin
2010-11-29 13:44                 ` Anthony Liguori
2010-11-29 13:48                   ` Avi Kivity
2010-11-24 16:29     ` Jes Sorensen
2010-11-24 16:34       ` Avi Kivity
2010-11-24 16:44         ` Jes Sorensen
2010-11-24 16:49           ` Avi Kivity
2010-11-28 11:59     ` Michael S. Tsirkin
2010-11-28 13:02       ` Avi Kivity
2010-11-28 13:57         ` Michael S. Tsirkin
2010-11-28 14:34           ` Avi Kivity
2010-11-28 16:57             ` Michael S. Tsirkin
2010-11-29  9:22               ` Avi Kivity
2010-11-29 10:47                 ` Michael S. Tsirkin
2010-11-29 10:52                   ` Avi Kivity
2010-11-29 11:26                     ` Michael S. Tsirkin
2010-11-29 13:38                       ` Anthony Liguori
2010-11-24 14:10   ` Anthony Liguori
2010-11-24 14:29     ` Avi Kivity
2010-11-24 14:45       ` Anthony Liguori
2010-11-24 14:53         ` Avi Kivity
2010-11-24 14:55           ` Anthony Liguori
2010-11-25 16:32       ` Avi Kivity
2010-11-26 10:16   ` Michael S. Tsirkin
     [not found]     ` <4CF0CB9A.5060403@redhat.com>
2010-11-28  8:58       ` Michael S. Tsirkin
2010-11-28  9:31         ` Avi Kivity
2010-11-28  9:50           ` Michael S. Tsirkin
2010-11-28  9:54             ` Avi Kivity
2010-11-28 11:44               ` Michael S. Tsirkin
2010-11-28 13:14                 ` Avi Kivity
2010-11-28 14:40                   ` Michael S. Tsirkin
2010-11-28 22:12                     ` Anthony Liguori
2010-11-29  9:30                     ` Avi Kivity
2010-11-28 11:49   ` Michael S. Tsirkin
2010-11-28 13:15     ` Avi Kivity
2010-11-28 14:49       ` Michael S. Tsirkin
2010-11-29  9:30         ` Avi Kivity
2010-11-24 10:52 ` [PATCH kvm-unit-tests 3/4] Add support for calling a function in guest mode Avi Kivity
2010-11-26 14:17   ` Michael S. Tsirkin
     [not found]     ` <4CF0CC26.8030407@redhat.com>
2010-11-28  8:59       ` Michael S. Tsirkin
2010-11-28  9:22         ` Avi Kivity
2010-11-24 10:52 ` [PATCH kvm-unit-tests 4/4] Add sample test using the api test harness Avi Kivity
2010-11-26 14:17   ` Michael S. Tsirkin
     [not found]     ` <4CF0CC4A.8070100@redhat.com>
2010-11-28  9:04       ` Michael S. Tsirkin
2010-11-28  9:21         ` Avi Kivity
2010-11-29 16:09 ` [PATCH kvm-unit-tests 0/4] API test framework Marcelo Tosatti
2010-12-01 10:38   ` Avi Kivity

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=20101124161204.GF15111@redhat.com \
    --to=gleb@redhat.com \
    --cc=agraf@suse.de \
    --cc=anthony@codemonkey.ws \
    --cc=avi@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=mtosatti@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