summaryrefslogtreecommitdiff
path: root/0050-Use-user-defined-shm-for-CRI-request.patch
diff options
context:
space:
mode:
Diffstat (limited to '0050-Use-user-defined-shm-for-CRI-request.patch')
-rw-r--r--0050-Use-user-defined-shm-for-CRI-request.patch171
1 files changed, 171 insertions, 0 deletions
diff --git a/0050-Use-user-defined-shm-for-CRI-request.patch b/0050-Use-user-defined-shm-for-CRI-request.patch
new file mode 100644
index 0000000..2d61c9d
--- /dev/null
+++ b/0050-Use-user-defined-shm-for-CRI-request.patch
@@ -0,0 +1,171 @@
+From 162123bdec0f45f7b2001b2b0b83705cc6b9b1b1 Mon Sep 17 00:00:00 2001
+From: xuxuepeng <xuxuepeng1@huawei.com>
+Date: Mon, 8 Apr 2024 20:53:57 +0800
+Subject: [PATCH 50/69] Use user defined shm for CRI request
+
+Signed-off-by: xuxuepeng <xuxuepeng1@huawei.com>
+---
+ src/daemon/modules/spec/specs_mount.c | 128 +++++++++++++++++---------
+ 1 file changed, 85 insertions(+), 43 deletions(-)
+
+diff --git a/src/daemon/modules/spec/specs_mount.c b/src/daemon/modules/spec/specs_mount.c
+index 20bf5378..6903ae40 100644
+--- a/src/daemon/modules/spec/specs_mount.c
++++ b/src/daemon/modules/spec/specs_mount.c
+@@ -2799,33 +2799,31 @@ out_free:
+ return ret;
+ }
+
+-#define SHM_MOUNT_POINT "/dev/shm"
+-static int set_shm_path(host_config *host_spec, container_config_v2_common_config *v2_spec)
++static inline int set_sharable_ipc_mode(host_config *host_spec, container_config_v2_common_config *v2_spec)
+ {
+- int ret = 0;
+- container_t *cont = NULL;
+- char *tmp_cid = NULL;
+- char *right_path = NULL;
+-
+- // ignore shm of system container
+- if (host_spec->system_container) {
++ free(v2_spec->shm_path);
++#ifdef ENABLE_CRI_API_V1
++ // In the case of sandbox API is used, the shm path has already been created in CRI,
++ // so we need to use the sandbox's shm path
++ if (is_sandbox_container(v2_spec->sandbox_info)) {
++ v2_spec->shm_path = util_strdup_s(v2_spec->sandbox_info->shm_path);
+ return 0;
+ }
+- // setup shareable dirs
+- if (is_shareable_ipc(host_spec->ipc_mode)) {
+- // has mount for /dev/shm
+- if (has_mount_shm(host_spec, v2_spec)) {
+- return 0;
+- }
++#endif
++ v2_spec->shm_path = get_prepare_share_shm_path(host_spec->runtime, v2_spec->id);
++ if (v2_spec->shm_path == NULL) {
++ ERROR("Failed to get prepare share shm path");
++ return -1;
++ }
+
+- v2_spec->shm_path = get_prepare_share_shm_path(host_spec->runtime, v2_spec->id);
+- if (v2_spec->shm_path == NULL) {
+- ERROR("Failed to get prepare share shm path");
+- return -1;
+- }
++ return 0;
++}
+
+- return 0;
+- }
++static inline int set_connected_container_shm_path(host_config *host_spec, container_config_v2_common_config *v2_spec)
++{
++ container_t *cont = NULL;
++ char *tmp_cid = NULL;
++ char *right_path = NULL;
+
+ #ifdef ENABLE_CRI_API_V1
+ // Sandbox API is used and the connected container is actually a sandbox
+@@ -2833,34 +2831,78 @@ static int set_shm_path(host_config *host_spec, container_config_v2_common_confi
+ if (namespace_is_sandbox(host_spec->ipc_mode, v2_spec->sandbox_info)) {
+ free(v2_spec->shm_path);
+ v2_spec->shm_path = util_strdup_s(v2_spec->sandbox_info->shm_path);
+- goto out;
++ return 0;
+ }
+ #endif
+
+- if (namespace_is_container(host_spec->ipc_mode)) {
+- tmp_cid = namespace_get_connected_container(host_spec->ipc_mode);
+- cont = containers_store_get(tmp_cid);
+- if (cont == NULL) {
+- ERROR("Invalid share path: %s", host_spec->ipc_mode);
+- ret = -1;
+- goto out;
+- }
+- right_path = util_strdup_s(cont->common_config->shm_path);
+- container_unref(cont);
+- } else if (namespace_is_host(host_spec->ipc_mode)) {
+- if (!util_file_exists(SHM_MOUNT_POINT)) {
+- ERROR("/dev/shm is not mounted, but must be for --ipc=host");
+- ret = -1;
+- goto out;
+- }
+- right_path = util_strdup_s(SHM_MOUNT_POINT);
++ tmp_cid = namespace_get_connected_container(host_spec->ipc_mode);
++ cont = containers_store_get(tmp_cid);
++ if (cont == NULL) {
++ ERROR("Invalid share path: %s", host_spec->ipc_mode);
++ return -1;
+ }
++ right_path = util_strdup_s(cont->common_config->shm_path);
++ container_unref(cont);
+
+ free(v2_spec->shm_path);
+ v2_spec->shm_path = right_path;
+-out:
+- free(tmp_cid);
+- return ret;
++
++ return 0;
++}
++
++#define SHM_MOUNT_POINT "/dev/shm"
++static inline int set_host_ipc_shm_path(container_config_v2_common_config *v2_spec)
++{
++ if (!util_file_exists(SHM_MOUNT_POINT)) {
++ ERROR("/dev/shm is not mounted, but must be for --ipc=host");
++ return -1;
++ }
++ free(v2_spec->shm_path);
++ v2_spec->shm_path = util_strdup_s(SHM_MOUNT_POINT);
++ return 0;
++}
++
++/**
++ * There are 4 cases for setting shm path:
++ * 1. The user defined /dev/shm in mounts, which takes the first priority
++ * 2. If sharable is set in ipc mode (or by default ipc_mode is null), the container provides shm path,
++ * in the case of sandbox API is used, the sandbox module has already provided shm path
++ * 3. Use the connected container's shm path if ipc_mode is set to container:<cid>,
++ * if connected containerd is a sandbox, use the sandbox's shm path
++ * 4. Use /dev/shm if ipc_mode is set to host
++ */
++static int set_shm_path(host_config *host_spec, container_config_v2_common_config *v2_spec)
++{
++ // ignore shm of system container
++ if (host_spec->system_container) {
++ return 0;
++ }
++
++ // case 1: Defined in mounts already
++ if (has_mount_shm(host_spec, v2_spec)) {
++ return 0;
++ }
++
++ // case 2: Container has its own IPC namespace
++ if (is_shareable_ipc(host_spec->ipc_mode)) {
++ return set_sharable_ipc_mode(host_spec, v2_spec);
++ }
++
++ // case 3: Connected container
++ if (namespace_is_container(host_spec->ipc_mode)) {
++ return set_connected_container_shm_path(host_spec, v2_spec);
++ }
++
++ // case 4: Host IPC namespace
++ if (namespace_is_host(host_spec->ipc_mode)) {
++ return set_host_ipc_shm_path(v2_spec);
++ }
++
++ // Otherwise, the case is unknown, nothing is set
++ free(v2_spec->shm_path);
++ v2_spec->shm_path = NULL;
++
++ return 0;
+ }
+
+ int destination_compare(const void *p1, const void *p2)
+--
+2.34.1
+