Files
xen/tools/memshr/bidir-daemon.c
T
Andres Lagar-Cavilla 447e175bad Update memshr API and tools
This patch is the folded version of API updates, along with the associated tool
changes to ensure that the build is always consistent.

API updates:
- The source domain in the sharing calls is no longer assumed to be dom0.
- Previously, the mem sharing code would return an opaque handle to index
  shared pages (and nominees) in its global hash table.  By removing the hash
  table, the handle becomes a version, to avoid sharing a stale version of a
  page. Thus, libxc wrappers and tools need to be updated to recall the share
  functions with the information needed to fetch the page (which they readily
  have).

Tool updates:
The only (in-tree, that we know of) consumer of the mem sharing API is the
memshr tool. This is updated to use the new API.

Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Signed-off-by: Adin Scannell <adin@scannell.ca>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
Committed-by: Tim Deegan <tim@xen.org>
2012-01-26 12:46:26 +00:00

105 lines
3.2 KiB
C

/******************************************************************************
*
* Copyright (c) 2009 Citrix Systems, 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 <unistd.h>
#include <errno.h>
#include "bidir-hash.h"
#include "memshr-priv.h"
static struct blockshr_hash *blks_hash;
/* Callback in the iterator, remember this value, and leave */
int find_one(vbdblk_t k, share_tuple_t v, void *priv)
{
share_tuple_t *rv = (share_tuple_t *) priv;
*rv = v;
/* Break out of iterator loop */
return 1;
}
void* bidir_daemon(void *unused)
{
uint32_t nr_ent, max_nr_ent, tab_size, max_load, min_load;
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)
{
share_tuple_t next_remove;
int to_remove;
int ret;
to_remove = 0.1 * max_nr_ent;
while(to_remove > 0)
{
/* We use the iterator to get one entry */
next_remove.handle = 0;
ret = blockshr_hash_iterator(blks_hash, find_one, &next_remove);
if ( !ret )
if ( next_remove.handle == 0 )
ret = -ESRCH;
if ( !ret )
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.handle, 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 */
to_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();
}