Merge branch 'akpm' (fixes from Andrew Morton)
Merge patch-bomb from Andrew Morton: - part of OCFS2 (review is laggy again) - procfs - slab - all of MM - zram, zbud - various other random things: arch, filesystems. * emailed patches from Andrew Morton <akpm@linux-foundation.org>: (164 commits) nosave: consolidate __nosave_{begin,end} in <asm/sections.h> include/linux/screen_info.h: remove unused ORIG_* macros kernel/sys.c: compat sysinfo syscall: fix undefined behavior kernel/sys.c: whitespace fixes acct: eliminate compile warning kernel/async.c: switch to pr_foo() include/linux/blkdev.h: use NULL instead of zero include/linux/kernel.h: deduplicate code implementing clamp* macros include/linux/kernel.h: rewrite min3, max3 and clamp using min and max alpha: use Kbuild logic to include <asm-generic/sections.h> frv: remove deprecated IRQF_DISABLED frv: remove unused cpuinfo_frv and friends to fix future build error zbud: avoid accessing last unused freelist zsmalloc: simplify init_zspage free obj linking mm/zsmalloc.c: correct comment for fullness group computation zram: use notify_free to account all free notifications zram: report maximum used memory zram: zram memory size limitation zsmalloc: change return value unit of zs_get_total_size_bytes zsmalloc: move pages_allocated to zs_pool ...
This commit is contained in:
@@ -179,6 +179,15 @@ dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg,
|
||||
extern int dma_common_mmap(struct device *dev, struct vm_area_struct *vma,
|
||||
void *cpu_addr, dma_addr_t dma_addr, size_t size);
|
||||
|
||||
void *dma_common_contiguous_remap(struct page *page, size_t size,
|
||||
unsigned long vm_flags,
|
||||
pgprot_t prot, const void *caller);
|
||||
|
||||
void *dma_common_pages_remap(struct page **pages, size_t size,
|
||||
unsigned long vm_flags, pgprot_t prot,
|
||||
const void *caller);
|
||||
void dma_common_free_remap(void *cpu_addr, size_t size, unsigned long vm_flags);
|
||||
|
||||
/**
|
||||
* dma_mmap_attrs - map a coherent DMA allocation into user space
|
||||
* @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
|
||||
|
||||
@@ -664,11 +664,12 @@ static inline int pmd_trans_unstable(pmd_t *pmd)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NUMA_BALANCING
|
||||
#ifdef CONFIG_ARCH_USES_NUMA_PROT_NONE
|
||||
/*
|
||||
* _PAGE_NUMA works identical to _PAGE_PROTNONE (it's actually the
|
||||
* same bit too). It's set only when _PAGE_PRESET is not set and it's
|
||||
* never set if _PAGE_PRESENT is set.
|
||||
* _PAGE_NUMA distinguishes between an unmapped page table entry, an entry that
|
||||
* is protected for PROT_NONE and a NUMA hinting fault entry. If the
|
||||
* architecture defines __PAGE_PROTNONE then it should take that into account
|
||||
* but those that do not can rely on the fact that the NUMA hinting scanner
|
||||
* skips inaccessible VMAs.
|
||||
*
|
||||
* pte/pmd_present() returns true if pte/pmd_numa returns true. Page
|
||||
* fault triggers on those regions if pte/pmd_numa returns true
|
||||
@@ -677,16 +678,14 @@ static inline int pmd_trans_unstable(pmd_t *pmd)
|
||||
#ifndef pte_numa
|
||||
static inline int pte_numa(pte_t pte)
|
||||
{
|
||||
return (pte_flags(pte) &
|
||||
(_PAGE_NUMA|_PAGE_PROTNONE|_PAGE_PRESENT)) == _PAGE_NUMA;
|
||||
return ptenuma_flags(pte) == _PAGE_NUMA;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef pmd_numa
|
||||
static inline int pmd_numa(pmd_t pmd)
|
||||
{
|
||||
return (pmd_flags(pmd) &
|
||||
(_PAGE_NUMA|_PAGE_PROTNONE|_PAGE_PRESENT)) == _PAGE_NUMA;
|
||||
return pmdnuma_flags(pmd) == _PAGE_NUMA;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -726,6 +725,8 @@ static inline pte_t pte_mknuma(pte_t pte)
|
||||
{
|
||||
pteval_t val = pte_val(pte);
|
||||
|
||||
VM_BUG_ON(!(val & _PAGE_PRESENT));
|
||||
|
||||
val &= ~_PAGE_PRESENT;
|
||||
val |= _PAGE_NUMA;
|
||||
|
||||
@@ -769,16 +770,6 @@ static inline void pmdp_set_numa(struct mm_struct *mm, unsigned long addr,
|
||||
}
|
||||
#endif
|
||||
#else
|
||||
extern int pte_numa(pte_t pte);
|
||||
extern int pmd_numa(pmd_t pmd);
|
||||
extern pte_t pte_mknonnuma(pte_t pte);
|
||||
extern pmd_t pmd_mknonnuma(pmd_t pmd);
|
||||
extern pte_t pte_mknuma(pte_t pte);
|
||||
extern pmd_t pmd_mknuma(pmd_t pmd);
|
||||
extern void ptep_set_numa(struct mm_struct *mm, unsigned long addr, pte_t *ptep);
|
||||
extern void pmdp_set_numa(struct mm_struct *mm, unsigned long addr, pmd_t *pmdp);
|
||||
#endif /* CONFIG_ARCH_USES_NUMA_PROT_NONE */
|
||||
#else
|
||||
static inline int pmd_numa(pmd_t pmd)
|
||||
{
|
||||
return 0;
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
|
||||
/* References to section boundaries */
|
||||
|
||||
#include <linux/compiler.h>
|
||||
|
||||
/*
|
||||
* Usage guidelines:
|
||||
* _text, _data: architecture specific, don't use them in arch-independent code
|
||||
@@ -37,6 +39,8 @@ extern char __start_rodata[], __end_rodata[];
|
||||
/* Start and end of .ctors section - used for constructor calls. */
|
||||
extern char __ctors_start[], __ctors_end[];
|
||||
|
||||
extern __visible const void __nosave_begin, __nosave_end;
|
||||
|
||||
/* function descriptor handling (if any). Override
|
||||
* in asm/sections.h */
|
||||
#ifndef dereference_function_descriptor
|
||||
|
||||
@@ -27,10 +27,13 @@
|
||||
* counter raised only while it is under our special handling;
|
||||
*
|
||||
* iii. after the lockless scan step have selected a potential balloon page for
|
||||
* isolation, re-test the page->mapping flags and the page ref counter
|
||||
* isolation, re-test the PageBalloon mark and the PagePrivate flag
|
||||
* under the proper page lock, to ensure isolating a valid balloon page
|
||||
* (not yet isolated, nor under release procedure)
|
||||
*
|
||||
* iv. isolation or dequeueing procedure must clear PagePrivate flag under
|
||||
* page lock together with removing page from balloon device page list.
|
||||
*
|
||||
* The functions provided by this interface are placed to help on coping with
|
||||
* the aforementioned balloon page corner case, as well as to ensure the simple
|
||||
* set of exposed rules are satisfied while we are dealing with balloon pages
|
||||
@@ -54,43 +57,22 @@
|
||||
* balloon driver as a page book-keeper for its registered balloon devices.
|
||||
*/
|
||||
struct balloon_dev_info {
|
||||
void *balloon_device; /* balloon device descriptor */
|
||||
struct address_space *mapping; /* balloon special page->mapping */
|
||||
unsigned long isolated_pages; /* # of isolated pages for migration */
|
||||
spinlock_t pages_lock; /* Protection to pages list */
|
||||
struct list_head pages; /* Pages enqueued & handled to Host */
|
||||
int (*migratepage)(struct balloon_dev_info *, struct page *newpage,
|
||||
struct page *page, enum migrate_mode mode);
|
||||
};
|
||||
|
||||
extern struct page *balloon_page_enqueue(struct balloon_dev_info *b_dev_info);
|
||||
extern struct page *balloon_page_dequeue(struct balloon_dev_info *b_dev_info);
|
||||
extern struct balloon_dev_info *balloon_devinfo_alloc(
|
||||
void *balloon_dev_descriptor);
|
||||
|
||||
static inline void balloon_devinfo_free(struct balloon_dev_info *b_dev_info)
|
||||
static inline void balloon_devinfo_init(struct balloon_dev_info *balloon)
|
||||
{
|
||||
kfree(b_dev_info);
|
||||
}
|
||||
|
||||
/*
|
||||
* balloon_page_free - release a balloon page back to the page free lists
|
||||
* @page: ballooned page to be set free
|
||||
*
|
||||
* This function must be used to properly set free an isolated/dequeued balloon
|
||||
* page at the end of a sucessful page migration, or at the balloon driver's
|
||||
* page release procedure.
|
||||
*/
|
||||
static inline void balloon_page_free(struct page *page)
|
||||
{
|
||||
/*
|
||||
* Balloon pages always get an extra refcount before being isolated
|
||||
* and before being dequeued to help on sorting out fortuite colisions
|
||||
* between a thread attempting to isolate and another thread attempting
|
||||
* to release the very same balloon page.
|
||||
*
|
||||
* Before we handle the page back to Buddy, lets drop its extra refcnt.
|
||||
*/
|
||||
put_page(page);
|
||||
__free_page(page);
|
||||
balloon->isolated_pages = 0;
|
||||
spin_lock_init(&balloon->pages_lock);
|
||||
INIT_LIST_HEAD(&balloon->pages);
|
||||
balloon->migratepage = NULL;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BALLOON_COMPACTION
|
||||
@@ -98,107 +80,58 @@ extern bool balloon_page_isolate(struct page *page);
|
||||
extern void balloon_page_putback(struct page *page);
|
||||
extern int balloon_page_migrate(struct page *newpage,
|
||||
struct page *page, enum migrate_mode mode);
|
||||
extern struct address_space
|
||||
*balloon_mapping_alloc(struct balloon_dev_info *b_dev_info,
|
||||
const struct address_space_operations *a_ops);
|
||||
|
||||
static inline void balloon_mapping_free(struct address_space *balloon_mapping)
|
||||
{
|
||||
kfree(balloon_mapping);
|
||||
}
|
||||
|
||||
/*
|
||||
* page_flags_cleared - helper to perform balloon @page ->flags tests.
|
||||
*
|
||||
* As balloon pages are obtained from buddy and we do not play with page->flags
|
||||
* at driver level (exception made when we get the page lock for compaction),
|
||||
* we can safely identify a ballooned page by checking if the
|
||||
* PAGE_FLAGS_CHECK_AT_PREP page->flags are all cleared. This approach also
|
||||
* helps us skip ballooned pages that are locked for compaction or release, thus
|
||||
* mitigating their racy check at balloon_page_movable()
|
||||
*/
|
||||
static inline bool page_flags_cleared(struct page *page)
|
||||
{
|
||||
return !(page->flags & PAGE_FLAGS_CHECK_AT_PREP);
|
||||
}
|
||||
|
||||
/*
|
||||
* __is_movable_balloon_page - helper to perform @page mapping->flags tests
|
||||
* __is_movable_balloon_page - helper to perform @page PageBalloon tests
|
||||
*/
|
||||
static inline bool __is_movable_balloon_page(struct page *page)
|
||||
{
|
||||
struct address_space *mapping = page->mapping;
|
||||
return mapping_balloon(mapping);
|
||||
return PageBalloon(page);
|
||||
}
|
||||
|
||||
/*
|
||||
* balloon_page_movable - test page->mapping->flags to identify balloon pages
|
||||
* that can be moved by compaction/migration.
|
||||
*
|
||||
* This function is used at core compaction's page isolation scheme, therefore
|
||||
* most pages exposed to it are not enlisted as balloon pages and so, to avoid
|
||||
* undesired side effects like racing against __free_pages(), we cannot afford
|
||||
* holding the page locked while testing page->mapping->flags here.
|
||||
* balloon_page_movable - test PageBalloon to identify balloon pages
|
||||
* and PagePrivate to check that the page is not
|
||||
* isolated and can be moved by compaction/migration.
|
||||
*
|
||||
* As we might return false positives in the case of a balloon page being just
|
||||
* released under us, the page->mapping->flags need to be re-tested later,
|
||||
* under the proper page lock, at the functions that will be coping with the
|
||||
* balloon page case.
|
||||
* released under us, this need to be re-tested later, under the page lock.
|
||||
*/
|
||||
static inline bool balloon_page_movable(struct page *page)
|
||||
{
|
||||
/*
|
||||
* Before dereferencing and testing mapping->flags, let's make sure
|
||||
* this is not a page that uses ->mapping in a different way
|
||||
*/
|
||||
if (page_flags_cleared(page) && !page_mapped(page) &&
|
||||
page_count(page) == 1)
|
||||
return __is_movable_balloon_page(page);
|
||||
|
||||
return false;
|
||||
return PageBalloon(page) && PagePrivate(page);
|
||||
}
|
||||
|
||||
/*
|
||||
* isolated_balloon_page - identify an isolated balloon page on private
|
||||
* compaction/migration page lists.
|
||||
*
|
||||
* After a compaction thread isolates a balloon page for migration, it raises
|
||||
* the page refcount to prevent concurrent compaction threads from re-isolating
|
||||
* the same page. For that reason putback_movable_pages(), or other routines
|
||||
* that need to identify isolated balloon pages on private pagelists, cannot
|
||||
* rely on balloon_page_movable() to accomplish the task.
|
||||
*/
|
||||
static inline bool isolated_balloon_page(struct page *page)
|
||||
{
|
||||
/* Already isolated balloon pages, by default, have a raised refcount */
|
||||
if (page_flags_cleared(page) && !page_mapped(page) &&
|
||||
page_count(page) >= 2)
|
||||
return __is_movable_balloon_page(page);
|
||||
|
||||
return false;
|
||||
return PageBalloon(page);
|
||||
}
|
||||
|
||||
/*
|
||||
* balloon_page_insert - insert a page into the balloon's page list and make
|
||||
* the page->mapping assignment accordingly.
|
||||
* the page->private assignment accordingly.
|
||||
* @balloon : pointer to balloon device
|
||||
* @page : page to be assigned as a 'balloon page'
|
||||
* @mapping : allocated special 'balloon_mapping'
|
||||
* @head : balloon's device page list head
|
||||
*
|
||||
* Caller must ensure the page is locked and the spin_lock protecting balloon
|
||||
* pages list is held before inserting a page into the balloon device.
|
||||
*/
|
||||
static inline void balloon_page_insert(struct page *page,
|
||||
struct address_space *mapping,
|
||||
struct list_head *head)
|
||||
static inline void balloon_page_insert(struct balloon_dev_info *balloon,
|
||||
struct page *page)
|
||||
{
|
||||
page->mapping = mapping;
|
||||
list_add(&page->lru, head);
|
||||
__SetPageBalloon(page);
|
||||
SetPagePrivate(page);
|
||||
set_page_private(page, (unsigned long)balloon);
|
||||
list_add(&page->lru, &balloon->pages);
|
||||
}
|
||||
|
||||
/*
|
||||
* balloon_page_delete - delete a page from balloon's page list and clear
|
||||
* the page->mapping assignement accordingly.
|
||||
* the page->private assignement accordingly.
|
||||
* @page : page to be released from balloon's page list
|
||||
*
|
||||
* Caller must ensure the page is locked and the spin_lock protecting balloon
|
||||
@@ -206,8 +139,12 @@ static inline void balloon_page_insert(struct page *page,
|
||||
*/
|
||||
static inline void balloon_page_delete(struct page *page)
|
||||
{
|
||||
page->mapping = NULL;
|
||||
list_del(&page->lru);
|
||||
__ClearPageBalloon(page);
|
||||
set_page_private(page, 0);
|
||||
if (PagePrivate(page)) {
|
||||
ClearPagePrivate(page);
|
||||
list_del(&page->lru);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -216,11 +153,7 @@ static inline void balloon_page_delete(struct page *page)
|
||||
*/
|
||||
static inline struct balloon_dev_info *balloon_page_device(struct page *page)
|
||||
{
|
||||
struct address_space *mapping = page->mapping;
|
||||
if (likely(mapping))
|
||||
return mapping->private_data;
|
||||
|
||||
return NULL;
|
||||
return (struct balloon_dev_info *)page_private(page);
|
||||
}
|
||||
|
||||
static inline gfp_t balloon_mapping_gfp_mask(void)
|
||||
@@ -228,36 +161,26 @@ static inline gfp_t balloon_mapping_gfp_mask(void)
|
||||
return GFP_HIGHUSER_MOVABLE;
|
||||
}
|
||||
|
||||
static inline bool balloon_compaction_check(void)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
#else /* !CONFIG_BALLOON_COMPACTION */
|
||||
|
||||
static inline void *balloon_mapping_alloc(void *balloon_device,
|
||||
const struct address_space_operations *a_ops)
|
||||
static inline void balloon_page_insert(struct balloon_dev_info *balloon,
|
||||
struct page *page)
|
||||
{
|
||||
return ERR_PTR(-EOPNOTSUPP);
|
||||
}
|
||||
|
||||
static inline void balloon_mapping_free(struct address_space *balloon_mapping)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
static inline void balloon_page_insert(struct page *page,
|
||||
struct address_space *mapping,
|
||||
struct list_head *head)
|
||||
{
|
||||
list_add(&page->lru, head);
|
||||
__SetPageBalloon(page);
|
||||
list_add(&page->lru, &balloon->pages);
|
||||
}
|
||||
|
||||
static inline void balloon_page_delete(struct page *page)
|
||||
{
|
||||
__ClearPageBalloon(page);
|
||||
list_del(&page->lru);
|
||||
}
|
||||
|
||||
static inline bool __is_movable_balloon_page(struct page *page)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool balloon_page_movable(struct page *page)
|
||||
{
|
||||
return false;
|
||||
@@ -289,9 +212,5 @@ static inline gfp_t balloon_mapping_gfp_mask(void)
|
||||
return GFP_HIGHUSER;
|
||||
}
|
||||
|
||||
static inline bool balloon_compaction_check(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif /* CONFIG_BALLOON_COMPACTION */
|
||||
#endif /* _LINUX_BALLOON_COMPACTION_H */
|
||||
|
||||
@@ -1564,7 +1564,7 @@ static inline int blk_rq_map_integrity_sg(struct request_queue *q,
|
||||
}
|
||||
static inline struct blk_integrity *bdev_get_integrity(struct block_device *b)
|
||||
{
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
static inline struct blk_integrity *blk_get_integrity(struct gendisk *disk)
|
||||
{
|
||||
|
||||
@@ -2,14 +2,24 @@
|
||||
#define _LINUX_COMPACTION_H
|
||||
|
||||
/* Return values for compact_zone() and try_to_compact_pages() */
|
||||
/* compaction didn't start as it was deferred due to past failures */
|
||||
#define COMPACT_DEFERRED 0
|
||||
/* compaction didn't start as it was not possible or direct reclaim was more suitable */
|
||||
#define COMPACT_SKIPPED 0
|
||||
#define COMPACT_SKIPPED 1
|
||||
/* compaction should continue to another pageblock */
|
||||
#define COMPACT_CONTINUE 1
|
||||
#define COMPACT_CONTINUE 2
|
||||
/* direct compaction partially compacted a zone and there are suitable pages */
|
||||
#define COMPACT_PARTIAL 2
|
||||
#define COMPACT_PARTIAL 3
|
||||
/* The full zone was compacted */
|
||||
#define COMPACT_COMPLETE 3
|
||||
#define COMPACT_COMPLETE 4
|
||||
|
||||
/* Used to signal whether compaction detected need_sched() or lock contention */
|
||||
/* No contention detected */
|
||||
#define COMPACT_CONTENDED_NONE 0
|
||||
/* Either need_sched() was true or fatal signal pending */
|
||||
#define COMPACT_CONTENDED_SCHED 1
|
||||
/* Zone lock or lru_lock was contended in async compaction */
|
||||
#define COMPACT_CONTENDED_LOCK 2
|
||||
|
||||
#ifdef CONFIG_COMPACTION
|
||||
extern int sysctl_compact_memory;
|
||||
@@ -22,7 +32,8 @@ extern int sysctl_extfrag_handler(struct ctl_table *table, int write,
|
||||
extern int fragmentation_index(struct zone *zone, unsigned int order);
|
||||
extern unsigned long try_to_compact_pages(struct zonelist *zonelist,
|
||||
int order, gfp_t gfp_mask, nodemask_t *mask,
|
||||
enum migrate_mode mode, bool *contended);
|
||||
enum migrate_mode mode, int *contended,
|
||||
struct zone **candidate_zone);
|
||||
extern void compact_pgdat(pg_data_t *pgdat, int order);
|
||||
extern void reset_isolation_suitable(pg_data_t *pgdat);
|
||||
extern unsigned long compaction_suitable(struct zone *zone, int order);
|
||||
@@ -91,7 +102,8 @@ static inline bool compaction_restarting(struct zone *zone, int order)
|
||||
#else
|
||||
static inline unsigned long try_to_compact_pages(struct zonelist *zonelist,
|
||||
int order, gfp_t gfp_mask, nodemask_t *nodemask,
|
||||
enum migrate_mode mode, bool *contended)
|
||||
enum migrate_mode mode, int *contended,
|
||||
struct zone **candidate_zone)
|
||||
{
|
||||
return COMPACT_CONTINUE;
|
||||
}
|
||||
|
||||
@@ -110,6 +110,10 @@ extern void gen_pool_set_algo(struct gen_pool *pool, genpool_algo_t algo,
|
||||
extern unsigned long gen_pool_first_fit(unsigned long *map, unsigned long size,
|
||||
unsigned long start, unsigned int nr, void *data);
|
||||
|
||||
extern unsigned long gen_pool_first_fit_order_align(unsigned long *map,
|
||||
unsigned long size, unsigned long start, unsigned int nr,
|
||||
void *data);
|
||||
|
||||
extern unsigned long gen_pool_best_fit(unsigned long *map, unsigned long size,
|
||||
unsigned long start, unsigned int nr, void *data);
|
||||
|
||||
@@ -117,6 +121,9 @@ extern struct gen_pool *devm_gen_pool_create(struct device *dev,
|
||||
int min_alloc_order, int nid);
|
||||
extern struct gen_pool *dev_get_gen_pool(struct device *dev);
|
||||
|
||||
bool addr_in_gen_pool(struct gen_pool *pool, unsigned long start,
|
||||
size_t size);
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
extern struct gen_pool *of_get_named_gen_pool(struct device_node *np,
|
||||
const char *propname, int index);
|
||||
|
||||
+1
-1
@@ -156,7 +156,7 @@ struct vm_area_struct;
|
||||
#define GFP_DMA32 __GFP_DMA32
|
||||
|
||||
/* Convert GFP flags to their corresponding migrate type */
|
||||
static inline int allocflags_to_migratetype(gfp_t gfp_flags)
|
||||
static inline int gfpflags_to_migratetype(const gfp_t gfp_flags)
|
||||
{
|
||||
WARN_ON((gfp_flags & GFP_MOVABLE_MASK) == GFP_MOVABLE_MASK);
|
||||
|
||||
|
||||
@@ -132,7 +132,7 @@ extern int __pmd_trans_huge_lock(pmd_t *pmd, struct vm_area_struct *vma,
|
||||
static inline int pmd_trans_huge_lock(pmd_t *pmd, struct vm_area_struct *vma,
|
||||
spinlock_t **ptl)
|
||||
{
|
||||
VM_BUG_ON(!rwsem_is_locked(&vma->vm_mm->mmap_sem));
|
||||
VM_BUG_ON_VMA(!rwsem_is_locked(&vma->vm_mm->mmap_sem), vma);
|
||||
if (pmd_trans_huge(*pmd))
|
||||
return __pmd_trans_huge_lock(pmd, vma, ptl);
|
||||
else
|
||||
|
||||
+12
-44
@@ -715,23 +715,8 @@ static inline void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) { }
|
||||
(void) (&_max1 == &_max2); \
|
||||
_max1 > _max2 ? _max1 : _max2; })
|
||||
|
||||
#define min3(x, y, z) ({ \
|
||||
typeof(x) _min1 = (x); \
|
||||
typeof(y) _min2 = (y); \
|
||||
typeof(z) _min3 = (z); \
|
||||
(void) (&_min1 == &_min2); \
|
||||
(void) (&_min1 == &_min3); \
|
||||
_min1 < _min2 ? (_min1 < _min3 ? _min1 : _min3) : \
|
||||
(_min2 < _min3 ? _min2 : _min3); })
|
||||
|
||||
#define max3(x, y, z) ({ \
|
||||
typeof(x) _max1 = (x); \
|
||||
typeof(y) _max2 = (y); \
|
||||
typeof(z) _max3 = (z); \
|
||||
(void) (&_max1 == &_max2); \
|
||||
(void) (&_max1 == &_max3); \
|
||||
_max1 > _max2 ? (_max1 > _max3 ? _max1 : _max3) : \
|
||||
(_max2 > _max3 ? _max2 : _max3); })
|
||||
#define min3(x, y, z) min((typeof(x))min(x, y), z)
|
||||
#define max3(x, y, z) max((typeof(x))max(x, y), z)
|
||||
|
||||
/**
|
||||
* min_not_zero - return the minimum that is _not_ zero, unless both are zero
|
||||
@@ -746,20 +731,13 @@ static inline void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) { }
|
||||
/**
|
||||
* clamp - return a value clamped to a given range with strict typechecking
|
||||
* @val: current value
|
||||
* @min: minimum allowable value
|
||||
* @max: maximum allowable value
|
||||
* @lo: lowest allowable value
|
||||
* @hi: highest allowable value
|
||||
*
|
||||
* This macro does strict typechecking of min/max to make sure they are of the
|
||||
* This macro does strict typechecking of lo/hi to make sure they are of the
|
||||
* same type as val. See the unnecessary pointer comparisons.
|
||||
*/
|
||||
#define clamp(val, min, max) ({ \
|
||||
typeof(val) __val = (val); \
|
||||
typeof(min) __min = (min); \
|
||||
typeof(max) __max = (max); \
|
||||
(void) (&__val == &__min); \
|
||||
(void) (&__val == &__max); \
|
||||
__val = __val < __min ? __min: __val; \
|
||||
__val > __max ? __max: __val; })
|
||||
#define clamp(val, lo, hi) min((typeof(val))max(val, lo), hi)
|
||||
|
||||
/*
|
||||
* ..and if you can't take the strict
|
||||
@@ -781,36 +759,26 @@ static inline void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) { }
|
||||
* clamp_t - return a value clamped to a given range using a given type
|
||||
* @type: the type of variable to use
|
||||
* @val: current value
|
||||
* @min: minimum allowable value
|
||||
* @max: maximum allowable value
|
||||
* @lo: minimum allowable value
|
||||
* @hi: maximum allowable value
|
||||
*
|
||||
* This macro does no typechecking and uses temporary variables of type
|
||||
* 'type' to make all the comparisons.
|
||||
*/
|
||||
#define clamp_t(type, val, min, max) ({ \
|
||||
type __val = (val); \
|
||||
type __min = (min); \
|
||||
type __max = (max); \
|
||||
__val = __val < __min ? __min: __val; \
|
||||
__val > __max ? __max: __val; })
|
||||
#define clamp_t(type, val, lo, hi) min_t(type, max_t(type, val, lo), hi)
|
||||
|
||||
/**
|
||||
* clamp_val - return a value clamped to a given range using val's type
|
||||
* @val: current value
|
||||
* @min: minimum allowable value
|
||||
* @max: maximum allowable value
|
||||
* @lo: minimum allowable value
|
||||
* @hi: maximum allowable value
|
||||
*
|
||||
* This macro does no typechecking and uses temporary variables of whatever
|
||||
* type the input argument 'val' is. This is useful when val is an unsigned
|
||||
* type and min and max are literals that will otherwise be assigned a signed
|
||||
* integer type.
|
||||
*/
|
||||
#define clamp_val(val, min, max) ({ \
|
||||
typeof(val) __val = (val); \
|
||||
typeof(val) __min = (min); \
|
||||
typeof(val) __max = (max); \
|
||||
__val = __val < __min ? __min: __val; \
|
||||
__val > __max ? __max: __val; })
|
||||
#define clamp_val(val, lo, hi) clamp_t(typeof(val), val, lo, hi)
|
||||
|
||||
|
||||
/*
|
||||
|
||||
@@ -440,11 +440,6 @@ void __memcg_kmem_uncharge_pages(struct page *page, int order);
|
||||
|
||||
int memcg_cache_id(struct mem_cgroup *memcg);
|
||||
|
||||
int memcg_alloc_cache_params(struct mem_cgroup *memcg, struct kmem_cache *s,
|
||||
struct kmem_cache *root_cache);
|
||||
void memcg_free_cache_params(struct kmem_cache *s);
|
||||
|
||||
int memcg_update_cache_size(struct kmem_cache *s, int num_groups);
|
||||
void memcg_update_array_size(int num_groups);
|
||||
|
||||
struct kmem_cache *
|
||||
@@ -574,16 +569,6 @@ static inline int memcg_cache_id(struct mem_cgroup *memcg)
|
||||
return -1;
|
||||
}
|
||||
|
||||
static inline int memcg_alloc_cache_params(struct mem_cgroup *memcg,
|
||||
struct kmem_cache *s, struct kmem_cache *root_cache)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void memcg_free_cache_params(struct kmem_cache *s)
|
||||
{
|
||||
}
|
||||
|
||||
static inline struct kmem_cache *
|
||||
memcg_kmem_get_cache(struct kmem_cache *cachep, gfp_t gfp)
|
||||
{
|
||||
|
||||
@@ -84,6 +84,7 @@ extern int zone_grow_waitqueues(struct zone *zone, unsigned long nr_pages);
|
||||
extern int add_one_highpage(struct page *page, int pfn, int bad_ppro);
|
||||
/* VM interface that may be used by firmware interface */
|
||||
extern int online_pages(unsigned long, unsigned long, int);
|
||||
extern int test_pages_in_a_zone(unsigned long, unsigned long);
|
||||
extern void __offline_isolated_pages(unsigned long, unsigned long);
|
||||
|
||||
typedef void (*online_page_callback_t)(struct page *page);
|
||||
|
||||
@@ -134,9 +134,10 @@ void mpol_free_shared_policy(struct shared_policy *p);
|
||||
struct mempolicy *mpol_shared_policy_lookup(struct shared_policy *sp,
|
||||
unsigned long idx);
|
||||
|
||||
struct mempolicy *get_vma_policy(struct task_struct *tsk,
|
||||
struct vm_area_struct *vma, unsigned long addr);
|
||||
bool vma_policy_mof(struct task_struct *task, struct vm_area_struct *vma);
|
||||
struct mempolicy *get_task_policy(struct task_struct *p);
|
||||
struct mempolicy *__get_vma_policy(struct vm_area_struct *vma,
|
||||
unsigned long addr);
|
||||
bool vma_policy_mof(struct vm_area_struct *vma);
|
||||
|
||||
extern void numa_default_policy(void);
|
||||
extern void numa_policy_init(void);
|
||||
|
||||
+1
-13
@@ -13,18 +13,9 @@ typedef void free_page_t(struct page *page, unsigned long private);
|
||||
* Return values from addresss_space_operations.migratepage():
|
||||
* - negative errno on page migration failure;
|
||||
* - zero on page migration success;
|
||||
*
|
||||
* The balloon page migration introduces this special case where a 'distinct'
|
||||
* return code is used to flag a successful page migration to unmap_and_move().
|
||||
* This approach is necessary because page migration can race against balloon
|
||||
* deflation procedure, and for such case we could introduce a nasty page leak
|
||||
* if a successfully migrated balloon page gets released concurrently with
|
||||
* migration's unmap_and_move() wrap-up steps.
|
||||
*/
|
||||
#define MIGRATEPAGE_SUCCESS 0
|
||||
#define MIGRATEPAGE_BALLOON_SUCCESS 1 /* special ret code for balloon page
|
||||
* sucessful migration case.
|
||||
*/
|
||||
|
||||
enum migrate_reason {
|
||||
MR_COMPACTION,
|
||||
MR_MEMORY_FAILURE,
|
||||
@@ -82,9 +73,6 @@ static inline int migrate_huge_page_move_mapping(struct address_space *mapping,
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
/* Possible settings for the migrate_page() method in address_operations */
|
||||
#define migrate_page NULL
|
||||
|
||||
#endif /* CONFIG_MIGRATION */
|
||||
|
||||
#ifdef CONFIG_NUMA_BALANCING
|
||||
|
||||
+36
-2
@@ -18,6 +18,7 @@
|
||||
#include <linux/pfn.h>
|
||||
#include <linux/bit_spinlock.h>
|
||||
#include <linux/shrinker.h>
|
||||
#include <linux/resource.h>
|
||||
|
||||
struct mempolicy;
|
||||
struct anon_vma;
|
||||
@@ -553,6 +554,25 @@ static inline void __ClearPageBuddy(struct page *page)
|
||||
atomic_set(&page->_mapcount, -1);
|
||||
}
|
||||
|
||||
#define PAGE_BALLOON_MAPCOUNT_VALUE (-256)
|
||||
|
||||
static inline int PageBalloon(struct page *page)
|
||||
{
|
||||
return atomic_read(&page->_mapcount) == PAGE_BALLOON_MAPCOUNT_VALUE;
|
||||
}
|
||||
|
||||
static inline void __SetPageBalloon(struct page *page)
|
||||
{
|
||||
VM_BUG_ON_PAGE(atomic_read(&page->_mapcount) != -1, page);
|
||||
atomic_set(&page->_mapcount, PAGE_BALLOON_MAPCOUNT_VALUE);
|
||||
}
|
||||
|
||||
static inline void __ClearPageBalloon(struct page *page)
|
||||
{
|
||||
VM_BUG_ON_PAGE(!PageBalloon(page), page);
|
||||
atomic_set(&page->_mapcount, -1);
|
||||
}
|
||||
|
||||
void put_page(struct page *page);
|
||||
void put_pages_list(struct list_head *pages);
|
||||
|
||||
@@ -1247,8 +1267,8 @@ static inline int stack_guard_page_end(struct vm_area_struct *vma,
|
||||
!vma_growsup(vma->vm_next, addr);
|
||||
}
|
||||
|
||||
extern pid_t
|
||||
vm_is_stack(struct task_struct *task, struct vm_area_struct *vma, int in_group);
|
||||
extern struct task_struct *task_of_stack(struct task_struct *task,
|
||||
struct vm_area_struct *vma, bool in_group);
|
||||
|
||||
extern unsigned long move_page_tables(struct vm_area_struct *vma,
|
||||
unsigned long old_addr, struct vm_area_struct *new_vma,
|
||||
@@ -1780,6 +1800,20 @@ extern struct vm_area_struct *copy_vma(struct vm_area_struct **,
|
||||
bool *need_rmap_locks);
|
||||
extern void exit_mmap(struct mm_struct *);
|
||||
|
||||
static inline int check_data_rlimit(unsigned long rlim,
|
||||
unsigned long new,
|
||||
unsigned long start,
|
||||
unsigned long end_data,
|
||||
unsigned long start_data)
|
||||
{
|
||||
if (rlim < RLIM_INFINITY) {
|
||||
if (((new - start) + (end_data - start_data)) > rlim)
|
||||
return -ENOSPC;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern int mm_take_all_locks(struct mm_struct *mm);
|
||||
extern void mm_drop_all_locks(struct mm_struct *mm);
|
||||
|
||||
|
||||
@@ -4,10 +4,14 @@
|
||||
#include <linux/stringify.h>
|
||||
|
||||
struct page;
|
||||
struct vm_area_struct;
|
||||
struct mm_struct;
|
||||
|
||||
extern void dump_page(struct page *page, const char *reason);
|
||||
extern void dump_page_badflags(struct page *page, const char *reason,
|
||||
unsigned long badflags);
|
||||
void dump_vma(const struct vm_area_struct *vma);
|
||||
void dump_mm(const struct mm_struct *mm);
|
||||
|
||||
#ifdef CONFIG_DEBUG_VM
|
||||
#define VM_BUG_ON(cond) BUG_ON(cond)
|
||||
@@ -18,12 +22,28 @@ extern void dump_page_badflags(struct page *page, const char *reason,
|
||||
BUG(); \
|
||||
} \
|
||||
} while (0)
|
||||
#define VM_BUG_ON_VMA(cond, vma) \
|
||||
do { \
|
||||
if (unlikely(cond)) { \
|
||||
dump_vma(vma); \
|
||||
BUG(); \
|
||||
} \
|
||||
} while (0)
|
||||
#define VM_BUG_ON_MM(cond, mm) \
|
||||
do { \
|
||||
if (unlikely(cond)) { \
|
||||
dump_mm(mm); \
|
||||
BUG(); \
|
||||
} \
|
||||
} while (0)
|
||||
#define VM_WARN_ON(cond) WARN_ON(cond)
|
||||
#define VM_WARN_ON_ONCE(cond) WARN_ON_ONCE(cond)
|
||||
#define VM_WARN_ONCE(cond, format...) WARN_ONCE(cond, format)
|
||||
#else
|
||||
#define VM_BUG_ON(cond) BUILD_BUG_ON_INVALID(cond)
|
||||
#define VM_BUG_ON_PAGE(cond, page) VM_BUG_ON(cond)
|
||||
#define VM_BUG_ON_VMA(cond, vma) VM_BUG_ON(cond)
|
||||
#define VM_BUG_ON_MM(cond, mm) VM_BUG_ON(cond)
|
||||
#define VM_WARN_ON(cond) BUILD_BUG_ON_INVALID(cond)
|
||||
#define VM_WARN_ON_ONCE(cond) BUILD_BUG_ON_INVALID(cond)
|
||||
#define VM_WARN_ONCE(cond, format...) BUILD_BUG_ON_INVALID(cond)
|
||||
|
||||
+3
-48
@@ -521,13 +521,13 @@ struct zone {
|
||||
atomic_long_t vm_stat[NR_VM_ZONE_STAT_ITEMS];
|
||||
} ____cacheline_internodealigned_in_smp;
|
||||
|
||||
typedef enum {
|
||||
enum zone_flags {
|
||||
ZONE_RECLAIM_LOCKED, /* prevents concurrent reclaim */
|
||||
ZONE_OOM_LOCKED, /* zone is in OOM killer zonelist */
|
||||
ZONE_CONGESTED, /* zone has many dirty pages backed by
|
||||
* a congested BDI
|
||||
*/
|
||||
ZONE_TAIL_LRU_DIRTY, /* reclaim scanning has recently found
|
||||
ZONE_DIRTY, /* reclaim scanning has recently found
|
||||
* many dirty file pages at the tail
|
||||
* of the LRU.
|
||||
*/
|
||||
@@ -535,52 +535,7 @@ typedef enum {
|
||||
* many pages under writeback
|
||||
*/
|
||||
ZONE_FAIR_DEPLETED, /* fair zone policy batch depleted */
|
||||
} zone_flags_t;
|
||||
|
||||
static inline void zone_set_flag(struct zone *zone, zone_flags_t flag)
|
||||
{
|
||||
set_bit(flag, &zone->flags);
|
||||
}
|
||||
|
||||
static inline int zone_test_and_set_flag(struct zone *zone, zone_flags_t flag)
|
||||
{
|
||||
return test_and_set_bit(flag, &zone->flags);
|
||||
}
|
||||
|
||||
static inline void zone_clear_flag(struct zone *zone, zone_flags_t flag)
|
||||
{
|
||||
clear_bit(flag, &zone->flags);
|
||||
}
|
||||
|
||||
static inline int zone_is_reclaim_congested(const struct zone *zone)
|
||||
{
|
||||
return test_bit(ZONE_CONGESTED, &zone->flags);
|
||||
}
|
||||
|
||||
static inline int zone_is_reclaim_dirty(const struct zone *zone)
|
||||
{
|
||||
return test_bit(ZONE_TAIL_LRU_DIRTY, &zone->flags);
|
||||
}
|
||||
|
||||
static inline int zone_is_reclaim_writeback(const struct zone *zone)
|
||||
{
|
||||
return test_bit(ZONE_WRITEBACK, &zone->flags);
|
||||
}
|
||||
|
||||
static inline int zone_is_reclaim_locked(const struct zone *zone)
|
||||
{
|
||||
return test_bit(ZONE_RECLAIM_LOCKED, &zone->flags);
|
||||
}
|
||||
|
||||
static inline int zone_is_fair_depleted(const struct zone *zone)
|
||||
{
|
||||
return test_bit(ZONE_FAIR_DEPLETED, &zone->flags);
|
||||
}
|
||||
|
||||
static inline int zone_is_oom_locked(const struct zone *zone)
|
||||
{
|
||||
return test_bit(ZONE_OOM_LOCKED, &zone->flags);
|
||||
}
|
||||
};
|
||||
|
||||
static inline unsigned long zone_end_pfn(const struct zone *zone)
|
||||
{
|
||||
|
||||
+1
-17
@@ -24,8 +24,7 @@ enum mapping_flags {
|
||||
AS_ENOSPC = __GFP_BITS_SHIFT + 1, /* ENOSPC on async write */
|
||||
AS_MM_ALL_LOCKS = __GFP_BITS_SHIFT + 2, /* under mm_take_all_locks() */
|
||||
AS_UNEVICTABLE = __GFP_BITS_SHIFT + 3, /* e.g., ramdisk, SHM_LOCK */
|
||||
AS_BALLOON_MAP = __GFP_BITS_SHIFT + 4, /* balloon page special map */
|
||||
AS_EXITING = __GFP_BITS_SHIFT + 5, /* final truncate in progress */
|
||||
AS_EXITING = __GFP_BITS_SHIFT + 4, /* final truncate in progress */
|
||||
};
|
||||
|
||||
static inline void mapping_set_error(struct address_space *mapping, int error)
|
||||
@@ -55,21 +54,6 @@ static inline int mapping_unevictable(struct address_space *mapping)
|
||||
return !!mapping;
|
||||
}
|
||||
|
||||
static inline void mapping_set_balloon(struct address_space *mapping)
|
||||
{
|
||||
set_bit(AS_BALLOON_MAP, &mapping->flags);
|
||||
}
|
||||
|
||||
static inline void mapping_clear_balloon(struct address_space *mapping)
|
||||
{
|
||||
clear_bit(AS_BALLOON_MAP, &mapping->flags);
|
||||
}
|
||||
|
||||
static inline int mapping_balloon(struct address_space *mapping)
|
||||
{
|
||||
return mapping && test_bit(AS_BALLOON_MAP, &mapping->flags);
|
||||
}
|
||||
|
||||
static inline void mapping_set_exiting(struct address_space *mapping)
|
||||
{
|
||||
set_bit(AS_EXITING, &mapping->flags);
|
||||
|
||||
@@ -150,7 +150,7 @@ int anon_vma_fork(struct vm_area_struct *, struct vm_area_struct *);
|
||||
static inline void anon_vma_merge(struct vm_area_struct *vma,
|
||||
struct vm_area_struct *next)
|
||||
{
|
||||
VM_BUG_ON(vma->anon_vma != next->anon_vma);
|
||||
VM_BUG_ON_VMA(vma->anon_vma != next->anon_vma, vma);
|
||||
unlink_anon_vmas(next);
|
||||
}
|
||||
|
||||
|
||||
@@ -1935,11 +1935,13 @@ extern void thread_group_cputime_adjusted(struct task_struct *p, cputime_t *ut,
|
||||
#define tsk_used_math(p) ((p)->flags & PF_USED_MATH)
|
||||
#define used_math() tsk_used_math(current)
|
||||
|
||||
/* __GFP_IO isn't allowed if PF_MEMALLOC_NOIO is set in current->flags */
|
||||
/* __GFP_IO isn't allowed if PF_MEMALLOC_NOIO is set in current->flags
|
||||
* __GFP_FS is also cleared as it implies __GFP_IO.
|
||||
*/
|
||||
static inline gfp_t memalloc_noio_flags(gfp_t flags)
|
||||
{
|
||||
if (unlikely(current->flags & PF_MEMALLOC_NOIO))
|
||||
flags &= ~__GFP_IO;
|
||||
flags &= ~(__GFP_IO | __GFP_FS);
|
||||
return flags;
|
||||
}
|
||||
|
||||
|
||||
@@ -5,12 +5,4 @@
|
||||
|
||||
extern struct screen_info screen_info;
|
||||
|
||||
#define ORIG_X (screen_info.orig_x)
|
||||
#define ORIG_Y (screen_info.orig_y)
|
||||
#define ORIG_VIDEO_MODE (screen_info.orig_video_mode)
|
||||
#define ORIG_VIDEO_COLS (screen_info.orig_video_cols)
|
||||
#define ORIG_VIDEO_EGA_BX (screen_info.orig_video_ega_bx)
|
||||
#define ORIG_VIDEO_LINES (screen_info.orig_video_lines)
|
||||
#define ORIG_VIDEO_ISVGA (screen_info.orig_video_isVGA)
|
||||
#define ORIG_VIDEO_POINTS (screen_info.orig_video_points)
|
||||
#endif /* _SCREEN_INFO_H */
|
||||
|
||||
+1
-63
@@ -158,31 +158,6 @@ size_t ksize(const void *);
|
||||
#define ARCH_KMALLOC_MINALIGN __alignof__(unsigned long long)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SLOB
|
||||
/*
|
||||
* Common fields provided in kmem_cache by all slab allocators
|
||||
* This struct is either used directly by the allocator (SLOB)
|
||||
* or the allocator must include definitions for all fields
|
||||
* provided in kmem_cache_common in their definition of kmem_cache.
|
||||
*
|
||||
* Once we can do anonymous structs (C11 standard) we could put a
|
||||
* anonymous struct definition in these allocators so that the
|
||||
* separate allocations in the kmem_cache structure of SLAB and
|
||||
* SLUB is no longer needed.
|
||||
*/
|
||||
struct kmem_cache {
|
||||
unsigned int object_size;/* The original size of the object */
|
||||
unsigned int size; /* The aligned/padded/added on size */
|
||||
unsigned int align; /* Alignment as calculated */
|
||||
unsigned long flags; /* Active flags on the slab */
|
||||
const char *name; /* Slab name for sysfs */
|
||||
int refcount; /* Use counter */
|
||||
void (*ctor)(void *); /* Called on object slot creation */
|
||||
struct list_head list; /* List of all slab caches on the system */
|
||||
};
|
||||
|
||||
#endif /* CONFIG_SLOB */
|
||||
|
||||
/*
|
||||
* Kmalloc array related definitions
|
||||
*/
|
||||
@@ -363,14 +338,6 @@ kmem_cache_alloc_node_trace(struct kmem_cache *s,
|
||||
}
|
||||
#endif /* CONFIG_TRACING */
|
||||
|
||||
#ifdef CONFIG_SLAB
|
||||
#include <linux/slab_def.h>
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SLUB
|
||||
#include <linux/slub_def.h>
|
||||
#endif
|
||||
|
||||
extern void *kmalloc_order(size_t size, gfp_t flags, unsigned int order);
|
||||
|
||||
#ifdef CONFIG_TRACING
|
||||
@@ -582,37 +549,15 @@ static inline void *kcalloc(size_t n, size_t size, gfp_t flags)
|
||||
* allocator where we care about the real place the memory allocation
|
||||
* request comes from.
|
||||
*/
|
||||
#if defined(CONFIG_DEBUG_SLAB) || defined(CONFIG_SLUB) || \
|
||||
(defined(CONFIG_SLAB) && defined(CONFIG_TRACING)) || \
|
||||
(defined(CONFIG_SLOB) && defined(CONFIG_TRACING))
|
||||
extern void *__kmalloc_track_caller(size_t, gfp_t, unsigned long);
|
||||
#define kmalloc_track_caller(size, flags) \
|
||||
__kmalloc_track_caller(size, flags, _RET_IP_)
|
||||
#else
|
||||
#define kmalloc_track_caller(size, flags) \
|
||||
__kmalloc(size, flags)
|
||||
#endif /* DEBUG_SLAB */
|
||||
|
||||
#ifdef CONFIG_NUMA
|
||||
/*
|
||||
* kmalloc_node_track_caller is a special version of kmalloc_node that
|
||||
* records the calling function of the routine calling it for slab leak
|
||||
* tracking instead of just the calling function (confusing, eh?).
|
||||
* It's useful when the call to kmalloc_node comes from a widely-used
|
||||
* standard allocator where we care about the real place the memory
|
||||
* allocation request comes from.
|
||||
*/
|
||||
#if defined(CONFIG_DEBUG_SLAB) || defined(CONFIG_SLUB) || \
|
||||
(defined(CONFIG_SLAB) && defined(CONFIG_TRACING)) || \
|
||||
(defined(CONFIG_SLOB) && defined(CONFIG_TRACING))
|
||||
extern void *__kmalloc_node_track_caller(size_t, gfp_t, int, unsigned long);
|
||||
#define kmalloc_node_track_caller(size, flags, node) \
|
||||
__kmalloc_node_track_caller(size, flags, node, \
|
||||
_RET_IP_)
|
||||
#else
|
||||
#define kmalloc_node_track_caller(size, flags, node) \
|
||||
__kmalloc_node(size, flags, node)
|
||||
#endif
|
||||
|
||||
#else /* CONFIG_NUMA */
|
||||
|
||||
@@ -650,14 +595,7 @@ static inline void *kzalloc_node(size_t size, gfp_t flags, int node)
|
||||
return kmalloc_node(size, flags | __GFP_ZERO, node);
|
||||
}
|
||||
|
||||
/*
|
||||
* Determine the size of a slab object
|
||||
*/
|
||||
static inline unsigned int kmem_cache_size(struct kmem_cache *s)
|
||||
{
|
||||
return s->object_size;
|
||||
}
|
||||
|
||||
unsigned int kmem_cache_size(struct kmem_cache *s);
|
||||
void __init kmem_cache_init_late(void);
|
||||
|
||||
#endif /* _LINUX_SLAB_H */
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
*/
|
||||
|
||||
struct kmem_cache {
|
||||
struct array_cache __percpu *cpu_cache;
|
||||
|
||||
/* 1) Cache tunables. Protected by slab_mutex */
|
||||
unsigned int batchcount;
|
||||
unsigned int limit;
|
||||
@@ -71,23 +73,7 @@ struct kmem_cache {
|
||||
struct memcg_cache_params *memcg_params;
|
||||
#endif
|
||||
|
||||
/* 6) per-cpu/per-node data, touched during every alloc/free */
|
||||
/*
|
||||
* We put array[] at the end of kmem_cache, because we want to size
|
||||
* this array to nr_cpu_ids slots instead of NR_CPUS
|
||||
* (see kmem_cache_init())
|
||||
* We still use [NR_CPUS] and not [1] or [0] because cache_cache
|
||||
* is statically defined, so we reserve the max number of cpus.
|
||||
*
|
||||
* We also need to guarantee that the list is able to accomodate a
|
||||
* pointer for each node since "nodelists" uses the remainder of
|
||||
* available pointers.
|
||||
*/
|
||||
struct kmem_cache_node **node;
|
||||
struct array_cache *array[NR_CPUS + MAX_NUMNODES];
|
||||
/*
|
||||
* Do not add fields after array[]
|
||||
*/
|
||||
struct kmem_cache_node *node[MAX_NUMNODES];
|
||||
};
|
||||
|
||||
#endif /* _LINUX_SLAB_DEF_H */
|
||||
|
||||
+4
-18
@@ -327,8 +327,10 @@ extern void lru_cache_add_active_or_unevictable(struct page *page,
|
||||
extern unsigned long try_to_free_pages(struct zonelist *zonelist, int order,
|
||||
gfp_t gfp_mask, nodemask_t *mask);
|
||||
extern int __isolate_lru_page(struct page *page, isolate_mode_t mode);
|
||||
extern unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *mem,
|
||||
gfp_t gfp_mask, bool noswap);
|
||||
extern unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *memcg,
|
||||
unsigned long nr_pages,
|
||||
gfp_t gfp_mask,
|
||||
bool may_swap);
|
||||
extern unsigned long mem_cgroup_shrink_node_zone(struct mem_cgroup *mem,
|
||||
gfp_t gfp_mask, bool noswap,
|
||||
struct zone *zone,
|
||||
@@ -354,22 +356,6 @@ static inline int zone_reclaim(struct zone *z, gfp_t mask, unsigned int order)
|
||||
extern int page_evictable(struct page *page);
|
||||
extern void check_move_unevictable_pages(struct page **, int nr_pages);
|
||||
|
||||
extern unsigned long scan_unevictable_pages;
|
||||
extern int scan_unevictable_handler(struct ctl_table *, int,
|
||||
void __user *, size_t *, loff_t *);
|
||||
#ifdef CONFIG_NUMA
|
||||
extern int scan_unevictable_register_node(struct node *node);
|
||||
extern void scan_unevictable_unregister_node(struct node *node);
|
||||
#else
|
||||
static inline int scan_unevictable_register_node(struct node *node)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void scan_unevictable_unregister_node(struct node *node)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
extern int kswapd_run(int nid);
|
||||
extern void kswapd_stop(int nid);
|
||||
#ifdef CONFIG_MEMCG
|
||||
|
||||
@@ -119,11 +119,20 @@ static inline int numa_node_id(void)
|
||||
* Use the accessor functions set_numa_mem(), numa_mem_id() and cpu_to_mem().
|
||||
*/
|
||||
DECLARE_PER_CPU(int, _numa_mem_);
|
||||
extern int _node_numa_mem_[MAX_NUMNODES];
|
||||
|
||||
#ifndef set_numa_mem
|
||||
static inline void set_numa_mem(int node)
|
||||
{
|
||||
this_cpu_write(_numa_mem_, node);
|
||||
_node_numa_mem_[numa_node_id()] = node;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef node_to_mem_node
|
||||
static inline int node_to_mem_node(int node)
|
||||
{
|
||||
return _node_numa_mem_[node];
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -146,6 +155,7 @@ static inline int cpu_to_mem(int cpu)
|
||||
static inline void set_cpu_numa_mem(int cpu, int node)
|
||||
{
|
||||
per_cpu(_numa_mem_, cpu) = node;
|
||||
_node_numa_mem_[cpu_to_node(cpu)] = node;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -159,6 +169,13 @@ static inline int numa_mem_id(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef node_to_mem_node
|
||||
static inline int node_to_mem_node(int node)
|
||||
{
|
||||
return node;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef cpu_to_mem
|
||||
static inline int cpu_to_mem(int cpu)
|
||||
{
|
||||
|
||||
@@ -72,6 +72,13 @@ enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT,
|
||||
THP_ZERO_PAGE_ALLOC,
|
||||
THP_ZERO_PAGE_ALLOC_FAILED,
|
||||
#endif
|
||||
#ifdef CONFIG_MEMORY_BALLOON
|
||||
BALLOON_INFLATE,
|
||||
BALLOON_DEFLATE,
|
||||
#ifdef CONFIG_BALLOON_COMPACTION
|
||||
BALLOON_MIGRATE,
|
||||
#endif
|
||||
#endif
|
||||
#ifdef CONFIG_DEBUG_TLBFLUSH
|
||||
#ifdef CONFIG_SMP
|
||||
NR_TLB_REMOTE_FLUSH, /* cpu tried to flush others' tlbs */
|
||||
|
||||
@@ -46,6 +46,6 @@ void *zs_map_object(struct zs_pool *pool, unsigned long handle,
|
||||
enum zs_mapmode mm);
|
||||
void zs_unmap_object(struct zs_pool *pool, unsigned long handle);
|
||||
|
||||
u64 zs_get_total_size_bytes(struct zs_pool *pool);
|
||||
unsigned long zs_get_total_pages(struct zs_pool *pool);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
|
||||
#define KPF_KSM 21
|
||||
#define KPF_THP 22
|
||||
#define KPF_BALLOON 23
|
||||
|
||||
|
||||
#endif /* _UAPILINUX_KERNEL_PAGE_FLAGS_H */
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
#ifndef _LINUX_PRCTL_H
|
||||
#define _LINUX_PRCTL_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
/* Values to pass as first argument to prctl() */
|
||||
|
||||
#define PR_SET_PDEATHSIG 1 /* Second arg is a signal */
|
||||
@@ -119,6 +121,31 @@
|
||||
# define PR_SET_MM_ENV_END 11
|
||||
# define PR_SET_MM_AUXV 12
|
||||
# define PR_SET_MM_EXE_FILE 13
|
||||
# define PR_SET_MM_MAP 14
|
||||
# define PR_SET_MM_MAP_SIZE 15
|
||||
|
||||
/*
|
||||
* This structure provides new memory descriptor
|
||||
* map which mostly modifies /proc/pid/stat[m]
|
||||
* output for a task. This mostly done in a
|
||||
* sake of checkpoint/restore functionality.
|
||||
*/
|
||||
struct prctl_mm_map {
|
||||
__u64 start_code; /* code section bounds */
|
||||
__u64 end_code;
|
||||
__u64 start_data; /* data section bounds */
|
||||
__u64 end_data;
|
||||
__u64 start_brk; /* heap for brk() syscall */
|
||||
__u64 brk;
|
||||
__u64 start_stack; /* stack starts at */
|
||||
__u64 arg_start; /* command line arguments bounds */
|
||||
__u64 arg_end;
|
||||
__u64 env_start; /* environment variables bounds */
|
||||
__u64 env_end;
|
||||
__u64 *auxv; /* auxiliary vector */
|
||||
__u32 auxv_size; /* vector size */
|
||||
__u32 exe_fd; /* /proc/$pid/exe link file */
|
||||
};
|
||||
|
||||
/*
|
||||
* Set specific pid that is allowed to ptrace the current task.
|
||||
|
||||
Reference in New Issue
Block a user