From: Bob Liu <lliubbo@gmail.com>
To: xen-devel@lists.xenproject.org
Cc: keir@xen.org, ian.campbell@citrix.com, JBeulich@suse.com
Subject: [PATCH v2 09/16] tmem: cleanup: drop runtime statistics
Date: Tue, 3 Dec 2013 10:19:10 +0800 [thread overview]
Message-ID: <1386037157-27261-10-git-send-email-bob.liu@oracle.com> (raw)
In-Reply-To: <1386037157-27261-1-git-send-email-bob.liu@oracle.com>
Tmem collects a lot of statistics and list them through tmemc_list().
But those statistics are mess, they are not well defined and unreadable.
This patch removes all of those statistics and leaves tmemc_list()
unimplemented so that it will be eaiser to do the clean up work.
Once tmem code is clean and good enough, really needed statistics will be
added back.
Signed-off-by: Bob Liu <bob.liu@oracle.com>
---
xen/common/tmem.c | 368 ++------------------------------------------
xen/include/xen/tmem_xen.h | 8 -
2 files changed, 15 insertions(+), 361 deletions(-)
diff --git a/xen/common/tmem.c b/xen/common/tmem.c
index c31141c..205ee95 100644
--- a/xen/common/tmem.c
+++ b/xen/common/tmem.c
@@ -26,29 +26,7 @@
#define TMEM_SPEC_VERSION 1
-/* global statistics (none need to be locked) */
-static unsigned long total_tmem_ops = 0;
-static unsigned long errored_tmem_ops = 0;
-static unsigned long total_flush_pool = 0;
-static unsigned long alloc_failed = 0, alloc_page_failed = 0;
-static unsigned long evicted_pgs = 0, evict_attempts = 0;
-static unsigned long relinq_pgs = 0, relinq_attempts = 0;
-static unsigned long max_evicts_per_relinq = 0;
-static unsigned long low_on_memory = 0;
-static unsigned long deduped_puts = 0;
-static unsigned long tot_good_eph_puts = 0;
-static int global_obj_count_max = 0;
-static int global_pgp_count_max = 0;
-static int global_pcd_count_max = 0;
-static int global_page_count_max = 0;
-static int global_rtree_node_count_max = 0;
-static long global_eph_count_max = 0;
-static unsigned long failed_copies;
-static unsigned long pcd_tot_tze_size = 0;
-static unsigned long pcd_tot_csize = 0;
-
/************ CORE DATA STRUCTURES ************************************/
-
#define MAX_POOLS_PER_DOMAIN 16
#define MAX_GLOBAL_SHARED_POOLS 16
@@ -61,7 +39,7 @@ struct client {
struct domain *domain;
struct xmem_pool *persistent_pool;
struct list_head ephemeral_page_list;
- long eph_count, eph_count_max;
+ long eph_count;
domid_t cli_id;
uint32_t weight;
uint32_t cap;
@@ -73,12 +51,6 @@ struct client {
bool_t was_frozen;
struct list_head persistent_invalidated_list;
struct tmem_page_descriptor *cur_pgp;
- /* statistics collection */
- unsigned long compress_poor, compress_nomem;
- unsigned long compressed_pages;
- uint64_t compressed_sum_size;
- uint64_t total_cycles;
- unsigned long succ_pers_puts, succ_eph_gets, succ_pers_gets;
/* shared pool authentication */
uint64_t shared_auth_uuid[MAX_GLOBAL_SHARED_POOLS][2];
};
@@ -109,17 +81,6 @@ struct tmem_pool {
struct tmem_page_descriptor *cur_pgp;
/* statistics collection */
atomic_t pgp_count;
- int pgp_count_max;
- long obj_count; /* atomicity depends on pool_rwlock held for write */
- long obj_count_max;
- unsigned long objnode_count, objnode_count_max;
- uint64_t sum_life_cycles;
- uint64_t sum_evicted_cycles;
- unsigned long puts, good_puts, no_mem_puts;
- unsigned long dup_puts_flushed, dup_puts_replaced;
- unsigned long gets, found_gets;
- unsigned long flushs, flushs_found;
- unsigned long flush_objs, flush_objs_found;
};
#define is_persistent(_p) (_p->persistent)
@@ -132,7 +93,6 @@ struct oid {
struct tmem_object_root {
struct oid oid;
struct rb_node rb_tree_node; /* protected by pool->pool_rwlock */
- unsigned long objnode_count; /* atomicity depends on obj_spinlock */
long pgp_count; /* atomicity depends on obj_spinlock */
struct radix_tree_root tree_root; /* tree of pages within object */
struct tmem_pool *pool;
@@ -198,7 +158,6 @@ struct rb_root pcd_tree_roots[256]; /* choose based on first byte of page */
rwlock_t pcd_tree_rwlocks[256]; /* poor man's concurrency for now */
static LIST_HEAD(global_ephemeral_page_list); /* all pages in ephemeral pools */
-
static LIST_HEAD(global_client_list);
static LIST_HEAD(global_pool_list);
@@ -208,7 +167,6 @@ static atomic_t client_weight_total = ATOMIC_INIT(0);
static int tmem_initialized = 0;
/************ CONCURRENCY ***********************************************/
-
DEFINE_SPINLOCK(tmem_spinlock); /* used iff tmem_lock_all */
DEFINE_RWLOCK(tmem_rwlock); /* used iff !tmem_lock_all */
static DEFINE_SPINLOCK(eph_lists_spinlock); /* protects global AND clients */
@@ -228,23 +186,6 @@ static DEFINE_SPINLOCK(pers_lists_spinlock);
/* global counters (should use long_atomic_t access) */
static long global_eph_count = 0; /* atomicity depends on eph_lists_spinlock */
-static atomic_t global_obj_count = ATOMIC_INIT(0);
-static atomic_t global_pgp_count = ATOMIC_INIT(0);
-static atomic_t global_pcd_count = ATOMIC_INIT(0);
-static atomic_t global_page_count = ATOMIC_INIT(0);
-static atomic_t global_rtree_node_count = ATOMIC_INIT(0);
-
-#define atomic_inc_and_max(_c) do { \
- atomic_inc(&_c); \
- if ( _atomic_read(_c) > _c##_max ) \
- _c##_max = _atomic_read(_c); \
-} while (0)
-
-#define atomic_dec_and_assert(_c) do { \
- atomic_dec(&_c); \
- ASSERT(_atomic_read(_c) >= 0); \
-} while (0)
-
/************ MEMORY ALLOCATION INTERFACE *****************************/
static void *tmem_malloc(size_t size, struct tmem_pool *pool)
@@ -261,8 +202,6 @@ static void *tmem_malloc(size_t size, struct tmem_pool *pool)
ASSERT( tmem_mempool != NULL );
v = xmem_pool_alloc(size, tmem_mempool);
}
- if ( v == NULL )
- alloc_failed++;
return v;
}
@@ -288,10 +227,6 @@ static struct page_info *tmem_page_alloc(struct tmem_pool *pool)
pfp = tmem_alloc_page_thispool(pool->client->domain);
else
pfp = tmem_alloc_page(pool,0);
- if ( pfp == NULL )
- alloc_page_failed++;
- else
- atomic_inc_and_max(global_page_count);
return pfp;
}
@@ -302,7 +237,6 @@ static void tmem_page_free(struct tmem_pool *pool, struct page_info *pfp)
tmem_free_page(pfp);
else
tmem_free_page_thispool(pfp);
- atomic_dec_and_assert(global_page_count);
}
/************ PAGE CONTENT DESCRIPTOR MANIPULATION ROUTINES ***********/
@@ -341,7 +275,6 @@ static void pcd_disassociate(struct tmem_page_descriptor *pgp, struct tmem_pool
pagesize_t pcd_size = pcd->size;
pagesize_t pgp_size = pgp->size;
char *pcd_cdata = pgp->pcd->cdata;
- pagesize_t pcd_csize = pgp->pcd->size;
ASSERT(tmem_dedup_enabled());
ASSERT(firstbyte != NOT_SHAREABLE);
@@ -370,25 +303,18 @@ static void pcd_disassociate(struct tmem_page_descriptor *pgp, struct tmem_pool
RB_CLEAR_NODE(&pcd->pcd_rb_tree_node);
/* now free up the pcd memory */
tmem_free(pcd, NULL);
- atomic_dec_and_assert(global_pcd_count);
if ( pgp_size != 0 && pcd_size < PAGE_SIZE )
{
/* compressed data */
tmem_free(pcd_cdata, pool);
- pcd_tot_csize -= pcd_csize;
}
else if ( pcd_size != PAGE_SIZE )
{
/* trailing zero data */
- pcd_tot_tze_size -= pcd_size;
if ( pcd_size )
tmem_free(pcd_tze, pool);
} else {
/* real physical page */
- if ( tmem_tze_enabled() )
- pcd_tot_tze_size -= PAGE_SIZE;
- if ( tmem_compression_enabled() )
- pcd_tot_csize -= PAGE_SIZE;
tmem_page_free(pool,pfp);
}
tmem_write_unlock(&pcd_tree_rwlocks[firstbyte]);
@@ -469,7 +395,6 @@ static int pcd_associate(struct tmem_page_descriptor *pgp, char *cdata, pagesize
/* but if compressed, data is assumed static so don't free! */
if ( cdata == NULL )
tmem_page_free(pgp->us.obj->pool,pgp->pfp);
- deduped_puts++;
goto match;
}
}
@@ -487,7 +412,6 @@ static int pcd_associate(struct tmem_page_descriptor *pgp, char *cdata, pagesize
goto unlock;
}
}
- atomic_inc_and_max(global_pcd_count);
RB_CLEAR_NODE(&pcd->pcd_rb_tree_node); /* is this necessary */
INIT_LIST_HEAD(&pcd->pgp_list); /* is this necessary */
pcd->pgp_ref_count = 0;
@@ -495,7 +419,6 @@ static int pcd_associate(struct tmem_page_descriptor *pgp, char *cdata, pagesize
{
memcpy(pcd->cdata,cdata,csize);
pcd->size = csize;
- pcd_tot_csize += csize;
} else if ( pfp_size == 0 ) {
ASSERT(tmem_tze_enabled());
pcd->size = 0;
@@ -504,15 +427,10 @@ static int pcd_associate(struct tmem_page_descriptor *pgp, char *cdata, pagesize
((pcd->tze = tmem_malloc(pfp_size,pgp->us.obj->pool)) != NULL) ) {
tmem_tze_copy_from_pfp(pcd->tze,pgp->pfp,pfp_size);
pcd->size = pfp_size;
- pcd_tot_tze_size += pfp_size;
tmem_page_free(pgp->us.obj->pool,pgp->pfp);
} else {
pcd->pfp = pgp->pfp;
pcd->size = PAGE_SIZE;
- if ( tmem_tze_enabled() )
- pcd_tot_tze_size += PAGE_SIZE;
- if ( tmem_compression_enabled() )
- pcd_tot_csize += PAGE_SIZE;
}
rb_link_node(&pcd->pcd_rb_tree_node, parent, new);
rb_insert_color(&pcd->pcd_rb_tree_node, root);
@@ -555,8 +473,7 @@ static struct tmem_page_descriptor *pgp_alloc(struct tmem_object_root *obj)
pgp->size = -1;
pgp->index = -1;
pgp->timestamp = get_cycles();
- atomic_inc_and_max(global_pgp_count);
- atomic_inc_and_max(pool->pgp_count);
+ atomic_inc(&pool->pgp_count);
return pgp;
}
@@ -580,11 +497,6 @@ static void pgp_free_data(struct tmem_page_descriptor *pgp, struct tmem_pool *po
tmem_free(pgp->cdata, pool);
else
tmem_page_free(pgp->us.obj->pool,pgp->pfp);
- if ( pool != NULL && pgp_size )
- {
- pool->client->compressed_pages--;
- pool->client->compressed_sum_size -= pgp_size;
- }
pgp->pfp = NULL;
pgp->size = -1;
}
@@ -605,8 +517,7 @@ static void pgp_free(struct tmem_page_descriptor *pgp, int from_delete)
ASSERT(list_empty(&pgp->us.client_eph_pages));
}
pgp_free_data(pgp, pool);
- atomic_dec_and_assert(global_pgp_count);
- atomic_dec_and_assert(pool->pgp_count);
+ atomic_dec(&pool->pgp_count);
pgp->size = -1;
if ( is_persistent(pool) && pool->client->live_migrating )
{
@@ -678,7 +589,6 @@ static void pgp_delete(struct tmem_page_descriptor *pgp, bool_t no_eph_lock)
ASSERT(pgp->us.obj != NULL);
ASSERT(pgp->us.obj->pool != NULL);
life = get_cycles() - pgp->timestamp;
- pgp->us.obj->pool->sum_life_cycles += life;
pgp_delist(pgp, no_eph_lock);
pgp_free(pgp,1);
}
@@ -736,10 +646,6 @@ static struct radix_tree_node *rtn_alloc(void *arg)
return NULL;
objnode->obj = obj;
memset(&objnode->rtn, 0, sizeof(struct radix_tree_node));
- if (++obj->pool->objnode_count > obj->pool->objnode_count_max)
- obj->pool->objnode_count_max = obj->pool->objnode_count;
- atomic_inc_and_max(global_rtree_node_count);
- obj->objnode_count++;
return &objnode->rtn;
}
@@ -755,11 +661,8 @@ static void rtn_free(struct radix_tree_node *rtn, void *arg)
ASSERT_SPINLOCK(&objnode->obj->obj_spinlock);
pool = objnode->obj->pool;
ASSERT(pool != NULL);
- pool->objnode_count--;
- objnode->obj->objnode_count--;
objnode->obj = NULL;
tmem_free(objnode, pool);
- atomic_dec_and_assert(global_rtree_node_count);
}
/************ POOL OBJECT COLLECTION MANIPULATION ROUTINES *******************/
@@ -852,15 +755,11 @@ static void obj_free(struct tmem_object_root *obj, int no_rebalance)
ASSERT_WRITELOCK(&pool->pool_rwlock);
if ( obj->tree_root.rnode != NULL ) /* may be a "stump" with no leaves */
radix_tree_destroy(&obj->tree_root, pgp_destroy);
- ASSERT((long)obj->objnode_count == 0);
ASSERT(obj->tree_root.rnode == NULL);
- pool->obj_count--;
- ASSERT(pool->obj_count >= 0);
obj->pool = NULL;
old_oid = obj->oid;
oid_set_invalid(&obj->oid);
obj->last_client = TMEM_CLI_ID_NULL;
- atomic_dec_and_assert(global_obj_count);
/* use no_rebalance only if all objects are being destroyed anyway */
if ( !no_rebalance )
rb_erase(&obj->rb_tree_node,&pool->obj_rb_root[oid_hash(&old_oid)]);
@@ -907,16 +806,11 @@ static struct tmem_object_root * obj_new(struct tmem_pool *pool, struct oid *oid
ASSERT_WRITELOCK(&pool->pool_rwlock);
if ( (obj = tmem_malloc(sizeof(struct tmem_object_root), pool)) == NULL )
return NULL;
- pool->obj_count++;
- if (pool->obj_count > pool->obj_count_max)
- pool->obj_count_max = pool->obj_count;
- atomic_inc_and_max(global_obj_count);
radix_tree_init(&obj->tree_root);
radix_tree_set_alloc_callbacks(&obj->tree_root, rtn_alloc, rtn_free, obj);
spin_lock_init(&obj->obj_spinlock);
obj->pool = pool;
obj->oid = *oidp;
- obj->objnode_count = 0;
obj->pgp_count = 0;
obj->last_client = TMEM_CLI_ID_NULL;
tmem_spin_lock(&obj->obj_spinlock);
@@ -980,16 +874,9 @@ static struct tmem_pool * pool_alloc(void)
INIT_LIST_HEAD(&pool->persistent_page_list);
pool->cur_pgp = NULL;
rwlock_init(&pool->pool_rwlock);
- pool->pgp_count_max = pool->obj_count_max = 0;
- pool->objnode_count = pool->objnode_count_max = 0;
atomic_set(&pool->pgp_count,0);
- pool->obj_count = 0; pool->shared_count = 0;
+ pool->shared_count = 0;
pool->pageshift = PAGE_SHIFT - 12;
- pool->good_puts = pool->puts = pool->dup_puts_flushed = 0;
- pool->dup_puts_replaced = pool->no_mem_puts = 0;
- pool->found_gets = pool->gets = 0;
- pool->flushs_found = pool->flushs = 0;
- pool->flush_objs_found = pool->flush_objs = 0;
pool->is_dying = 0;
return pool;
}
@@ -1165,9 +1052,7 @@ static struct client *client_create(domid_t cli_id)
INIT_LIST_HEAD(&client->ephemeral_page_list);
INIT_LIST_HEAD(&client->persistent_invalidated_list);
client->cur_pgp = NULL;
- client->eph_count = client->eph_count_max = 0;
- client->total_cycles = 0; client->succ_pers_puts = 0;
- client->succ_eph_gets = 0; client->succ_pers_gets = 0;
+ client->eph_count = 0;
tmem_client_info("ok\n");
return client;
@@ -1275,7 +1160,6 @@ static int tmem_evict(void)
int ret = 0;
bool_t hold_pool_rwlock = 0;
- evict_attempts++;
tmem_spin_lock(&eph_lists_spinlock);
if ( (client != NULL) && client_over_quota(client) &&
!list_empty(&client->ephemeral_page_list) )
@@ -1320,7 +1204,6 @@ found:
tmem_spin_unlock(&obj->obj_spinlock);
if ( hold_pool_rwlock )
tmem_write_unlock(&pool->pool_rwlock);
- evicted_pgs++;
ret = 1;
out:
@@ -1406,8 +1289,6 @@ static int do_tmem_put_compress(struct tmem_page_descriptor *pgp, xen_pfn_t cmfn
pgp->cdata = p;
}
pgp->size = size;
- pgp->us.obj->pool->client->compressed_pages++;
- pgp->us.obj->pool->client->compressed_sum_size += size;
ret = 1;
out:
@@ -1445,7 +1326,7 @@ static int do_tmem_dup_put(struct tmem_page_descriptor *pgp, xen_pfn_t cmfn,
else if ( ret == -ENOMEM )
goto failed_dup;
else if ( ret == -EFAULT )
- goto bad_copy;
+ goto cleanup;
}
copy_uncompressed:
@@ -1456,7 +1337,7 @@ copy_uncompressed:
pgp->size = 0;
ret = tmem_copy_from_client(pgp->pfp, cmfn, tmem_cli_buf_null);
if ( ret < 0 )
- goto bad_copy;
+ goto cleanup;
if ( tmem_dedup_enabled() && !is_persistent(pool) )
{
if ( pcd_associate(pgp,NULL,0) == -ENOMEM )
@@ -1469,16 +1350,8 @@ done:
obj->last_client = client->cli_id;
obj->no_evict = 0;
tmem_spin_unlock(&obj->obj_spinlock);
- pool->dup_puts_replaced++;
- pool->good_puts++;
- if ( is_persistent(pool) )
- client->succ_pers_puts++;
return 1;
-bad_copy:
- failed_copies++;
- goto cleanup;
-
failed_dup:
/* couldn't change out the data, flush the old data and return
* -ENOSPC instead of -ENOMEM to differentiate failed _dup_ put */
@@ -1496,7 +1369,6 @@ cleanup:
obj->no_evict = 0;
tmem_spin_unlock(&obj->obj_spinlock);
}
- pool->dup_puts_flushed++;
return ret;
}
@@ -1512,7 +1384,6 @@ static int do_tmem_put(struct tmem_pool *pool,
ASSERT(pool != NULL);
client = pool->client;
ret = client->frozen ? -EFROZEN : -ENOMEM;
- pool->puts++;
/* does page already exist (dup)? if so, handle specially */
if ( (obj = obj_find(pool,oidp)) != NULL )
{
@@ -1563,16 +1434,14 @@ static int do_tmem_put(struct tmem_pool *pool,
goto insert_page;
if ( ret == -ENOMEM )
{
- client->compress_nomem++;
goto del_pgp_from_obj;
}
if ( ret == 0 )
{
- client->compress_poor++;
goto copy_uncompressed;
}
if ( ret == -EFAULT )
- goto bad_copy;
+ goto del_pgp_from_obj;
}
copy_uncompressed:
@@ -1583,7 +1452,7 @@ copy_uncompressed:
}
ret = tmem_copy_from_client(pgp->pfp, cmfn, clibuf);
if ( ret < 0 )
- goto bad_copy;
+ goto del_pgp_from_obj;
if ( tmem_dedup_enabled() && !is_persistent(pool) )
{
@@ -1597,12 +1466,10 @@ insert_page:
tmem_spin_lock(&eph_lists_spinlock);
list_add_tail(&pgp->global_eph_pages,
&global_ephemeral_page_list);
- if (++global_eph_count > global_eph_count_max)
- global_eph_count_max = global_eph_count;
+ ++global_eph_count;
list_add_tail(&pgp->us.client_eph_pages,
&client->ephemeral_page_list);
- if (++client->eph_count > client->eph_count_max)
- client->eph_count_max = client->eph_count;
+ ++client->eph_count;
tmem_spin_unlock(&eph_lists_spinlock);
}
else
@@ -1619,17 +1486,8 @@ insert_page:
/* free the obj spinlock */
tmem_spin_unlock(&obj->obj_spinlock);
- pool->good_puts++;
-
- if ( is_persistent(pool) )
- client->succ_pers_puts++;
- else
- tot_good_eph_puts++;
return 1;
-bad_copy:
- failed_copies++;
-
del_pgp_from_obj:
ASSERT((obj != NULL) && (pgp != NULL) && (pgp->index != -1));
pgp_delete_from_obj(obj, pgp->index);
@@ -1648,7 +1506,6 @@ unlock_obj:
obj->no_evict = 0;
tmem_spin_unlock(&obj->obj_spinlock);
}
- pool->no_mem_puts++;
return ret;
}
@@ -1663,7 +1520,6 @@ static int do_tmem_get(struct tmem_pool *pool, struct oid *oidp, uint32_t index,
if ( !_atomic_read(pool->pgp_count) )
return -EEMPTY;
- pool->gets++;
obj = obj_find(pool,oidp);
if ( obj == NULL )
return 0;
@@ -1690,7 +1546,7 @@ static int do_tmem_get(struct tmem_pool *pool, struct oid *oidp, uint32_t index,
else
rc = tmem_copy_to_client(cmfn, pgp->pfp, clibuf);
if ( rc <= 0 )
- goto bad_copy;
+ goto out;
if ( !is_persistent(pool) )
{
@@ -1719,17 +1575,11 @@ static int do_tmem_get(struct tmem_pool *pool, struct oid *oidp, uint32_t index,
obj->no_evict = 0;
tmem_spin_unlock(&obj->obj_spinlock);
}
- pool->found_gets++;
- if ( is_persistent(pool) )
- client->succ_pers_gets++;
- else
- client->succ_eph_gets++;
return 1;
-bad_copy:
+out:
obj->no_evict = 0;
tmem_spin_unlock(&obj->obj_spinlock);
- failed_copies++;
return rc;
}
@@ -1738,7 +1588,6 @@ static int do_tmem_flush_page(struct tmem_pool *pool, struct oid *oidp, uint32_t
struct tmem_object_root *obj;
struct tmem_page_descriptor *pgp;
- pool->flushs++;
obj = obj_find(pool,oidp);
if ( obj == NULL )
goto out;
@@ -1759,7 +1608,6 @@ static int do_tmem_flush_page(struct tmem_pool *pool, struct oid *oidp, uint32_t
obj->no_evict = 0;
tmem_spin_unlock(&obj->obj_spinlock);
}
- pool->flushs_found++;
out:
if ( pool->client->frozen )
@@ -1772,13 +1620,11 @@ static int do_tmem_flush_object(struct tmem_pool *pool, struct oid *oidp)
{
struct tmem_object_root *obj;
- pool->flush_objs++;
obj = obj_find(pool,oidp);
if ( obj == NULL )
goto out;
tmem_write_lock(&pool->pool_rwlock);
obj_destroy(obj,0);
- pool->flush_objs_found++;
tmem_write_unlock(&pool->pool_rwlock);
out:
@@ -1981,176 +1827,11 @@ static int tmemc_flush_mem(domid_t cli_id, uint32_t kb)
return flushed_kb;
}
-/*
- * These tmemc_list* routines output lots of stats in a format that is
- * intended to be program-parseable, not human-readable. Further, by
- * tying each group of stats to a line format indicator (e.g. G= for
- * global stats) and each individual stat to a two-letter specifier
- * (e.g. Ec:nnnnn in the G= line says there are nnnnn pages in the
- * global ephemeral pool), it should allow the stats reported to be
- * forward and backwards compatible as tmem evolves.
- */
-#define BSIZE 1024
-
-static int tmemc_list_client(struct client *c, tmem_cli_va_param_t buf,
- int off, uint32_t len, bool_t use_long)
-{
- char info[BSIZE];
- int i, n = 0, sum = 0;
- struct tmem_pool *p;
- bool_t s;
-
- n = scnprintf(info,BSIZE,"C=CI:%d,ww:%d,ca:%d,co:%d,fr:%d,"
- "Tc:%"PRIu64",Ge:%ld,Pp:%ld,Gp:%ld%c",
- c->cli_id, c->weight, c->cap, c->compress, c->frozen,
- c->total_cycles, c->succ_eph_gets, c->succ_pers_puts, c->succ_pers_gets,
- use_long ? ',' : '\n');
- if (use_long)
- n += scnprintf(info+n,BSIZE-n,
- "Ec:%ld,Em:%ld,cp:%ld,cb:%"PRId64",cn:%ld,cm:%ld\n",
- c->eph_count, c->eph_count_max,
- c->compressed_pages, c->compressed_sum_size,
- c->compress_poor, c->compress_nomem);
- tmem_copy_to_client_buf_offset(buf,off+sum,info,n+1);
- sum += n;
- for ( i = 0; i < MAX_POOLS_PER_DOMAIN; i++ )
- {
- if ( (p = c->pools[i]) == NULL )
- continue;
- s = is_shared(p);
- n = scnprintf(info,BSIZE,"P=CI:%d,PI:%d,"
- "PT:%c%c,U0:%"PRIx64",U1:%"PRIx64"%c",
- c->cli_id, p->pool_id,
- is_persistent(p) ? 'P' : 'E', s ? 'S' : 'P',
- (uint64_t)(s ? p->uuid[0] : 0),
- (uint64_t)(s ? p->uuid[1] : 0LL),
- use_long ? ',' : '\n');
- if (use_long)
- n += scnprintf(info+n,BSIZE-n,
- "Pc:%d,Pm:%d,Oc:%ld,Om:%ld,Nc:%lu,Nm:%lu,"
- "ps:%lu,pt:%lu,pd:%lu,pr:%lu,px:%lu,gs:%lu,gt:%lu,"
- "fs:%lu,ft:%lu,os:%lu,ot:%lu\n",
- _atomic_read(p->pgp_count), p->pgp_count_max,
- p->obj_count, p->obj_count_max,
- p->objnode_count, p->objnode_count_max,
- p->good_puts, p->puts,p->dup_puts_flushed, p->dup_puts_replaced,
- p->no_mem_puts,
- p->found_gets, p->gets,
- p->flushs_found, p->flushs, p->flush_objs_found, p->flush_objs);
- if ( sum + n >= len )
- return sum;
- tmem_copy_to_client_buf_offset(buf,off+sum,info,n+1);
- sum += n;
- }
- return sum;
-}
-
-static int tmemc_list_shared(tmem_cli_va_param_t buf, int off, uint32_t len,
- bool_t use_long)
-{
- char info[BSIZE];
- int i, n = 0, sum = 0;
- struct tmem_pool *p;
- struct share_list *sl;
-
- for ( i = 0; i < MAX_GLOBAL_SHARED_POOLS; i++ )
- {
- if ( (p = global_shared_pools[i]) == NULL )
- continue;
- n = scnprintf(info+n,BSIZE-n,"S=SI:%d,PT:%c%c,U0:%"PRIx64",U1:%"PRIx64,
- i, is_persistent(p) ? 'P' : 'E',
- is_shared(p) ? 'S' : 'P',
- p->uuid[0], p->uuid[1]);
- list_for_each_entry(sl,&p->share_list, share_list)
- n += scnprintf(info+n,BSIZE-n,",SC:%d",sl->client->cli_id);
- n += scnprintf(info+n,BSIZE-n,"%c", use_long ? ',' : '\n');
- if (use_long)
- n += scnprintf(info+n,BSIZE-n,
- "Pc:%d,Pm:%d,Oc:%ld,Om:%ld,Nc:%lu,Nm:%lu,"
- "ps:%lu,pt:%lu,pd:%lu,pr:%lu,px:%lu,gs:%lu,gt:%lu,"
- "fs:%lu,ft:%lu,os:%lu,ot:%lu\n",
- _atomic_read(p->pgp_count), p->pgp_count_max,
- p->obj_count, p->obj_count_max,
- p->objnode_count, p->objnode_count_max,
- p->good_puts, p->puts,p->dup_puts_flushed, p->dup_puts_replaced,
- p->no_mem_puts,
- p->found_gets, p->gets,
- p->flushs_found, p->flushs, p->flush_objs_found, p->flush_objs);
- if ( sum + n >= len )
- return sum;
- tmem_copy_to_client_buf_offset(buf,off+sum,info,n+1);
- sum += n;
- }
- return sum;
-}
-
-static int tmemc_list_global_perf(tmem_cli_va_param_t buf, int off,
- uint32_t len, bool_t use_long)
-{
- char info[BSIZE];
- int n = 0, sum = 0;
-
- n = scnprintf(info+n,BSIZE-n,"T=");
- n--; /* overwrite trailing comma */
- n += scnprintf(info+n,BSIZE-n,"\n");
- if ( sum + n >= len )
- return sum;
- tmem_copy_to_client_buf_offset(buf,off+sum,info,n+1);
- sum += n;
- return sum;
-}
-
-static int tmemc_list_global(tmem_cli_va_param_t buf, int off, uint32_t len,
- bool_t use_long)
-{
- char info[BSIZE];
- int n = 0, sum = off;
-
- n += scnprintf(info,BSIZE,"G="
- "Tt:%lu,Te:%lu,Cf:%lu,Af:%lu,Pf:%lu,Ta:%lu,"
- "Lm:%lu,Et:%lu,Ea:%lu,Rt:%lu,Ra:%lu,Rx:%lu,Fp:%lu%c",
- total_tmem_ops, errored_tmem_ops, failed_copies,
- alloc_failed, alloc_page_failed, tmem_page_list_pages,
- low_on_memory, evicted_pgs,
- evict_attempts, relinq_pgs, relinq_attempts, max_evicts_per_relinq,
- total_flush_pool, use_long ? ',' : '\n');
- if (use_long)
- n += scnprintf(info+n,BSIZE-n,
- "Ec:%ld,Em:%ld,Oc:%d,Om:%d,Nc:%d,Nm:%d,Pc:%d,Pm:%d,"
- "Fc:%d,Fm:%d,Sc:%d,Sm:%d,Ep:%lu,Gd:%lu,Zt:%lu,Gz:%lu\n",
- global_eph_count, global_eph_count_max,
- _atomic_read(global_obj_count), global_obj_count_max,
- _atomic_read(global_rtree_node_count), global_rtree_node_count_max,
- _atomic_read(global_pgp_count), global_pgp_count_max,
- _atomic_read(global_page_count), global_page_count_max,
- _atomic_read(global_pcd_count), global_pcd_count_max,
- tot_good_eph_puts,deduped_puts,pcd_tot_tze_size,pcd_tot_csize);
- if ( sum + n >= len )
- return sum;
- tmem_copy_to_client_buf_offset(buf,off+sum,info,n+1);
- sum += n;
- return sum;
-}
-
static int tmemc_list(domid_t cli_id, tmem_cli_va_param_t buf, uint32_t len,
bool_t use_long)
{
- struct client *client;
- int off = 0;
-
- if ( cli_id == TMEM_CLI_ID_NULL ) {
- off = tmemc_list_global(buf,0,len,use_long);
- off += tmemc_list_shared(buf,off,len-off,use_long);
- list_for_each_entry(client,&global_client_list,client_list)
- off += tmemc_list_client(client, buf, off, len-off, use_long);
- off += tmemc_list_global_perf(buf,off,len-off,use_long);
- }
- else if ( (client = tmem_client_from_cli_id(cli_id)) == NULL)
- return -1;
- else
- off = tmemc_list_client(client, buf, 0, len, use_long);
-
- return 0;
+ tmem_client_info("tmemc_list is not implemented yet!\n");
+ return -ENOSYS;
}
static int tmemc_set_var_one(struct client *client, uint32_t subop, uint32_t arg1)
@@ -2541,9 +2222,6 @@ long do_tmem_op(tmem_cli_op_t uops)
struct tmem_pool *pool = NULL;
struct oid *oidp;
int rc = 0;
- bool_t succ_get = 0, succ_put = 0;
- bool_t non_succ_get = 0, non_succ_put = 0;
- bool_t flush = 0, flush_obj = 0;
bool_t tmem_write_lock_set = 0, tmem_read_lock_set = 0;
if ( !tmem_initialized )
@@ -2552,8 +2230,6 @@ long do_tmem_op(tmem_cli_op_t uops)
if ( !tmem_current_permitted() )
return -EPERM;
- total_tmem_ops++;
-
if ( tmem_lock_all )
{
if ( tmem_lock_all > 1 )
@@ -2568,7 +2244,6 @@ long do_tmem_op(tmem_cli_op_t uops)
if ( tmem_lock_all )
goto out;
simple_error:
- errored_tmem_ops++;
return rc;
}
@@ -2650,25 +2325,18 @@ long do_tmem_op(tmem_cli_op_t uops)
tmem_ensure_avail_pages();
rc = do_tmem_put(pool, oidp, op.u.gen.index, op.u.gen.cmfn,
tmem_cli_buf_null);
- if (rc == 1) succ_put = 1;
- else non_succ_put = 1;
break;
case TMEM_GET_PAGE:
rc = do_tmem_get(pool, oidp, op.u.gen.index, op.u.gen.cmfn,
tmem_cli_buf_null);
- if (rc == 1) succ_get = 1;
- else non_succ_get = 1;
break;
case TMEM_FLUSH_PAGE:
- flush = 1;
rc = do_tmem_flush_page(pool, oidp, op.u.gen.index);
break;
case TMEM_FLUSH_OBJECT:
rc = do_tmem_flush_object(pool, oidp);
- flush_obj = 1;
break;
case TMEM_DESTROY_POOL:
- flush = 1;
rc = do_tmem_destroy_pool(op.pool_id);
break;
default:
@@ -2678,8 +2346,6 @@ long do_tmem_op(tmem_cli_op_t uops)
}
out:
- if ( rc < 0 )
- errored_tmem_ops++;
if ( tmem_lock_all )
{
if ( tmem_lock_all > 1 )
@@ -2756,7 +2422,6 @@ void *tmem_relinquish_pages(unsigned int order, unsigned int memflags)
if (!tmem_enabled() || !tmem_freeable_pages())
return NULL;
- relinq_attempts++;
if ( order > 0 )
{
#ifndef NDEBUG
@@ -2779,13 +2444,10 @@ void *tmem_relinquish_pages(unsigned int order, unsigned int memflags)
break;
evicts_per_relinq++;
}
- if ( evicts_per_relinq > max_evicts_per_relinq )
- max_evicts_per_relinq = evicts_per_relinq;
if ( pfp != NULL )
{
if ( !(memflags & MEMF_tmem) )
scrub_one_page(pfp);
- relinq_pgs++;
}
if ( tmem_called_from_tmem(memflags) )
diff --git a/xen/include/xen/tmem_xen.h b/xen/include/xen/tmem_xen.h
index 837d0c8..0685af3 100644
--- a/xen/include/xen/tmem_xen.h
+++ b/xen/include/xen/tmem_xen.h
@@ -361,14 +361,6 @@ static inline int tmem_get_tmemop_from_client(tmem_op_t *op, tmem_cli_op_t uops)
}
#define tmem_cli_buf_null guest_handle_from_ptr(NULL, char)
-
-static inline void tmem_copy_to_client_buf_offset(tmem_cli_va_param_t clibuf,
- int off,
- char *tmembuf, int len)
-{
- copy_to_guest_offset(clibuf,off,tmembuf,len);
-}
-
#define tmem_copy_to_client_buf(clibuf, tmembuf, cnt) \
copy_to_guest(guest_handle_cast(clibuf, void), tmembuf, cnt)
--
1.7.10.4
next prev parent reply other threads:[~2013-12-03 2:21 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-12-03 2:19 [PATCH v2 00/16] tmem: continue to cleanup tmem Bob Liu
2013-12-03 2:19 ` [PATCH v2 01/16] tmem: fix public head file Bob Liu
2013-12-06 10:03 ` Jan Beulich
2013-12-06 14:36 ` Konrad Rzeszutek Wilk
2013-12-03 2:19 ` [PATCH v2 02/16] tmem: cleanup: drop unused sub command Bob Liu
2013-12-03 2:19 ` [PATCH v2 03/16] tmem: cleanup: drop some debug code Bob Liu
2013-12-03 2:19 ` [PATCH v2 04/16] tmem: cleanup: drop useless function 'tmem_copy_page' Bob Liu
2013-12-03 2:19 ` [PATCH v2 05/16] tmem: cleanup: drop useless parameters from put/get page Bob Liu
2013-12-03 2:19 ` [PATCH v2 06/16] tmem: cleanup: reorg function do_tmem_put() Bob Liu
2013-12-03 2:19 ` [PATCH v2 07/16] tmem: drop unneeded is_ephemeral() and is_private() Bob Liu
2013-12-03 2:19 ` [PATCH v2 08/16] tmem: cleanup: rm useless EXPORT/FORWARD define Bob Liu
2013-12-03 2:19 ` Bob Liu [this message]
2013-12-03 2:19 ` [PATCH v2 10/16] tmem: cleanup: drop tmem_lock_all Bob Liu
2013-12-03 2:19 ` [PATCH v2 11/16] tmem: cleanup: refactor the alloc/free path Bob Liu
2013-12-03 2:19 ` [PATCH v2 12/16] tmem: cleanup: __tmem_alloc_page: drop unneed parameters Bob Liu
2013-12-03 2:19 ` [PATCH v2 13/16] tmem: cleanup: drop useless functions from head file Bob Liu
2013-12-03 10:32 ` Andrew Cooper
2013-12-06 6:53 ` Bob Liu
2013-12-03 2:19 ` [PATCH v2 14/16] tmem: refator function tmem_ensure_avail_pages() Bob Liu
2013-12-03 2:19 ` [PATCH v2 15/16] tmem: cleanup: rename tmem_relinquish_npages() Bob Liu
2013-12-03 2:19 ` [PATCH v2 16/16] tmem: cleanup: rm unused tmem_freeze_all() Bob Liu
2013-12-03 21:07 ` [PATCH v2 00/16] tmem: continue to cleanup tmem Konrad Rzeszutek Wilk
2013-12-03 21:50 ` Andrew Cooper
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1386037157-27261-10-git-send-email-bob.liu@oracle.com \
--to=lliubbo@gmail.com \
--cc=JBeulich@suse.com \
--cc=ian.campbell@citrix.com \
--cc=keir@xen.org \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).