aboutsummaryrefslogtreecommitdiffstats
path: root/mm/zsmalloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/zsmalloc.c')
-rw-r--r--mm/zsmalloc.c23
1 files changed, 8 insertions, 15 deletions
diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c
index 94f38fac5e81..2a4acf400846 100644
--- a/mm/zsmalloc.c
+++ b/mm/zsmalloc.c
@@ -199,9 +199,6 @@ struct size_class {
199 199
200 spinlock_t lock; 200 spinlock_t lock;
201 201
202 /* stats */
203 u64 pages_allocated;
204
205 struct page *fullness_list[_ZS_NR_FULLNESS_GROUPS]; 202 struct page *fullness_list[_ZS_NR_FULLNESS_GROUPS];
206}; 203};
207 204
@@ -220,6 +217,7 @@ struct zs_pool {
220 struct size_class size_class[ZS_SIZE_CLASSES]; 217 struct size_class size_class[ZS_SIZE_CLASSES];
221 218
222 gfp_t flags; /* allocation flags used when growing pool */ 219 gfp_t flags; /* allocation flags used when growing pool */
220 atomic_long_t pages_allocated;
223}; 221};
224 222
225/* 223/*
@@ -1028,8 +1026,9 @@ unsigned long zs_malloc(struct zs_pool *pool, size_t size)
1028 return 0; 1026 return 0;
1029 1027
1030 set_zspage_mapping(first_page, class->index, ZS_EMPTY); 1028 set_zspage_mapping(first_page, class->index, ZS_EMPTY);
1029 atomic_long_add(class->pages_per_zspage,
1030 &pool->pages_allocated);
1031 spin_lock(&class->lock); 1031 spin_lock(&class->lock);
1032 class->pages_allocated += class->pages_per_zspage;
1033 } 1032 }
1034 1033
1035 obj = (unsigned long)first_page->freelist; 1034 obj = (unsigned long)first_page->freelist;
@@ -1082,14 +1081,13 @@ void zs_free(struct zs_pool *pool, unsigned long obj)
1082 1081
1083 first_page->inuse--; 1082 first_page->inuse--;
1084 fullness = fix_fullness_group(pool, first_page); 1083 fullness = fix_fullness_group(pool, first_page);
1085
1086 if (fullness == ZS_EMPTY)
1087 class->pages_allocated -= class->pages_per_zspage;
1088
1089 spin_unlock(&class->lock); 1084 spin_unlock(&class->lock);
1090 1085
1091 if (fullness == ZS_EMPTY) 1086 if (fullness == ZS_EMPTY) {
1087 atomic_long_sub(class->pages_per_zspage,
1088 &pool->pages_allocated);
1092 free_zspage(first_page); 1089 free_zspage(first_page);
1090 }
1093} 1091}
1094EXPORT_SYMBOL_GPL(zs_free); 1092EXPORT_SYMBOL_GPL(zs_free);
1095 1093
@@ -1185,12 +1183,7 @@ EXPORT_SYMBOL_GPL(zs_unmap_object);
1185 1183
1186u64 zs_get_total_size_bytes(struct zs_pool *pool) 1184u64 zs_get_total_size_bytes(struct zs_pool *pool)
1187{ 1185{
1188 int i; 1186 u64 npages = atomic_long_read(&pool->pages_allocated);
1189 u64 npages = 0;
1190
1191 for (i = 0; i < ZS_SIZE_CLASSES; i++)
1192 npages += pool->size_class[i].pages_allocated;
1193
1194 return npages << PAGE_SHIFT; 1187 return npages << PAGE_SHIFT;
1195} 1188}
1196EXPORT_SYMBOL_GPL(zs_get_total_size_bytes); 1189EXPORT_SYMBOL_GPL(zs_get_total_size_bytes);