Roman Penyaev <r.peni...@gmail.com> writes:

> On Tue, Jan 21, 2025 at 4:02 PM Alex Bennée <alex.ben...@linaro.org> wrote:
>>
>> Roman Penyaev <r.peni...@gmail.com> writes:
>>
>> > This adds a few lines describing `hub` aggregator configuration
>> > for aggregation of several backend devices with a single frontend
>> > device.
>> >
>> > Signed-off-by: Roman Penyaev <r.peni...@gmail.com>
>> > Cc: "Marc-André Lureau" <marcandre.lur...@redhat.com>
>> > Cc: qemu-devel@nongnu.org
>> > ---
>> >  qemu-options.hx | 48 ++++++++++++++++++++++++++++++++++++++++++++----
>> >  1 file changed, 44 insertions(+), 4 deletions(-)
>> >
>> > diff --git a/qemu-options.hx b/qemu-options.hx
>> > index 7090d59f6f10..fdc46f7e68b3 100644
>> > --- a/qemu-options.hx
>> > +++ b/qemu-options.hx
>> > @@ -3720,7 +3720,7 @@ SRST
>> >  The general form of a character device option is:
>> >
>> >  ``-chardev backend,id=id[,mux=on|off][,options]``
>> > -    Backend is one of: ``null``, ``socket``, ``udp``, ``msmouse``,
>> > +    Backend is one of: ``null``, ``socket``, ``udp``, ``msmouse``, 
>> > ``hub``,
>> >      ``vc``, ``ringbuf``, ``file``, ``pipe``, ``console``, ``serial``,
>> >      ``pty``, ``stdio``, ``braille``, ``parallel``,
>> >      ``spicevmc``, ``spiceport``. The specific backend will determine the
>> > @@ -3777,9 +3777,10 @@ The general form of a character device option is:
>> >      the QEMU monitor, and ``-nographic`` also multiplexes the console
>> >      and the monitor to stdio.
>> >
>> > -    There is currently no support for multiplexing in the other
>> > -    direction (where a single QEMU front end takes input and output from
>> > -    multiple chardevs).
>> > +    If you need to aggregate data in the opposite direction (where one
>> > +    QEMU frontend interface receives input and output from multiple
>> > +    backend chardev devices), please refer to the paragraph below
>> > +    regarding chardev ``hub`` aggregator device configuration.
>> >
>> >      Every backend supports the ``logfile`` option, which supplies the
>> >      path to a file to record all data transmitted via the backend. The
>> > @@ -3879,6 +3880,45 @@ The available backends are:
>> >      Forward QEMU's emulated msmouse events to the guest. ``msmouse``
>> >      does not take any options.
>> >
>> > +``-chardev hub,id=id,chardevs.0=id[,chardevs.N=id]`` Explicitly create
>> > +    chardev backend hub device with the possibility to aggregate input
>> > +    from multiple backend devices and forward it to a single frontend
>> > +    device. Additionally, `hub` device takes the output from the
>> > +    frontend device and sends it back to all the connected backend
>> > +    devices. This allows for seamless interaction between different
>> > +    backend devices and a single frontend interface. Aggregation
>> > +    supported for up to 4 chardev devices. (Since 10.0)
>> > +
>> > +    For example, the following is a use case of 2 backend devices:
>> > +    virtual console ``vc0`` and a pseudo TTY ``pty0`` connected to
>> > +    a single virtio hvc console frontend device with a hub ``hub0``
>> > +    help. Virtual console renders text to an image, which can be
>> > +    shared over the VNC protocol. In turn, pty backend provides
>> > +    bidirectional communication to the virtio hvc console over the
>> > +    pseudo TTY file. The example configuration can be as follows:
>> > +
>> > +    ::
>> > +
>> > +       -chardev pty,path=/tmp/pty,id=pty0 \
>> > +       -chardev vc,id=vc0 \
>> > +       -chardev hub,id=hub0,chardevs.0=pty0,chardevs.1=vc0 \
>> > +       -device virtconsole,chardev=hub0 \
>> > +       -vnc 0.0.0.0:0
>> > +
>> > +    Once QEMU starts VNC client and any TTY emulator can be used to
>> > +    control a single hvc console:
>> > +
>> > +    ::
>> > +
>> > +       # Start TTY emulator
>> > +       tio /tmp/pty
>> > +
>> > +       # Start VNC client and switch to virtual console Ctrl-Alt-2
>> > +       vncviewer :0
>> > +
>> > +    Several frontend devices is not supported. Stacking of multiplexers
>> > +    and hub devices is not supported as well.
>> > +
>>
>> Not sure why this breaks but I'm seeing:
>>
>>   FAILED: docs/docs.stamp
>>   /usr/bin/env CONFDIR=etc/qemu
>> /home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/sphinx-build -q -W
>> -Dkerneldoc_werror=1 -j auto -Dversion=9.2.50 -Drelease=
>> -Ddepfile=docs/docs.d -Ddepfile_stamp=docs/docs.stamp -b html -d
>> /home/alex/lsrc/qemu.git/builds/all/docs/manual.p
>> /home/alex/lsrc/qemu.git/docs
>> /home/alex/lsrc/qemu.git/builds/all/docs/manual
>>
>>   Warning, treated as error:
>>   /home/alex/lsrc/qemu.git/qemu-options.hx:3884:'any' reference target not 
>> found: hub
>
> This is odd, my make is silent. Can you please check this?
>
> diff --git a/qemu-options.hx b/qemu-options.hx
> index fdc46f7e68b3..e6d9de142aaf 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -3880,7 +3880,8 @@ The available backends are:
>      Forward QEMU's emulated msmouse events to the guest. ``msmouse``
>      does not take any options.
>
> -``-chardev hub,id=id,chardevs.0=id[,chardevs.N=id]`` Explicitly create
> +``-chardev hub,id=id,chardevs.0=id[,chardevs.N=id]``
> +    Explicitly create

No joy. I did replicate from the command line and s/-q/-v/

  writing output... [ 43%] specs/fsi .. specs/ppc-spapr-hotplug

  Traceback (most recent call last):
    File "/usr/lib/python3/dist-packages/sphinx/cmd/build.py", line 281, in 
build_main
      app.build(args.force_all, args.filenames)
    File "/usr/lib/python3/dist-packages/sphinx/application.py", line 341, in 
build
      self.builder.build_update()
    File "/usr/lib/python3/dist-packages/sphinx/builders/__init__.py", line 
310, in build_update
      self.build(to_build,
    File "/usr/lib/python3/dist-packages/sphinx/builders/__init__.py", line 
376, in build
      self.write(docnames, list(updated_docnames), method)
    File "/usr/lib/python3/dist-packages/sphinx/builders/__init__.py", line 
568, in write
      self._write_parallel(sorted(docnames),
    File "/usr/lib/python3/dist-packages/sphinx/builders/__init__.py", line 
612, in _write_parallel
      doctree = self.env.get_and_resolve_doctree(docname, self)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/usr/lib/python3/dist-packages/sphinx/environment/__init__.py", line 
591, in get_and_resolve_doctree
      self.apply_post_transforms(doctree, docname)
    File "/usr/lib/python3/dist-packages/sphinx/environment/__init__.py", line 
637, in apply_post_transforms
      transformer.apply_transforms()
    File "/usr/lib/python3/dist-packages/sphinx/transforms/__init__.py", line 
80, in apply_transforms
      super().apply_transforms()
    File "/usr/lib/python3/dist-packages/docutils/transforms/__init__.py", line 
173, in apply_transforms
      transform.apply(**kwargs)
    File 
"/usr/lib/python3/dist-packages/sphinx/transforms/post_transforms/__init__.py", 
line 35, in apply
      self.run(**kwargs)
    File 
"/usr/lib/python3/dist-packages/sphinx/transforms/post_transforms/__init__.py", 
line 97, in run
      self.warn_missing_reference(refdoc, typ, target, node, domain)
    File 
"/usr/lib/python3/dist-packages/sphinx/transforms/post_transforms/__init__.py", 
line 204, in warn_missing_reference
      logger.warning(msg, location=node, type='ref', subtype=typ)
    File "/usr/lib/python3.11/logging/__init__.py", line 1855, in warning
      self.log(WARNING, msg, *args, **kwargs)
    File "/usr/lib/python3/dist-packages/sphinx/util/logging.py", line 123, in 
log
      super().log(level, msg, *args, **kwargs)
    File "/usr/lib/python3.11/logging/__init__.py", line 1887, in log
      self.logger.log(level, msg, *args, **kwargs)
    File "/usr/lib/python3.11/logging/__init__.py", line 1559, in log
      self._log(level, msg, args, **kwargs)
    File "/usr/lib/python3.11/logging/__init__.py", line 1634, in _log
      self.handle(record)
    File "/usr/lib/python3.11/logging/__init__.py", line 1644, in handle
      self.callHandlers(record)
    File "/usr/lib/python3.11/logging/__init__.py", line 1706, in callHandlers
      hdlr.handle(record)
    File "/usr/lib/python3.11/logging/__init__.py", line 974, in handle
      rv = self.filter(record)
           ^^^^^^^^^^^^^^^^^^^
    File "/usr/lib/python3.11/logging/__init__.py", line 830, in filter
      result = f.filter(record)
               ^^^^^^^^^^^^^^^^
    File "/usr/lib/python3/dist-packages/sphinx/util/logging.py", line 426, in 
filter
      raise exc
  sphinx.errors.SphinxWarning: 
/home/alex/lsrc/qemu.git/qemu-options.hx:3884:'any' reference target not found: 
hub

  Warning, treated as error:
  /home/alex/lsrc/qemu.git/qemu-options.hx:3884:'any' reference target not 
found: hub

So it appears deep in sphinx itself and not any of our config bits... I
can't work out why its looking up hub as a reference though.

-- 
Alex Bennée
Virtualisation Tech Lead @ Linaro

Reply via email to