[PATCH 0/2] Add support for Unix mode to serial port dev

This patchset adds support for Unix mode to serial port device in ch guests. Praveen K Paladugu (2): ch: Add Cap checks for unix backend of serial port ch: Add support for `Unix` mode to serial port dev src/ch/ch_capabilities.c | 6 ++++++ src/ch/ch_capabilities.h | 1 + src/ch/ch_domain.c | 21 +++++++++++++++------ src/ch/ch_monitor.c | 35 ++++++++++++++++++++++++----------- src/ch/ch_process.c | 7 +++++++ 5 files changed, 53 insertions(+), 17 deletions(-) -- 2.43.0

From: Praveen K Paladugu <praveenkpaladugu@gmail.com> Unix Socket backend is only supported for serial port in cloud-hypervisor. Add relevant checks in chValidateDomainDeviceDef. Signed-off-by: Praveen K Paladugu <prapal@linux.microsoft.com> --- src/ch/ch_capabilities.c | 6 ++++++ src/ch/ch_capabilities.h | 1 + src/ch/ch_domain.c | 20 +++++++++++++++----- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/ch/ch_capabilities.c b/src/ch/ch_capabilities.c index b9e62d2d5b..5941851500 100644 --- a/src/ch/ch_capabilities.c +++ b/src/ch/ch_capabilities.c @@ -59,6 +59,12 @@ virCHCapsInitCHVersionCaps(int version) if (version >= 22000000) virCHCapsSet(chCaps, CH_MULTIFD_IN_ADDNET); + /* Starting v36, Cloud-Hypervisor accepts Unix Socket as a backend for + * guest's serial port. + * https://github.com/cloud-hypervisor/cloud-hypervisor/releases/tag/v36.0 */ + if (version >= 36000000) + virCHCapsSet(chCaps, CH_SOCKET_BACKEND_SERIAL_PORT); + return g_steal_pointer(&chCaps); } diff --git a/src/ch/ch_capabilities.h b/src/ch/ch_capabilities.h index ffb8881a11..03932511f6 100644 --- a/src/ch/ch_capabilities.h +++ b/src/ch/ch_capabilities.h @@ -27,6 +27,7 @@ typedef enum { CH_KERNEL_API_DEPRCATED, /* Use `payload` in place of `kernel` api */ CH_SERIAL_CONSOLE_IN_PARALLEL, /* Serial and Console ports can work in parallel */ CH_MULTIFD_IN_ADDNET, /* Cloud-hypervisor can accept multiple FDs in add-net api */ + CH_SOCKET_BACKEND_SERIAL_PORT, /* Support Unix socket as a backend for a serial port */ CH_CAPS_LAST /* this must always be the last item */ } virCHCapsFlags; diff --git a/src/ch/ch_domain.c b/src/ch/ch_domain.c index a6bf749d89..214574cf00 100644 --- a/src/ch/ch_domain.c +++ b/src/ch/ch_domain.c @@ -219,15 +219,25 @@ chValidateDomainDeviceDef(const virDomainDeviceDef *dev, if (def->nconsoles && def->consoles[0]->source->type != VIR_DOMAIN_CHR_TYPE_PTY) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Console can only be enabled for a PTY")); + _("Console only works in PTY mode")); return -1; } - if (def->nserials && def->serials[0]->source->type != VIR_DOMAIN_CHR_TYPE_PTY) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Serial can only be enabled for a PTY")); - return -1; + if (def->nserials) { + if (def->serials[0]->source->type != VIR_DOMAIN_CHR_TYPE_PTY && + def->serials[0]->source->type != VIR_DOMAIN_CHR_TYPE_UNIX) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Serial only works in UNIX/PTY modes")); + return -1; + } + if (!virBitmapIsBitSet(driver->chCaps, CH_SOCKET_BACKEND_SERIAL_PORT) && + def->serials[0]->source->type == VIR_DOMAIN_CHR_TYPE_UNIX) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Unix Socket backend is not supported by this version of ch.")); + return -1; + } } + return 0; } -- 2.43.0

With Unix mode, pass a socket path to cloud-hypervisor. Cloud-Hypervisor will attach guest's serial port to this socket path. Users can connect to the serial port using one of the following commands: `socat -,crnl UNIX-CONNECT:<path/to/socket>` OR `minicom --device unix#<path/to/socket>` Signed-off-by: Praveen K Paladugu <prapal@linux.microsoft.com> --- src/ch/ch_domain.c | 1 - src/ch/ch_monitor.c | 35 ++++++++++++++++++++++++----------- src/ch/ch_process.c | 7 +++++++ 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/ch/ch_domain.c b/src/ch/ch_domain.c index 214574cf00..5b2ab6dd99 100644 --- a/src/ch/ch_domain.c +++ b/src/ch/ch_domain.c @@ -204,7 +204,6 @@ chValidateDomainDeviceDef(const virDomainDeviceDef *dev, } } - if (def->nconsoles > 1) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Only a single console can be configured for this domain")); diff --git a/src/ch/ch_monitor.c b/src/ch/ch_monitor.c index 62ba72bb82..3536d3d63e 100644 --- a/src/ch/ch_monitor.c +++ b/src/ch/ch_monitor.c @@ -89,22 +89,35 @@ virCHMonitorBuildCPUJson(virJSONValue *content, virDomainDef *vmdef) } static int -virCHMonitorBuildPTYJson(virJSONValue *content, virDomainDef *vmdef) +virCHMonitorBuildConsoleJson(virJSONValue *content, virDomainDef *vmdef) { - if (vmdef->nconsoles) { - g_autoptr(virJSONValue) pty = virJSONValueNewObject(); - if (virJSONValueObjectAppendString(pty, "mode", "Pty") < 0) + g_autoptr(virJSONValue) console = virJSONValueNewObject(); + g_autoptr(virJSONValue) serial = virJSONValueNewObject(); + + if (vmdef->nconsoles && + vmdef->consoles[0]->source->type == VIR_DOMAIN_CHR_TYPE_PTY) { + if (virJSONValueObjectAppendString(console, "mode", "Pty") < 0) return -1; - if (virJSONValueObjectAppend(content, "console", &pty) < 0) + if (virJSONValueObjectAppend(content, "console", &console) < 0) return -1; } if (vmdef->nserials) { - g_autoptr(virJSONValue) pty = virJSONValueNewObject(); - if (virJSONValueObjectAppendString(pty, "mode", "Pty") < 0) - return -1; - if (virJSONValueObjectAppend(content, "serial", &pty) < 0) - return -1; + if (vmdef->serials[0]->source->type == VIR_DOMAIN_CHR_TYPE_PTY) { + if (virJSONValueObjectAppendString(serial, "mode", "Pty") < 0) + return -1; + } + else if (vmdef->serials[0]->source->type == VIR_DOMAIN_CHR_TYPE_UNIX) { + if (virJSONValueObjectAppendString(serial, "mode", "Socket") < 0) + return -1; + if (virJSONValueObjectAppendString(serial, + "socket", + vmdef->serials[0]->source->data.file.path) < 0) + return -1; + } + + if (virJSONValueObjectAppend(content, "serial", &serial) < 0) + return -1; } return 0; @@ -415,7 +428,7 @@ virCHMonitorBuildVMJson(virCHDriver *driver, virDomainDef *vmdef, return -1; } - if (virCHMonitorBuildPTYJson(content, vmdef) < 0) + if (virCHMonitorBuildConsoleJson(content, vmdef) < 0) return -1; if (virCHMonitorBuildCPUJson(content, vmdef) < 0) diff --git a/src/ch/ch_process.c b/src/ch/ch_process.c index 3bde9d9dcf..b371181fb2 100644 --- a/src/ch/ch_process.c +++ b/src/ch/ch_process.c @@ -69,6 +69,13 @@ virCHProcessUpdateConsoleDevice(virDomainObj *vm, if (!config) return; + /* This method is used to extract pty info from cloud-hypervisor and capture + * it in domain configuration. This step can be skipped for serial devices + * with unix backend.*/ + if (STREQ(device, "serial") && + vm->def->serials[0]->source->type == VIR_DOMAIN_CHR_TYPE_UNIX) + return; + dev = virJSONValueObjectGet(config, device); if (!dev) { virReportError(VIR_ERR_INTERNAL_ERROR, -- 2.43.0

On 3/5/24 21:57, Praveen K Paladugu wrote:
This patchset adds support for Unix mode to serial port device in ch guests.
Praveen K Paladugu (2): ch: Add Cap checks for unix backend of serial port ch: Add support for `Unix` mode to serial port dev
src/ch/ch_capabilities.c | 6 ++++++ src/ch/ch_capabilities.h | 1 + src/ch/ch_domain.c | 21 +++++++++++++++------ src/ch/ch_monitor.c | 35 ++++++++++++++++++++++++----------- src/ch/ch_process.c | 7 +++++++ 5 files changed, 53 insertions(+), 17 deletions(-)
I'm fixing small coding style issues and merging. Reviewed-by: Michal Privoznik <mprivozn@redhat.com> Michal
participants (2)
-
Michal Prívozník
-
Praveen K Paladugu