Merge branch 'akpm' (second patchbomb from Andrew Morton)
Merge more incoming from Andrew Morton:
"Two new syscalls:
memfd_create in "shm: add memfd_create() syscall"
kexec_file_load in "kexec: implementation of new syscall kexec_file_load"
And:
- Most (all?) of the rest of MM
- Lots of the usual misc bits
- fs/autofs4
- drivers/rtc
- fs/nilfs
- procfs
- fork.c, exec.c
- more in lib/
- rapidio
- Janitorial work in filesystems: fs/ufs, fs/reiserfs, fs/adfs,
fs/cramfs, fs/romfs, fs/qnx6.
- initrd/initramfs work
- "file sealing" and the memfd_create() syscall, in tmpfs
- add pci_zalloc_consistent, use it in lots of places
- MAINTAINERS maintenance
- kexec feature work"
* emailed patches from Andrew Morton <akpm@linux-foundation.org: (193 commits)
MAINTAINERS: update nomadik patterns
MAINTAINERS: update usb/gadget patterns
MAINTAINERS: update DMA BUFFER SHARING patterns
kexec: verify the signature of signed PE bzImage
kexec: support kexec/kdump on EFI systems
kexec: support for kexec on panic using new system call
kexec-bzImage64: support for loading bzImage using 64bit entry
kexec: load and relocate purgatory at kernel load time
purgatory: core purgatory functionality
purgatory/sha256: provide implementation of sha256 in purgaotory context
kexec: implementation of new syscall kexec_file_load
kexec: new syscall kexec_file_load() declaration
kexec: make kexec_segment user buffer pointer a union
resource: provide new functions to walk through resources
kexec: use common function for kimage_normal_alloc() and kimage_crash_alloc()
kexec: move segment verification code in a separate function
kexec: rename unusebale_pages to unusable_pages
kernel: build bin2c based on config option CONFIG_BUILD_BIN2C
bin2c: move bin2c in scripts/basic
shm: wait for pins to be released when sealing
...
This commit is contained in:
commit
8065be8d03
348 changed files with 10235 additions and 3582 deletions
|
|
@ -1,10 +1,10 @@
|
|||
#ifndef DECOMPRESS_BUNZIP2_H
|
||||
#define DECOMPRESS_BUNZIP2_H
|
||||
|
||||
int bunzip2(unsigned char *inbuf, int len,
|
||||
int(*fill)(void*, unsigned int),
|
||||
int(*flush)(void*, unsigned int),
|
||||
int bunzip2(unsigned char *inbuf, long len,
|
||||
long (*fill)(void*, unsigned long),
|
||||
long (*flush)(void*, unsigned long),
|
||||
unsigned char *output,
|
||||
int *pos,
|
||||
long *pos,
|
||||
void(*error)(char *x));
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
#ifndef DECOMPRESS_GENERIC_H
|
||||
#define DECOMPRESS_GENERIC_H
|
||||
|
||||
typedef int (*decompress_fn) (unsigned char *inbuf, int len,
|
||||
int(*fill)(void*, unsigned int),
|
||||
int(*flush)(void*, unsigned int),
|
||||
typedef int (*decompress_fn) (unsigned char *inbuf, long len,
|
||||
long (*fill)(void*, unsigned long),
|
||||
long (*flush)(void*, unsigned long),
|
||||
unsigned char *outbuf,
|
||||
int *posp,
|
||||
long *posp,
|
||||
void(*error)(char *x));
|
||||
|
||||
/* inbuf - input buffer
|
||||
|
|
@ -33,7 +33,7 @@ typedef int (*decompress_fn) (unsigned char *inbuf, int len,
|
|||
|
||||
|
||||
/* Utility routine to detect the decompression method */
|
||||
decompress_fn decompress_method(const unsigned char *inbuf, int len,
|
||||
decompress_fn decompress_method(const unsigned char *inbuf, long len,
|
||||
const char **name);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
#ifndef LINUX_DECOMPRESS_INFLATE_H
|
||||
#define LINUX_DECOMPRESS_INFLATE_H
|
||||
|
||||
int gunzip(unsigned char *inbuf, int len,
|
||||
int(*fill)(void*, unsigned int),
|
||||
int(*flush)(void*, unsigned int),
|
||||
int gunzip(unsigned char *inbuf, long len,
|
||||
long (*fill)(void*, unsigned long),
|
||||
long (*flush)(void*, unsigned long),
|
||||
unsigned char *output,
|
||||
int *pos,
|
||||
long *pos,
|
||||
void(*error_fn)(char *x));
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
#ifndef DECOMPRESS_UNLZ4_H
|
||||
#define DECOMPRESS_UNLZ4_H
|
||||
|
||||
int unlz4(unsigned char *inbuf, int len,
|
||||
int(*fill)(void*, unsigned int),
|
||||
int(*flush)(void*, unsigned int),
|
||||
int unlz4(unsigned char *inbuf, long len,
|
||||
long (*fill)(void*, unsigned long),
|
||||
long (*flush)(void*, unsigned long),
|
||||
unsigned char *output,
|
||||
int *pos,
|
||||
long *pos,
|
||||
void(*error)(char *x));
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
#ifndef DECOMPRESS_UNLZMA_H
|
||||
#define DECOMPRESS_UNLZMA_H
|
||||
|
||||
int unlzma(unsigned char *, int,
|
||||
int(*fill)(void*, unsigned int),
|
||||
int(*flush)(void*, unsigned int),
|
||||
int unlzma(unsigned char *, long,
|
||||
long (*fill)(void*, unsigned long),
|
||||
long (*flush)(void*, unsigned long),
|
||||
unsigned char *output,
|
||||
int *posp,
|
||||
long *posp,
|
||||
void(*error)(char *x)
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
#ifndef DECOMPRESS_UNLZO_H
|
||||
#define DECOMPRESS_UNLZO_H
|
||||
|
||||
int unlzo(unsigned char *inbuf, int len,
|
||||
int(*fill)(void*, unsigned int),
|
||||
int(*flush)(void*, unsigned int),
|
||||
int unlzo(unsigned char *inbuf, long len,
|
||||
long (*fill)(void*, unsigned long),
|
||||
long (*flush)(void*, unsigned long),
|
||||
unsigned char *output,
|
||||
int *pos,
|
||||
long *pos,
|
||||
void(*error)(char *x));
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -10,10 +10,10 @@
|
|||
#ifndef DECOMPRESS_UNXZ_H
|
||||
#define DECOMPRESS_UNXZ_H
|
||||
|
||||
int unxz(unsigned char *in, int in_size,
|
||||
int (*fill)(void *dest, unsigned int size),
|
||||
int (*flush)(void *src, unsigned int size),
|
||||
unsigned char *out, int *in_used,
|
||||
int unxz(unsigned char *in, long in_size,
|
||||
long (*fill)(void *dest, unsigned long size),
|
||||
long (*flush)(void *src, unsigned long size),
|
||||
unsigned char *out, long *in_used,
|
||||
void (*error)(char *x));
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1156,6 +1156,9 @@ int efivars_sysfs_init(void);
|
|||
#ifdef CONFIG_EFI_RUNTIME_MAP
|
||||
int efi_runtime_map_init(struct kobject *);
|
||||
void efi_runtime_map_setup(void *, int, u32);
|
||||
int efi_get_runtime_map_size(void);
|
||||
int efi_get_runtime_map_desc_size(void);
|
||||
int efi_runtime_map_copy(void *buf, size_t bufsz);
|
||||
#else
|
||||
static inline int efi_runtime_map_init(struct kobject *kobj)
|
||||
{
|
||||
|
|
@ -1164,6 +1167,22 @@ static inline int efi_runtime_map_init(struct kobject *kobj)
|
|||
|
||||
static inline void
|
||||
efi_runtime_map_setup(void *map, int nr_entries, u32 desc_size) {}
|
||||
|
||||
static inline int efi_get_runtime_map_size(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int efi_get_runtime_map_desc_size(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int efi_runtime_map_copy(void *buf, size_t bufsz)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* prototypes shared between arch specific and generic stub code */
|
||||
|
|
|
|||
|
|
@ -387,7 +387,7 @@ struct address_space {
|
|||
struct inode *host; /* owner: inode, block_device */
|
||||
struct radix_tree_root page_tree; /* radix tree of all pages */
|
||||
spinlock_t tree_lock; /* and lock protecting it */
|
||||
unsigned int i_mmap_writable;/* count VM_SHARED mappings */
|
||||
atomic_t i_mmap_writable;/* count VM_SHARED mappings */
|
||||
struct rb_root i_mmap; /* tree of private and shared mappings */
|
||||
struct list_head i_mmap_nonlinear;/*list VM_NONLINEAR mappings */
|
||||
struct mutex i_mmap_mutex; /* protect tree, count, list */
|
||||
|
|
@ -470,10 +470,35 @@ static inline int mapping_mapped(struct address_space *mapping)
|
|||
* Note that i_mmap_writable counts all VM_SHARED vmas: do_mmap_pgoff
|
||||
* marks vma as VM_SHARED if it is shared, and the file was opened for
|
||||
* writing i.e. vma may be mprotected writable even if now readonly.
|
||||
*
|
||||
* If i_mmap_writable is negative, no new writable mappings are allowed. You
|
||||
* can only deny writable mappings, if none exists right now.
|
||||
*/
|
||||
static inline int mapping_writably_mapped(struct address_space *mapping)
|
||||
{
|
||||
return mapping->i_mmap_writable != 0;
|
||||
return atomic_read(&mapping->i_mmap_writable) > 0;
|
||||
}
|
||||
|
||||
static inline int mapping_map_writable(struct address_space *mapping)
|
||||
{
|
||||
return atomic_inc_unless_negative(&mapping->i_mmap_writable) ?
|
||||
0 : -EPERM;
|
||||
}
|
||||
|
||||
static inline void mapping_unmap_writable(struct address_space *mapping)
|
||||
{
|
||||
atomic_dec(&mapping->i_mmap_writable);
|
||||
}
|
||||
|
||||
static inline int mapping_deny_writable(struct address_space *mapping)
|
||||
{
|
||||
return atomic_dec_unless_positive(&mapping->i_mmap_writable) ?
|
||||
0 : -EBUSY;
|
||||
}
|
||||
|
||||
static inline void mapping_allow_writable(struct address_space *mapping)
|
||||
{
|
||||
atomic_inc(&mapping->i_mmap_writable);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -237,6 +237,12 @@ extern int iomem_is_exclusive(u64 addr);
|
|||
extern int
|
||||
walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages,
|
||||
void *arg, int (*func)(unsigned long, unsigned long, void *));
|
||||
extern int
|
||||
walk_system_ram_res(u64 start, u64 end, void *arg,
|
||||
int (*func)(u64, u64, void *));
|
||||
extern int
|
||||
walk_iomem_res(char *name, unsigned long flags, u64 start, u64 end, void *arg,
|
||||
int (*func)(u64, u64, void *));
|
||||
|
||||
/* True if any part of r1 overlaps r2 */
|
||||
static inline bool resource_overlaps(struct resource *r1, struct resource *r2)
|
||||
|
|
|
|||
|
|
@ -470,6 +470,7 @@ extern enum system_states {
|
|||
#define TAINT_FIRMWARE_WORKAROUND 11
|
||||
#define TAINT_OOT_MODULE 12
|
||||
#define TAINT_UNSIGNED_MODULE 13
|
||||
#define TAINT_SOFTLOCKUP 14
|
||||
|
||||
extern const char hex_asc[];
|
||||
#define hex_asc_lo(x) hex_asc[((x) & 0x0f)]
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
#include <linux/ioport.h>
|
||||
#include <linux/elfcore.h>
|
||||
#include <linux/elf.h>
|
||||
#include <linux/module.h>
|
||||
#include <asm/kexec.h>
|
||||
|
||||
/* Verify architecture specific macros are defined */
|
||||
|
|
@ -69,7 +70,18 @@ typedef unsigned long kimage_entry_t;
|
|||
#define IND_SOURCE 0x8
|
||||
|
||||
struct kexec_segment {
|
||||
void __user *buf;
|
||||
/*
|
||||
* This pointer can point to user memory if kexec_load() system
|
||||
* call is used or will point to kernel memory if
|
||||
* kexec_file_load() system call is used.
|
||||
*
|
||||
* Use ->buf when expecting to deal with user memory and use ->kbuf
|
||||
* when expecting to deal with kernel memory.
|
||||
*/
|
||||
union {
|
||||
void __user *buf;
|
||||
void *kbuf;
|
||||
};
|
||||
size_t bufsz;
|
||||
unsigned long mem;
|
||||
size_t memsz;
|
||||
|
|
@ -84,6 +96,27 @@ struct compat_kexec_segment {
|
|||
};
|
||||
#endif
|
||||
|
||||
struct kexec_sha_region {
|
||||
unsigned long start;
|
||||
unsigned long len;
|
||||
};
|
||||
|
||||
struct purgatory_info {
|
||||
/* Pointer to elf header of read only purgatory */
|
||||
Elf_Ehdr *ehdr;
|
||||
|
||||
/* Pointer to purgatory sechdrs which are modifiable */
|
||||
Elf_Shdr *sechdrs;
|
||||
/*
|
||||
* Temporary buffer location where purgatory is loaded and relocated
|
||||
* This memory can be freed post image load
|
||||
*/
|
||||
void *purgatory_buf;
|
||||
|
||||
/* Address where purgatory is finally loaded and is executed from */
|
||||
unsigned long purgatory_load_addr;
|
||||
};
|
||||
|
||||
struct kimage {
|
||||
kimage_entry_t head;
|
||||
kimage_entry_t *entry;
|
||||
|
|
@ -100,7 +133,7 @@ struct kimage {
|
|||
|
||||
struct list_head control_pages;
|
||||
struct list_head dest_pages;
|
||||
struct list_head unuseable_pages;
|
||||
struct list_head unusable_pages;
|
||||
|
||||
/* Address of next control page to allocate for crash kernels. */
|
||||
unsigned long control_page;
|
||||
|
|
@ -110,13 +143,63 @@ struct kimage {
|
|||
#define KEXEC_TYPE_DEFAULT 0
|
||||
#define KEXEC_TYPE_CRASH 1
|
||||
unsigned int preserve_context : 1;
|
||||
/* If set, we are using file mode kexec syscall */
|
||||
unsigned int file_mode:1;
|
||||
|
||||
#ifdef ARCH_HAS_KIMAGE_ARCH
|
||||
struct kimage_arch arch;
|
||||
#endif
|
||||
|
||||
/* Additional fields for file based kexec syscall */
|
||||
void *kernel_buf;
|
||||
unsigned long kernel_buf_len;
|
||||
|
||||
void *initrd_buf;
|
||||
unsigned long initrd_buf_len;
|
||||
|
||||
char *cmdline_buf;
|
||||
unsigned long cmdline_buf_len;
|
||||
|
||||
/* File operations provided by image loader */
|
||||
struct kexec_file_ops *fops;
|
||||
|
||||
/* Image loader handling the kernel can store a pointer here */
|
||||
void *image_loader_data;
|
||||
|
||||
/* Information for loading purgatory */
|
||||
struct purgatory_info purgatory_info;
|
||||
};
|
||||
|
||||
/*
|
||||
* Keeps track of buffer parameters as provided by caller for requesting
|
||||
* memory placement of buffer.
|
||||
*/
|
||||
struct kexec_buf {
|
||||
struct kimage *image;
|
||||
char *buffer;
|
||||
unsigned long bufsz;
|
||||
unsigned long memsz;
|
||||
unsigned long buf_align;
|
||||
unsigned long buf_min;
|
||||
unsigned long buf_max;
|
||||
bool top_down; /* allocate from top of memory hole */
|
||||
};
|
||||
|
||||
typedef int (kexec_probe_t)(const char *kernel_buf, unsigned long kernel_size);
|
||||
typedef void *(kexec_load_t)(struct kimage *image, char *kernel_buf,
|
||||
unsigned long kernel_len, char *initrd,
|
||||
unsigned long initrd_len, char *cmdline,
|
||||
unsigned long cmdline_len);
|
||||
typedef int (kexec_cleanup_t)(void *loader_data);
|
||||
typedef int (kexec_verify_sig_t)(const char *kernel_buf,
|
||||
unsigned long kernel_len);
|
||||
|
||||
struct kexec_file_ops {
|
||||
kexec_probe_t *probe;
|
||||
kexec_load_t *load;
|
||||
kexec_cleanup_t *cleanup;
|
||||
kexec_verify_sig_t *verify_sig;
|
||||
};
|
||||
|
||||
/* kexec interface functions */
|
||||
extern void machine_kexec(struct kimage *image);
|
||||
|
|
@ -127,8 +210,21 @@ extern asmlinkage long sys_kexec_load(unsigned long entry,
|
|||
struct kexec_segment __user *segments,
|
||||
unsigned long flags);
|
||||
extern int kernel_kexec(void);
|
||||
extern int kexec_add_buffer(struct kimage *image, char *buffer,
|
||||
unsigned long bufsz, unsigned long memsz,
|
||||
unsigned long buf_align, unsigned long buf_min,
|
||||
unsigned long buf_max, bool top_down,
|
||||
unsigned long *load_addr);
|
||||
extern struct page *kimage_alloc_control_pages(struct kimage *image,
|
||||
unsigned int order);
|
||||
extern int kexec_load_purgatory(struct kimage *image, unsigned long min,
|
||||
unsigned long max, int top_down,
|
||||
unsigned long *load_addr);
|
||||
extern int kexec_purgatory_get_set_symbol(struct kimage *image,
|
||||
const char *name, void *buf,
|
||||
unsigned int size, bool get_value);
|
||||
extern void *kexec_purgatory_get_symbol_addr(struct kimage *image,
|
||||
const char *name);
|
||||
extern void crash_kexec(struct pt_regs *);
|
||||
int kexec_should_crash(struct task_struct *);
|
||||
void crash_save_cpu(struct pt_regs *regs, int cpu);
|
||||
|
|
@ -177,6 +273,10 @@ extern int kexec_load_disabled;
|
|||
#define KEXEC_FLAGS (KEXEC_ON_CRASH | KEXEC_PRESERVE_CONTEXT)
|
||||
#endif
|
||||
|
||||
/* List of defined/legal kexec file flags */
|
||||
#define KEXEC_FILE_FLAGS (KEXEC_FILE_UNLOAD | KEXEC_FILE_ON_CRASH | \
|
||||
KEXEC_FILE_NO_INITRAMFS)
|
||||
|
||||
#define VMCOREINFO_BYTES (4096)
|
||||
#define VMCOREINFO_NOTE_NAME "VMCOREINFO"
|
||||
#define VMCOREINFO_NOTE_NAME_BYTES ALIGN(sizeof(VMCOREINFO_NOTE_NAME), 4)
|
||||
|
|
|
|||
|
|
@ -54,39 +54,20 @@ struct mem_cgroup_reclaim_cookie {
|
|||
};
|
||||
|
||||
#ifdef CONFIG_MEMCG
|
||||
/*
|
||||
* All "charge" functions with gfp_mask should use GFP_KERNEL or
|
||||
* (gfp_mask & GFP_RECLAIM_MASK). In current implementatin, memcg doesn't
|
||||
* alloc memory but reclaims memory from all available zones. So, "where I want
|
||||
* memory from" bits of gfp_mask has no meaning. So any bits of that field is
|
||||
* available but adding a rule is better. charge functions' gfp_mask should
|
||||
* be set to GFP_KERNEL or gfp_mask & GFP_RECLAIM_MASK for avoiding ambiguous
|
||||
* codes.
|
||||
* (Of course, if memcg does memory allocation in future, GFP_KERNEL is sane.)
|
||||
*/
|
||||
int mem_cgroup_try_charge(struct page *page, struct mm_struct *mm,
|
||||
gfp_t gfp_mask, struct mem_cgroup **memcgp);
|
||||
void mem_cgroup_commit_charge(struct page *page, struct mem_cgroup *memcg,
|
||||
bool lrucare);
|
||||
void mem_cgroup_cancel_charge(struct page *page, struct mem_cgroup *memcg);
|
||||
void mem_cgroup_uncharge(struct page *page);
|
||||
void mem_cgroup_uncharge_list(struct list_head *page_list);
|
||||
|
||||
extern int mem_cgroup_charge_anon(struct page *page, struct mm_struct *mm,
|
||||
gfp_t gfp_mask);
|
||||
/* for swap handling */
|
||||
extern int mem_cgroup_try_charge_swapin(struct mm_struct *mm,
|
||||
struct page *page, gfp_t mask, struct mem_cgroup **memcgp);
|
||||
extern void mem_cgroup_commit_charge_swapin(struct page *page,
|
||||
struct mem_cgroup *memcg);
|
||||
extern void mem_cgroup_cancel_charge_swapin(struct mem_cgroup *memcg);
|
||||
|
||||
extern int mem_cgroup_charge_file(struct page *page, struct mm_struct *mm,
|
||||
gfp_t gfp_mask);
|
||||
void mem_cgroup_migrate(struct page *oldpage, struct page *newpage,
|
||||
bool lrucare);
|
||||
|
||||
struct lruvec *mem_cgroup_zone_lruvec(struct zone *, struct mem_cgroup *);
|
||||
struct lruvec *mem_cgroup_page_lruvec(struct page *, struct zone *);
|
||||
|
||||
/* For coalescing uncharge for reducing memcg' overhead*/
|
||||
extern void mem_cgroup_uncharge_start(void);
|
||||
extern void mem_cgroup_uncharge_end(void);
|
||||
|
||||
extern void mem_cgroup_uncharge_page(struct page *page);
|
||||
extern void mem_cgroup_uncharge_cache_page(struct page *page);
|
||||
|
||||
bool __mem_cgroup_same_or_subtree(const struct mem_cgroup *root_memcg,
|
||||
struct mem_cgroup *memcg);
|
||||
bool task_in_mem_cgroup(struct task_struct *task,
|
||||
|
|
@ -113,12 +94,6 @@ bool mm_match_cgroup(const struct mm_struct *mm, const struct mem_cgroup *memcg)
|
|||
|
||||
extern struct cgroup_subsys_state *mem_cgroup_css(struct mem_cgroup *memcg);
|
||||
|
||||
extern void
|
||||
mem_cgroup_prepare_migration(struct page *page, struct page *newpage,
|
||||
struct mem_cgroup **memcgp);
|
||||
extern void mem_cgroup_end_migration(struct mem_cgroup *memcg,
|
||||
struct page *oldpage, struct page *newpage, bool migration_ok);
|
||||
|
||||
struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *,
|
||||
struct mem_cgroup *,
|
||||
struct mem_cgroup_reclaim_cookie *);
|
||||
|
|
@ -133,8 +108,6 @@ unsigned long mem_cgroup_get_lru_size(struct lruvec *lruvec, enum lru_list);
|
|||
void mem_cgroup_update_lru_size(struct lruvec *, enum lru_list, int);
|
||||
extern void mem_cgroup_print_oom_info(struct mem_cgroup *memcg,
|
||||
struct task_struct *p);
|
||||
extern void mem_cgroup_replace_page_cache(struct page *oldpage,
|
||||
struct page *newpage);
|
||||
|
||||
static inline void mem_cgroup_oom_enable(void)
|
||||
{
|
||||
|
|
@ -233,46 +206,36 @@ void mem_cgroup_print_bad_page(struct page *page);
|
|||
#else /* CONFIG_MEMCG */
|
||||
struct mem_cgroup;
|
||||
|
||||
static inline int mem_cgroup_charge_anon(struct page *page,
|
||||
struct mm_struct *mm, gfp_t gfp_mask)
|
||||
static inline int mem_cgroup_try_charge(struct page *page, struct mm_struct *mm,
|
||||
gfp_t gfp_mask,
|
||||
struct mem_cgroup **memcgp)
|
||||
{
|
||||
*memcgp = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int mem_cgroup_charge_file(struct page *page,
|
||||
struct mm_struct *mm, gfp_t gfp_mask)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int mem_cgroup_try_charge_swapin(struct mm_struct *mm,
|
||||
struct page *page, gfp_t gfp_mask, struct mem_cgroup **memcgp)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void mem_cgroup_commit_charge_swapin(struct page *page,
|
||||
struct mem_cgroup *memcg)
|
||||
static inline void mem_cgroup_commit_charge(struct page *page,
|
||||
struct mem_cgroup *memcg,
|
||||
bool lrucare)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void mem_cgroup_cancel_charge_swapin(struct mem_cgroup *memcg)
|
||||
static inline void mem_cgroup_cancel_charge(struct page *page,
|
||||
struct mem_cgroup *memcg)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void mem_cgroup_uncharge_start(void)
|
||||
static inline void mem_cgroup_uncharge(struct page *page)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void mem_cgroup_uncharge_end(void)
|
||||
static inline void mem_cgroup_uncharge_list(struct list_head *page_list)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void mem_cgroup_uncharge_page(struct page *page)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void mem_cgroup_uncharge_cache_page(struct page *page)
|
||||
static inline void mem_cgroup_migrate(struct page *oldpage,
|
||||
struct page *newpage,
|
||||
bool lrucare)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -311,17 +274,6 @@ static inline struct cgroup_subsys_state
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static inline void
|
||||
mem_cgroup_prepare_migration(struct page *page, struct page *newpage,
|
||||
struct mem_cgroup **memcgp)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void mem_cgroup_end_migration(struct mem_cgroup *memcg,
|
||||
struct page *oldpage, struct page *newpage, bool migration_ok)
|
||||
{
|
||||
}
|
||||
|
||||
static inline struct mem_cgroup *
|
||||
mem_cgroup_iter(struct mem_cgroup *root,
|
||||
struct mem_cgroup *prev,
|
||||
|
|
@ -417,10 +369,6 @@ static inline
|
|||
void mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx)
|
||||
{
|
||||
}
|
||||
static inline void mem_cgroup_replace_page_cache(struct page *oldpage,
|
||||
struct page *newpage)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_MEMCG */
|
||||
|
||||
#if !defined(CONFIG_MEMCG) || !defined(CONFIG_DEBUG_VM)
|
||||
|
|
|
|||
|
|
@ -2014,13 +2014,20 @@ static inline bool kernel_page_present(struct page *page) { return true; }
|
|||
#endif /* CONFIG_HIBERNATION */
|
||||
#endif
|
||||
|
||||
#ifdef __HAVE_ARCH_GATE_AREA
|
||||
extern struct vm_area_struct *get_gate_vma(struct mm_struct *mm);
|
||||
#ifdef __HAVE_ARCH_GATE_AREA
|
||||
int in_gate_area_no_mm(unsigned long addr);
|
||||
int in_gate_area(struct mm_struct *mm, unsigned long addr);
|
||||
extern int in_gate_area_no_mm(unsigned long addr);
|
||||
extern int in_gate_area(struct mm_struct *mm, unsigned long addr);
|
||||
#else
|
||||
int in_gate_area_no_mm(unsigned long addr);
|
||||
#define in_gate_area(mm, addr) ({(void)mm; in_gate_area_no_mm(addr);})
|
||||
static inline struct vm_area_struct *get_gate_vma(struct mm_struct *mm)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
static inline int in_gate_area_no_mm(unsigned long addr) { return 0; }
|
||||
static inline int in_gate_area(struct mm_struct *mm, unsigned long addr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif /* __HAVE_ARCH_GATE_AREA */
|
||||
|
||||
#ifdef CONFIG_SYSCTL
|
||||
|
|
|
|||
|
|
@ -461,6 +461,7 @@ static inline void mm_init_cpumask(struct mm_struct *mm)
|
|||
#ifdef CONFIG_CPUMASK_OFFSTACK
|
||||
mm->cpu_vm_mask_var = &mm->cpumask_allocation;
|
||||
#endif
|
||||
cpumask_clear(mm->cpu_vm_mask_var);
|
||||
}
|
||||
|
||||
/* Future-safe accessor for struct mm_struct's cpu_vm_mask. */
|
||||
|
|
|
|||
|
|
@ -3,17 +3,15 @@
|
|||
|
||||
enum {
|
||||
/* flags for mem_cgroup */
|
||||
PCG_LOCK, /* Lock for pc->mem_cgroup and following bits. */
|
||||
PCG_USED, /* this object is in use. */
|
||||
PCG_MIGRATION, /* under page migration */
|
||||
__NR_PCG_FLAGS,
|
||||
PCG_USED = 0x01, /* This page is charged to a memcg */
|
||||
PCG_MEM = 0x02, /* This page holds a memory charge */
|
||||
PCG_MEMSW = 0x04, /* This page holds a memory+swap charge */
|
||||
};
|
||||
|
||||
#ifndef __GENERATING_BOUNDS_H
|
||||
#include <generated/bounds.h>
|
||||
struct pglist_data;
|
||||
|
||||
#ifdef CONFIG_MEMCG
|
||||
#include <linux/bit_spinlock.h>
|
||||
struct mem_cgroup;
|
||||
|
||||
/*
|
||||
* Page Cgroup can be considered as an extended mem_map.
|
||||
|
|
@ -27,65 +25,30 @@ struct page_cgroup {
|
|||
struct mem_cgroup *mem_cgroup;
|
||||
};
|
||||
|
||||
void __meminit pgdat_page_cgroup_init(struct pglist_data *pgdat);
|
||||
extern void pgdat_page_cgroup_init(struct pglist_data *pgdat);
|
||||
|
||||
#ifdef CONFIG_SPARSEMEM
|
||||
static inline void __init page_cgroup_init_flatmem(void)
|
||||
static inline void page_cgroup_init_flatmem(void)
|
||||
{
|
||||
}
|
||||
extern void __init page_cgroup_init(void);
|
||||
extern void page_cgroup_init(void);
|
||||
#else
|
||||
void __init page_cgroup_init_flatmem(void);
|
||||
static inline void __init page_cgroup_init(void)
|
||||
extern void page_cgroup_init_flatmem(void);
|
||||
static inline void page_cgroup_init(void)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
struct page_cgroup *lookup_page_cgroup(struct page *page);
|
||||
struct page *lookup_cgroup_page(struct page_cgroup *pc);
|
||||
|
||||
#define TESTPCGFLAG(uname, lname) \
|
||||
static inline int PageCgroup##uname(struct page_cgroup *pc) \
|
||||
{ return test_bit(PCG_##lname, &pc->flags); }
|
||||
|
||||
#define SETPCGFLAG(uname, lname) \
|
||||
static inline void SetPageCgroup##uname(struct page_cgroup *pc)\
|
||||
{ set_bit(PCG_##lname, &pc->flags); }
|
||||
|
||||
#define CLEARPCGFLAG(uname, lname) \
|
||||
static inline void ClearPageCgroup##uname(struct page_cgroup *pc) \
|
||||
{ clear_bit(PCG_##lname, &pc->flags); }
|
||||
|
||||
#define TESTCLEARPCGFLAG(uname, lname) \
|
||||
static inline int TestClearPageCgroup##uname(struct page_cgroup *pc) \
|
||||
{ return test_and_clear_bit(PCG_##lname, &pc->flags); }
|
||||
|
||||
TESTPCGFLAG(Used, USED)
|
||||
CLEARPCGFLAG(Used, USED)
|
||||
SETPCGFLAG(Used, USED)
|
||||
|
||||
SETPCGFLAG(Migration, MIGRATION)
|
||||
CLEARPCGFLAG(Migration, MIGRATION)
|
||||
TESTPCGFLAG(Migration, MIGRATION)
|
||||
|
||||
static inline void lock_page_cgroup(struct page_cgroup *pc)
|
||||
static inline int PageCgroupUsed(struct page_cgroup *pc)
|
||||
{
|
||||
/*
|
||||
* Don't take this lock in IRQ context.
|
||||
* This lock is for pc->mem_cgroup, USED, MIGRATION
|
||||
*/
|
||||
bit_spin_lock(PCG_LOCK, &pc->flags);
|
||||
return !!(pc->flags & PCG_USED);
|
||||
}
|
||||
|
||||
static inline void unlock_page_cgroup(struct page_cgroup *pc)
|
||||
{
|
||||
bit_spin_unlock(PCG_LOCK, &pc->flags);
|
||||
}
|
||||
|
||||
#else /* CONFIG_MEMCG */
|
||||
#else /* !CONFIG_MEMCG */
|
||||
struct page_cgroup;
|
||||
|
||||
static inline void __meminit pgdat_page_cgroup_init(struct pglist_data *pgdat)
|
||||
static inline void pgdat_page_cgroup_init(struct pglist_data *pgdat)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -98,10 +61,9 @@ static inline void page_cgroup_init(void)
|
|||
{
|
||||
}
|
||||
|
||||
static inline void __init page_cgroup_init_flatmem(void)
|
||||
static inline void page_cgroup_init_flatmem(void)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* CONFIG_MEMCG */
|
||||
|
||||
#include <linux/swap.h>
|
||||
|
|
@ -140,6 +102,4 @@ static inline void swap_cgroup_swapoff(int type)
|
|||
|
||||
#endif /* CONFIG_MEMCG_SWAP */
|
||||
|
||||
#endif /* !__GENERATING_BOUNDS_H */
|
||||
|
||||
#endif /* __LINUX_PAGE_CGROUP_H */
|
||||
|
|
|
|||
|
|
@ -384,11 +384,16 @@ void rio_dev_put(struct rio_dev *);
|
|||
|
||||
#ifdef CONFIG_RAPIDIO_DMA_ENGINE
|
||||
extern struct dma_chan *rio_request_dma(struct rio_dev *rdev);
|
||||
extern struct dma_chan *rio_request_mport_dma(struct rio_mport *mport);
|
||||
extern void rio_release_dma(struct dma_chan *dchan);
|
||||
extern struct dma_async_tx_descriptor *rio_dma_prep_slave_sg(
|
||||
struct rio_dev *rdev, struct dma_chan *dchan,
|
||||
struct rio_dma_data *data,
|
||||
enum dma_transfer_direction direction, unsigned long flags);
|
||||
extern struct dma_async_tx_descriptor *rio_dma_prep_xfer(
|
||||
struct dma_chan *dchan, u16 destid,
|
||||
struct rio_dma_data *data,
|
||||
enum dma_transfer_direction direction, unsigned long flags);
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -136,7 +136,7 @@ static inline void sg_set_buf(struct scatterlist *sg, const void *buf,
|
|||
static inline void sg_chain(struct scatterlist *prv, unsigned int prv_nents,
|
||||
struct scatterlist *sgl)
|
||||
{
|
||||
#ifndef ARCH_HAS_SG_CHAIN
|
||||
#ifndef CONFIG_ARCH_HAS_SG_CHAIN
|
||||
BUG();
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ struct sched_param {
|
|||
|
||||
#include <linux/smp.h>
|
||||
#include <linux/sem.h>
|
||||
#include <linux/shm.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/completion.h>
|
||||
|
|
@ -1385,6 +1386,7 @@ struct task_struct {
|
|||
#ifdef CONFIG_SYSVIPC
|
||||
/* ipc stuff */
|
||||
struct sysv_sem sysvsem;
|
||||
struct sysv_shm sysvshm;
|
||||
#endif
|
||||
#ifdef CONFIG_DETECT_HUNG_TASK
|
||||
/* hung task detection */
|
||||
|
|
@ -1628,12 +1630,6 @@ struct task_struct {
|
|||
unsigned long trace_recursion;
|
||||
#endif /* CONFIG_TRACING */
|
||||
#ifdef CONFIG_MEMCG /* memcg uses this to do batch job */
|
||||
struct memcg_batch_info {
|
||||
int do_batch; /* incremented when batch uncharge started */
|
||||
struct mem_cgroup *memcg; /* target memcg of uncharge */
|
||||
unsigned long nr_pages; /* uncharged usage */
|
||||
unsigned long memsw_nr_pages; /* uncharged mem+swap usage */
|
||||
} memcg_batch;
|
||||
unsigned int memcg_kmem_skip_account;
|
||||
struct memcg_oom_info {
|
||||
struct mem_cgroup *memcg;
|
||||
|
|
@ -2967,15 +2963,10 @@ static inline void inc_syscw(struct task_struct *tsk)
|
|||
|
||||
#ifdef CONFIG_MEMCG
|
||||
extern void mm_update_next_owner(struct mm_struct *mm);
|
||||
extern void mm_init_owner(struct mm_struct *mm, struct task_struct *p);
|
||||
#else
|
||||
static inline void mm_update_next_owner(struct mm_struct *mm)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void mm_init_owner(struct mm_struct *mm, struct task_struct *p)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_MEMCG */
|
||||
|
||||
static inline unsigned long task_rlimit(const struct task_struct *tsk,
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
#ifndef _LINUX_SHM_H_
|
||||
#define _LINUX_SHM_H_
|
||||
|
||||
#include <linux/list.h>
|
||||
#include <asm/page.h>
|
||||
#include <uapi/linux/shm.h>
|
||||
#include <asm/shmparam.h>
|
||||
|
|
@ -20,6 +21,7 @@ struct shmid_kernel /* private to the kernel */
|
|||
|
||||
/* The task created the shm object. NULL if the task is dead. */
|
||||
struct task_struct *shm_creator;
|
||||
struct list_head shm_clist; /* list by creator */
|
||||
};
|
||||
|
||||
/* shm_mode upper byte flags */
|
||||
|
|
@ -44,11 +46,20 @@ struct shmid_kernel /* private to the kernel */
|
|||
#define SHM_HUGE_1GB (30 << SHM_HUGE_SHIFT)
|
||||
|
||||
#ifdef CONFIG_SYSVIPC
|
||||
struct sysv_shm {
|
||||
struct list_head shm_clist;
|
||||
};
|
||||
|
||||
long do_shmat(int shmid, char __user *shmaddr, int shmflg, unsigned long *addr,
|
||||
unsigned long shmlba);
|
||||
extern int is_file_shm_hugepages(struct file *file);
|
||||
extern void exit_shm(struct task_struct *task);
|
||||
int is_file_shm_hugepages(struct file *file);
|
||||
void exit_shm(struct task_struct *task);
|
||||
#define shm_init_task(task) INIT_LIST_HEAD(&(task)->sysvshm.shm_clist)
|
||||
#else
|
||||
struct sysv_shm {
|
||||
/* empty */
|
||||
};
|
||||
|
||||
static inline long do_shmat(int shmid, char __user *shmaddr,
|
||||
int shmflg, unsigned long *addr,
|
||||
unsigned long shmlba)
|
||||
|
|
@ -62,6 +73,9 @@ static inline int is_file_shm_hugepages(struct file *file)
|
|||
static inline void exit_shm(struct task_struct *task)
|
||||
{
|
||||
}
|
||||
static inline void shm_init_task(struct task_struct *task)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _LINUX_SHM_H_ */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
#ifndef __SHMEM_FS_H
|
||||
#define __SHMEM_FS_H
|
||||
|
||||
#include <linux/file.h>
|
||||
#include <linux/swap.h>
|
||||
#include <linux/mempolicy.h>
|
||||
#include <linux/pagemap.h>
|
||||
|
|
@ -11,6 +12,7 @@
|
|||
|
||||
struct shmem_inode_info {
|
||||
spinlock_t lock;
|
||||
unsigned int seals; /* shmem seals */
|
||||
unsigned long flags;
|
||||
unsigned long alloced; /* data pages alloced to file */
|
||||
union {
|
||||
|
|
@ -65,4 +67,19 @@ static inline struct page *shmem_read_mapping_page(
|
|||
mapping_gfp_mask(mapping));
|
||||
}
|
||||
|
||||
#ifdef CONFIG_TMPFS
|
||||
|
||||
extern int shmem_add_seals(struct file *file, unsigned int seals);
|
||||
extern int shmem_get_seals(struct file *file);
|
||||
extern long shmem_fcntl(struct file *file, unsigned int cmd, unsigned long arg);
|
||||
|
||||
#else
|
||||
|
||||
static inline long shmem_fcntl(struct file *f, unsigned int c, unsigned long a)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -320,6 +320,9 @@ extern void swap_setup(void);
|
|||
|
||||
extern void add_page_to_unevictable_list(struct page *page);
|
||||
|
||||
extern void lru_cache_add_active_or_unevictable(struct page *page,
|
||||
struct vm_area_struct *vma);
|
||||
|
||||
/* linux/mm/vmscan.c */
|
||||
extern unsigned long try_to_free_pages(struct zonelist *zonelist, int order,
|
||||
gfp_t gfp_mask, nodemask_t *mask);
|
||||
|
|
@ -378,9 +381,13 @@ static inline int mem_cgroup_swappiness(struct mem_cgroup *mem)
|
|||
}
|
||||
#endif
|
||||
#ifdef CONFIG_MEMCG_SWAP
|
||||
extern void mem_cgroup_uncharge_swap(swp_entry_t ent);
|
||||
extern void mem_cgroup_swapout(struct page *page, swp_entry_t entry);
|
||||
extern void mem_cgroup_uncharge_swap(swp_entry_t entry);
|
||||
#else
|
||||
static inline void mem_cgroup_uncharge_swap(swp_entry_t ent)
|
||||
static inline void mem_cgroup_swapout(struct page *page, swp_entry_t entry)
|
||||
{
|
||||
}
|
||||
static inline void mem_cgroup_uncharge_swap(swp_entry_t entry)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
|
@ -440,7 +447,7 @@ extern void swap_shmem_alloc(swp_entry_t);
|
|||
extern int swap_duplicate(swp_entry_t);
|
||||
extern int swapcache_prepare(swp_entry_t);
|
||||
extern void swap_free(swp_entry_t);
|
||||
extern void swapcache_free(swp_entry_t, struct page *page);
|
||||
extern void swapcache_free(swp_entry_t);
|
||||
extern int free_swap_and_cache(swp_entry_t);
|
||||
extern int swap_type_of(dev_t, sector_t, struct block_device **);
|
||||
extern unsigned int count_swap_pages(int, int);
|
||||
|
|
@ -504,7 +511,7 @@ static inline void swap_free(swp_entry_t swp)
|
|||
{
|
||||
}
|
||||
|
||||
static inline void swapcache_free(swp_entry_t swp, struct page *page)
|
||||
static inline void swapcache_free(swp_entry_t swp)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -317,6 +317,10 @@ asmlinkage long sys_restart_syscall(void);
|
|||
asmlinkage long sys_kexec_load(unsigned long entry, unsigned long nr_segments,
|
||||
struct kexec_segment __user *segments,
|
||||
unsigned long flags);
|
||||
asmlinkage long sys_kexec_file_load(int kernel_fd, int initrd_fd,
|
||||
unsigned long cmdline_len,
|
||||
const char __user *cmdline_ptr,
|
||||
unsigned long flags);
|
||||
|
||||
asmlinkage long sys_exit(int error_code);
|
||||
asmlinkage long sys_exit_group(int error_code);
|
||||
|
|
@ -802,6 +806,7 @@ asmlinkage long sys_timerfd_settime(int ufd, int flags,
|
|||
asmlinkage long sys_timerfd_gettime(int ufd, struct itimerspec __user *otmr);
|
||||
asmlinkage long sys_eventfd(unsigned int count);
|
||||
asmlinkage long sys_eventfd2(unsigned int count, int flags);
|
||||
asmlinkage long sys_memfd_create(const char __user *uname_ptr, unsigned int flags);
|
||||
asmlinkage long sys_fallocate(int fd, int mode, loff_t offset, loff_t len);
|
||||
asmlinkage long sys_old_readdir(unsigned int, struct old_linux_dirent __user *, unsigned int);
|
||||
asmlinkage long sys_pselect6(int, fd_set __user *, fd_set __user *,
|
||||
|
|
|
|||
|
|
@ -34,8 +34,6 @@ struct ctl_table_root;
|
|||
struct ctl_table_header;
|
||||
struct ctl_dir;
|
||||
|
||||
typedef struct ctl_table ctl_table;
|
||||
|
||||
typedef int proc_handler (struct ctl_table *ctl, int write,
|
||||
void __user *buffer, size_t *lenp, loff_t *ppos);
|
||||
|
||||
|
|
|
|||
|
|
@ -57,9 +57,9 @@ static inline void put_user_ns(struct user_namespace *ns)
|
|||
}
|
||||
|
||||
struct seq_operations;
|
||||
extern struct seq_operations proc_uid_seq_operations;
|
||||
extern struct seq_operations proc_gid_seq_operations;
|
||||
extern struct seq_operations proc_projid_seq_operations;
|
||||
extern const struct seq_operations proc_uid_seq_operations;
|
||||
extern const struct seq_operations proc_gid_seq_operations;
|
||||
extern const struct seq_operations proc_projid_seq_operations;
|
||||
extern ssize_t proc_uid_map_write(struct file *, const char __user *, size_t, loff_t *);
|
||||
extern ssize_t proc_gid_map_write(struct file *, const char __user *, size_t, loff_t *);
|
||||
extern ssize_t proc_projid_map_write(struct file *, const char __user *, size_t, loff_t *);
|
||||
|
|
|
|||
|
|
@ -83,11 +83,11 @@ struct internal_state;
|
|||
|
||||
typedef struct z_stream_s {
|
||||
const Byte *next_in; /* next input byte */
|
||||
uInt avail_in; /* number of bytes available at next_in */
|
||||
uLong avail_in; /* number of bytes available at next_in */
|
||||
uLong total_in; /* total nb of input bytes read so far */
|
||||
|
||||
Byte *next_out; /* next output byte should be put there */
|
||||
uInt avail_out; /* remaining free space at next_out */
|
||||
uLong avail_out; /* remaining free space at next_out */
|
||||
uLong total_out; /* total nb of bytes output so far */
|
||||
|
||||
char *msg; /* last error message, NULL if no error */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue