Merge branch 'akpm' (patches from Andrew)
Merge updates from Andrew Morton: - a few misc bits - ocfs2 updates - almost all of MM * emailed patches from Andrew Morton <akpm@linux-foundation.org>: (131 commits) memory hotplug: fix comments when adding section mm: make alloc_node_mem_map a void call if we don't have CONFIG_FLAT_NODE_MEM_MAP mm: simplify nodemask printing mm,oom_reaper: remove pointless kthread_run() error check mm/page_ext.c: check if page_ext is not prepared writeback: remove unused function parameter mm: do not rely on preempt_count in print_vma_addr mm, sparse: do not swamp log with huge vmemmap allocation failures mm/hmm: remove redundant variable align_end mm/list_lru.c: mark expected switch fall-through mm/shmem.c: mark expected switch fall-through mm/page_alloc.c: broken deferred calculation mm: don't warn about allocations which stall for too long fs: fuse: account fuse_inode slab memory as reclaimable mm, page_alloc: fix potential false positive in __zone_watermark_ok mm: mlock: remove lru_add_drain_all() mm, sysctl: make NUMA stats configurable shmem: convert shmem_init_inodecache() to void Unify migrate_pages and move_pages access checks mm, pagevec: rename pagevec drained field ...
This commit is contained in:
@@ -93,7 +93,7 @@ extern void wb_writeout_inc(struct bdi_writeback *wb);
|
||||
/*
|
||||
* maximal error of a stat counter.
|
||||
*/
|
||||
static inline unsigned long wb_stat_error(struct bdi_writeback *wb)
|
||||
static inline unsigned long wb_stat_error(void)
|
||||
{
|
||||
#ifdef CONFIG_SMP
|
||||
return nr_cpu_ids * WB_STAT_BATCH;
|
||||
@@ -122,6 +122,8 @@ int bdi_set_max_ratio(struct backing_dev_info *bdi, unsigned int max_ratio);
|
||||
* BDI_CAP_STRICTLIMIT: Keep number of dirty pages below bdi threshold.
|
||||
*
|
||||
* BDI_CAP_CGROUP_WRITEBACK: Supports cgroup-aware writeback.
|
||||
* BDI_CAP_SYNCHRONOUS_IO: Device is so fast that asynchronous IO would be
|
||||
* inefficient.
|
||||
*/
|
||||
#define BDI_CAP_NO_ACCT_DIRTY 0x00000001
|
||||
#define BDI_CAP_NO_WRITEBACK 0x00000002
|
||||
@@ -129,6 +131,7 @@ int bdi_set_max_ratio(struct backing_dev_info *bdi, unsigned int max_ratio);
|
||||
#define BDI_CAP_STABLE_WRITES 0x00000008
|
||||
#define BDI_CAP_STRICTLIMIT 0x00000010
|
||||
#define BDI_CAP_CGROUP_WRITEBACK 0x00000020
|
||||
#define BDI_CAP_SYNCHRONOUS_IO 0x00000040
|
||||
|
||||
#define BDI_CAP_NO_ACCT_AND_WRITEBACK \
|
||||
(BDI_CAP_NO_WRITEBACK | BDI_CAP_NO_ACCT_DIRTY | BDI_CAP_NO_ACCT_WB)
|
||||
@@ -174,6 +177,11 @@ static inline int wb_congested(struct bdi_writeback *wb, int cong_bits)
|
||||
long congestion_wait(int sync, long timeout);
|
||||
long wait_iff_congested(struct pglist_data *pgdat, int sync, long timeout);
|
||||
|
||||
static inline bool bdi_cap_synchronous_io(struct backing_dev_info *bdi)
|
||||
{
|
||||
return bdi->capabilities & BDI_CAP_SYNCHRONOUS_IO;
|
||||
}
|
||||
|
||||
static inline bool bdi_cap_stable_pages_required(struct backing_dev_info *bdi)
|
||||
{
|
||||
return bdi->capabilities & BDI_CAP_STABLE_WRITES;
|
||||
|
@@ -161,6 +161,9 @@ extern void *__alloc_bootmem_low_node(pg_data_t *pgdat,
|
||||
#define BOOTMEM_ALLOC_ANYWHERE (~(phys_addr_t)0)
|
||||
|
||||
/* FIXME: Move to memblock.h at a point where we remove nobootmem.c */
|
||||
void *memblock_virt_alloc_try_nid_raw(phys_addr_t size, phys_addr_t align,
|
||||
phys_addr_t min_addr,
|
||||
phys_addr_t max_addr, int nid);
|
||||
void *memblock_virt_alloc_try_nid_nopanic(phys_addr_t size,
|
||||
phys_addr_t align, phys_addr_t min_addr,
|
||||
phys_addr_t max_addr, int nid);
|
||||
@@ -177,6 +180,14 @@ static inline void * __init memblock_virt_alloc(
|
||||
NUMA_NO_NODE);
|
||||
}
|
||||
|
||||
static inline void * __init memblock_virt_alloc_raw(
|
||||
phys_addr_t size, phys_addr_t align)
|
||||
{
|
||||
return memblock_virt_alloc_try_nid_raw(size, align, BOOTMEM_LOW_LIMIT,
|
||||
BOOTMEM_ALLOC_ACCESSIBLE,
|
||||
NUMA_NO_NODE);
|
||||
}
|
||||
|
||||
static inline void * __init memblock_virt_alloc_nopanic(
|
||||
phys_addr_t size, phys_addr_t align)
|
||||
{
|
||||
@@ -258,6 +269,14 @@ static inline void * __init memblock_virt_alloc(
|
||||
return __alloc_bootmem(size, align, BOOTMEM_LOW_LIMIT);
|
||||
}
|
||||
|
||||
static inline void * __init memblock_virt_alloc_raw(
|
||||
phys_addr_t size, phys_addr_t align)
|
||||
{
|
||||
if (!align)
|
||||
align = SMP_CACHE_BYTES;
|
||||
return __alloc_bootmem_nopanic(size, align, BOOTMEM_LOW_LIMIT);
|
||||
}
|
||||
|
||||
static inline void * __init memblock_virt_alloc_nopanic(
|
||||
phys_addr_t size, phys_addr_t align)
|
||||
{
|
||||
@@ -310,6 +329,14 @@ static inline void * __init memblock_virt_alloc_try_nid(phys_addr_t size,
|
||||
min_addr);
|
||||
}
|
||||
|
||||
static inline void * __init memblock_virt_alloc_try_nid_raw(
|
||||
phys_addr_t size, phys_addr_t align,
|
||||
phys_addr_t min_addr, phys_addr_t max_addr, int nid)
|
||||
{
|
||||
return ___alloc_bootmem_node_nopanic(NODE_DATA(nid), size, align,
|
||||
min_addr, max_addr);
|
||||
}
|
||||
|
||||
static inline void * __init memblock_virt_alloc_try_nid_nopanic(
|
||||
phys_addr_t size, phys_addr_t align,
|
||||
phys_addr_t min_addr, phys_addr_t max_addr, int nid)
|
||||
|
@@ -9,8 +9,6 @@
|
||||
* the Free Software Foundation
|
||||
*/
|
||||
|
||||
#include <linux/kmemcheck.h>
|
||||
|
||||
#define C2PORT_NAME_LEN 32
|
||||
|
||||
struct device;
|
||||
@@ -22,10 +20,8 @@ struct device;
|
||||
/* Main struct */
|
||||
struct c2port_ops;
|
||||
struct c2port_device {
|
||||
kmemcheck_bitfield_begin(flags);
|
||||
unsigned int access:1;
|
||||
unsigned int flash_access:1;
|
||||
kmemcheck_bitfield_end(flags);
|
||||
|
||||
int id;
|
||||
char name[C2PORT_NAME_LEN];
|
||||
|
@@ -9,7 +9,6 @@
|
||||
#include <linux/dma-debug.h>
|
||||
#include <linux/dma-direction.h>
|
||||
#include <linux/scatterlist.h>
|
||||
#include <linux/kmemcheck.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/mem_encrypt.h>
|
||||
|
||||
@@ -232,7 +231,6 @@ static inline dma_addr_t dma_map_single_attrs(struct device *dev, void *ptr,
|
||||
const struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
dma_addr_t addr;
|
||||
|
||||
kmemcheck_mark_initialized(ptr, size);
|
||||
BUG_ON(!valid_dma_direction(dir));
|
||||
addr = ops->map_page(dev, virt_to_page(ptr),
|
||||
offset_in_page(ptr), size,
|
||||
@@ -265,11 +263,8 @@ static inline int dma_map_sg_attrs(struct device *dev, struct scatterlist *sg,
|
||||
unsigned long attrs)
|
||||
{
|
||||
const struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
int i, ents;
|
||||
struct scatterlist *s;
|
||||
int ents;
|
||||
|
||||
for_each_sg(sg, s, nents, i)
|
||||
kmemcheck_mark_initialized(sg_virt(s), s->length);
|
||||
BUG_ON(!valid_dma_direction(dir));
|
||||
ents = ops->map_sg(dev, sg, nents, dir, attrs);
|
||||
BUG_ON(ents < 0);
|
||||
@@ -299,7 +294,6 @@ static inline dma_addr_t dma_map_page_attrs(struct device *dev,
|
||||
const struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
dma_addr_t addr;
|
||||
|
||||
kmemcheck_mark_initialized(page_address(page) + offset, size);
|
||||
BUG_ON(!valid_dma_direction(dir));
|
||||
addr = ops->map_page(dev, page, offset, size, dir, attrs);
|
||||
debug_dma_map_page(dev, page, offset, size, dir, addr, false);
|
||||
|
@@ -454,13 +454,11 @@ struct bpf_binary_header {
|
||||
|
||||
struct bpf_prog {
|
||||
u16 pages; /* Number of allocated pages */
|
||||
kmemcheck_bitfield_begin(meta);
|
||||
u16 jited:1, /* Is our filter JIT'ed? */
|
||||
locked:1, /* Program image locked? */
|
||||
gpl_compatible:1, /* Is filter GPL compatible? */
|
||||
cb_access:1, /* Is control block accessed? */
|
||||
dst_needed:1; /* Do we need dst entry? */
|
||||
kmemcheck_bitfield_end(meta);
|
||||
enum bpf_prog_type type; /* Type of BPF program */
|
||||
u32 len; /* Number of filter blocks */
|
||||
u32 jited_len; /* Size of jited insns in bytes */
|
||||
|
@@ -24,7 +24,6 @@ struct vm_area_struct;
|
||||
#define ___GFP_HIGH 0x20u
|
||||
#define ___GFP_IO 0x40u
|
||||
#define ___GFP_FS 0x80u
|
||||
#define ___GFP_COLD 0x100u
|
||||
#define ___GFP_NOWARN 0x200u
|
||||
#define ___GFP_RETRY_MAYFAIL 0x400u
|
||||
#define ___GFP_NOFAIL 0x800u
|
||||
@@ -37,7 +36,6 @@ struct vm_area_struct;
|
||||
#define ___GFP_THISNODE 0x40000u
|
||||
#define ___GFP_ATOMIC 0x80000u
|
||||
#define ___GFP_ACCOUNT 0x100000u
|
||||
#define ___GFP_NOTRACK 0x200000u
|
||||
#define ___GFP_DIRECT_RECLAIM 0x400000u
|
||||
#define ___GFP_WRITE 0x800000u
|
||||
#define ___GFP_KSWAPD_RECLAIM 0x1000000u
|
||||
@@ -193,27 +191,15 @@ struct vm_area_struct;
|
||||
/*
|
||||
* Action modifiers
|
||||
*
|
||||
* __GFP_COLD indicates that the caller does not expect to be used in the near
|
||||
* future. Where possible, a cache-cold page will be returned.
|
||||
*
|
||||
* __GFP_NOWARN suppresses allocation failure reports.
|
||||
*
|
||||
* __GFP_COMP address compound page metadata.
|
||||
*
|
||||
* __GFP_ZERO returns a zeroed page on success.
|
||||
*
|
||||
* __GFP_NOTRACK avoids tracking with kmemcheck.
|
||||
*
|
||||
* __GFP_NOTRACK_FALSE_POSITIVE is an alias of __GFP_NOTRACK. It's a means of
|
||||
* distinguishing in the source between false positives and allocations that
|
||||
* cannot be supported (e.g. page tables).
|
||||
*/
|
||||
#define __GFP_COLD ((__force gfp_t)___GFP_COLD)
|
||||
#define __GFP_NOWARN ((__force gfp_t)___GFP_NOWARN)
|
||||
#define __GFP_COMP ((__force gfp_t)___GFP_COMP)
|
||||
#define __GFP_ZERO ((__force gfp_t)___GFP_ZERO)
|
||||
#define __GFP_NOTRACK ((__force gfp_t)___GFP_NOTRACK)
|
||||
#define __GFP_NOTRACK_FALSE_POSITIVE (__GFP_NOTRACK)
|
||||
|
||||
/* Disable lockdep for GFP context tracking */
|
||||
#define __GFP_NOLOCKDEP ((__force gfp_t)___GFP_NOLOCKDEP)
|
||||
@@ -539,8 +525,8 @@ void * __meminit alloc_pages_exact_nid(int nid, size_t size, gfp_t gfp_mask);
|
||||
|
||||
extern void __free_pages(struct page *page, unsigned int order);
|
||||
extern void free_pages(unsigned long addr, unsigned int order);
|
||||
extern void free_hot_cold_page(struct page *page, bool cold);
|
||||
extern void free_hot_cold_page_list(struct list_head *list, bool cold);
|
||||
extern void free_unref_page(struct page *page);
|
||||
extern void free_unref_page_list(struct list_head *list);
|
||||
|
||||
struct page_frag_cache;
|
||||
extern void __page_frag_cache_drain(struct page *page, unsigned int count);
|
||||
|
@@ -471,9 +471,9 @@ static inline void hmm_devmem_page_set_drvdata(struct page *page,
|
||||
* @page: pointer to struct page
|
||||
* Return: driver data value
|
||||
*/
|
||||
static inline unsigned long hmm_devmem_page_get_drvdata(struct page *page)
|
||||
static inline unsigned long hmm_devmem_page_get_drvdata(const struct page *page)
|
||||
{
|
||||
unsigned long *drvdata = (unsigned long *)&page->pgmap;
|
||||
const unsigned long *drvdata = (const unsigned long *)&page->pgmap;
|
||||
|
||||
return drvdata[1];
|
||||
}
|
||||
|
@@ -594,21 +594,6 @@ static inline void tasklet_hi_schedule(struct tasklet_struct *t)
|
||||
__tasklet_hi_schedule(t);
|
||||
}
|
||||
|
||||
extern void __tasklet_hi_schedule_first(struct tasklet_struct *t);
|
||||
|
||||
/*
|
||||
* This version avoids touching any other tasklets. Needed for kmemcheck
|
||||
* in order not to take any page faults while enqueueing this tasklet;
|
||||
* consider VERY carefully whether you really need this or
|
||||
* tasklet_hi_schedule()...
|
||||
*/
|
||||
static inline void tasklet_hi_schedule_first(struct tasklet_struct *t)
|
||||
{
|
||||
if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
|
||||
__tasklet_hi_schedule_first(t);
|
||||
}
|
||||
|
||||
|
||||
static inline void tasklet_disable_nosync(struct tasklet_struct *t)
|
||||
{
|
||||
atomic_inc(&t->count);
|
||||
|
@@ -46,7 +46,7 @@ void kasan_alloc_pages(struct page *page, unsigned int order);
|
||||
void kasan_free_pages(struct page *page, unsigned int order);
|
||||
|
||||
void kasan_cache_create(struct kmem_cache *cache, size_t *size,
|
||||
unsigned long *flags);
|
||||
slab_flags_t *flags);
|
||||
void kasan_cache_shrink(struct kmem_cache *cache);
|
||||
void kasan_cache_shutdown(struct kmem_cache *cache);
|
||||
|
||||
@@ -95,7 +95,7 @@ static inline void kasan_free_pages(struct page *page, unsigned int order) {}
|
||||
|
||||
static inline void kasan_cache_create(struct kmem_cache *cache,
|
||||
size_t *size,
|
||||
unsigned long *flags) {}
|
||||
slab_flags_t *flags) {}
|
||||
static inline void kasan_cache_shrink(struct kmem_cache *cache) {}
|
||||
static inline void kasan_cache_shutdown(struct kmem_cache *cache) {}
|
||||
|
||||
|
@@ -1,172 +1 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef LINUX_KMEMCHECK_H
|
||||
#define LINUX_KMEMCHECK_H
|
||||
|
||||
#include <linux/mm_types.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#ifdef CONFIG_KMEMCHECK
|
||||
extern int kmemcheck_enabled;
|
||||
|
||||
/* The slab-related functions. */
|
||||
void kmemcheck_alloc_shadow(struct page *page, int order, gfp_t flags, int node);
|
||||
void kmemcheck_free_shadow(struct page *page, int order);
|
||||
void kmemcheck_slab_alloc(struct kmem_cache *s, gfp_t gfpflags, void *object,
|
||||
size_t size);
|
||||
void kmemcheck_slab_free(struct kmem_cache *s, void *object, size_t size);
|
||||
|
||||
void kmemcheck_pagealloc_alloc(struct page *p, unsigned int order,
|
||||
gfp_t gfpflags);
|
||||
|
||||
void kmemcheck_show_pages(struct page *p, unsigned int n);
|
||||
void kmemcheck_hide_pages(struct page *p, unsigned int n);
|
||||
|
||||
bool kmemcheck_page_is_tracked(struct page *p);
|
||||
|
||||
void kmemcheck_mark_unallocated(void *address, unsigned int n);
|
||||
void kmemcheck_mark_uninitialized(void *address, unsigned int n);
|
||||
void kmemcheck_mark_initialized(void *address, unsigned int n);
|
||||
void kmemcheck_mark_freed(void *address, unsigned int n);
|
||||
|
||||
void kmemcheck_mark_unallocated_pages(struct page *p, unsigned int n);
|
||||
void kmemcheck_mark_uninitialized_pages(struct page *p, unsigned int n);
|
||||
void kmemcheck_mark_initialized_pages(struct page *p, unsigned int n);
|
||||
|
||||
int kmemcheck_show_addr(unsigned long address);
|
||||
int kmemcheck_hide_addr(unsigned long address);
|
||||
|
||||
bool kmemcheck_is_obj_initialized(unsigned long addr, size_t size);
|
||||
|
||||
/*
|
||||
* Bitfield annotations
|
||||
*
|
||||
* How to use: If you have a struct using bitfields, for example
|
||||
*
|
||||
* struct a {
|
||||
* int x:8, y:8;
|
||||
* };
|
||||
*
|
||||
* then this should be rewritten as
|
||||
*
|
||||
* struct a {
|
||||
* kmemcheck_bitfield_begin(flags);
|
||||
* int x:8, y:8;
|
||||
* kmemcheck_bitfield_end(flags);
|
||||
* };
|
||||
*
|
||||
* Now the "flags_begin" and "flags_end" members may be used to refer to the
|
||||
* beginning and end, respectively, of the bitfield (and things like
|
||||
* &x.flags_begin is allowed). As soon as the struct is allocated, the bit-
|
||||
* fields should be annotated:
|
||||
*
|
||||
* struct a *a = kmalloc(sizeof(struct a), GFP_KERNEL);
|
||||
* kmemcheck_annotate_bitfield(a, flags);
|
||||
*/
|
||||
#define kmemcheck_bitfield_begin(name) \
|
||||
int name##_begin[0];
|
||||
|
||||
#define kmemcheck_bitfield_end(name) \
|
||||
int name##_end[0];
|
||||
|
||||
#define kmemcheck_annotate_bitfield(ptr, name) \
|
||||
do { \
|
||||
int _n; \
|
||||
\
|
||||
if (!ptr) \
|
||||
break; \
|
||||
\
|
||||
_n = (long) &((ptr)->name##_end) \
|
||||
- (long) &((ptr)->name##_begin); \
|
||||
BUILD_BUG_ON(_n < 0); \
|
||||
\
|
||||
kmemcheck_mark_initialized(&((ptr)->name##_begin), _n); \
|
||||
} while (0)
|
||||
|
||||
#define kmemcheck_annotate_variable(var) \
|
||||
do { \
|
||||
kmemcheck_mark_initialized(&(var), sizeof(var)); \
|
||||
} while (0) \
|
||||
|
||||
#else
|
||||
#define kmemcheck_enabled 0
|
||||
|
||||
static inline void
|
||||
kmemcheck_alloc_shadow(struct page *page, int order, gfp_t flags, int node)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void
|
||||
kmemcheck_free_shadow(struct page *page, int order)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void
|
||||
kmemcheck_slab_alloc(struct kmem_cache *s, gfp_t gfpflags, void *object,
|
||||
size_t size)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void kmemcheck_slab_free(struct kmem_cache *s, void *object,
|
||||
size_t size)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void kmemcheck_pagealloc_alloc(struct page *p,
|
||||
unsigned int order, gfp_t gfpflags)
|
||||
{
|
||||
}
|
||||
|
||||
static inline bool kmemcheck_page_is_tracked(struct page *p)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline void kmemcheck_mark_unallocated(void *address, unsigned int n)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void kmemcheck_mark_uninitialized(void *address, unsigned int n)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void kmemcheck_mark_initialized(void *address, unsigned int n)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void kmemcheck_mark_freed(void *address, unsigned int n)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void kmemcheck_mark_unallocated_pages(struct page *p,
|
||||
unsigned int n)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void kmemcheck_mark_uninitialized_pages(struct page *p,
|
||||
unsigned int n)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void kmemcheck_mark_initialized_pages(struct page *p,
|
||||
unsigned int n)
|
||||
{
|
||||
}
|
||||
|
||||
static inline bool kmemcheck_is_obj_initialized(unsigned long addr, size_t size)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
#define kmemcheck_bitfield_begin(name)
|
||||
#define kmemcheck_bitfield_end(name)
|
||||
#define kmemcheck_annotate_bitfield(ptr, name) \
|
||||
do { \
|
||||
} while (0)
|
||||
|
||||
#define kmemcheck_annotate_variable(var) \
|
||||
do { \
|
||||
} while (0)
|
||||
|
||||
#endif /* CONFIG_KMEMCHECK */
|
||||
|
||||
#endif /* LINUX_KMEMCHECK_H */
|
||||
|
@@ -48,14 +48,14 @@ extern void kmemleak_not_leak_phys(phys_addr_t phys) __ref;
|
||||
extern void kmemleak_ignore_phys(phys_addr_t phys) __ref;
|
||||
|
||||
static inline void kmemleak_alloc_recursive(const void *ptr, size_t size,
|
||||
int min_count, unsigned long flags,
|
||||
int min_count, slab_flags_t flags,
|
||||
gfp_t gfp)
|
||||
{
|
||||
if (!(flags & SLAB_NOLEAKTRACE))
|
||||
kmemleak_alloc(ptr, size, min_count, gfp);
|
||||
}
|
||||
|
||||
static inline void kmemleak_free_recursive(const void *ptr, unsigned long flags)
|
||||
static inline void kmemleak_free_recursive(const void *ptr, slab_flags_t flags)
|
||||
{
|
||||
if (!(flags & SLAB_NOLEAKTRACE))
|
||||
kmemleak_free(ptr);
|
||||
@@ -76,7 +76,7 @@ static inline void kmemleak_alloc(const void *ptr, size_t size, int min_count,
|
||||
{
|
||||
}
|
||||
static inline void kmemleak_alloc_recursive(const void *ptr, size_t size,
|
||||
int min_count, unsigned long flags,
|
||||
int min_count, slab_flags_t flags,
|
||||
gfp_t gfp)
|
||||
{
|
||||
}
|
||||
@@ -94,7 +94,7 @@ static inline void kmemleak_free(const void *ptr)
|
||||
static inline void kmemleak_free_part(const void *ptr, size_t size)
|
||||
{
|
||||
}
|
||||
static inline void kmemleak_free_recursive(const void *ptr, unsigned long flags)
|
||||
static inline void kmemleak_free_recursive(const void *ptr, slab_flags_t flags)
|
||||
{
|
||||
}
|
||||
static inline void kmemleak_free_percpu(const void __percpu *ptr)
|
||||
|
@@ -237,6 +237,22 @@ unsigned long memblock_next_valid_pfn(unsigned long pfn, unsigned long max_pfn);
|
||||
for_each_mem_range_rev(i, &memblock.memory, &memblock.reserved, \
|
||||
nid, flags, p_start, p_end, p_nid)
|
||||
|
||||
/**
|
||||
* for_each_resv_unavail_range - iterate through reserved and unavailable memory
|
||||
* @i: u64 used as loop variable
|
||||
* @flags: pick from blocks based on memory attributes
|
||||
* @p_start: ptr to phys_addr_t for start address of the range, can be %NULL
|
||||
* @p_end: ptr to phys_addr_t for end address of the range, can be %NULL
|
||||
*
|
||||
* Walks over unavailable but reserved (reserved && !memory) areas of memblock.
|
||||
* Available as soon as memblock is initialized.
|
||||
* Note: because this memory does not belong to any physical node, flags and
|
||||
* nid arguments do not make sense and thus not exported as arguments.
|
||||
*/
|
||||
#define for_each_resv_unavail_range(i, p_start, p_end) \
|
||||
for_each_mem_range(i, &memblock.reserved, &memblock.memory, \
|
||||
NUMA_NO_NODE, MEMBLOCK_NONE, p_start, p_end, NULL)
|
||||
|
||||
static inline void memblock_set_region_flags(struct memblock_region *r,
|
||||
unsigned long flags)
|
||||
{
|
||||
@@ -389,10 +405,10 @@ static inline unsigned long memblock_region_reserved_end_pfn(const struct memblo
|
||||
region < (memblock.memblock_type.regions + memblock.memblock_type.cnt); \
|
||||
region++)
|
||||
|
||||
#define for_each_memblock_type(memblock_type, rgn) \
|
||||
for (idx = 0, rgn = &memblock_type->regions[0]; \
|
||||
idx < memblock_type->cnt; \
|
||||
idx++, rgn = &memblock_type->regions[idx])
|
||||
#define for_each_memblock_type(i, memblock_type, rgn) \
|
||||
for (i = 0, rgn = &memblock_type->regions[0]; \
|
||||
i < memblock_type->cnt; \
|
||||
i++, rgn = &memblock_type->regions[i])
|
||||
|
||||
#ifdef CONFIG_MEMTEST
|
||||
extern void early_memtest(phys_addr_t start, phys_addr_t end);
|
||||
|
@@ -95,6 +95,15 @@ extern int mmap_rnd_compat_bits __read_mostly;
|
||||
#define mm_forbids_zeropage(X) (0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* On some architectures it is expensive to call memset() for small sizes.
|
||||
* Those architectures should provide their own implementation of "struct page"
|
||||
* zeroing by defining this macro in <asm/pgtable.h>.
|
||||
*/
|
||||
#ifndef mm_zero_struct_page
|
||||
#define mm_zero_struct_page(pp) ((void)memset((pp), 0, sizeof(struct page)))
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Default maximum number of active map areas, this limits the number of vmas
|
||||
* per mm struct. Users can overwrite this number by sysctl but there is a
|
||||
@@ -1431,7 +1440,13 @@ void account_page_cleaned(struct page *page, struct address_space *mapping,
|
||||
struct bdi_writeback *wb);
|
||||
int set_page_dirty(struct page *page);
|
||||
int set_page_dirty_lock(struct page *page);
|
||||
void cancel_dirty_page(struct page *page);
|
||||
void __cancel_dirty_page(struct page *page);
|
||||
static inline void cancel_dirty_page(struct page *page)
|
||||
{
|
||||
/* Avoid atomic ops, locking, etc. when not actually needed. */
|
||||
if (PageDirty(page))
|
||||
__cancel_dirty_page(page);
|
||||
}
|
||||
int clear_page_dirty_for_io(struct page *page);
|
||||
|
||||
int get_cmdline(struct task_struct *task, char *buffer, int buflen);
|
||||
@@ -1599,14 +1614,27 @@ static inline int __p4d_alloc(struct mm_struct *mm, pgd_t *pgd,
|
||||
int __p4d_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address);
|
||||
#endif
|
||||
|
||||
#ifdef __PAGETABLE_PUD_FOLDED
|
||||
#if defined(__PAGETABLE_PUD_FOLDED) || !defined(CONFIG_MMU)
|
||||
static inline int __pud_alloc(struct mm_struct *mm, p4d_t *p4d,
|
||||
unsigned long address)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void mm_inc_nr_puds(struct mm_struct *mm) {}
|
||||
static inline void mm_dec_nr_puds(struct mm_struct *mm) {}
|
||||
|
||||
#else
|
||||
int __pud_alloc(struct mm_struct *mm, p4d_t *p4d, unsigned long address);
|
||||
|
||||
static inline void mm_inc_nr_puds(struct mm_struct *mm)
|
||||
{
|
||||
atomic_long_add(PTRS_PER_PUD * sizeof(pud_t), &mm->pgtables_bytes);
|
||||
}
|
||||
|
||||
static inline void mm_dec_nr_puds(struct mm_struct *mm)
|
||||
{
|
||||
atomic_long_sub(PTRS_PER_PUD * sizeof(pud_t), &mm->pgtables_bytes);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(__PAGETABLE_PMD_FOLDED) || !defined(CONFIG_MMU)
|
||||
@@ -1616,40 +1644,55 @@ static inline int __pmd_alloc(struct mm_struct *mm, pud_t *pud,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void mm_nr_pmds_init(struct mm_struct *mm) {}
|
||||
|
||||
static inline unsigned long mm_nr_pmds(struct mm_struct *mm)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void mm_inc_nr_pmds(struct mm_struct *mm) {}
|
||||
static inline void mm_dec_nr_pmds(struct mm_struct *mm) {}
|
||||
|
||||
#else
|
||||
int __pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address);
|
||||
|
||||
static inline void mm_nr_pmds_init(struct mm_struct *mm)
|
||||
{
|
||||
atomic_long_set(&mm->nr_pmds, 0);
|
||||
}
|
||||
|
||||
static inline unsigned long mm_nr_pmds(struct mm_struct *mm)
|
||||
{
|
||||
return atomic_long_read(&mm->nr_pmds);
|
||||
}
|
||||
|
||||
static inline void mm_inc_nr_pmds(struct mm_struct *mm)
|
||||
{
|
||||
atomic_long_inc(&mm->nr_pmds);
|
||||
atomic_long_add(PTRS_PER_PMD * sizeof(pmd_t), &mm->pgtables_bytes);
|
||||
}
|
||||
|
||||
static inline void mm_dec_nr_pmds(struct mm_struct *mm)
|
||||
{
|
||||
atomic_long_dec(&mm->nr_pmds);
|
||||
atomic_long_sub(PTRS_PER_PMD * sizeof(pmd_t), &mm->pgtables_bytes);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
static inline void mm_pgtables_bytes_init(struct mm_struct *mm)
|
||||
{
|
||||
atomic_long_set(&mm->pgtables_bytes, 0);
|
||||
}
|
||||
|
||||
static inline unsigned long mm_pgtables_bytes(const struct mm_struct *mm)
|
||||
{
|
||||
return atomic_long_read(&mm->pgtables_bytes);
|
||||
}
|
||||
|
||||
static inline void mm_inc_nr_ptes(struct mm_struct *mm)
|
||||
{
|
||||
atomic_long_add(PTRS_PER_PTE * sizeof(pte_t), &mm->pgtables_bytes);
|
||||
}
|
||||
|
||||
static inline void mm_dec_nr_ptes(struct mm_struct *mm)
|
||||
{
|
||||
atomic_long_sub(PTRS_PER_PTE * sizeof(pte_t), &mm->pgtables_bytes);
|
||||
}
|
||||
#else
|
||||
|
||||
static inline void mm_pgtables_bytes_init(struct mm_struct *mm) {}
|
||||
static inline unsigned long mm_pgtables_bytes(const struct mm_struct *mm)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void mm_inc_nr_ptes(struct mm_struct *mm) {}
|
||||
static inline void mm_dec_nr_ptes(struct mm_struct *mm) {}
|
||||
#endif
|
||||
|
||||
int __pte_alloc(struct mm_struct *mm, pmd_t *pmd, unsigned long address);
|
||||
int __pte_alloc_kernel(pmd_t *pmd, unsigned long address);
|
||||
|
||||
@@ -2002,6 +2045,12 @@ extern int __meminit __early_pfn_to_nid(unsigned long pfn,
|
||||
struct mminit_pfnnid_cache *state);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_HAVE_MEMBLOCK
|
||||
void zero_resv_unavail(void);
|
||||
#else
|
||||
static inline void zero_resv_unavail(void) {}
|
||||
#endif
|
||||
|
||||
extern void set_dma_reserve(unsigned long new_dma_reserve);
|
||||
extern void memmap_init_zone(unsigned long, int, unsigned long,
|
||||
unsigned long, enum memmap_context);
|
||||
|
@@ -48,8 +48,10 @@ struct page {
|
||||
* inode address_space, or NULL.
|
||||
* If page mapped as anonymous
|
||||
* memory, low bit is set, and
|
||||
* it points to anon_vma object:
|
||||
* see PAGE_MAPPING_ANON below.
|
||||
* it points to anon_vma object
|
||||
* or KSM private structure. See
|
||||
* PAGE_MAPPING_ANON and
|
||||
* PAGE_MAPPING_KSM.
|
||||
*/
|
||||
void *s_mem; /* slab first object */
|
||||
atomic_t compound_mapcount; /* first tail page */
|
||||
@@ -207,14 +209,6 @@ struct page {
|
||||
not kmapped, ie. highmem) */
|
||||
#endif /* WANT_PAGE_VIRTUAL */
|
||||
|
||||
#ifdef CONFIG_KMEMCHECK
|
||||
/*
|
||||
* kmemcheck wants to track the status of each byte in a page; this
|
||||
* is a pointer to such a status block. NULL if not tracked.
|
||||
*/
|
||||
void *shadow;
|
||||
#endif
|
||||
|
||||
#ifdef LAST_CPUPID_NOT_IN_PAGE_FLAGS
|
||||
int _last_cpupid;
|
||||
#endif
|
||||
@@ -399,9 +393,8 @@ struct mm_struct {
|
||||
*/
|
||||
atomic_t mm_count;
|
||||
|
||||
atomic_long_t nr_ptes; /* PTE page table pages */
|
||||
#if CONFIG_PGTABLE_LEVELS > 2
|
||||
atomic_long_t nr_pmds; /* PMD page table pages */
|
||||
#ifdef CONFIG_MMU
|
||||
atomic_long_t pgtables_bytes; /* PTE page table pages */
|
||||
#endif
|
||||
int map_count; /* number of VMAs */
|
||||
|
||||
|
@@ -156,7 +156,8 @@ struct mmu_notifier_ops {
|
||||
* shared page-tables, it not necessary to implement the
|
||||
* invalidate_range_start()/end() notifiers, as
|
||||
* invalidate_range() alread catches the points in time when an
|
||||
* external TLB range needs to be flushed.
|
||||
* external TLB range needs to be flushed. For more in depth
|
||||
* discussion on this see Documentation/vm/mmu_notifier.txt
|
||||
*
|
||||
* The invalidate_range() function is called under the ptl
|
||||
* spin-lock and not allowed to sleep.
|
||||
@@ -213,7 +214,8 @@ extern void __mmu_notifier_change_pte(struct mm_struct *mm,
|
||||
extern void __mmu_notifier_invalidate_range_start(struct mm_struct *mm,
|
||||
unsigned long start, unsigned long end);
|
||||
extern void __mmu_notifier_invalidate_range_end(struct mm_struct *mm,
|
||||
unsigned long start, unsigned long end);
|
||||
unsigned long start, unsigned long end,
|
||||
bool only_end);
|
||||
extern void __mmu_notifier_invalidate_range(struct mm_struct *mm,
|
||||
unsigned long start, unsigned long end);
|
||||
|
||||
@@ -267,7 +269,14 @@ static inline void mmu_notifier_invalidate_range_end(struct mm_struct *mm,
|
||||
unsigned long start, unsigned long end)
|
||||
{
|
||||
if (mm_has_notifiers(mm))
|
||||
__mmu_notifier_invalidate_range_end(mm, start, end);
|
||||
__mmu_notifier_invalidate_range_end(mm, start, end, false);
|
||||
}
|
||||
|
||||
static inline void mmu_notifier_invalidate_range_only_end(struct mm_struct *mm,
|
||||
unsigned long start, unsigned long end)
|
||||
{
|
||||
if (mm_has_notifiers(mm))
|
||||
__mmu_notifier_invalidate_range_end(mm, start, end, true);
|
||||
}
|
||||
|
||||
static inline void mmu_notifier_invalidate_range(struct mm_struct *mm,
|
||||
@@ -438,6 +447,11 @@ static inline void mmu_notifier_invalidate_range_end(struct mm_struct *mm,
|
||||
{
|
||||
}
|
||||
|
||||
static inline void mmu_notifier_invalidate_range_only_end(struct mm_struct *mm,
|
||||
unsigned long start, unsigned long end)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void mmu_notifier_invalidate_range(struct mm_struct *mm,
|
||||
unsigned long start, unsigned long end)
|
||||
{
|
||||
|
@@ -700,7 +700,8 @@ typedef struct pglist_data {
|
||||
* is the first PFN that needs to be initialised.
|
||||
*/
|
||||
unsigned long first_deferred_pfn;
|
||||
unsigned long static_init_size;
|
||||
/* Number of non-deferred pages */
|
||||
unsigned long static_init_pgcnt;
|
||||
#endif /* CONFIG_DEFERRED_STRUCT_PAGE_INIT */
|
||||
|
||||
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
||||
@@ -712,12 +713,6 @@ typedef struct pglist_data {
|
||||
/* Fields commonly accessed by the page reclaim scanner */
|
||||
struct lruvec lruvec;
|
||||
|
||||
/*
|
||||
* The target ratio of ACTIVE_ANON to INACTIVE_ANON pages on
|
||||
* this node's LRU. Maintained by the pageout code.
|
||||
*/
|
||||
unsigned int inactive_ratio;
|
||||
|
||||
unsigned long flags;
|
||||
|
||||
ZONE_PADDING(_pad2_)
|
||||
|
@@ -22,7 +22,6 @@
|
||||
#include <linux/random.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/fcntl.h> /* For O_CLOEXEC and O_NONBLOCK */
|
||||
#include <linux/kmemcheck.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/once.h>
|
||||
#include <linux/fs.h>
|
||||
@@ -111,9 +110,7 @@ struct socket_wq {
|
||||
struct socket {
|
||||
socket_state state;
|
||||
|
||||
kmemcheck_bitfield_begin(type);
|
||||
short type;
|
||||
kmemcheck_bitfield_end(type);
|
||||
|
||||
unsigned long flags;
|
||||
|
||||
|
@@ -104,7 +104,9 @@ extern nodemask_t _unused_nodemask_arg_;
|
||||
*
|
||||
* Can be used to provide arguments for '%*pb[l]' when printing a nodemask.
|
||||
*/
|
||||
#define nodemask_pr_args(maskp) MAX_NUMNODES, (maskp)->bits
|
||||
#define nodemask_pr_args(maskp) \
|
||||
((maskp) != NULL) ? MAX_NUMNODES : 0, \
|
||||
((maskp) != NULL) ? (maskp)->bits : NULL
|
||||
|
||||
/*
|
||||
* The inline keyword gives the compiler room to decide to inline, or
|
||||
|
@@ -18,7 +18,7 @@
|
||||
* Various page->flags bits:
|
||||
*
|
||||
* PG_reserved is set for special pages, which can never be swapped out. Some
|
||||
* of them might not even exist (eg empty_bad_page)...
|
||||
* of them might not even exist...
|
||||
*
|
||||
* The PG_private bitflag is set on pagecache pages if they contain filesystem
|
||||
* specific data (which is normally at page->private). It can be used by
|
||||
|
@@ -31,7 +31,7 @@ static inline bool is_migrate_isolate(int migratetype)
|
||||
#endif
|
||||
|
||||
bool has_unmovable_pages(struct zone *zone, struct page *page, int count,
|
||||
bool skip_hwpoisoned_pages);
|
||||
int migratetype, bool skip_hwpoisoned_pages);
|
||||
void set_pageblock_migratetype(struct page *page, int migratetype);
|
||||
int move_freepages_block(struct zone *zone, struct page *page,
|
||||
int migratetype, int *num_movable);
|
||||
|
@@ -16,6 +16,8 @@
|
||||
#include <linux/hardirq.h> /* for in_interrupt() */
|
||||
#include <linux/hugetlb_inline.h>
|
||||
|
||||
struct pagevec;
|
||||
|
||||
/*
|
||||
* Bits in mapping->flags.
|
||||
*/
|
||||
@@ -116,7 +118,7 @@ static inline void mapping_set_gfp_mask(struct address_space *m, gfp_t mask)
|
||||
m->gfp_mask = mask;
|
||||
}
|
||||
|
||||
void release_pages(struct page **pages, int nr, bool cold);
|
||||
void release_pages(struct page **pages, int nr);
|
||||
|
||||
/*
|
||||
* speculatively take a reference to a page.
|
||||
@@ -232,15 +234,9 @@ static inline struct page *page_cache_alloc(struct address_space *x)
|
||||
return __page_cache_alloc(mapping_gfp_mask(x));
|
||||
}
|
||||
|
||||
static inline struct page *page_cache_alloc_cold(struct address_space *x)
|
||||
{
|
||||
return __page_cache_alloc(mapping_gfp_mask(x)|__GFP_COLD);
|
||||
}
|
||||
|
||||
static inline gfp_t readahead_gfp_mask(struct address_space *x)
|
||||
{
|
||||
return mapping_gfp_mask(x) |
|
||||
__GFP_COLD | __GFP_NORETRY | __GFP_NOWARN;
|
||||
return mapping_gfp_mask(x) | __GFP_NORETRY | __GFP_NOWARN;
|
||||
}
|
||||
|
||||
typedef int filler_t(void *, struct page *);
|
||||
@@ -366,8 +362,16 @@ static inline unsigned find_get_pages(struct address_space *mapping,
|
||||
}
|
||||
unsigned find_get_pages_contig(struct address_space *mapping, pgoff_t start,
|
||||
unsigned int nr_pages, struct page **pages);
|
||||
unsigned find_get_pages_tag(struct address_space *mapping, pgoff_t *index,
|
||||
int tag, unsigned int nr_pages, struct page **pages);
|
||||
unsigned find_get_pages_range_tag(struct address_space *mapping, pgoff_t *index,
|
||||
pgoff_t end, int tag, unsigned int nr_pages,
|
||||
struct page **pages);
|
||||
static inline unsigned find_get_pages_tag(struct address_space *mapping,
|
||||
pgoff_t *index, int tag, unsigned int nr_pages,
|
||||
struct page **pages)
|
||||
{
|
||||
return find_get_pages_range_tag(mapping, index, (pgoff_t)-1, tag,
|
||||
nr_pages, pages);
|
||||
}
|
||||
unsigned find_get_entries_tag(struct address_space *mapping, pgoff_t start,
|
||||
int tag, unsigned int nr_entries,
|
||||
struct page **entries, pgoff_t *indices);
|
||||
@@ -616,6 +620,8 @@ int add_to_page_cache_lru(struct page *page, struct address_space *mapping,
|
||||
extern void delete_from_page_cache(struct page *page);
|
||||
extern void __delete_from_page_cache(struct page *page, void *shadow);
|
||||
int replace_page_cache_page(struct page *old, struct page *new, gfp_t gfp_mask);
|
||||
void delete_from_page_cache_batch(struct address_space *mapping,
|
||||
struct pagevec *pvec);
|
||||
|
||||
/*
|
||||
* Like add_to_page_cache_locked, but used to add newly allocated pages:
|
||||
|
@@ -17,7 +17,7 @@ struct address_space;
|
||||
|
||||
struct pagevec {
|
||||
unsigned long nr;
|
||||
unsigned long cold;
|
||||
bool percpu_pvec_drained;
|
||||
struct page *pages[PAGEVEC_SIZE];
|
||||
};
|
||||
|
||||
@@ -38,14 +38,22 @@ static inline unsigned pagevec_lookup(struct pagevec *pvec,
|
||||
return pagevec_lookup_range(pvec, mapping, start, (pgoff_t)-1);
|
||||
}
|
||||
|
||||
unsigned pagevec_lookup_tag(struct pagevec *pvec,
|
||||
struct address_space *mapping, pgoff_t *index, int tag,
|
||||
unsigned nr_pages);
|
||||
unsigned pagevec_lookup_range_tag(struct pagevec *pvec,
|
||||
struct address_space *mapping, pgoff_t *index, pgoff_t end,
|
||||
int tag);
|
||||
unsigned pagevec_lookup_range_nr_tag(struct pagevec *pvec,
|
||||
struct address_space *mapping, pgoff_t *index, pgoff_t end,
|
||||
int tag, unsigned max_pages);
|
||||
static inline unsigned pagevec_lookup_tag(struct pagevec *pvec,
|
||||
struct address_space *mapping, pgoff_t *index, int tag)
|
||||
{
|
||||
return pagevec_lookup_range_tag(pvec, mapping, index, (pgoff_t)-1, tag);
|
||||
}
|
||||
|
||||
static inline void pagevec_init(struct pagevec *pvec, int cold)
|
||||
static inline void pagevec_init(struct pagevec *pvec)
|
||||
{
|
||||
pvec->nr = 0;
|
||||
pvec->cold = cold;
|
||||
pvec->percpu_pvec_drained = false;
|
||||
}
|
||||
|
||||
static inline void pagevec_reinit(struct pagevec *pvec)
|
||||
|
@@ -301,18 +301,17 @@ void *__radix_tree_lookup(const struct radix_tree_root *, unsigned long index,
|
||||
void *radix_tree_lookup(const struct radix_tree_root *, unsigned long);
|
||||
void __rcu **radix_tree_lookup_slot(const struct radix_tree_root *,
|
||||
unsigned long index);
|
||||
typedef void (*radix_tree_update_node_t)(struct radix_tree_node *, void *);
|
||||
typedef void (*radix_tree_update_node_t)(struct radix_tree_node *);
|
||||
void __radix_tree_replace(struct radix_tree_root *, struct radix_tree_node *,
|
||||
void __rcu **slot, void *entry,
|
||||
radix_tree_update_node_t update_node, void *private);
|
||||
radix_tree_update_node_t update_node);
|
||||
void radix_tree_iter_replace(struct radix_tree_root *,
|
||||
const struct radix_tree_iter *, void __rcu **slot, void *entry);
|
||||
void radix_tree_replace_slot(struct radix_tree_root *,
|
||||
void __rcu **slot, void *entry);
|
||||
void __radix_tree_delete_node(struct radix_tree_root *,
|
||||
struct radix_tree_node *,
|
||||
radix_tree_update_node_t update_node,
|
||||
void *private);
|
||||
radix_tree_update_node_t update_node);
|
||||
void radix_tree_iter_delete(struct radix_tree_root *,
|
||||
struct radix_tree_iter *iter, void __rcu **slot);
|
||||
void *radix_tree_delete_item(struct radix_tree_root *, unsigned long, void *);
|
||||
|
@@ -2,7 +2,6 @@
|
||||
#ifndef _LINUX_RING_BUFFER_H
|
||||
#define _LINUX_RING_BUFFER_H
|
||||
|
||||
#include <linux/kmemcheck.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/poll.h>
|
||||
@@ -14,9 +13,7 @@ struct ring_buffer_iter;
|
||||
* Don't refer to this struct directly, use functions below.
|
||||
*/
|
||||
struct ring_buffer_event {
|
||||
kmemcheck_bitfield_begin(bitfield);
|
||||
u32 type_len:5, time_delta:27;
|
||||
kmemcheck_bitfield_end(bitfield);
|
||||
|
||||
u32 array[];
|
||||
};
|
||||
|
@@ -15,7 +15,6 @@
|
||||
#define _LINUX_SKBUFF_H
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/kmemcheck.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/bug.h>
|
||||
@@ -711,7 +710,6 @@ struct sk_buff {
|
||||
/* Following fields are _not_ copied in __copy_skb_header()
|
||||
* Note that queue_mapping is here mostly to fill a hole.
|
||||
*/
|
||||
kmemcheck_bitfield_begin(flags1);
|
||||
__u16 queue_mapping;
|
||||
|
||||
/* if you move cloned around you also must adapt those constants */
|
||||
@@ -730,7 +728,6 @@ struct sk_buff {
|
||||
head_frag:1,
|
||||
xmit_more:1,
|
||||
__unused:1; /* one bit hole */
|
||||
kmemcheck_bitfield_end(flags1);
|
||||
|
||||
/* fields enclosed in headers_start/headers_end are copied
|
||||
* using a single memcpy() in __copy_skb_header()
|
||||
@@ -2664,7 +2661,7 @@ static inline struct page *__dev_alloc_pages(gfp_t gfp_mask,
|
||||
* 4. __GFP_MEMALLOC is ignored if __GFP_NOMEMALLOC is set due to
|
||||
* code in gfp_to_alloc_flags that should be enforcing this.
|
||||
*/
|
||||
gfp_mask |= __GFP_COLD | __GFP_COMP | __GFP_MEMALLOC;
|
||||
gfp_mask |= __GFP_COMP | __GFP_MEMALLOC;
|
||||
|
||||
return alloc_pages_node(NUMA_NO_NODE, gfp_mask, order);
|
||||
}
|
||||
|
@@ -21,13 +21,20 @@
|
||||
* Flags to pass to kmem_cache_create().
|
||||
* The ones marked DEBUG are only valid if CONFIG_DEBUG_SLAB is set.
|
||||
*/
|
||||
#define SLAB_CONSISTENCY_CHECKS 0x00000100UL /* DEBUG: Perform (expensive) checks on alloc/free */
|
||||
#define SLAB_RED_ZONE 0x00000400UL /* DEBUG: Red zone objs in a cache */
|
||||
#define SLAB_POISON 0x00000800UL /* DEBUG: Poison objects */
|
||||
#define SLAB_HWCACHE_ALIGN 0x00002000UL /* Align objs on cache lines */
|
||||
#define SLAB_CACHE_DMA 0x00004000UL /* Use GFP_DMA memory */
|
||||
#define SLAB_STORE_USER 0x00010000UL /* DEBUG: Store the last owner for bug hunting */
|
||||
#define SLAB_PANIC 0x00040000UL /* Panic if kmem_cache_create() fails */
|
||||
/* DEBUG: Perform (expensive) checks on alloc/free */
|
||||
#define SLAB_CONSISTENCY_CHECKS ((slab_flags_t __force)0x00000100U)
|
||||
/* DEBUG: Red zone objs in a cache */
|
||||
#define SLAB_RED_ZONE ((slab_flags_t __force)0x00000400U)
|
||||
/* DEBUG: Poison objects */
|
||||
#define SLAB_POISON ((slab_flags_t __force)0x00000800U)
|
||||
/* Align objs on cache lines */
|
||||
#define SLAB_HWCACHE_ALIGN ((slab_flags_t __force)0x00002000U)
|
||||
/* Use GFP_DMA memory */
|
||||
#define SLAB_CACHE_DMA ((slab_flags_t __force)0x00004000U)
|
||||
/* DEBUG: Store the last owner for bug hunting */
|
||||
#define SLAB_STORE_USER ((slab_flags_t __force)0x00010000U)
|
||||
/* Panic if kmem_cache_create() fails */
|
||||
#define SLAB_PANIC ((slab_flags_t __force)0x00040000U)
|
||||
/*
|
||||
* SLAB_TYPESAFE_BY_RCU - **WARNING** READ THIS!
|
||||
*
|
||||
@@ -65,44 +72,45 @@
|
||||
*
|
||||
* Note that SLAB_TYPESAFE_BY_RCU was originally named SLAB_DESTROY_BY_RCU.
|
||||
*/
|
||||
#define SLAB_TYPESAFE_BY_RCU 0x00080000UL /* Defer freeing slabs to RCU */
|
||||
#define SLAB_MEM_SPREAD 0x00100000UL /* Spread some memory over cpuset */
|
||||
#define SLAB_TRACE 0x00200000UL /* Trace allocations and frees */
|
||||
/* Defer freeing slabs to RCU */
|
||||
#define SLAB_TYPESAFE_BY_RCU ((slab_flags_t __force)0x00080000U)
|
||||
/* Spread some memory over cpuset */
|
||||
#define SLAB_MEM_SPREAD ((slab_flags_t __force)0x00100000U)
|
||||
/* Trace allocations and frees */
|
||||
#define SLAB_TRACE ((slab_flags_t __force)0x00200000U)
|
||||
|
||||
/* Flag to prevent checks on free */
|
||||
#ifdef CONFIG_DEBUG_OBJECTS
|
||||
# define SLAB_DEBUG_OBJECTS 0x00400000UL
|
||||
# define SLAB_DEBUG_OBJECTS ((slab_flags_t __force)0x00400000U)
|
||||
#else
|
||||
# define SLAB_DEBUG_OBJECTS 0x00000000UL
|
||||
# define SLAB_DEBUG_OBJECTS 0
|
||||
#endif
|
||||
|
||||
#define SLAB_NOLEAKTRACE 0x00800000UL /* Avoid kmemleak tracing */
|
||||
/* Avoid kmemleak tracing */
|
||||
#define SLAB_NOLEAKTRACE ((slab_flags_t __force)0x00800000U)
|
||||
|
||||
/* Don't track use of uninitialized memory */
|
||||
#ifdef CONFIG_KMEMCHECK
|
||||
# define SLAB_NOTRACK 0x01000000UL
|
||||
#else
|
||||
# define SLAB_NOTRACK 0x00000000UL
|
||||
#endif
|
||||
/* Fault injection mark */
|
||||
#ifdef CONFIG_FAILSLAB
|
||||
# define SLAB_FAILSLAB 0x02000000UL /* Fault injection mark */
|
||||
# define SLAB_FAILSLAB ((slab_flags_t __force)0x02000000U)
|
||||
#else
|
||||
# define SLAB_FAILSLAB 0x00000000UL
|
||||
# define SLAB_FAILSLAB 0
|
||||
#endif
|
||||
/* Account to memcg */
|
||||
#if defined(CONFIG_MEMCG) && !defined(CONFIG_SLOB)
|
||||
# define SLAB_ACCOUNT 0x04000000UL /* Account to memcg */
|
||||
# define SLAB_ACCOUNT ((slab_flags_t __force)0x04000000U)
|
||||
#else
|
||||
# define SLAB_ACCOUNT 0x00000000UL
|
||||
# define SLAB_ACCOUNT 0
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_KASAN
|
||||
#define SLAB_KASAN 0x08000000UL
|
||||
#define SLAB_KASAN ((slab_flags_t __force)0x08000000U)
|
||||
#else
|
||||
#define SLAB_KASAN 0x00000000UL
|
||||
#define SLAB_KASAN 0
|
||||
#endif
|
||||
|
||||
/* The following flags affect the page allocator grouping pages by mobility */
|
||||
#define SLAB_RECLAIM_ACCOUNT 0x00020000UL /* Objects are reclaimable */
|
||||
/* Objects are reclaimable */
|
||||
#define SLAB_RECLAIM_ACCOUNT ((slab_flags_t __force)0x00020000U)
|
||||
#define SLAB_TEMPORARY SLAB_RECLAIM_ACCOUNT /* Objects are short-lived */
|
||||
/*
|
||||
* ZERO_SIZE_PTR will be returned for zero sized kmalloc requests.
|
||||
@@ -128,7 +136,7 @@ void __init kmem_cache_init(void);
|
||||
bool slab_is_available(void);
|
||||
|
||||
struct kmem_cache *kmem_cache_create(const char *, size_t, size_t,
|
||||
unsigned long,
|
||||
slab_flags_t,
|
||||
void (*)(void *));
|
||||
void kmem_cache_destroy(struct kmem_cache *);
|
||||
int kmem_cache_shrink(struct kmem_cache *);
|
||||
@@ -459,9 +467,6 @@ static __always_inline void *kmalloc_large(size_t size, gfp_t flags)
|
||||
* Also it is possible to set different flags by OR'ing
|
||||
* in one or more of the following additional @flags:
|
||||
*
|
||||
* %__GFP_COLD - Request cache-cold pages instead of
|
||||
* trying to return cache-warm pages.
|
||||
*
|
||||
* %__GFP_HIGH - This allocation has high priority and may use emergency pools.
|
||||
*
|
||||
* %__GFP_NOFAIL - Indicate that this allocation is in no way allowed to fail
|
||||
@@ -636,6 +641,22 @@ extern void *__kmalloc_track_caller(size_t, gfp_t, unsigned long);
|
||||
#define kmalloc_track_caller(size, flags) \
|
||||
__kmalloc_track_caller(size, flags, _RET_IP_)
|
||||
|
||||
static inline void *kmalloc_array_node(size_t n, size_t size, gfp_t flags,
|
||||
int node)
|
||||
{
|
||||
if (size != 0 && n > SIZE_MAX / size)
|
||||
return NULL;
|
||||
if (__builtin_constant_p(n) && __builtin_constant_p(size))
|
||||
return kmalloc_node(n * size, flags, node);
|
||||
return __kmalloc_node(n * size, flags, node);
|
||||
}
|
||||
|
||||
static inline void *kcalloc_node(size_t n, size_t size, gfp_t flags, int node)
|
||||
{
|
||||
return kmalloc_array_node(n, size, flags | __GFP_ZERO, node);
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_NUMA
|
||||
extern void *__kmalloc_node_track_caller(size_t, gfp_t, int, unsigned long);
|
||||
#define kmalloc_node_track_caller(size, flags, node) \
|
||||
|
@@ -20,7 +20,7 @@ struct kmem_cache {
|
||||
struct reciprocal_value reciprocal_buffer_size;
|
||||
/* 2) touched by every alloc & free from the backend */
|
||||
|
||||
unsigned int flags; /* constant flags */
|
||||
slab_flags_t flags; /* constant flags */
|
||||
unsigned int num; /* # of objs per slab */
|
||||
|
||||
/* 3) cache_grow/shrink */
|
||||
|
@@ -82,7 +82,7 @@ struct kmem_cache_order_objects {
|
||||
struct kmem_cache {
|
||||
struct kmem_cache_cpu __percpu *cpu_slab;
|
||||
/* Used for retriving partial slabs etc */
|
||||
unsigned long flags;
|
||||
slab_flags_t flags;
|
||||
unsigned long min_partial;
|
||||
int size; /* The size of an object including meta data */
|
||||
int object_size; /* The size of an object without meta data */
|
||||
|
@@ -171,8 +171,9 @@ enum {
|
||||
SWP_AREA_DISCARD = (1 << 8), /* single-time swap area discards */
|
||||
SWP_PAGE_DISCARD = (1 << 9), /* freed swap page-cluster discards */
|
||||
SWP_STABLE_WRITES = (1 << 10), /* no overwrite PG_writeback pages */
|
||||
SWP_SYNCHRONOUS_IO = (1 << 11), /* synchronous IO is efficient */
|
||||
/* add others here before... */
|
||||
SWP_SCANNING = (1 << 11), /* refcount in scan_swap_map */
|
||||
SWP_SCANNING = (1 << 12), /* refcount in scan_swap_map */
|
||||
};
|
||||
|
||||
#define SWAP_CLUSTER_MAX 32UL
|
||||
@@ -297,7 +298,18 @@ struct vma_swap_readahead {
|
||||
void *workingset_eviction(struct address_space *mapping, struct page *page);
|
||||
bool workingset_refault(void *shadow);
|
||||
void workingset_activation(struct page *page);
|
||||
void workingset_update_node(struct radix_tree_node *node, void *private);
|
||||
|
||||
/* Do not use directly, use workingset_lookup_update */
|
||||
void workingset_update_node(struct radix_tree_node *node);
|
||||
|
||||
/* Returns workingset_update_node() if the mapping has shadow entries. */
|
||||
#define workingset_lookup_update(mapping) \
|
||||
({ \
|
||||
radix_tree_update_node_t __helper = workingset_update_node; \
|
||||
if (dax_mapping(mapping) || shmem_mapping(mapping)) \
|
||||
__helper = NULL; \
|
||||
__helper; \
|
||||
})
|
||||
|
||||
/* linux/mm/page_alloc.c */
|
||||
extern unsigned long totalram_pages;
|
||||
@@ -462,9 +474,11 @@ extern unsigned int count_swap_pages(int, int);
|
||||
extern sector_t map_swap_page(struct page *, struct block_device **);
|
||||
extern sector_t swapdev_block(int, pgoff_t);
|
||||
extern int page_swapcount(struct page *);
|
||||
extern int __swap_count(struct swap_info_struct *si, swp_entry_t entry);
|
||||
extern int __swp_swapcount(swp_entry_t entry);
|
||||
extern int swp_swapcount(swp_entry_t entry);
|
||||
extern struct swap_info_struct *page_swap_info(struct page *);
|
||||
extern struct swap_info_struct *swp_swap_info(swp_entry_t entry);
|
||||
extern bool reuse_swap_page(struct page *, int *);
|
||||
extern int try_to_free_swap(struct page *);
|
||||
struct backing_dev_info;
|
||||
@@ -473,6 +487,16 @@ extern void exit_swap_address_space(unsigned int type);
|
||||
|
||||
#else /* CONFIG_SWAP */
|
||||
|
||||
static inline int swap_readpage(struct page *page, bool do_poll)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline struct swap_info_struct *swp_swap_info(swp_entry_t entry)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#define swap_address_space(entry) (NULL)
|
||||
#define get_nr_swap_pages() 0L
|
||||
#define total_swap_pages 0L
|
||||
@@ -486,7 +510,7 @@ extern void exit_swap_address_space(unsigned int type);
|
||||
#define free_page_and_swap_cache(page) \
|
||||
put_page(page)
|
||||
#define free_pages_and_swap_cache(pages, nr) \
|
||||
release_pages((pages), (nr), false);
|
||||
release_pages((pages), (nr));
|
||||
|
||||
static inline void show_swap_cache_info(void)
|
||||
{
|
||||
@@ -577,6 +601,11 @@ static inline int page_swapcount(struct page *page)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int __swap_count(struct swap_info_struct *si, swp_entry_t entry)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int __swp_swapcount(swp_entry_t entry)
|
||||
{
|
||||
return 0;
|
||||
|
@@ -44,10 +44,9 @@ enum {
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_DEBUG_STACK_USAGE) || IS_ENABLED(CONFIG_DEBUG_KMEMLEAK)
|
||||
# define THREADINFO_GFP (GFP_KERNEL_ACCOUNT | __GFP_NOTRACK | \
|
||||
__GFP_ZERO)
|
||||
# define THREADINFO_GFP (GFP_KERNEL_ACCOUNT | __GFP_ZERO)
|
||||
#else
|
||||
# define THREADINFO_GFP (GFP_KERNEL_ACCOUNT | __GFP_NOTRACK)
|
||||
# define THREADINFO_GFP (GFP_KERNEL_ACCOUNT)
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@@ -156,6 +156,7 @@ typedef u32 dma_addr_t;
|
||||
#endif
|
||||
|
||||
typedef unsigned __bitwise gfp_t;
|
||||
typedef unsigned __bitwise slab_flags_t;
|
||||
typedef unsigned __bitwise fmode_t;
|
||||
|
||||
#ifdef CONFIG_PHYS_ADDR_T_64BIT
|
||||
|
@@ -7,9 +7,19 @@
|
||||
#include <linux/mmzone.h>
|
||||
#include <linux/vm_event_item.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/static_key.h>
|
||||
|
||||
extern int sysctl_stat_interval;
|
||||
|
||||
#ifdef CONFIG_NUMA
|
||||
#define ENABLE_NUMA_STAT 1
|
||||
#define DISABLE_NUMA_STAT 0
|
||||
extern int sysctl_vm_numa_stat;
|
||||
DECLARE_STATIC_KEY_TRUE(vm_numa_stat_key);
|
||||
extern int sysctl_vm_numa_stat_handler(struct ctl_table *table,
|
||||
int write, void __user *buffer, size_t *length, loff_t *ppos);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_VM_EVENT_COUNTERS
|
||||
/*
|
||||
* Light weight per cpu counter implementation.
|
||||
|
Reference in New Issue
Block a user