mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-25 14:13:01 -04:00
Merge branch 'akpm' (patches from Andrew)
Merge updates from Andrew Morton:
- a few misc bits
- ocfs2
- most(?) of MM
* emailed patches from Andrew Morton <akpm@linux-foundation.org>: (125 commits)
thp: fix comments of __pmd_trans_huge_lock()
cgroup: remove unnecessary 0 check from css_from_id()
cgroup: fix idr leak for the first cgroup root
mm: memcontrol: fix documentation for compound parameter
mm: memcontrol: remove BUG_ON in uncharge_list
mm: fix build warnings in <linux/compaction.h>
mm, thp: convert from optimistic swapin collapsing to conservative
mm, thp: fix comment inconsistency for swapin readahead functions
thp: update Documentation/{vm/transhuge,filesystems/proc}.txt
shmem: split huge pages beyond i_size under memory pressure
thp: introduce CONFIG_TRANSPARENT_HUGE_PAGECACHE
khugepaged: add support of collapse for tmpfs/shmem pages
shmem: make shmem_inode_info::lock irq-safe
khugepaged: move up_read(mmap_sem) out of khugepaged_alloc_page()
thp: extract khugepaged from mm/huge_memory.c
shmem, thp: respect MADV_{NO,}HUGEPAGE for file mappings
shmem: add huge pages support
shmem: get_unmapped_area align huge page
shmem: prepare huge= mount option and sysfs knob
mm, rmap: account shmem thp pages
...
This commit is contained in:
commit
0e06f5c0de
186 changed files with 7414 additions and 4185 deletions
|
|
@ -244,6 +244,7 @@ config PAGE_OWNER
|
|||
depends on DEBUG_KERNEL && STACKTRACE_SUPPORT
|
||||
select DEBUG_FS
|
||||
select STACKTRACE
|
||||
select STACKDEPOT
|
||||
select PAGE_EXTENSION
|
||||
help
|
||||
This keeps track of what call chain is the owner of a page, may
|
||||
|
|
|
|||
|
|
@ -253,6 +253,7 @@ static int hash_fn(struct dma_debug_entry *entry)
|
|||
*/
|
||||
static struct hash_bucket *get_hash_bucket(struct dma_debug_entry *entry,
|
||||
unsigned long *flags)
|
||||
__acquires(&dma_entry_hash[idx].lock)
|
||||
{
|
||||
int idx = hash_fn(entry);
|
||||
unsigned long __flags;
|
||||
|
|
@ -267,6 +268,7 @@ static struct hash_bucket *get_hash_bucket(struct dma_debug_entry *entry,
|
|||
*/
|
||||
static void put_hash_bucket(struct hash_bucket *bucket,
|
||||
unsigned long *flags)
|
||||
__releases(&bucket->lock)
|
||||
{
|
||||
unsigned long __flags = *flags;
|
||||
|
||||
|
|
|
|||
|
|
@ -38,6 +38,9 @@
|
|||
#include <linux/preempt.h> /* in_interrupt() */
|
||||
|
||||
|
||||
/* Number of nodes in fully populated tree of given height */
|
||||
static unsigned long height_to_maxnodes[RADIX_TREE_MAX_PATH + 1] __read_mostly;
|
||||
|
||||
/*
|
||||
* Radix tree node cache.
|
||||
*/
|
||||
|
|
@ -342,7 +345,7 @@ radix_tree_node_free(struct radix_tree_node *node)
|
|||
* To make use of this facility, the radix tree must be initialised without
|
||||
* __GFP_DIRECT_RECLAIM being passed to INIT_RADIX_TREE().
|
||||
*/
|
||||
static int __radix_tree_preload(gfp_t gfp_mask)
|
||||
static int __radix_tree_preload(gfp_t gfp_mask, int nr)
|
||||
{
|
||||
struct radix_tree_preload *rtp;
|
||||
struct radix_tree_node *node;
|
||||
|
|
@ -350,14 +353,14 @@ static int __radix_tree_preload(gfp_t gfp_mask)
|
|||
|
||||
preempt_disable();
|
||||
rtp = this_cpu_ptr(&radix_tree_preloads);
|
||||
while (rtp->nr < RADIX_TREE_PRELOAD_SIZE) {
|
||||
while (rtp->nr < nr) {
|
||||
preempt_enable();
|
||||
node = kmem_cache_alloc(radix_tree_node_cachep, gfp_mask);
|
||||
if (node == NULL)
|
||||
goto out;
|
||||
preempt_disable();
|
||||
rtp = this_cpu_ptr(&radix_tree_preloads);
|
||||
if (rtp->nr < RADIX_TREE_PRELOAD_SIZE) {
|
||||
if (rtp->nr < nr) {
|
||||
node->private_data = rtp->nodes;
|
||||
rtp->nodes = node;
|
||||
rtp->nr++;
|
||||
|
|
@ -383,7 +386,7 @@ int radix_tree_preload(gfp_t gfp_mask)
|
|||
{
|
||||
/* Warn on non-sensical use... */
|
||||
WARN_ON_ONCE(!gfpflags_allow_blocking(gfp_mask));
|
||||
return __radix_tree_preload(gfp_mask);
|
||||
return __radix_tree_preload(gfp_mask, RADIX_TREE_PRELOAD_SIZE);
|
||||
}
|
||||
EXPORT_SYMBOL(radix_tree_preload);
|
||||
|
||||
|
|
@ -395,13 +398,58 @@ EXPORT_SYMBOL(radix_tree_preload);
|
|||
int radix_tree_maybe_preload(gfp_t gfp_mask)
|
||||
{
|
||||
if (gfpflags_allow_blocking(gfp_mask))
|
||||
return __radix_tree_preload(gfp_mask);
|
||||
return __radix_tree_preload(gfp_mask, RADIX_TREE_PRELOAD_SIZE);
|
||||
/* Preloading doesn't help anything with this gfp mask, skip it */
|
||||
preempt_disable();
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(radix_tree_maybe_preload);
|
||||
|
||||
/*
|
||||
* The same as function above, but preload number of nodes required to insert
|
||||
* (1 << order) continuous naturally-aligned elements.
|
||||
*/
|
||||
int radix_tree_maybe_preload_order(gfp_t gfp_mask, int order)
|
||||
{
|
||||
unsigned long nr_subtrees;
|
||||
int nr_nodes, subtree_height;
|
||||
|
||||
/* Preloading doesn't help anything with this gfp mask, skip it */
|
||||
if (!gfpflags_allow_blocking(gfp_mask)) {
|
||||
preempt_disable();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Calculate number and height of fully populated subtrees it takes to
|
||||
* store (1 << order) elements.
|
||||
*/
|
||||
nr_subtrees = 1 << order;
|
||||
for (subtree_height = 0; nr_subtrees > RADIX_TREE_MAP_SIZE;
|
||||
subtree_height++)
|
||||
nr_subtrees >>= RADIX_TREE_MAP_SHIFT;
|
||||
|
||||
/*
|
||||
* The worst case is zero height tree with a single item at index 0 and
|
||||
* then inserting items starting at ULONG_MAX - (1 << order).
|
||||
*
|
||||
* This requires RADIX_TREE_MAX_PATH nodes to build branch from root to
|
||||
* 0-index item.
|
||||
*/
|
||||
nr_nodes = RADIX_TREE_MAX_PATH;
|
||||
|
||||
/* Plus branch to fully populated subtrees. */
|
||||
nr_nodes += RADIX_TREE_MAX_PATH - subtree_height;
|
||||
|
||||
/* Root node is shared. */
|
||||
nr_nodes--;
|
||||
|
||||
/* Plus nodes required to build subtrees. */
|
||||
nr_nodes += nr_subtrees * height_to_maxnodes[subtree_height];
|
||||
|
||||
return __radix_tree_preload(gfp_mask, nr_nodes);
|
||||
}
|
||||
|
||||
/*
|
||||
* The maximum index which can be stored in a radix tree
|
||||
*/
|
||||
|
|
@ -1571,6 +1619,31 @@ radix_tree_node_ctor(void *arg)
|
|||
INIT_LIST_HEAD(&node->private_list);
|
||||
}
|
||||
|
||||
static __init unsigned long __maxindex(unsigned int height)
|
||||
{
|
||||
unsigned int width = height * RADIX_TREE_MAP_SHIFT;
|
||||
int shift = RADIX_TREE_INDEX_BITS - width;
|
||||
|
||||
if (shift < 0)
|
||||
return ~0UL;
|
||||
if (shift >= BITS_PER_LONG)
|
||||
return 0UL;
|
||||
return ~0UL >> shift;
|
||||
}
|
||||
|
||||
static __init void radix_tree_init_maxnodes(void)
|
||||
{
|
||||
unsigned long height_to_maxindex[RADIX_TREE_MAX_PATH + 1];
|
||||
unsigned int i, j;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(height_to_maxindex); i++)
|
||||
height_to_maxindex[i] = __maxindex(i);
|
||||
for (i = 0; i < ARRAY_SIZE(height_to_maxnodes); i++) {
|
||||
for (j = i; j > 0; j--)
|
||||
height_to_maxnodes[i] += height_to_maxindex[j - 1] + 1;
|
||||
}
|
||||
}
|
||||
|
||||
static int radix_tree_callback(struct notifier_block *nfb,
|
||||
unsigned long action, void *hcpu)
|
||||
{
|
||||
|
|
@ -1597,5 +1670,6 @@ void __init radix_tree_init(void)
|
|||
sizeof(struct radix_tree_node), 0,
|
||||
SLAB_PANIC | SLAB_RECLAIM_ACCOUNT,
|
||||
radix_tree_node_ctor);
|
||||
radix_tree_init_maxnodes();
|
||||
hotcpu_notifier(radix_tree_callback, 0);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue