
On Thu, Feb 10, 2022 at 18:35:44 +0100, Ján Tomko wrote:
On a Wednesday in 2022, Peter Krempa wrote:
The existing helpers we have are very clumsy and there's no integration with the monitor.
This patch introduces new helpers to bridge the gap and simplify handing
[...]
+/** + * qemuFDPassNew: + * @prefix: prefix used for naming the passed FDs + * @dompriv: qemu domain private data + * @useFDSet: Always use FD sets (/dev/fdset/N) for this instance + * + * Create a new helper object for passing FDs to qemu. If @useFDSet is false + * the older approach of directly using FD number on the commandline and 'getfd' + * QMP command is used. Otherwise '-add-fd' and /dev/fdset/N is used to pass the + * FD. + *
I dislike using bools in helpers, can this be turned into a flag?
Well I dislike flags because it makes the code of the function harder to read as opposed to making the call itself easier to read, so I try to avoid them if it's feasible in a given situation.
Alternatively, to discourage the older approach you can create a thin qemuFDPassNewLegacy wrapper and leave qemuFDPassNew without the comment.
I think I'll go with this one.
(Can we even convince QEMU to use fdset for sockets? Or is that not worth pursuing?)
I actually have a qemu patch prepared which makes the code paths using direct FD passing or the 'getfd' QMP command to accept fdsets too, but I still have to test it. The idea is to hide the complexity in these wrappers and then just use fdsets.
+ * Non-test uses must pass a valid @dompriv. + * + * @prefix is used for naming the FD if needed and is later referenced when + * removing the FDSet via monitor. + */ +qemuFDPass * +qemuFDPassNew(const char *prefix, + void *dompriv, + bool useFDSet) +{ + qemuDomainObjPrivate *priv = dompriv; + qemuFDPass *fdpass = g_new0(qemuFDPass, 1); + + fdpass->prefix = g_strdup(prefix); + fdpass->useFDSet = useFDSet; + + if (fdpass->useFDSet && priv) + fdpass->fdSetID = qemuDomainFDSetIdNew(priv); + + return fdpass; +} + + +/** + * qemuFDPassAddFD: + * @fdpass: The fd passing helper struct + * @fd: File descriptor to pass + * @suffix: Name suffix for the file descriptor name + * + * Adds @fd to be passed to qemu when transferring @fdpass to qemu.
QEMU
When @fdpass + * is configured to use FD set mode, multiple file descriptors can be passed by + * calling this function repeatedly. + * + * @suffix is used to build the name of the file descriptor by concatenating + * it with @prefix passed to qemuFDPassNew. @suffix may be NULL, in which case + * it's considered to be an empty string. + * + * Returns 0 on success, -1 on error (when attempting to pass multiple FDs) using + * the 'direct' method. + */ +int +qemuFDPassAddFD(qemuFDPass *fdpass, + int *fd, + const char *suffix) +{ + struct qemuFDPassFD newfd = { .fd = *fd }; + + if (newfd.fd < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("invalid file descriptor")); + return -1; + } + + if (fdpass->nfds >= 1) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("direct FD passing supports only 1 file descriptor"));
This check conflicts with the comment above saying multiple FDs are allowed with fdsets. Also, please s/1/one/
oops, the idea was to do that check only when the legacy mode is used. Changes in this series actually don't use the multi-fd mode yet.