mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-23 15:27:29 +00:00
Merge branch 'for-5.14' of git://git.kernel.org/pub/scm/linux/kernel/git/dennis/percpu
Pull percpu updates from Dennis Zhou: - percpu chunk depopulation - depopulate backing pages for chunks with empty pages when we exceed a global threshold without those pages. This lets us reclaim a portion of memory that would previously be lost until the full chunk would be freed (possibly never). - memcg accounting cleanup - previously separate chunks were managed for normal allocations and __GFP_ACCOUNT allocations. These are now consolidated which cleans up the code quite a bit. - a few misc clean ups for clang warnings * 'for-5.14' of git://git.kernel.org/pub/scm/linux/kernel/git/dennis/percpu: percpu: optimize locking in pcpu_balance_workfn() percpu: initialize best_upa variable percpu: rework memcg accounting mm, memcg: introduce mem_cgroup_kmem_disabled() mm, memcg: mark cgroup_memory_nosocket, nokmem and noswap as __ro_after_init percpu: make symbol 'pcpu_free_slot' static percpu: implement partial chunk depopulation percpu: use pcpu_free_slot instead of pcpu_nr_slots - 1 percpu: factor out pcpu_check_block_hint() percpu: split __pcpu_balance_workfn() percpu: fix a comment about the chunks ordering
This commit is contained in:
commit
e267992f9e
7 changed files with 343 additions and 186 deletions
|
@ -5,25 +5,6 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/percpu.h>
|
||||
|
||||
/*
|
||||
* There are two chunk types: root and memcg-aware.
|
||||
* Chunks of each type have separate slots list.
|
||||
*
|
||||
* Memcg-aware chunks have an attached vector of obj_cgroup pointers, which is
|
||||
* used to store memcg membership data of a percpu object. Obj_cgroups are
|
||||
* ref-counted pointers to a memory cgroup with an ability to switch dynamically
|
||||
* to the parent memory cgroup. This allows to reclaim a deleted memory cgroup
|
||||
* without reclaiming of all outstanding objects, which hold a reference at it.
|
||||
*/
|
||||
enum pcpu_chunk_type {
|
||||
PCPU_CHUNK_ROOT,
|
||||
#ifdef CONFIG_MEMCG_KMEM
|
||||
PCPU_CHUNK_MEMCG,
|
||||
#endif
|
||||
PCPU_NR_CHUNK_TYPES,
|
||||
PCPU_FAIL_ALLOC = PCPU_NR_CHUNK_TYPES
|
||||
};
|
||||
|
||||
/*
|
||||
* pcpu_block_md is the metadata block struct.
|
||||
* Each chunk's bitmap is split into a number of full blocks.
|
||||
|
@ -67,6 +48,8 @@ struct pcpu_chunk {
|
|||
|
||||
void *data; /* chunk data */
|
||||
bool immutable; /* no [de]population allowed */
|
||||
bool isolated; /* isolated from active chunk
|
||||
slots */
|
||||
int start_offset; /* the overlap with the previous
|
||||
region to have a page aligned
|
||||
base_addr */
|
||||
|
@ -87,7 +70,9 @@ extern spinlock_t pcpu_lock;
|
|||
|
||||
extern struct list_head *pcpu_chunk_lists;
|
||||
extern int pcpu_nr_slots;
|
||||
extern int pcpu_nr_empty_pop_pages[];
|
||||
extern int pcpu_sidelined_slot;
|
||||
extern int pcpu_to_depopulate_slot;
|
||||
extern int pcpu_nr_empty_pop_pages;
|
||||
|
||||
extern struct pcpu_chunk *pcpu_first_chunk;
|
||||
extern struct pcpu_chunk *pcpu_reserved_chunk;
|
||||
|
@ -128,37 +113,6 @@ static inline int pcpu_chunk_map_bits(struct pcpu_chunk *chunk)
|
|||
return pcpu_nr_pages_to_map_bits(chunk->nr_pages);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MEMCG_KMEM
|
||||
static inline enum pcpu_chunk_type pcpu_chunk_type(struct pcpu_chunk *chunk)
|
||||
{
|
||||
if (chunk->obj_cgroups)
|
||||
return PCPU_CHUNK_MEMCG;
|
||||
return PCPU_CHUNK_ROOT;
|
||||
}
|
||||
|
||||
static inline bool pcpu_is_memcg_chunk(enum pcpu_chunk_type chunk_type)
|
||||
{
|
||||
return chunk_type == PCPU_CHUNK_MEMCG;
|
||||
}
|
||||
|
||||
#else
|
||||
static inline enum pcpu_chunk_type pcpu_chunk_type(struct pcpu_chunk *chunk)
|
||||
{
|
||||
return PCPU_CHUNK_ROOT;
|
||||
}
|
||||
|
||||
static inline bool pcpu_is_memcg_chunk(enum pcpu_chunk_type chunk_type)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline struct list_head *pcpu_chunk_list(enum pcpu_chunk_type chunk_type)
|
||||
{
|
||||
return &pcpu_chunk_lists[pcpu_nr_slots *
|
||||
pcpu_is_memcg_chunk(chunk_type)];
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PERCPU_STATS
|
||||
|
||||
#include <linux/spinlock.h>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue