All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Daniel P. Berrange" <berrange@redhat.com>
To: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
Cc: qemu-devel@nongnu.org, armbru@redhat.com
Subject: Re: [Qemu-devel] chardev's and fd's in monitors
Date: Tue, 18 Oct 2016 14:35:28 +0100	[thread overview]
Message-ID: <20161018133528.GD12728@redhat.com> (raw)
In-Reply-To: <20161018132524.GG2190@work-vm>

On Tue, Oct 18, 2016 at 02:25:25PM +0100, Dr. David Alan Gilbert wrote:
> * Daniel P. Berrange (berrange@redhat.com) wrote:
> > On Tue, Oct 18, 2016 at 12:32:02PM +0100, Dr. David Alan Gilbert wrote:
> > > * Daniel P. Berrange (berrange@redhat.com) wrote:
> > > > On Wed, Oct 12, 2016 at 08:15:02PM +0100, Dr. David Alan Gilbert wrote:
> > > > > Hi,
> > > > >   I had a look at a couple of readline like libraries;
> > > > > editline and linenoise.  A difficulty with using them is that
> > > > > they both want fd's or FILE*'s; editline takes either but
> > > > > from a brief look I think it's expecting to extract the fd.
> > > > > That makes them tricky to integrate into qemu, where
> > > > > the chardev's hide a whole bunch of non-fd things; in particular
> > > > > tls, mux, ringbuffers etc.
> > > > > 
> > > > > If we could get away with just a FILE* then we could use fopencookie,
> > > > > but that's GNU only.
> > > > > 
> > > > > Is there any sane way of shepherding all chardev's into having an
> > > > > fd?
> > > > 
> > > > The entire chardev abstraction model exists precisely because we cannot
> > > > make all chardevs look like a single fd. Even those which are fd based
> > > > may have separate FDs for input and output.
> > > 
> > > Note that editline takes separate in/out streams, but it does want those streams
> > > to be FILE*'s.
> > > 
> > > > IMHO the only viable approach would be to enhance linenoise/editline to
> > > > not assume use of fd* or FILE * abstractions.
> > > 
> > > I think if it came to that then we'd probably end up sticking with what we
> > > had for a very long time; I'd assume it would take a long time before
> > > any mods we made to the libraries would come around to be generally useful.
> > > 
> > > > BTW, what is the actual thread issue you are facing ? Chardevs at least
> > > > ought to be usable from a separate thread, as long as each distinct
> > > > chardev object instance was only used from one thread at a time ?
> > > 
> > > Marc-André pointed that out; I hadn't realised they were thread safe.
> > > But what are the rules? You say 'only used from one thread at a time' -
> > > what happens if we have a mux and the different streams to the mux come
> > > from different threads?
> > 
> > Well there is no mutex locking on the CharDriverState objects, so the
> > exact rule is "you mustn't do anything from multiple threads that will
> > race on contents of CharDriverState". That's too fuzzy to be useful to
> > developers though, so I think the only sensible option right now is to
> > say any "top level" CharDriverState should only be touch from one thread
> > at a time. IOW, if you have a mux, that that rule would apply to the
> > mux itself and the various children it owns as if they were a single
> > unnit.
> 
> OK; I think we're probably saved by the big lock at the moment, so that
> all device emulation that outputs text is probably holding it and the monitor
> is also.  What about something like an error_report from a different thread
> while something is happening in the monitor?

If we moved execution of monitor commands to separate thread from the
thread handling monitor I/O, then we'd have to modify error_report so
that it queued the text in some manner, such that it was only then
fed back to the client once the command thread completed. Alternatively
we'd have to introduced locking in the Monitor object, that serialized
access to the underling CharDriverState I/O funcs.

> > > My actual thoughts for threads came from a few sides:
> > >   a) Maybe I could have a shim thread that fed the editline fd from a chardev
> > >   b) I'd eventually like multiple monitor threads.
> > 
> > Can you expand on what you mean by multiple monitor threads ? Presumably
> > you're meaning a single monitor instance, with multiple threads processing
> > commands concurrently ?  If so, I think that ought to be fine even with
> > the current thread rules around chardevs. The processing of individual
> > monitor commands doesn't interact with the CharDriverState AFAIR, as we
> > have clean separation between parsing the incoming command, running the
> > command, and formatting the outgoing response. IOW, for a single monitor
> > it is still sufficient to have a single thread deal with all I/O for the
> > chardev - only the command execution needs to be delegated to other
> > threads, and those wouldn't be touching the chardev at all.
> 
> Hmm, I'd thought of the other way around - multiple individual monitors each
> running one command; ie each connection for a monitor would be it's own
> thread.

So I guess there's two problems with the monitor handling right now wrt.

 - A long running command will block the event loop thread for too long
 - A long running command prevents a client issuing other commands while
   waiting for the previous command to complete.

Running a thread per monitor server solves the first problem. If we make
monitor command handling async though, then it solves both problems.

Regards,
Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://entangle-photo.org       -o-    http://search.cpan.org/~danberr/ :|

  reply	other threads:[~2016-10-18 13:35 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-12 19:15 [Qemu-devel] chardev's and fd's in monitors Dr. David Alan Gilbert
2016-10-12 20:02 ` Marc-André Lureau
2016-10-13 15:47   ` Dr. David Alan Gilbert
2016-10-18 10:04 ` Daniel P. Berrange
2016-10-18 11:32   ` Dr. David Alan Gilbert
2016-10-18 11:41     ` Marc-André Lureau
2016-10-18 11:44       ` Marc-André Lureau
2016-10-18 12:01     ` Daniel P. Berrange
2016-10-18 13:25       ` Dr. David Alan Gilbert
2016-10-18 13:35         ` Daniel P. Berrange [this message]
2016-10-18 13:52           ` Dr. David Alan Gilbert
2016-10-18 14:01             ` Daniel P. Berrange
2016-10-18 18:53               ` Dr. David Alan Gilbert
2016-10-19  7:45                 ` Daniel P. Berrange
2016-10-19  8:00               ` Markus Armbruster
2016-10-19  8:12                 ` Dr. David Alan Gilbert
2016-10-19  8:42                   ` Daniel P. Berrange
2016-10-19  9:48                     ` Markus Armbruster
2016-10-19 10:05                       ` Dr. David Alan Gilbert
2016-10-19 10:16                         ` Daniel P. Berrange
2016-10-19 12:16                           ` Markus Armbruster
2016-10-19 12:21                             ` Daniel P. Berrange
2016-10-19 18:06                               ` Dr. David Alan Gilbert
2016-10-20  8:37                                 ` Daniel P. Berrange
2016-10-20  8:53                                   ` Marc-André Lureau
2016-10-20 10:45                                     ` Markus Armbruster
2016-10-20 16:56                                   ` Paolo Bonzini
2016-10-21  9:12                                     ` Markus Armbruster
2016-10-21 21:06                                       ` Paolo Bonzini
2016-10-24  7:07                                         ` Markus Armbruster
2016-10-21  9:35                                     ` Daniel P. Berrange
2016-10-20 16:59                                   ` Dr. David Alan Gilbert
2016-10-20  8:55                                 ` Markus Armbruster
2016-10-20  9:03                                   ` Daniel P. Berrange
2016-10-20  9:58                                     ` Dr. David Alan Gilbert
2016-10-20 10:42                                       ` Markus Armbruster
2016-10-20 11:01                                         ` Dr. David Alan Gilbert
2016-10-20 11:10                                           ` Daniel P. Berrange
2016-10-20 11:45                                             ` Markus Armbruster
2016-10-20 11:08                                         ` Daniel P. Berrange
2016-10-20 11:57                                           ` Markus Armbruster
2016-10-20 17:56                                             ` Dr. David Alan Gilbert
2016-10-21  9:06                                               ` Markus Armbruster
2016-10-21  9:37                                                 ` Daniel P. Berrange
2016-10-21 11:56                                                   ` Dr. David Alan Gilbert
2016-10-21  9:45                                                 ` Dr. David Alan Gilbert
2016-10-19 12:26               ` Paolo Bonzini
2016-10-19 17:01                 ` Dr. David Alan Gilbert
2016-10-19 20:51                   ` Paolo Bonzini
2016-10-20  8:34                     ` Daniel P. Berrange
2016-10-18 12:08   ` Markus Armbruster
2016-10-18 12:13     ` Daniel P. Berrange
2016-10-18 12:43       ` Dr. David Alan Gilbert
2016-10-18 10:06 ` Daniel P. Berrange

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=20161018133528.GD12728@redhat.com \
    --to=berrange@redhat.com \
    --cc=armbru@redhat.com \
    --cc=dgilbert@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.