From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34258) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bwT5I-0000nD-23 for qemu-devel@nongnu.org; Tue, 18 Oct 2016 08:01:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bwT5C-0007mQ-Cy for qemu-devel@nongnu.org; Tue, 18 Oct 2016 08:01:32 -0400 Received: from mx1.redhat.com ([209.132.183.28]:35646) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1bwT5C-0007lH-6H for qemu-devel@nongnu.org; Tue, 18 Oct 2016 08:01:26 -0400 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 548D87F7A4 for ; Tue, 18 Oct 2016 12:01:25 +0000 (UTC) Date: Tue, 18 Oct 2016 13:01:22 +0100 From: "Daniel P. Berrange" Message-ID: <20161018120121.GN4349@redhat.com> Reply-To: "Daniel P. Berrange" References: <20161012191502.GC16187@work-vm> <20161018100409.GH4349@redhat.com> <20161018113202.GE2190@work-vm> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20161018113202.GE2190@work-vm> Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] chardev's and fd's in monitors List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "Dr. David Alan Gilbert" Cc: qemu-devel@nongnu.org, armbru@redhat.com 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 wrot= e: > > > 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. > > >=20 > > > If we could get away with just a FILE* then we could use fopencooki= e, > > > but that's GNU only. > > >=20 > > > Is there any sane way of shepherding all chardev's into having an > > > fd? > >=20 > > The entire chardev abstraction model exists precisely because we cann= ot > > make all chardevs look like a single fd. Even those which are fd base= d > > may have separate FDs for input and output. >=20 > Note that editline takes separate in/out streams, but it does want thos= e streams > to be FILE*'s. >=20 > > IMHO the only viable approach would be to enhance linenoise/editline = to > > not assume use of fd* or FILE * abstractions. >=20 > 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 use= ful. >=20 > > BTW, what is the actual thread issue you are facing ? Chardevs at lea= st > > 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 ? >=20 > Marc-Andr=C3=A9 pointed that out; I hadn't realised they were thread sa= fe. > 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. > 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 c= hardev > 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 processin= g 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. Regards, Daniel --=20 |: http://berrange.com -o- http://www.flickr.com/photos/dberrange= / :| |: http://libvirt.org -o- http://virt-manager.or= g :| |: http://entangle-photo.org -o- http://search.cpan.org/~danberr= / :|