aboutsummaryrefslogtreecommitdiffstats
path: root/tools/memshr/interface.c
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2009-12-17 06:27:56 +0000
committerKeir Fraser <keir.fraser@citrix.com>2009-12-17 06:27:56 +0000
commitab562bd46c7041d82523322dde38d42494fb37ca (patch)
treed249f5ba799f603f43370f9eccac5b98821762b3 /tools/memshr/interface.c
parent7e31226c7a62a1b88727b9e718eb11b745de16ab (diff)
downloadxen-ab562bd46c7041d82523322dde38d42494fb37ca.tar.gz
xen-ab562bd46c7041d82523322dde38d42494fb37ca.tar.bz2
xen-ab562bd46c7041d82523322dde38d42494fb37ca.zip
Generic bi-directional map, and related initialisation functions. At the moment
a single map is used to store mappings between sharing handles and disk blocks. This is used to share pages which store data read of the same blocks on (virtual) disk. Note that the map is stored in a shared memory region, as it needs to be accessed by multiple tapdisk processes. This complicates memory allocation (malloc cannot be used), prevents poniters to be stored directly (as the shared memory region might and is mapped at different base address) and finally pthread locks need to be multi-process aware. Signed-off-by: Grzegorz Milos <Grzegorz.Milos@citrix.com>
Diffstat (limited to 'tools/memshr/interface.c')
-rw-r--r--tools/memshr/interface.c92
1 files changed, 92 insertions, 0 deletions
diff --git a/tools/memshr/interface.c b/tools/memshr/interface.c
new file mode 100644
index 0000000000..9ab20c213c
--- /dev/null
+++ b/tools/memshr/interface.c
@@ -0,0 +1,92 @@
+/******************************************************************************
+ *
+ * Copyright (c) 2009 Citrix (R&D) Inc. (Grzegorz Milos)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include <string.h>
+
+#include "memshr-priv.h"
+#include "shm.h"
+
+
+typedef struct {
+ struct shared_memshr_info *shared_info;
+ struct fgprtshr_hash *fgprts;
+ struct blockshr_hash *blks;
+} private_memshr_info_t;
+
+private_memshr_info_t memshr;
+
+#define SHARED_INFO (memshr.shared_info)
+
+void memshr_daemon_initialize(void)
+{
+ void *shm_base_addr;
+ struct fgprtshr_hash *h;
+
+ memset(&memshr, 0, sizeof(private_memshr_info_t));
+
+ if((SHARED_INFO = shm_shared_info_open(1)) == NULL)
+ {
+ DPRINTF("Failed to init shared info.\n");
+ return;
+ }
+
+ if((memshr.fgprts = shm_fgprtshr_hash_open(1)) == NULL)
+ {
+ DPRINTF("Failed to init fgprtshr hash.\n");
+ return;
+ }
+ memshr.shared_info->fgprtshr_hash_inited = 1;
+
+ if((memshr.blks = shm_blockshr_hash_open(1)) == NULL)
+ {
+ DPRINTF("Failed to init blockshr hash.\n");
+ return;
+ }
+ memshr.shared_info->blockshr_hash_inited = 1;
+}
+
+
+void memshr_vbd_initialize(void)
+{
+ memset(&memshr, 0, sizeof(private_memshr_info_t));
+
+ if((SHARED_INFO = shm_shared_info_open(0)) == NULL)
+ {
+ DPRINTF("Failed to open shared info.\n");
+ return;
+ }
+
+ if(!SHARED_INFO->fgprtshr_hash_inited)
+ {
+ DPRINTF("fgprtshr hash not inited.\n");
+ return;
+ }
+
+ if((memshr.fgprts = shm_fgprtshr_hash_open(0)) == NULL)
+ {
+ DPRINTF("Failed to open fgprtshr_hash.\n");
+ return;
+ }
+
+ if((memshr.blks = shm_blockshr_hash_open(0)) == NULL)
+ {
+ DPRINTF("Failed to open blockshr_hash.\n");
+ return;
+ }
+}
+