From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: xen-devel@lists.xenproject.org
Cc: Doug Goldstein <cardoe@cardoe.com>,
Andrew Cooper <andrew.cooper3@citrix.com>,
Wei Liu <wei.liu2@citrix.com>, Jan Beulich <jbeulich@suse.com>,
Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [PATCH v1 1/4] tmem: Move global stats in a tmem_statistics structure
Date: Thu, 2 Jun 2016 11:04:17 -0400 [thread overview]
Message-ID: <1464879860-25554-2-git-send-email-konrad.wilk@oracle.com> (raw)
In-Reply-To: <1464879860-25554-1-git-send-email-konrad.wilk@oracle.com>
And adjust the macro: atomic_inc_and_max to update the structure.
Sadly one entry: pool->pgp_count cannot use this macro anymore
so unroll the macro for this instance.
No functional change. The name has the 'tmem_stats' as it will
be eventually non-local.
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Reviewed-by: Doug Goldstein <cardoe@cardoe.com>
---
Cc: Andrew Cooper <andrew.cooper3@citrix.com>
Cc: Jan Beulich <jbeulich@suse.com>
Cc: Wei Liu <wei.liu2@citrix.com>
Cc: Doug Goldstein <cardoe@cardoe.com>
v1: Posting as non-RFC
---
xen/common/tmem.c | 135 +++++++++++++++++++++++++++++-------------------------
1 file changed, 73 insertions(+), 62 deletions(-)
diff --git a/xen/common/tmem.c b/xen/common/tmem.c
index 16e249a..d362eae 100644
--- a/xen/common/tmem.c
+++ b/xen/common/tmem.c
@@ -28,25 +28,32 @@
#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;
+struct tmem_statistics {
+ unsigned long total_tmem_ops;
+ unsigned long errored_tmem_ops;
+ unsigned long total_flush_pool;
+ unsigned long alloc_failed;
+ unsigned long alloc_page_failed;
+ unsigned long evicted_pgs;
+ unsigned long evict_attempts;
+ unsigned long relinq_pgs;
+ unsigned long relinq_attempts;
+ unsigned long max_evicts_per_relinq;
+ unsigned long low_on_memory;
+ unsigned long deduped_puts;
+ unsigned long tot_good_eph_puts;
+ int global_obj_count_max;
+ int global_pgp_count_max;
+ int global_pcd_count_max;
+ int global_page_count_max;
+ int global_rtree_node_count_max;
+ long global_eph_count_max;
+ unsigned long failed_copies;
+ unsigned long pcd_tot_tze_size;
+ unsigned long pcd_tot_csize;
+};
+
+static struct tmem_statistics tmem_stats;
/************ CORE DATA STRUCTURES ************************************/
@@ -225,8 +232,8 @@ 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); \
+ if ( _atomic_read(_c) > tmem_stats._c##_max ) \
+ tmem_stats._c##_max = _atomic_read(_c); \
} while (0)
#define atomic_dec_and_assert(_c) do { \
@@ -273,7 +280,7 @@ static void *tmem_malloc(size_t size, struct tmem_pool *pool)
v = xmem_pool_alloc(size, tmem_mempool);
}
if ( v == NULL )
- alloc_failed++;
+ tmem_stats.alloc_failed++;
return v;
}
@@ -300,7 +307,7 @@ static struct page_info *tmem_alloc_page(struct tmem_pool *pool)
else
pfp = __tmem_alloc_page();
if ( pfp == NULL )
- alloc_page_failed++;
+ tmem_stats.alloc_page_failed++;
else
atomic_inc_and_max(global_page_count);
return pfp;
@@ -437,20 +444,20 @@ static void pcd_disassociate(struct tmem_page_descriptor *pgp, struct tmem_pool
{
/* Compressed data. */
tmem_free(pcd_cdata, pool);
- pcd_tot_csize -= pcd_csize;
+ tmem_stats.pcd_tot_csize -= pcd_csize;
}
else if ( pcd_size != PAGE_SIZE )
{
/* Trailing zero data. */
- pcd_tot_tze_size -= pcd_size;
+ tmem_stats.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;
+ tmem_stats.pcd_tot_tze_size -= PAGE_SIZE;
if ( tmem_compression_enabled() )
- pcd_tot_csize -= PAGE_SIZE;
+ tmem_stats.pcd_tot_csize -= PAGE_SIZE;
tmem_free_page(pool,pfp);
}
write_unlock(&pcd_tree_rwlocks[firstbyte]);
@@ -533,7 +540,7 @@ static int pcd_associate(struct tmem_page_descriptor *pgp, char *cdata, pagesize
*/
if ( cdata == NULL )
tmem_free_page(pgp->us.obj->pool,pgp->pfp);
- deduped_puts++;
+ tmem_stats.deduped_puts++;
goto match;
}
}
@@ -559,7 +566,7 @@ static int pcd_associate(struct tmem_page_descriptor *pgp, char *cdata, pagesize
{
memcpy(pcd->cdata,cdata,csize);
pcd->size = csize;
- pcd_tot_csize += csize;
+ tmem_stats.pcd_tot_csize += csize;
} else if ( pfp_size == 0 ) {
ASSERT(tmem_tze_enabled());
pcd->size = 0;
@@ -568,15 +575,15 @@ 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_stats.pcd_tot_tze_size += pfp_size;
tmem_free_page(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;
+ tmem_stats.pcd_tot_tze_size += PAGE_SIZE;
if ( tmem_compression_enabled() )
- pcd_tot_csize += PAGE_SIZE;
+ tmem_stats.pcd_tot_csize += PAGE_SIZE;
}
rb_link_node(&pcd->pcd_rb_tree_node, parent, new);
rb_insert_color(&pcd->pcd_rb_tree_node, root);
@@ -620,7 +627,9 @@ static struct tmem_page_descriptor *pgp_alloc(struct tmem_object_root *obj)
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);
+ if ( _atomic_read(pool->pgp_count) > pool->pgp_count_max )
+ pool->pgp_count_max = _atomic_read(pool->pgp_count);
return pgp;
}
@@ -1295,7 +1304,7 @@ static int tmem_evict(void)
int ret = 0;
bool_t hold_pool_rwlock = 0;
- evict_attempts++;
+ tmem_stats.evict_attempts++;
spin_lock(&eph_lists_spinlock);
if ( (client != NULL) && client_over_quota(client) &&
!list_empty(&client->ephemeral_page_list) )
@@ -1353,7 +1362,7 @@ found:
spin_unlock(&obj->obj_spinlock);
if ( hold_pool_rwlock )
write_unlock(&pool->pool_rwlock);
- evicted_pgs++;
+ tmem_stats.evicted_pgs++;
ret = 1;
out:
return ret;
@@ -1512,7 +1521,7 @@ done:
return 1;
bad_copy:
- failed_copies++;
+ tmem_stats.failed_copies++;
goto cleanup;
failed_dup:
@@ -1650,8 +1659,8 @@ insert_page:
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;
+ if (++global_eph_count > tmem_stats.global_eph_count_max)
+ tmem_stats.global_eph_count_max = global_eph_count;
list_add_tail(&pgp->us.client_eph_pages,
&client->ephemeral_page_list);
if (++client->eph_count > client->eph_count_max)
@@ -1676,11 +1685,11 @@ insert_page:
if ( is_persistent(pool) )
client->succ_pers_puts++;
else
- tot_good_eph_puts++;
+ tmem_stats.tot_good_eph_puts++;
return 1;
bad_copy:
- failed_copies++;
+ tmem_stats.failed_copies++;
del_pgp_from_obj:
ASSERT((obj != NULL) && (pgp != NULL) && (pgp->index != -1));
@@ -1778,7 +1787,7 @@ static int do_tmem_get(struct tmem_pool *pool,
bad_copy:
spin_unlock(&obj->obj_spinlock);
- failed_copies++;
+ tmem_stats.failed_copies++;
return rc;
}
@@ -2190,22 +2199,24 @@ static int tmemc_list_global(tmem_cli_va_param_t buf, int off, uint32_t len,
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');
+ tmem_stats.total_tmem_ops, tmem_stats.errored_tmem_ops, tmem_stats.failed_copies,
+ tmem_stats.alloc_failed, tmem_stats.alloc_page_failed, tmem_page_list_pages,
+ tmem_stats.low_on_memory, tmem_stats.evicted_pgs,
+ tmem_stats.evict_attempts, tmem_stats.relinq_pgs, tmem_stats.relinq_attempts,
+ tmem_stats.max_evicts_per_relinq,
+ tmem_stats.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);
+ global_eph_count, tmem_stats.global_eph_count_max,
+ _atomic_read(global_obj_count), tmem_stats.global_obj_count_max,
+ _atomic_read(global_rtree_node_count), tmem_stats.global_rtree_node_count_max,
+ _atomic_read(global_pgp_count), tmem_stats.global_pgp_count_max,
+ _atomic_read(global_page_count), tmem_stats.global_page_count_max,
+ _atomic_read(global_pcd_count), tmem_stats.global_pcd_count_max,
+ tmem_stats.tot_good_eph_puts,tmem_stats.deduped_puts,tmem_stats.pcd_tot_tze_size,
+ tmem_stats.pcd_tot_csize);
if ( sum + n >= len )
return sum;
if ( !copy_to_guest_offset(buf, off + sum, info, n + 1) )
@@ -2658,18 +2669,18 @@ long do_tmem_op(tmem_cli_op_t uops)
if ( xsm_tmem_op(XSM_HOOK) )
return -EPERM;
- total_tmem_ops++;
+ tmem_stats.total_tmem_ops++;
if ( client != NULL && client->domain->is_dying )
{
- errored_tmem_ops++;
+ tmem_stats.errored_tmem_ops++;
return -ENODEV;
}
if ( unlikely(tmem_get_tmemop_from_client(&op, uops) != 0) )
{
tmem_client_err("tmem: can't get tmem struct from %s\n", tmem_client_str);
- errored_tmem_ops++;
+ tmem_stats.errored_tmem_ops++;
return -EFAULT;
}
@@ -2764,14 +2775,14 @@ long do_tmem_op(tmem_cli_op_t uops)
}
read_unlock(&tmem_rwlock);
if ( rc < 0 )
- errored_tmem_ops++;
+ tmem_stats.errored_tmem_ops++;
return rc;
}
}
out:
write_unlock(&tmem_rwlock);
if ( rc < 0 )
- errored_tmem_ops++;
+ tmem_stats.errored_tmem_ops++;
return rc;
}
@@ -2808,7 +2819,7 @@ void *tmem_relinquish_pages(unsigned int order, unsigned int memflags)
if (!tmem_enabled() || !tmem_freeable_pages())
return NULL;
- relinq_attempts++;
+ tmem_stats.relinq_attempts++;
if ( order > 0 )
{
#ifndef NDEBUG
@@ -2823,13 +2834,13 @@ 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 ( evicts_per_relinq > tmem_stats.max_evicts_per_relinq )
+ tmem_stats.max_evicts_per_relinq = evicts_per_relinq;
if ( pfp != NULL )
{
if ( !(memflags & MEMF_tmem) )
scrub_one_page(pfp);
- relinq_pgs++;
+ tmem_stats.relinq_pgs++;
}
return pfp;
--
2.5.5
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
next prev parent reply other threads:[~2016-06-02 15:05 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-02 15:04 [PATCH v1 for 4.7] Tmem cleanups Konrad Rzeszutek Wilk
2016-06-02 15:04 ` Konrad Rzeszutek Wilk [this message]
2016-06-02 15:04 ` [PATCH v1 2/4] tmem: Wrap atomic_t in struct tmem_statistics as well Konrad Rzeszutek Wilk
2016-06-02 15:16 ` Andrew Cooper
2016-06-02 15:26 ` Konrad Rzeszutek Wilk
2016-06-02 15:04 ` [PATCH v1 3/4] tmem: Move global_ individual variables in a global structure Konrad Rzeszutek Wilk
2016-06-02 15:04 ` [PATCH v1 4/4] tmem: Move bulk of tmem control functions in its own file Konrad Rzeszutek Wilk
2016-06-02 15:17 ` [PATCH v1 for 4.7] Tmem cleanups Jan Beulich
2016-06-02 15:27 ` Konrad Rzeszutek Wilk
2016-06-02 15:42 ` Wei Liu
2016-06-02 15:46 ` Konrad Rzeszutek Wilk
2016-06-02 20:09 ` Konrad Rzeszutek Wilk
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=1464879860-25554-2-git-send-email-konrad.wilk@oracle.com \
--to=konrad.wilk@oracle.com \
--cc=andrew.cooper3@citrix.com \
--cc=cardoe@cardoe.com \
--cc=jbeulich@suse.com \
--cc=wei.liu2@citrix.com \
--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).