[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC 1/4] tmem: Move global stats in a tmem_statistics structure
On 5/18/16 9:34 AM, Konrad Rzeszutek Wilk wrote: > On Tue, May 17, 2016 at 09:01:00PM -0500, Doug Goldstein wrote: >> On 5/17/16 8:57 PM, Doug Goldstein wrote: >>> On 5/16/16 10:58 AM, Konrad Rzeszutek Wilk wrote: >>>> 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@xxxxxxxxxx> >>>> --- >>>> 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); >>> >>> So the code was previously like this but this change made me notice >>> this. How come tmem_stats.global_page_count needs to be atomically >>> incremented but not tmem_stats.alloc_page_failed? Its also a little >>> weird that global_page_count is in the struct now but not really visible >>> here while alloc_page_count is in the struct but has to be explicitly >>> called out. >>> >>> >> >> Actually I just realized "global_page_count" but this patch actually >> deals with "global_page_count_max". So ignore the original email. >> >> But does this patch compile (for bisect-ability) due to the change to >> atomic_inc_and_max() but not moving "global_page_count" into the structure? > > Yup: > > #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) > > As the global_page_count is still an atomic outside the structure. > And the global_page_count_max is inside the structure. > >> >> -- >> Doug Goldstein >> > > > Gah. You're right. Reviewed-by: Doug Goldstein <cardoe@xxxxxxxxxx> -- Doug Goldstein Attachment:
signature.asc _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |