[GSoC PATCH 2/9] Jailhouse driver: Implementation of ConnectOpen

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


On a Monday in 2020, Prakhar Bansal wrote:
>---
> include/libvirt/virterror.h         |   1 +
> po/POTFILES.in                      |   2 +
> src/jailhouse/Makefile.inc.am       |  34 ++-
> src/jailhouse/jailhouse.conf        |  10 +
> src/jailhouse/jailhouse_api.c       | 372 ++++++++++++++++++++++++++++
> src/jailhouse/jailhouse_api.h       |  74 ++++++
> src/jailhouse/jailhouse_driver.c    | 302 +++++++++++++++++-----
> src/jailhouse/jailhouse_driver.h    |  51 ++++
> src/jailhouse/meson.build           |   1 +
> src/libvirt.c                       |  10 -
> src/remote/remote_daemon.c          |   4 +
> src/remote/remote_daemon_dispatch.c |   3 +-
> 12 files changed, 783 insertions(+), 81 deletions(-)
> create mode 100644 src/jailhouse/jailhouse.conf
> create mode 100644 src/jailhouse/jailhouse_api.c
> create mode 100644 src/jailhouse/jailhouse_api.h
>
>diff --git a/include/libvirt/virterror.h b/include/libvirt/virterror.h
>index 97f2ac16d8..9f1bca2684 100644
>--- a/include/libvirt/virterror.h
>+++ b/include/libvirt/virterror.h
>@@ -137,6 +137,7 @@ typedef enum {
>     VIR_FROM_TPM = 70,          /* Error from TPM */
>     VIR_FROM_BPF = 71,          /* Error from BPF code */
>     VIR_FROM_JAILHOUSE = 72,    /* Error from Jailhouse driver */
>+

Unrelated whitespace change - more fitting for the first patch.

> # ifdef VIR_ENUM_SENTINELS
>     VIR_ERR_DOMAIN_LAST
> # endif
>diff --git a/po/POTFILES.in b/po/POTFILES.in
>index 3d6c20c55f..a94285817f 100644
>--- a/po/POTFILES.in
>+++ b/po/POTFILES.in
>@@ -85,6 +85,8 @@
> @SRCDIR at src/interface/interface_backend_netcf.c
> @SRCDIR at src/interface/interface_backend_udev.c
> @SRCDIR at src/internal.h
>+ at SRCDIR@src/jailhouse/jailhouse_api.c
>+ at SRCDIR@src/jailhouse/jailhouse_driver.c
> @SRCDIR at src/libvirt-domain-checkpoint.c
> @SRCDIR at src/libvirt-domain-snapshot.c
> @SRCDIR at src/libvirt-domain.c
>--- a/src/jailhouse/jailhouse_driver.c
>+++ b/src/jailhouse/jailhouse_driver.c
>@@ -16,43 +16,228 @@
>  * 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 <string.h>
>

No need to include string.h

>+#include "configmake.h"
>+#include "datatypes.h"
>+#include "domain_conf.h"

> #include "jailhouse_driver.h"

jailhouse_driver.h should stay at the top

> #include "virtypedparam.h"
> #include "virerror.h"
> #include "virstring.h"
> #include "viralloc.h"
>-#include "domain_conf.h"
> #include "virfile.h"
>-#include "datatypes.h"
>+#include "virlog.h"
> #include "vircommand.h"
>-#include <string.h>
>+#include "virpidfile.h"
>
>-#define UNUSED(x) (void)(x)
> static const char *
> jailhouseConnectGetType(virConnectPtr conn)
> {


Lots of unnecessary changes below here:

>@@ -69,36 +254,16 @@ jailhouseConnectGetHostname(virConnectPtr conn)
> }
>
> static int
>-jailhouseNodeGetInfo(virConnectPtr conn,
>-                     virNodeInfoPtr info)
>+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)
>+                               virDomainPtr ** domain, unsigned int flags)
> {
>     UNUSED(conn);
>     UNUSED(domain);
>@@ -107,8 +272,7 @@ jailhouseConnectListAllDomains(virConnectPtr conn,
> }
>
> static virDomainPtr
>-jailhouseDomainLookupByID(virConnectPtr conn,
>-                          int id)
>+jailhouseDomainLookupByID(virConnectPtr conn, int id)
> {
>     UNUSED(conn);
>     UNUSED(id);
>@@ -116,8 +280,7 @@ jailhouseDomainLookupByID(virConnectPtr conn,
> }
>
> static virDomainPtr
>-jailhouseDomainLookupByName(virConnectPtr conn,
>-                            const char *name)
>+jailhouseDomainLookupByName(virConnectPtr conn, const char *name)
> {
>     UNUSED(conn);
>     UNUSED(name);
>@@ -125,8 +288,7 @@ jailhouseDomainLookupByName(virConnectPtr conn,
> }
>
> static virDomainPtr
>-jailhouseDomainLookupByUUID(virConnectPtr conn,
>-                            const unsigned char *uuid)
>+jailhouseDomainLookupByUUID(virConnectPtr conn, const unsigned char *uuid)
> {
>     UNUSED(conn);
>     UNUSED(uuid);
>@@ -157,8 +319,7 @@ jailhouseDomainDestroy(virDomainPtr domain)
> }
>
> static int
>-jailhouseDomainGetInfo(virDomainPtr domain,
>-                       virDomainInfoPtr info)
>+jailhouseDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info)
> {
>     UNUSED(domain);
>     UNUSED(info);
>@@ -167,9 +328,7 @@ jailhouseDomainGetInfo(virDomainPtr domain,
>
> static int
> jailhouseDomainGetState(virDomainPtr domain,
>-                        int *state,
>-                        int *reason,
>-                        unsigned int flags)
>+                        int *state, int *reason, unsigned int flags)
> {
>     UNUSED(domain);
>     UNUSED(state);
>@@ -179,8 +338,7 @@ jailhouseDomainGetState(virDomainPtr domain,
> }
>
> static char *
>-jailhouseDomainGetXMLDesc(virDomainPtr domain,
>-                          unsigned int flags)
>+jailhouseDomainGetXMLDesc(virDomainPtr domain, unsigned int flags)
> {
>     UNUSED(domain);
>     UNUSED(flags);
>@@ -189,31 +347,43 @@ jailhouseDomainGetXMLDesc(virDomainPtr domain,
>
> static virHypervisorDriver jailhouseHypervisorDriver = {
>     .name = "JAILHOUSE",

>-    .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 */
>+    .connectOpen = jailhouseConnectOpen,        /* 6.3.0 */
>+    .connectClose = jailhouseConnectClose,      /* 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 */

Please don't try to align the comments, that way any change in spacing
results in a huge diff like this.

> };
>
>+
> static virConnectDriver jailhouseConnectDriver = {
>+    .localOnly = true,
>+    .uriSchemes = (const char *[]){ "jailhouse", NULL },
>     .hypervisorDriver = &jailhouseHypervisorDriver,
> };
>
>+
>+static virStateDriver jailhouseStateDriver = {
>+    .name = "JAILHOUSE",
>+    .stateInitialize = jailhouseStateInitialize,
>+    .stateCleanup = jailhouseStateCleanup,
>+};
>+
> int
> jailhouseRegister(void)
> {
>-    return virRegisterConnectDriver(&jailhouseConnectDriver, false);
>+    if (virRegisterConnectDriver(&jailhouseConnectDriver, false) < 0)
>+        return -1;
>+    if (virRegisterStateDriver(&jailhouseStateDriver) < 0)
>+        return -1;
>+    return 0;
> }
>diff --git a/src/jailhouse/jailhouse_driver.h
>b/src/jailhouse/jailhouse_driver.h
>index b0dbc8d033..8a0e111676 100644
>--- a/src/jailhouse/jailhouse_driver.h
>+++ b/src/jailhouse/jailhouse_driver.h
>@@ -20,4 +20,55 @@
>
> #pragma once
>
>+#include <linux/types.h>
>+
>+#include "jailhouse_api.h"
>+
> int jailhouseRegister(void);
>+
>+#define JAILHOUSE_CONFIG_FILE SYSCONFDIR
>"/libvirt/jailhouse/jailhouse.conf"
>+#define JAILHOUSE_STATE_DIR RUNSTATEDIR "/libvirt/jailhouse"
>+
>+#define JAILHOUSE_DEV "/dev/jailhouse"
>+
>+#define JAILHOUSE_SYSFS_DEV "/sys/devices/jailhouse/"
>+
>+typedef struct _virJailhouseDriver virJailhouseDriver;
>+typedef virJailhouseDriver *virJailhouseDriverPtr;
>+
>+typedef struct _virJailhouseDriverConfig virJailhouseDriverConfig;
>+typedef virJailhouseDriverConfig *virJailhouseDriverConfigPtr;
>+
>+struct _virJailhouseDriverConfig {
>+    virObject parent;
>+
>+    char *stateDir;
>+

>+    // File path of the jailhouse system configuration
>+    // for jailhouse enable/disable.
>+    char *sys_config_file_path;
>+
>+    // Config directory where all jailhouse cell configurations
>+    // are stored.
>+    char *cell_config_dir;
>+};
>+
>+struct _virJailhouseDriver {
>+    virMutex lock;
>+
>+    // Jailhouse configuration read from the jailhouse.conf

These should be using /* */ as the comment marker.

>+    virJailhouseDriverConfigPtr config;
>+
>+    /* pid file FD, ensures two copies of the driver can't use the same
>root */
>+    int lockFD;
>+
>+    // All the cells created during connect open on the hypervisor.
>+    virJailhouseCellInfoPtr *cell_info_list;
>+};
>+
>+struct _jailhouseCell {
>+    __s32 id;
>+    char *state;
>+    char *cpus_assigned_list;
>+    char *cpus_failed_list;
>+};
>diff --git a/src/jailhouse/meson.build b/src/jailhouse/meson.build
>index 45ceeecca3..a706985169 100644
>--- a/src/jailhouse/meson.build
>+++ b/src/jailhouse/meson.build
>@@ -1,5 +1,6 @@
> jailhouse_sources = files(
>   'jailhouse_driver.c',
>+  'jailhouse_api.c',
> )
>
> driver_source_files += jailhouse_sources

>diff --git a/src/libvirt.c b/src/libvirt.c
>index 59b75c6f7b..b2d0ba3d23 100644
>--- a/src/libvirt.c
>+++ b/src/libvirt.c
>@@ -75,9 +75,6 @@
> #ifdef WITH_BHYVE
> # include "bhyve/bhyve_driver.h"
> #endif
>-#ifdef WITH_JAILHOUSE
>-# include "jailhouse/jailhouse_driver.h"
>-#endif
> #include "access/viraccessmanager.h"
>
> #define VIR_FROM_THIS VIR_FROM_NONE
>@@ -274,10 +271,6 @@ virGlobalInit(void)
>     if (hypervRegister() == -1)
>         goto error;
> #endif
>-#ifdef WITH_JAILHOUSE
>-    if (jailhouseRegister() == -1)
>-        goto error;
>-#endif
> #ifdef WITH_REMOTE
>     if (remoteRegister() == -1)
>         goto error;
>@@ -1010,9 +1003,6 @@ virConnectOpenInternal(const char *name,
> #endif
> #ifndef WITH_VZ
>              STRCASEEQ(ret->uri->scheme, "parallels") ||
>-#endif
>-#ifndef WITH_JAILHOUSE
>-             STRCASEEQ(ret->uri->scheme, "jailhouse") ||
> #endif
>              false)) {
>             virReportErrorHelper(VIR_FROM_NONE, VIR_ERR_CONFIG_UNSUPPORTED,

These changes were all added in the first patch. Why remove them?

>diff --git a/src/remote/remote_daemon.c b/src/remote/remote_daemon.c
>index 1aa9bfc0d2..9d1b208a38 100644
>--- a/src/remote/remote_daemon.c
>+++ b/src/remote/remote_daemon.c
>@@ -145,6 +145,10 @@ static int daemonInitialize(void)
>     if (virDriverLoadModule("interface", "interfaceRegister", false) < 0)
>         return -1;
> # endif
>+# ifdef WITH_JAILHOUSE
>+    if (virDriverLoadModule("jailhouse", "jailhouseRegister", false) < 0)
>+        return -1;
>+# endif
> # ifdef WITH_SECRETS
>     if (virDriverLoadModule("secret", "secretRegister", false) < 0)
>         return -1;

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/7674431a/attachment-0001.sig>


More information about the libvir-list mailing list