]> xenbits.xensource.com Git - xen.git/commitdiff
Maintains/cleans-up the sharing map. At the moment a simple FIFO policy is
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 17 Dec 2009 06:27:57 +0000 (06:27 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 17 Dec 2009 06:27:57 +0000 (06:27 +0000)
applied.

Signed-off-by: Grzegorz Milos <Grzegorz.Milos@citrix.com>
tools/memshr/Makefile
tools/memshr/bidir-daemon.c [new file with mode: 0644]
tools/memshr/bidir-daemon.h [new file with mode: 0644]
tools/memshr/interface.c

index e7cf33b360405e427cb90129277025a7d75a44ec..fcf3a4ef22719a17a0c41c26a89b763ee9156b47 100644 (file)
@@ -17,10 +17,12 @@ DEPS             = .*.d
 
 LIB-SRCS        := interface.c
 LIB-SRCS        += shm.c
+LIB-SRCS        += bidir-daemon.c
 LIB-SRCS        += bidir-hash.c
 
 LIB-OBJS        := interface.o
 LIB-OBJS        += shm.o
+LIB-OBJS        += bidir-daemon.o
 LIB-OBJS        += bidir-hash-fgprtshr.o
 LIB-OBJS        += bidir-hash-blockshr.o
 
diff --git a/tools/memshr/bidir-daemon.c b/tools/memshr/bidir-daemon.c
new file mode 100644 (file)
index 0000000..b5077f2
--- /dev/null
@@ -0,0 +1,89 @@
+/******************************************************************************
+ *
+ * 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 <pthread.h>
+#include <inttypes.h>
+
+#include "bidir-hash.h"
+#include "memshr-priv.h"
+
+static struct blockshr_hash *blks_hash;
+
+void* bidir_daemon(void *unused)
+{
+    uint32_t nr_ent, max_nr_ent, tab_size, max_load, min_load;
+    static uint64_t shrhnd = 1;
+
+    while(1)
+    {
+        blockshr_hash_sizes( blks_hash, 
+                            &nr_ent, 
+                            &max_nr_ent,
+                            &tab_size, 
+                            &max_load, 
+                            &min_load);
+        /* Remove some hints as soon as we get to 90% capacity */ 
+        if(10 * nr_ent > 9 * max_nr_ent)
+        {
+            uint64_t next_remove = shrhnd;
+            int to_remove;
+            int ret;
+
+            to_remove = 0.1 * max_nr_ent; 
+            while(to_remove > 0) 
+            {
+                ret = blockshr_shrhnd_remove(blks_hash, next_remove, NULL);
+                if(ret < 0)
+                {
+                    /* We failed to remove an entry, because of a serious hash
+                     * table error */
+                    DPRINTF("Could not remove handle %"PRId64", error: %d\n",
+                            next_remove, ret);
+                    /* Force to exit the loop early */
+                    to_remove = 0;
+                } else 
+                if(ret > 0)
+                {
+                    /* Managed to remove the entry. Note next_remove not
+                     * incremented, in case there are duplicates */
+                    shrhnd = next_remove;
+                    to_remove--;
+                } else
+                {
+                    /* Failed to remove, because there is no such handle */
+                    next_remove++;
+                }
+            }
+        }
+
+        sleep(1);
+    }
+}
+
+void bidir_daemon_launch(void)
+{
+    pthread_t thread; 
+
+    pthread_create(&thread, NULL, bidir_daemon, NULL);
+}
+
+void bidir_daemon_initialize(struct blockshr_hash *blks)
+{
+    blks_hash = blks; 
+    bidir_daemon_launch();
+}
diff --git a/tools/memshr/bidir-daemon.h b/tools/memshr/bidir-daemon.h
new file mode 100644 (file)
index 0000000..8784e7b
--- /dev/null
@@ -0,0 +1,25 @@
+/******************************************************************************
+ *
+ * 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
+ */
+
+#ifndef __BIDIR_DAEMON_H__
+#define __BIDIR_DAEMON_H__
+
+void bidir_daemon_initialize(struct blockshr_hash *blks);
+
+#endif /* __BIDIR_DAEMON_H__ */
index 73fb144bfed4900b32c1ef0db7ffb6c72862d2a6..7ddee46fce60574314436ff9b878866d062479c4 100644 (file)
@@ -23,6 +23,7 @@
 #include "memshr-priv.h"
 #include "bidir-hash.h"
 #include "shm.h"
+#include "bidir-daemon.h"
 
 typedef struct {
     int     enabled;
@@ -32,6 +33,7 @@ typedef struct {
 
 memshr_vbd_info_t vbd_info = {0, DOMID_INVALID};
 
+
 typedef struct {
     struct shared_memshr_info *shared_info;
     struct fgprtshr_hash      *fgprts;
@@ -73,6 +75,8 @@ void memshr_daemon_initialize(void)
         return;
     }
     memshr.shared_info->blockshr_hash_inited = 1;
+    
+    bidir_daemon_initialize(memshr.blks);
 }