[GSoC PATCH 1/9] Jailhouse driver: first commit with skeleton code

Ján Tomko jtomko at redhat.com
Tue Sep 1 14:02:24 UTC 2020


On a Monday in 2020, Prakhar Bansal wrote:
>---
> include/libvirt/virterror.h          |   2 +-
> libvirt.spec.in                      |   7 +
> m4/virt-driver-jailhouse.m4          |  42 +++++
> meson.build                          |   4 +
> meson_options.txt                    |   1 +
> src/conf/domain_conf.c               |   1 +
> src/conf/domain_conf.h               |   1 +
> src/jailhouse/Makefile.inc.am        |  21 +++
> src/jailhouse/jailhouse_driver.c     | 219 +++++++++++++++++++++++++++
> src/jailhouse/jailhouse_driver.h     |  23 +++
> src/jailhouse/libvirtd_jailhouse.aug |  43 ++++++
> src/jailhouse/meson.build            |  48 ++++++
> src/libvirt.c                        |  10 ++
> src/meson.build                      |   1 +
> src/qemu/qemu_command.c              |   1 +
> src/util/virerror.c                  |   1 +
> 16 files changed, 424 insertions(+), 1 deletion(-)
> create mode 100644 m4/virt-driver-jailhouse.m4
> create mode 100644 src/jailhouse/Makefile.inc.am
> create mode 100644 src/jailhouse/jailhouse_driver.c
> create mode 100644 src/jailhouse/jailhouse_driver.h
> create mode 100644 src/jailhouse/libvirtd_jailhouse.aug
> create mode 100644 src/jailhouse/meson.build
>

[...]

>diff --git a/m4/virt-driver-jailhouse.m4 b/m4/virt-driver-jailhouse.m4
>new file mode 100644
>index 0000000000..9008c6ce30
>--- /dev/null
>+++ b/m4/virt-driver-jailhouse.m4

m4/virt-driver-jailhouse.m4 is not needed anymore, after the switch to
Meson

>diff --git a/meson.build b/meson.build
>index dabd4196e6..d0f31f916b 100644
>--- a/meson.build
>+++ b/meson.build
>@@ -1889,6 +1889,10 @@ elif get_option('secdriver_selinux').enabled()
>   error('You must install the libselinux development package in order to
>compile libvirt.')
> endif
>
>+if get_option('driver_jailhouse').enabled()
>+  conf.set('WITH_JAILHOUSE', 1)
>+endif
>+
> if conf.has('WITH_QEMU') or conf.has('WITH_LXC') or
>conf.has('WITH_NETWORK')
>   conf.set('WITH_BRIDGE', 1)
> endif
>diff --git a/meson_options.txt b/meson_options.txt
>index 79554c3186..c1f2b51427 100644
>--- a/meson_options.txt
>+++ b/meson_options.txt
>@@ -68,6 +68,7 @@ option('driver_vbox', type: 'feature', value: 'enabled',
>description: 'VirtualBo
> option('vbox_xpcomc_dir', type: 'string', value: '', description:
>'Location of directory containing VirtualBox XPCOMC library')
> option('driver_vmware', type: 'feature', value: 'enabled', description:
>'VMware driver')
> option('driver_vz', type: 'feature', value: 'auto', description:
>'Virtuozzo driver')
>+option('driver_jailhouse', type: 'feature', value: 'auto', description:
>'Jailhouse driver')
>
> option('secdriver_apparmor', type: 'feature', value: 'auto', description:
>'use AppArmor security driver')
> option('apparmor_profiles', type: 'boolean', value: false, description:
>'install apparmor profiles')
>diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>index 5d3ae8bb28..cb946d5e87 100644
>--- a/src/conf/domain_conf.c
>+++ b/src/conf/domain_conf.c
>@@ -130,6 +130,7 @@ VIR_ENUM_IMPL(virDomainVirt,
>               "parallels",
>               "bhyve",
>               "vz",
>+              "jailhouse",
> );
>
> VIR_ENUM_IMPL(virDomainOS,
>diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
>index 8a0f26f5c0..cc51547bc2 100644
>--- a/src/conf/domain_conf.h
>+++ b/src/conf/domain_conf.h
>@@ -139,6 +139,7 @@ typedef enum {
>     VIR_DOMAIN_VIRT_PARALLELS,
>     VIR_DOMAIN_VIRT_BHYVE,
>     VIR_DOMAIN_VIRT_VZ,
>+    VIR_DOMAIN_VIRT_JAILHOUSE,
>
>     VIR_DOMAIN_VIRT_LAST
> } virDomainVirtType;
>diff --git a/src/jailhouse/Makefile.inc.am b/src/jailhouse/Makefile.inc.am
>new file mode 100644
>index 0000000000..02822b2ea1
>--- /dev/null
>+++ b/src/jailhouse/Makefile.inc.am
>@@ -0,0 +1,21 @@
>+# vim: filetype=automake
>+
>+JAILHOUSE_DRIVER_SOURCES = \
>+       jailhouse/jailhouse_driver.c \
>+       jailhouse/jailhouse_driver.h \
>+       $(NULL)
>+
>+
>+DRIVER_SOURCE_FILES += $(addprefix $(srcdir)/,$(JAILHOUSE_DRIVER_SOURCES))
>+
>+EXTRA_DIST += $(JAILHOUSE_DRIVER_SOURCES)
>+
>+if WITH_JAILHOUSE
>+noinst_LTLIBRARIES += libvirt_driver_jailhouse.la
>+libvirt_la_BUILT_LIBADD += libvirt_driver_jailhouse.la
>+libvirt_driver_jailhouse_la_CFLAGS = \
>+       -I$(srcdir)/conf \
>+       $(AM_CFLAGS) \
>+       $(NULL)
>+libvirt_driver_jailhouse_la_SOURCES = $(JAILHOUSE_DRIVER_SOURCES)
>+endif WITH_JAILHOUSE
>diff --git a/src/jailhouse/jailhouse_driver.c
>b/src/jailhouse/jailhouse_driver.c
>new file mode 100644
>index 0000000000..0175ba771b
>--- /dev/null
>+++ b/src/jailhouse/jailhouse_driver.c
>@@ -0,0 +1,219 @@
>+/*
>+ * jailhouse_driver.c: Implementation of driver for Jailhouse hypervisor
>+ *
>+ * Copyright (C) 2020 Prakhar Bansal
>+ *
>+ * This library is free software; you can redistribute it and/or
>+ * modify it under the terms of the GNU Lesser General Public
>+ * License as published by the Free Software Foundation; either
>+ * version 2.1 of the License, or (at your option) any later version.
>+ *
>+ * This library is distributed in the hope that it will be useful,
>+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
>+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+ * Lesser General Public License for more details.
>+ *
>+ * You should have received a copy of the GNU Lesser General Public
>+ * License along with this library.  If not, see
>+ * <http://www.gnu.org/licenses/>.
>+ */
>+
>+#include <config.h>
>+
>+#include "jailhouse_driver.h"
>+#include "virtypedparam.h"
>+#include "virerror.h"
>+#include "virstring.h"
>+#include "viralloc.h"
>+#include "domain_conf.h"
>+#include "virfile.h"
>+#include "datatypes.h"
>+#include "vircommand.h"

>+#include <string.h>

This should not be needed if you include internal.h,
which should be included transitively by the includes above.

>+
>+#define UNUSED(x) (void)(x)
>+

We have G_GNUC_UNUSED, that can be used like:

>+jailhouseConnectOpen(virConnectPtr conn G_GNUC_UNUSED,
>+                     virConnectAuthPtr auth,
>+                     virConfPtr conf,
>+                     unsigned int flags)

however, there is no need to include all these functions in the first
patch (see below)

>+static virDrvOpenStatus
>+jailhouseConnectOpen(virConnectPtr conn,
>+                     virConnectAuthPtr auth,
>+                     virConfPtr conf,
>+                     unsigned int flags)
>+{
>+    UNUSED(conn);
>+    UNUSED(auth);
>+    UNUSED(conf);
>+    UNUSED(flags);
>+    return 0;
>+}
>+
>+static int
>+jailhouseConnectClose(virConnectPtr conn)
>+{
>+    UNUSED(conn);
>+    return 0;
>+}
>+
>+static const char *
>+jailhouseConnectGetType(virConnectPtr conn)
>+{
>+    UNUSED(conn);
>+    return NULL;
>+
>+}
>+
>+static char *
>+jailhouseConnectGetHostname(virConnectPtr conn)
>+{
>+    UNUSED(conn);
>+    return NULL;
>+}
>+
>+static int
>+jailhouseNodeGetInfo(virConnectPtr conn,
>+                     virNodeInfoPtr info)
>+{
>+    UNUSED(conn);
>+    UNUSED(info);
>+    return -1;
>+}
>+
>+static int
>+jailhouseConnectListDomains(virConnectPtr conn,
>+                            int *ids,
>+                            int maxids)
>+{
>+    UNUSED(conn);
>+    UNUSED(ids);
>+    UNUSED(maxids);
>+    return -1;
>+}
>+
>+static int
>+jailhouseConnectNumOfDomains(virConnectPtr conn)
>+{
>+    UNUSED(conn);
>+    return -1;
>+}
>+
>+static int
>+jailhouseConnectListAllDomains(virConnectPtr conn,
>+                               virDomainPtr **domain,
>+                               unsigned int flags)
>+{
>+    UNUSED(conn);
>+    UNUSED(domain);
>+    UNUSED(flags);
>+    return -1;
>+}
>+
>+static virDomainPtr
>+jailhouseDomainLookupByID(virConnectPtr conn,
>+                          int id)
>+{
>+    UNUSED(conn);
>+    UNUSED(id);
>+    return NULL;
>+}
>+
>+static virDomainPtr
>+jailhouseDomainLookupByName(virConnectPtr conn,
>+                            const char *name)
>+{
>+    UNUSED(conn);
>+    UNUSED(name);
>+    return NULL;
>+}
>+
>+static virDomainPtr
>+jailhouseDomainLookupByUUID(virConnectPtr conn,
>+                            const unsigned char *uuid)
>+{
>+    UNUSED(conn);
>+    UNUSED(uuid);
>+    return NULL;
>+}
>+
>+static int
>+jailhouseDomainCreate(virDomainPtr domain)
>+{
>+    UNUSED(domain);
>+    return -1;
>+
>+}
>+
>+static int
>+jailhouseDomainShutdown(virDomainPtr domain)
>+{
>+    UNUSED(domain);
>+    return -1;
>+}
>+
>+
>+static int
>+jailhouseDomainDestroy(virDomainPtr domain)
>+{
>+    UNUSED(domain);
>+    return -1;
>+}
>+
>+static int
>+jailhouseDomainGetInfo(virDomainPtr domain,
>+                       virDomainInfoPtr info)
>+{
>+    UNUSED(domain);
>+    UNUSED(info);
>+    return -1;
>+}
>+
>+static int
>+jailhouseDomainGetState(virDomainPtr domain,
>+                        int *state,
>+                        int *reason,
>+                        unsigned int flags)
>+{
>+    UNUSED(domain);
>+    UNUSED(state);
>+    UNUSED(reason);
>+    UNUSED(flags);
>+    return -1;
>+}
>+
>+static char *
>+jailhouseDomainGetXMLDesc(virDomainPtr domain,
>+                          unsigned int flags)
>+{
>+    UNUSED(domain);
>+    UNUSED(flags);
>+    return NULL;
>+}
>+
>+static virHypervisorDriver jailhouseHypervisorDriver = {
>+    .name = "JAILHOUSE",

Why is this all uppercase? From the cover letter it seems "Jailhouse" is
the preferred spelling.

>+    .connectOpen = jailhouseConnectOpen, /* 6.3.0 */
>+    .connectClose = jailhouseConnectClose, /* 6.3.0 */
>+    .connectListDomains = jailhouseConnectListDomains, /* 6.3.0 */
>+    .connectNumOfDomains = jailhouseConnectNumOfDomains, /* 6.3.0 */
>+    .connectListAllDomains = jailhouseConnectListAllDomains, /* 6.3.0 */
>+    .domainLookupByID = jailhouseDomainLookupByID, /* 6.3.0 */
>+    .domainLookupByUUID = jailhouseDomainLookupByUUID, /* 6.3.0 */
>+    .domainLookupByName = jailhouseDomainLookupByName, /* 6.3.0 */
>+    .domainGetXMLDesc = jailhouseDomainGetXMLDesc, /* 6.3.0 */
>+    .domainCreate = jailhouseDomainCreate, /* 6.3.0 */
>+    .connectGetType = jailhouseConnectGetType, /* 6.3.0 */
>+    .connectGetHostname = jailhouseConnectGetHostname, /* 6.3.0 */
>+    .nodeGetInfo = jailhouseNodeGetInfo, /* 6.3.0 */
>+    .domainShutdown = jailhouseDomainShutdown, /* 6.3.0 */
>+    .domainDestroy = jailhouseDomainDestroy, /* 6.3.0 */
>+    .domainGetInfo = jailhouseDomainGetInfo, /* 6.3.0 */
>+    .domainGetState = jailhouseDomainGetState, /* 6.3.0 */

Apart from connectOpen and connectClose, there is no need to list all
the functions upfront. If you don't initialize them, the caller will
check whether a particular driver implements it or not before calling
it:
virDomainLookupByID(virConnectPtr conn, int id)
   ...

     if (conn->driver->domainLookupByID) {
         virDomainPtr ret;
         ret = conn->driver->domainLookupByID(conn, id);
         if (!ret)
             goto error;
         return ret;
     }


>+};
>+
>+static virConnectDriver jailhouseConnectDriver = {
>+    .hypervisorDriver = &jailhouseHypervisorDriver,
>+};
>+
>+int
>+jailhouseRegister(void)
>+{
>+    return virRegisterConnectDriver(&jailhouseConnectDriver, false);
>+}
>diff --git a/src/jailhouse/jailhouse_driver.h
>b/src/jailhouse/jailhouse_driver.h
>new file mode 100644
>index 0000000000..b0dbc8d033
>--- /dev/null
>+++ b/src/jailhouse/jailhouse_driver.h
>@@ -0,0 +1,23 @@
>+/*
>+ * jailhouse_driver.h: Libvirt driver for Jailhouse hypervisor
>+ *
>+ * Copyright (C) 2020 Prakhar Bansal
>+ *
>+ * This library is free software; you can redistribute it and/or
>+ * modify it under the terms of the GNU Lesser General Public
>+ * License as published by the Free Software Foundation; either
>+ * version 2.1 of the License, or (at your option) any later version.
>+ *
>+ * This library is distributed in the hope that it will be useful,
>+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
>+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+ * Lesser General Public License for more details.
>+ *
>+ * You should have received a copy of the GNU Lesser General Public
>+ * License along with this library.  If not, see
>+ * <http://www.gnu.org/licenses/>.
>+ */
>+
>+#pragma once
>+

#include "internal.h"
please

>+int jailhouseRegister(void);

Jano
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20200901/f2aa1690/attachment-0001.sig>


More information about the libvir-list mailing list