Merge branch 'akpm' (patches from Andrew Morton)
Merge second patch-bomb from Andrew Morton:
- a few hotfixes
- drivers/dma updates
- MAINTAINERS updates
- Quite a lot of lib/ updates
- checkpatch updates
- binfmt updates
- autofs4
- drivers/rtc/
- various small tweaks to less used filesystems
- ipc/ updates
- kernel/watchdog.c changes
* emailed patches from Andrew Morton <akpm@linux-foundation.org>: (135 commits)
mm: softdirty: enable write notifications on VMAs after VM_SOFTDIRTY cleared
kernel/param: consolidate __{start,stop}___param[] in <linux/moduleparam.h>
ia64: remove duplicate declarations of __per_cpu_start[] and __per_cpu_end[]
frv: remove unused declarations of __start___ex_table and __stop___ex_table
kvm: ensure hard lockup detection is disabled by default
kernel/watchdog.c: control hard lockup detection default
staging: rtl8192u: use %*pEn to escape buffer
staging: rtl8192e: use %*pEn to escape buffer
staging: wlan-ng: use %*pEhp to print SN
lib80211: remove unused print_ssid()
wireless: hostap: proc: print properly escaped SSID
wireless: ipw2x00: print SSID via %*pE
wireless: libertas: print esaped string via %*pE
lib/vsprintf: add %*pE[achnops] format specifier
lib / string_helpers: introduce string_escape_mem()
lib / string_helpers: refactoring the test suite
lib / string_helpers: move documentation to c-file
include/linux: remove strict_strto* definitions
arch/x86/mm/numa.c: fix boot failure when all nodes are hotpluggable
fs: check bh blocknr earlier when searching lru
...
This commit is contained in:
commit
dfe2c6dcc8
150 changed files with 5592 additions and 1660 deletions
|
|
@ -22,6 +22,9 @@ extern int __init cma_declare_contiguous(phys_addr_t size,
|
|||
phys_addr_t base, phys_addr_t limit,
|
||||
phys_addr_t alignment, unsigned int order_per_bit,
|
||||
bool fixed, struct cma **res_cma);
|
||||
extern int cma_init_reserved_mem(phys_addr_t size,
|
||||
phys_addr_t base, int order_per_bit,
|
||||
struct cma **res_cma);
|
||||
extern struct page *cma_alloc(struct cma *cma, int count, unsigned int align);
|
||||
extern bool cma_release(struct cma *cma, struct page *pages, int count);
|
||||
#endif
|
||||
|
|
|
|||
66
include/linux/compiler-gcc5.h
Normal file
66
include/linux/compiler-gcc5.h
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
#ifndef __LINUX_COMPILER_H
|
||||
#error "Please don't include <linux/compiler-gcc5.h> directly, include <linux/compiler.h> instead."
|
||||
#endif
|
||||
|
||||
#define __used __attribute__((__used__))
|
||||
#define __must_check __attribute__((warn_unused_result))
|
||||
#define __compiler_offsetof(a, b) __builtin_offsetof(a, b)
|
||||
|
||||
/* Mark functions as cold. gcc will assume any path leading to a call
|
||||
to them will be unlikely. This means a lot of manual unlikely()s
|
||||
are unnecessary now for any paths leading to the usual suspects
|
||||
like BUG(), printk(), panic() etc. [but let's keep them for now for
|
||||
older compilers]
|
||||
|
||||
Early snapshots of gcc 4.3 don't support this and we can't detect this
|
||||
in the preprocessor, but we can live with this because they're unreleased.
|
||||
Maketime probing would be overkill here.
|
||||
|
||||
gcc also has a __attribute__((__hot__)) to move hot functions into
|
||||
a special section, but I don't see any sense in this right now in
|
||||
the kernel context */
|
||||
#define __cold __attribute__((__cold__))
|
||||
|
||||
#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
|
||||
|
||||
#ifndef __CHECKER__
|
||||
# define __compiletime_warning(message) __attribute__((warning(message)))
|
||||
# define __compiletime_error(message) __attribute__((error(message)))
|
||||
#endif /* __CHECKER__ */
|
||||
|
||||
/*
|
||||
* Mark a position in code as unreachable. This can be used to
|
||||
* suppress control flow warnings after asm blocks that transfer
|
||||
* control elsewhere.
|
||||
*
|
||||
* Early snapshots of gcc 4.5 don't support this and we can't detect
|
||||
* this in the preprocessor, but we can live with this because they're
|
||||
* unreleased. Really, we need to have autoconf for the kernel.
|
||||
*/
|
||||
#define unreachable() __builtin_unreachable()
|
||||
|
||||
/* Mark a function definition as prohibited from being cloned. */
|
||||
#define __noclone __attribute__((__noclone__))
|
||||
|
||||
/*
|
||||
* Tell the optimizer that something else uses this function or variable.
|
||||
*/
|
||||
#define __visible __attribute__((externally_visible))
|
||||
|
||||
/*
|
||||
* GCC 'asm goto' miscompiles certain code sequences:
|
||||
*
|
||||
* http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670
|
||||
*
|
||||
* Work it around via a compiler barrier quirk suggested by Jakub Jelinek.
|
||||
* Fixed in GCC 4.8.2 and later versions.
|
||||
*
|
||||
* (asm goto is automatically volatile - the naming reflects this.)
|
||||
*/
|
||||
#define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0)
|
||||
|
||||
#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP
|
||||
#define __HAVE_BUILTIN_BSWAP32__
|
||||
#define __HAVE_BUILTIN_BSWAP64__
|
||||
#define __HAVE_BUILTIN_BSWAP16__
|
||||
#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */
|
||||
|
|
@ -376,10 +376,6 @@ extern unsigned long simple_strtoul(const char *,char **,unsigned int);
|
|||
extern long simple_strtol(const char *,char **,unsigned int);
|
||||
extern unsigned long long simple_strtoull(const char *,char **,unsigned int);
|
||||
extern long long simple_strtoll(const char *,char **,unsigned int);
|
||||
#define strict_strtoul kstrtoul
|
||||
#define strict_strtol kstrtol
|
||||
#define strict_strtoull kstrtoull
|
||||
#define strict_strtoll kstrtoll
|
||||
|
||||
extern int num_to_str(char *buf, int size, unsigned long long num);
|
||||
|
||||
|
|
|
|||
|
|
@ -178,6 +178,7 @@ struct kexec_buf {
|
|||
struct kimage *image;
|
||||
char *buffer;
|
||||
unsigned long bufsz;
|
||||
unsigned long mem;
|
||||
unsigned long memsz;
|
||||
unsigned long buf_align;
|
||||
unsigned long buf_min;
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
#include <linux/stddef.h>
|
||||
#include <linux/poison.h>
|
||||
#include <linux/const.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
/*
|
||||
* Simple doubly linked list implementation.
|
||||
|
|
|
|||
|
|
@ -347,6 +347,7 @@ static inline int put_page_unless_one(struct page *page)
|
|||
}
|
||||
|
||||
extern int page_is_ram(unsigned long pfn);
|
||||
extern int region_is_ram(resource_size_t phys_addr, unsigned long size);
|
||||
|
||||
/* Support for virtually mapped pages */
|
||||
struct page *vmalloc_to_page(const void *addr);
|
||||
|
|
@ -1973,11 +1974,16 @@ static inline struct vm_area_struct *find_exact_vma(struct mm_struct *mm,
|
|||
|
||||
#ifdef CONFIG_MMU
|
||||
pgprot_t vm_get_page_prot(unsigned long vm_flags);
|
||||
void vma_set_page_prot(struct vm_area_struct *vma);
|
||||
#else
|
||||
static inline pgprot_t vm_get_page_prot(unsigned long vm_flags)
|
||||
{
|
||||
return __pgprot(0);
|
||||
}
|
||||
static inline void vma_set_page_prot(struct vm_area_struct *vma)
|
||||
{
|
||||
vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NUMA_BALANCING
|
||||
|
|
|
|||
|
|
@ -78,6 +78,8 @@ struct kernel_param {
|
|||
};
|
||||
};
|
||||
|
||||
extern const struct kernel_param __start___param[], __stop___param[];
|
||||
|
||||
/* Special one for strings we want to copy into */
|
||||
struct kparam_string {
|
||||
unsigned int maxlen;
|
||||
|
|
|
|||
|
|
@ -24,6 +24,19 @@ static inline void touch_nmi_watchdog(void)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_HARDLOCKUP_DETECTOR)
|
||||
extern void watchdog_enable_hardlockup_detector(bool val);
|
||||
extern bool watchdog_hardlockup_detector_is_enabled(void);
|
||||
#else
|
||||
static inline void watchdog_enable_hardlockup_detector(bool val)
|
||||
{
|
||||
}
|
||||
static inline bool watchdog_hardlockup_detector_is_enabled(void)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Create trigger_all_cpu_backtrace() out of the arch-provided
|
||||
* base function. Return whether such support was available,
|
||||
|
|
|
|||
|
|
@ -1,58 +0,0 @@
|
|||
#ifndef _LINUX_PRIO_HEAP_H
|
||||
#define _LINUX_PRIO_HEAP_H
|
||||
|
||||
/*
|
||||
* Simple insertion-only static-sized priority heap containing
|
||||
* pointers, based on CLR, chapter 7
|
||||
*/
|
||||
|
||||
#include <linux/gfp.h>
|
||||
|
||||
/**
|
||||
* struct ptr_heap - simple static-sized priority heap
|
||||
* @ptrs - pointer to data area
|
||||
* @max - max number of elements that can be stored in @ptrs
|
||||
* @size - current number of valid elements in @ptrs (in the range 0..@size-1
|
||||
* @gt: comparison operator, which should implement "greater than"
|
||||
*/
|
||||
struct ptr_heap {
|
||||
void **ptrs;
|
||||
int max;
|
||||
int size;
|
||||
int (*gt)(void *, void *);
|
||||
};
|
||||
|
||||
/**
|
||||
* heap_init - initialize an empty heap with a given memory size
|
||||
* @heap: the heap structure to be initialized
|
||||
* @size: amount of memory to use in bytes
|
||||
* @gfp_mask: mask to pass to kmalloc()
|
||||
* @gt: comparison operator, which should implement "greater than"
|
||||
*/
|
||||
extern int heap_init(struct ptr_heap *heap, size_t size, gfp_t gfp_mask,
|
||||
int (*gt)(void *, void *));
|
||||
|
||||
/**
|
||||
* heap_free - release a heap's storage
|
||||
* @heap: the heap structure whose data should be released
|
||||
*/
|
||||
void heap_free(struct ptr_heap *heap);
|
||||
|
||||
/**
|
||||
* heap_insert - insert a value into the heap and return any overflowed value
|
||||
* @heap: the heap to be operated on
|
||||
* @p: the pointer to be inserted
|
||||
*
|
||||
* Attempts to insert the given value into the priority heap. If the
|
||||
* heap is full prior to the insertion, then the resulting heap will
|
||||
* consist of the smallest @max elements of the original heap and the
|
||||
* new element; the greatest element will be removed from the heap and
|
||||
* returned. Note that the returned element will be the new element
|
||||
* (i.e. no change to the heap) if the new element is greater than all
|
||||
* elements currently in the heap.
|
||||
*/
|
||||
extern void *heap_insert(struct ptr_heap *heap, void *p);
|
||||
|
||||
|
||||
|
||||
#endif /* _LINUX_PRIO_HEAP_H */
|
||||
|
|
@ -43,6 +43,16 @@ struct rb_augment_callbacks {
|
|||
|
||||
extern void __rb_insert_augmented(struct rb_node *node, struct rb_root *root,
|
||||
void (*augment_rotate)(struct rb_node *old, struct rb_node *new));
|
||||
/*
|
||||
* Fixup the rbtree and update the augmented information when rebalancing.
|
||||
*
|
||||
* On insertion, the user must update the augmented information on the path
|
||||
* leading to the inserted node, then call rb_link_node() as usual and
|
||||
* rb_augment_inserted() instead of the usual rb_insert_color() call.
|
||||
* If rb_augment_inserted() rebalances the rbtree, it will callback into
|
||||
* a user provided function to update the augmented information on the
|
||||
* affected subtrees.
|
||||
*/
|
||||
static inline void
|
||||
rb_insert_augmented(struct rb_node *node, struct rb_root *root,
|
||||
const struct rb_augment_callbacks *augment)
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
#define _LINUX_SIGNAL_H
|
||||
|
||||
#include <linux/list.h>
|
||||
#include <linux/bug.h>
|
||||
#include <uapi/linux/signal.h>
|
||||
|
||||
struct task_struct;
|
||||
|
|
@ -67,7 +68,6 @@ static inline int sigismember(sigset_t *set, int _sig)
|
|||
|
||||
static inline int sigisemptyset(sigset_t *set)
|
||||
{
|
||||
extern void _NSIG_WORDS_is_unsupported_size(void);
|
||||
switch (_NSIG_WORDS) {
|
||||
case 4:
|
||||
return (set->sig[3] | set->sig[2] |
|
||||
|
|
@ -77,7 +77,7 @@ static inline int sigisemptyset(sigset_t *set)
|
|||
case 1:
|
||||
return set->sig[0] == 0;
|
||||
default:
|
||||
_NSIG_WORDS_is_unsupported_size();
|
||||
BUILD_BUG();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
@ -90,24 +90,23 @@ static inline int sigisemptyset(sigset_t *set)
|
|||
#define _SIG_SET_BINOP(name, op) \
|
||||
static inline void name(sigset_t *r, const sigset_t *a, const sigset_t *b) \
|
||||
{ \
|
||||
extern void _NSIG_WORDS_is_unsupported_size(void); \
|
||||
unsigned long a0, a1, a2, a3, b0, b1, b2, b3; \
|
||||
\
|
||||
switch (_NSIG_WORDS) { \
|
||||
case 4: \
|
||||
case 4: \
|
||||
a3 = a->sig[3]; a2 = a->sig[2]; \
|
||||
b3 = b->sig[3]; b2 = b->sig[2]; \
|
||||
r->sig[3] = op(a3, b3); \
|
||||
r->sig[2] = op(a2, b2); \
|
||||
case 2: \
|
||||
case 2: \
|
||||
a1 = a->sig[1]; b1 = b->sig[1]; \
|
||||
r->sig[1] = op(a1, b1); \
|
||||
case 1: \
|
||||
case 1: \
|
||||
a0 = a->sig[0]; b0 = b->sig[0]; \
|
||||
r->sig[0] = op(a0, b0); \
|
||||
break; \
|
||||
default: \
|
||||
_NSIG_WORDS_is_unsupported_size(); \
|
||||
default: \
|
||||
BUILD_BUG(); \
|
||||
} \
|
||||
}
|
||||
|
||||
|
|
@ -128,16 +127,14 @@ _SIG_SET_BINOP(sigandnsets, _sig_andn)
|
|||
#define _SIG_SET_OP(name, op) \
|
||||
static inline void name(sigset_t *set) \
|
||||
{ \
|
||||
extern void _NSIG_WORDS_is_unsupported_size(void); \
|
||||
\
|
||||
switch (_NSIG_WORDS) { \
|
||||
case 4: set->sig[3] = op(set->sig[3]); \
|
||||
set->sig[2] = op(set->sig[2]); \
|
||||
case 2: set->sig[1] = op(set->sig[1]); \
|
||||
case 1: set->sig[0] = op(set->sig[0]); \
|
||||
case 4: set->sig[3] = op(set->sig[3]); \
|
||||
set->sig[2] = op(set->sig[2]); \
|
||||
case 2: set->sig[1] = op(set->sig[1]); \
|
||||
case 1: set->sig[0] = op(set->sig[0]); \
|
||||
break; \
|
||||
default: \
|
||||
_NSIG_WORDS_is_unsupported_size(); \
|
||||
default: \
|
||||
BUILD_BUG(); \
|
||||
} \
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ extern int strcmp(const char *,const char *);
|
|||
extern int strncmp(const char *,const char *,__kernel_size_t);
|
||||
#endif
|
||||
#ifndef __HAVE_ARCH_STRNICMP
|
||||
extern int strnicmp(const char *, const char *, __kernel_size_t);
|
||||
#define strnicmp strncasecmp
|
||||
#endif
|
||||
#ifndef __HAVE_ARCH_STRCASECMP
|
||||
extern int strcasecmp(const char *s1, const char *s2);
|
||||
|
|
|
|||
|
|
@ -20,40 +20,6 @@ int string_get_size(u64 size, enum string_size_units units,
|
|||
#define UNESCAPE_ANY \
|
||||
(UNESCAPE_SPACE | UNESCAPE_OCTAL | UNESCAPE_HEX | UNESCAPE_SPECIAL)
|
||||
|
||||
/**
|
||||
* string_unescape - unquote characters in the given string
|
||||
* @src: source buffer (escaped)
|
||||
* @dst: destination buffer (unescaped)
|
||||
* @size: size of the destination buffer (0 to unlimit)
|
||||
* @flags: combination of the flags (bitwise OR):
|
||||
* %UNESCAPE_SPACE:
|
||||
* '\f' - form feed
|
||||
* '\n' - new line
|
||||
* '\r' - carriage return
|
||||
* '\t' - horizontal tab
|
||||
* '\v' - vertical tab
|
||||
* %UNESCAPE_OCTAL:
|
||||
* '\NNN' - byte with octal value NNN (1 to 3 digits)
|
||||
* %UNESCAPE_HEX:
|
||||
* '\xHH' - byte with hexadecimal value HH (1 to 2 digits)
|
||||
* %UNESCAPE_SPECIAL:
|
||||
* '\"' - double quote
|
||||
* '\\' - backslash
|
||||
* '\a' - alert (BEL)
|
||||
* '\e' - escape
|
||||
* %UNESCAPE_ANY:
|
||||
* all previous together
|
||||
*
|
||||
* Returns amount of characters processed to the destination buffer excluding
|
||||
* trailing '\0'.
|
||||
*
|
||||
* Because the size of the output will be the same as or less than the size of
|
||||
* the input, the transformation may be performed in place.
|
||||
*
|
||||
* Caller must provide valid source and destination pointers. Be aware that
|
||||
* destination buffer will always be NULL-terminated. Source string must be
|
||||
* NULL-terminated as well.
|
||||
*/
|
||||
int string_unescape(char *src, char *dst, size_t size, unsigned int flags);
|
||||
|
||||
static inline int string_unescape_inplace(char *buf, unsigned int flags)
|
||||
|
|
@ -71,4 +37,35 @@ static inline int string_unescape_any_inplace(char *buf)
|
|||
return string_unescape_any(buf, buf, 0);
|
||||
}
|
||||
|
||||
#define ESCAPE_SPACE 0x01
|
||||
#define ESCAPE_SPECIAL 0x02
|
||||
#define ESCAPE_NULL 0x04
|
||||
#define ESCAPE_OCTAL 0x08
|
||||
#define ESCAPE_ANY \
|
||||
(ESCAPE_SPACE | ESCAPE_OCTAL | ESCAPE_SPECIAL | ESCAPE_NULL)
|
||||
#define ESCAPE_NP 0x10
|
||||
#define ESCAPE_ANY_NP (ESCAPE_ANY | ESCAPE_NP)
|
||||
#define ESCAPE_HEX 0x20
|
||||
|
||||
int string_escape_mem(const char *src, size_t isz, char **dst, size_t osz,
|
||||
unsigned int flags, const char *esc);
|
||||
|
||||
static inline int string_escape_mem_any_np(const char *src, size_t isz,
|
||||
char **dst, size_t osz, const char *esc)
|
||||
{
|
||||
return string_escape_mem(src, isz, dst, osz, ESCAPE_ANY_NP, esc);
|
||||
}
|
||||
|
||||
static inline int string_escape_str(const char *src, char **dst, size_t sz,
|
||||
unsigned int flags, const char *esc)
|
||||
{
|
||||
return string_escape_mem(src, strlen(src), dst, sz, flags, esc);
|
||||
}
|
||||
|
||||
static inline int string_escape_str_any_np(const char *src, char **dst,
|
||||
size_t sz, const char *esc)
|
||||
{
|
||||
return string_escape_str(src, dst, sz, ESCAPE_ANY_NP, esc);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue