diff mbox

[API-NEXT,PATCHv8,03/15] linux-gen: _ishm: create description file for external memory sharing

Message ID 1479975872-4945-4-git-send-email-christophe.milard@linaro.org
State Superseded
Headers show

Commit Message

Christophe Milard Nov. 24, 2016, 8:24 a.m. UTC
A new flag called _ODP_ISHM_EXPORT is added to _ishm. When this flag is
specified at reserve() time, an extra file
("/tmp/odp-<pid>-shm-<blockname>", where <pid> is the process ID of the
main ODP instatiation process and <blockname> is the block name given at
reserve time) is created, describing to the underlying block attributes.
This file is meant to be used by processes external to ODP willing to
share this memory.

Signed-off-by: Christophe Milard <christophe.milard@linaro.org>

---
 platform/linux-generic/_ishm.c                  | 74 ++++++++++++++++++++++---
 platform/linux-generic/include/_ishm_internal.h |  1 +
 2 files changed, 68 insertions(+), 7 deletions(-)

-- 
2.7.4
diff mbox

Patch

diff --git a/platform/linux-generic/_ishm.c b/platform/linux-generic/_ishm.c
index 3371d94..e3ab8b4 100644
--- a/platform/linux-generic/_ishm.c
+++ b/platform/linux-generic/_ishm.c
@@ -99,6 +99,14 @@ 
 #define ISHM_FILENAME_NORMAL_PAGE_DIR "/tmp"
 
 /*
+ * when the memory is to be shared with an external entity (such as another
+ * ODP instance or an OS process not part of this ODP instance) then a
+ * export file is created describing the exported memory: this defines the
+ * location and the filename format of this description file
+ */
+#define ISHM_EXPTNAME_FORMAT "/tmp/odp-%d-shm-%s"
+
+/*
  * At worse case the virtual space gets so fragmented that there is
  * a unallocated fragment between each allocated fragment:
  * In that case, the number of fragments to take care of is twice the
@@ -107,6 +115,17 @@ 
 #define ISHM_NB_FRAGMNTS (ISHM_MAX_NB_BLOCKS * 2 + 1)
 
 /*
+ * when a memory block is to be exported outside its ODP instance,
+ * an block 'attribute file' is created in /tmp/odp-<pid>-shm-<name>.
+ * The information given in this file is according to the following:
+ */
+#define EXPORT_FILE_LINE1_FMT "ODP exported shm block info:"
+#define EXPORT_FILE_LINE2_FMT "ishm_blockname: %s"
+#define EXPORT_FILE_LINE3_FMT "file: %s"
+#define EXPORT_FILE_LINE4_FMT "length: %" PRIu64
+#define EXPORT_FILE_LINE5_FMT "flags: %" PRIu32
+#define EXPORT_FILE_LINE6_FMT "align: %" PRIu32
+/*
  * A fragment describes a piece of the shared virtual address space,
  * and is allocated only when allocation is done with the _ODP_ISHM_SINGLE_VA
  * flag:
@@ -136,6 +155,7 @@  typedef struct ishm_fragment {
 typedef struct ishm_block {
 	char name[ISHM_NAME_MAXLEN];    /* name for the ishm block (if any) */
 	char filename[ISHM_FILENAME_MAXLEN]; /* name of the .../odp-* file  */
+	char exptname[ISHM_FILENAME_MAXLEN]; /* name of the export file     */
 	int  main_odpthread;     /* The thread which did the initial reserve*/
 	uint32_t user_flags;     /* any flags the user want to remember.    */
 	uint32_t flags;          /* block creation flags.                   */
@@ -380,7 +400,8 @@  static void free_fragment(ishm_fragment_t *fragmnt)
  * or /mnt/huge/odp-<pid>-<sequence_or_name> (for huge pages)
  * Return the new file descriptor, or -1 on error.
  */
-static int create_file(int block_index, int huge, uint64_t len)
+static int create_file(int block_index, int huge, uint64_t len,
+		       uint32_t flags, uint32_t align)
 {
 	char *name;
 	int  fd;
@@ -388,6 +409,7 @@  static int create_file(int block_index, int huge, uint64_t len)
 	char seq_string[ISHM_FILENAME_MAXLEN];   /* used to construct filename*/
 	char filename[ISHM_FILENAME_MAXLEN];/* filename in /tmp/ or /mnt/huge */
 	int  oflag = O_RDWR | O_CREAT | O_TRUNC; /* flags for open	      */
+	FILE *export_file;
 
 	new_block = &ishm_tbl->block[block_index];
 	name = new_block->name;
@@ -429,9 +451,48 @@  static int create_file(int block_index, int huge, uint64_t len)
 
 	strncpy(new_block->filename, filename, ISHM_FILENAME_MAXLEN - 1);
 
+	/* if _ODP_ISHM_EXPORT is set, create a description file for
+	 * external ref:
+	 */
+	if (flags & _ODP_ISHM_EXPORT) {
+		snprintf(new_block->exptname, ISHM_FILENAME_MAXLEN,
+			 ISHM_EXPTNAME_FORMAT,
+			 odp_global_data.main_pid,
+			 (name && name[0]) ? name : seq_string);
+		export_file = fopen(new_block->exptname, "w");
+		if (export_file == NULL) {
+			ODP_ERR("open failed: err=%s.\n",
+				strerror(errno));
+			new_block->exptname[0] = 0;
+		} else {
+			fprintf(export_file, EXPORT_FILE_LINE1_FMT "\n");
+			fprintf(export_file, EXPORT_FILE_LINE2_FMT "\n",  name);
+			fprintf(export_file, EXPORT_FILE_LINE3_FMT "\n",
+				new_block->filename);
+			fprintf(export_file, EXPORT_FILE_LINE4_FMT "\n", len);
+			fprintf(export_file, EXPORT_FILE_LINE5_FMT "\n", flags);
+			fprintf(export_file, EXPORT_FILE_LINE6_FMT "\n", align);
+
+			fclose(export_file);
+		}
+	} else {
+		new_block->exptname[0] = 0;
+	}
+
 	return fd;
 }
 
+/* delete the files related to a given ishm block: */
+static void delete_file(ishm_block_t *block)
+{
+	/* remove the .../odp-* file, unless fd was external: */
+	if (block->filename[0] != 0)
+		unlink(block->filename);
+	/* also remove possible description file (if block was exported): */
+	if (block->exptname[0] != 0)
+		unlink(block->exptname);
+}
+
 /*
  * performs the mapping, possibly allocating a fragment of the pre-reserved
  * VA space if the _ODP_ISHM_SINGLE_VA flag was given.
@@ -456,7 +517,7 @@  static void *do_map(int block_index, uint64_t len, uint32_t align,
 	 * unless a fd was already given
 	 */
 	if (*fd < 0) {
-		*fd = create_file(block_index, huge, len);
+		*fd = create_file(block_index, huge, len, flags, align);
 		if (*fd < 0)
 			return NULL;
 	} else {
@@ -471,7 +532,7 @@  static void *do_map(int block_index, uint64_t len, uint32_t align,
 			if (new_block->filename[0]) {
 				close(*fd);
 				*fd = -1;
-				unlink(new_block->filename);
+				delete_file(new_block);
 			}
 			return NULL;
 		}
@@ -486,7 +547,7 @@  static void *do_map(int block_index, uint64_t len, uint32_t align,
 		if (new_block->filename[0]) {
 			close(*fd);
 			*fd = -1;
-			unlink(new_block->filename);
+			delete_file(new_block);
 		}
 		return NULL;
 	}
@@ -867,9 +928,8 @@  static int block_free(int block_index)
 		do_unmap(NULL, 0, block->flags, block_index);
 	}
 
-	/* remove the .../odp-* file, unless fd was external: */
-	if (block->filename[0] != 0)
-		unlink(block->filename);
+	/* remove all files related to this block: */
+	delete_file(block);
 
 	/* deregister the file descriptor from the file descriptor server. */
 	_odp_fdserver_deregister_fd(FD_SRV_CTX_ISHM, block_index);
diff --git a/platform/linux-generic/include/_ishm_internal.h b/platform/linux-generic/include/_ishm_internal.h
index 3231b60..f5de26e 100644
--- a/platform/linux-generic/include/_ishm_internal.h
+++ b/platform/linux-generic/include/_ishm_internal.h
@@ -14,6 +14,7 @@  extern "C" {
 /* flags available at ishm_reserve: */
 #define _ODP_ISHM_SINGLE_VA		1
 #define _ODP_ISHM_LOCK			2
+#define _ODP_ISHM_EXPORT		4 /*create export descr file in /tmp */
 
 /**
  * Shared memory block info