Code Review
/
kvmfornfv.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
Upgrade to 4.4.50-rt62
[kvmfornfv.git]
/
kernel
/
mm
/
zsmalloc.c
diff --git
a/kernel/mm/zsmalloc.c
b/kernel/mm/zsmalloc.c
index
18cc59f
..
529552c
100644
(file)
--- a/
kernel/mm/zsmalloc.c
+++ b/
kernel/mm/zsmalloc.c
@@
-64,6
+64,7
@@
#include <linux/debugfs.h>
#include <linux/zsmalloc.h>
#include <linux/zpool.h>
#include <linux/debugfs.h>
#include <linux/zsmalloc.h>
#include <linux/zpool.h>
+#include <linux/locallock.h>
/*
* This must be power of 2 and greater than of equal to sizeof(link_free).
/*
* This must be power of 2 and greater than of equal to sizeof(link_free).
@@
-403,6
+404,7
@@
static unsigned int get_maxobj_per_zspage(int size, int pages_per_zspage)
/* per-cpu VM mapping areas for zspage accesses that cross page boundaries */
static DEFINE_PER_CPU(struct mapping_area, zs_map_area);
/* per-cpu VM mapping areas for zspage accesses that cross page boundaries */
static DEFINE_PER_CPU(struct mapping_area, zs_map_area);
+static DEFINE_LOCAL_IRQ_LOCK(zs_map_area_lock);
static int is_first_page(struct page *page)
{
static int is_first_page(struct page *page)
{
@@
-1289,7
+1291,7
@@
void *zs_map_object(struct zs_pool *pool, unsigned long handle,
class = pool->size_class[class_idx];
off = obj_idx_to_offset(page, obj_idx, class->size);
class = pool->size_class[class_idx];
off = obj_idx_to_offset(page, obj_idx, class->size);
- area =
per_cpu_ptr(&zs_map_area, get_cpu_light()
);
+ area =
&get_locked_var(zs_map_area_lock, zs_map_area
);
area->vm_mm = mm;
if (off + class->size <= PAGE_SIZE) {
/* this object is contained entirely within a page */
area->vm_mm = mm;
if (off + class->size <= PAGE_SIZE) {
/* this object is contained entirely within a page */
@@
-1342,7
+1344,7
@@
void zs_unmap_object(struct zs_pool *pool, unsigned long handle)
__zs_unmap_object(area, pages, off, class->size);
}
__zs_unmap_object(area, pages, off, class->size);
}
- put_
cpu_light(
);
+ put_
locked_var(zs_map_area_lock, zs_map_area
);
unpin_tag(handle);
}
EXPORT_SYMBOL_GPL(zs_unmap_object);
unpin_tag(handle);
}
EXPORT_SYMBOL_GPL(zs_unmap_object);
@@
-1732,10
+1734,13
@@
static struct page *isolate_source_page(struct size_class *class)
static unsigned long zs_can_compact(struct size_class *class)
{
unsigned long obj_wasted;
static unsigned long zs_can_compact(struct size_class *class)
{
unsigned long obj_wasted;
+ unsigned long obj_allocated = zs_stat_get(class, OBJ_ALLOCATED);
+ unsigned long obj_used = zs_stat_get(class, OBJ_USED);
- obj_wasted = zs_stat_get(class, OBJ_ALLOCATED) -
-
zs_stat_get(class, OBJ_USED)
;
+ if (obj_allocated <= obj_used)
+
return 0
;
+ obj_wasted = obj_allocated - obj_used;
obj_wasted /= get_maxobj_per_zspage(class->size,
class->pages_per_zspage);
obj_wasted /= get_maxobj_per_zspage(class->size,
class->pages_per_zspage);