[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v7 2/4] chardev/char-hub: implement backend chardev aggregato
From: |
Alex Bennée |
Subject: |
Re: [PATCH v7 2/4] chardev/char-hub: implement backend chardev aggregator |
Date: |
Wed, 22 Jan 2025 14:44:14 +0000 |
User-agent: |
mu4e 1.12.8; emacs 29.4 |
Roman Penyaev <r.peniaev@gmail.com> writes:
> This patch implements a new chardev backend `hub` device, which
> aggregates input from multiple backend devices and forwards 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.
>
> The idea of the change is trivial: keep list of backend devices
> (up to 4), init them on demand and forward data buffer back and
> forth.
>
> The following is QEMU command line example:
>
> -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
>
> Which creates 2 backend devices: text virtual console (`vc0`) and a
> pseudo TTY (`pty0`) connected to the single virtio hvc console with
> the backend aggregator (`hub0`) help. `vc0` renders text to an image,
> which can be shared over the VNC protocol. `pty0` is a pseudo TTY
> backend which provides biderectional communication to the virtio hvc
> console.
>
<snip>
> +static void qemu_chr_open_hub(Chardev *chr,
> + ChardevBackend *backend,
> + bool *be_opened,
> + Error **errp)
> +{
> + ChardevHub *hub = backend->u.hub.data;
> + HubChardev *d = HUB_CHARDEV(chr);
> + strList *list = hub->chardevs;
> +
> + d->be_eagain_ind = -1;
> +
> + if (list == NULL) {
> + error_setg(errp, "hub: 'chardevs' list is not defined");
> + return;
> + }
> +
> + while (list) {
> + Chardev *s;
> +
> + s = qemu_chr_find(list->value);
> + if (s == NULL) {
> + error_setg(errp, "hub: chardev can't be found by id '%s'",
> + list->value);
> + return;
> + }
> + if (CHARDEV_IS_HUB(s) || CHARDEV_IS_MUX(s)) {
> + error_setg(errp, "hub: multiplexers and hub devices can't be "
> + "stacked, check chardev '%s', chardev should not "
> + "be a hub device or have 'mux=on' enabled",
> + list->value);
> + return;
So I was looking at this to see if I could implement what I wanted which
was a tee-like copy of a serial port output while maintaining the C-a
support of the mux.
Normally I just use the shortcut -serial mon:stdio
However that form is a special case so I tried the following and ran
into the above:
-chardev stdio,mux=on,id=char0 \
-chardev file,path=console.log,id=clog \
-mon chardev=char0,mode=readline \
-chardev hub,id=hub0,chardevs.0=char0,chardevs.1=clog
Giving:
qemu-system-aarch64: -chardev -hub,id=hub0,chardevs.0=char0,chardevs.1=clog:
hub: -multiplexers and hub devices can't be stacked, check chardev
-'char0', chardev should not be a hub device or have 'mux=on'
-enabled
So what stops this sort of chain?
--
Alex Bennée
Virtualisation Tech Lead @ Linaro