Commit a6598110 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'akpm' (patches from Andrew)

Merge more updates from Andrew Morton:

 - procfs updates

 - various misc bits

 - lib/ updates

 - epoll updates

 - autofs

 - fatfs

 - a few more MM bits

* emailed patches from Andrew Morton <akpm@linux-foundation.org>: (58 commits)
  mm/page_io.c: fix polled swap page in
  checkpatch: add Co-developed-by to signature tags
  docs: fix Co-Developed-by docs
  drivers/base/platform.c: kmemleak ignore a known leak
  fs: don't open code lru_to_page()
  fs/: remove caller signal_pending branch predictions
  mm/: remove caller signal_pending branch predictions
  arch/arc/mm/fault.c: remove caller signal_pending_branch predictions
  kernel/sched/: remove caller signal_pending branch predictions
  kernel/locking/mutex.c: remove caller signal_pending branch predictions
  mm: select HAVE_MOVE_PMD on x86 for faster mremap
  mm: speed up mremap by 20x on large regions
  mm: treewide: remove unused address argument from pte_alloc functions
  initramfs: cleanup incomplete rootfs
  scripts/gdb: fix lx-version string output
  kernel/kcov.c: mark write_comp_data() as notrace
  kernel/sysctl: add panic_print into sysctl
  panic: add options to print system info when panic happens
  bfs: extra sanity checking and static inode bitmap
  exec: separate MM_ANONPAGES and RLIMIT_STACK accounting
  ...
parents 3fed6ae4 b685a735
...@@ -3092,6 +3092,14 @@ ...@@ -3092,6 +3092,14 @@
timeout < 0: reboot immediately timeout < 0: reboot immediately
Format: <timeout> Format: <timeout>
panic_print= Bitmask for printing system info when panic happens.
User can chose combination of the following bits:
bit 0: print all tasks info
bit 1: print system memory info
bit 2: print timer info
bit 3: print locks info if CONFIG_LOCKDEP is on
bit 4: print ftrace buffer
panic_on_warn panic() instead of WARN(). Useful to cause kdump panic_on_warn panic() instead of WARN(). Useful to cause kdump
on a WARN(). on a WARN().
......
...@@ -443,6 +443,9 @@ In function prototypes, include parameter names with their data types. ...@@ -443,6 +443,9 @@ In function prototypes, include parameter names with their data types.
Although this is not required by the C language, it is preferred in Linux Although this is not required by the C language, it is preferred in Linux
because it is a simple way to add valuable information for the reader. because it is a simple way to add valuable information for the reader.
Do not use the `extern' keyword with function prototypes as this makes
lines longer and isn't strictly necessary.
7) Centralized exiting of functions 7) Centralized exiting of functions
----------------------------------- -----------------------------------
......
...@@ -510,7 +510,7 @@ tracking your trees, and to people trying to troubleshoot bugs in your ...@@ -510,7 +510,7 @@ tracking your trees, and to people trying to troubleshoot bugs in your
tree. tree.
12) When to use Acked-by:, Cc:, and Co-Developed-by: 12) When to use Acked-by:, Cc:, and Co-developed-by:
------------------------------------------------------- -------------------------------------------------------
The Signed-off-by: tag indicates that the signer was involved in the The Signed-off-by: tag indicates that the signer was involved in the
...@@ -543,7 +543,7 @@ person it names - but it should indicate that this person was copied on the ...@@ -543,7 +543,7 @@ person it names - but it should indicate that this person was copied on the
patch. This tag documents that potentially interested parties patch. This tag documents that potentially interested parties
have been included in the discussion. have been included in the discussion.
A Co-Developed-by: states that the patch was also created by another developer A Co-developed-by: states that the patch was also created by another developer
along with the original author. This is useful at times when multiple people along with the original author. This is useful at times when multiple people
work on a single patch. Note, this person also needs to have a Signed-off-by: work on a single patch. Note, this person also needs to have a Signed-off-by:
line in the patch as well. line in the patch as well.
......
...@@ -60,6 +60,7 @@ show up in /proc/sys/kernel: ...@@ -60,6 +60,7 @@ show up in /proc/sys/kernel:
- panic_on_stackoverflow - panic_on_stackoverflow
- panic_on_unrecovered_nmi - panic_on_unrecovered_nmi
- panic_on_warn - panic_on_warn
- panic_print
- panic_on_rcu_stall - panic_on_rcu_stall
- perf_cpu_time_max_percent - perf_cpu_time_max_percent
- perf_event_paranoid - perf_event_paranoid
...@@ -654,6 +655,22 @@ a kernel rebuild when attempting to kdump at the location of a WARN(). ...@@ -654,6 +655,22 @@ a kernel rebuild when attempting to kdump at the location of a WARN().
============================================================== ==============================================================
panic_print:
Bitmask for printing system info when panic happens. User can chose
combination of the following bits:
bit 0: print all tasks info
bit 1: print system memory info
bit 2: print timer info
bit 3: print locks info if CONFIG_LOCKDEP is on
bit 4: print ftrace buffer
So for example to print tasks and memory info on panic, user can:
echo 3 > /proc/sys/kernel/panic_print
==============================================================
panic_on_rcu_stall: panic_on_rcu_stall:
When set to 1, calls panic() after RCU stall detection messages. This When set to 1, calls panic() after RCU stall detection messages. This
......
...@@ -535,6 +535,11 @@ config HAVE_IRQ_TIME_ACCOUNTING ...@@ -535,6 +535,11 @@ config HAVE_IRQ_TIME_ACCOUNTING
Archs need to ensure they use a high enough resolution clock to Archs need to ensure they use a high enough resolution clock to
support irq time accounting and then call enable_sched_clock_irqtime(). support irq time accounting and then call enable_sched_clock_irqtime().
config HAVE_MOVE_PMD
bool
help
Archs that select this are able to move page tables at the PMD level.
config HAVE_ARCH_TRANSPARENT_HUGEPAGE config HAVE_ARCH_TRANSPARENT_HUGEPAGE
bool bool
......
...@@ -391,9 +391,9 @@ static inline unsigned long __fls(unsigned long x) ...@@ -391,9 +391,9 @@ static inline unsigned long __fls(unsigned long x)
return fls64(x) - 1; return fls64(x) - 1;
} }
static inline int fls(int x) static inline int fls(unsigned int x)
{ {
return fls64((unsigned int) x); return fls64(x);
} }
/* /*
......
...@@ -52,7 +52,7 @@ pmd_free(struct mm_struct *mm, pmd_t *pmd) ...@@ -52,7 +52,7 @@ pmd_free(struct mm_struct *mm, pmd_t *pmd)
} }
static inline pte_t * static inline pte_t *
pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address) pte_alloc_one_kernel(struct mm_struct *mm)
{ {
pte_t *pte = (pte_t *)__get_free_page(GFP_KERNEL|__GFP_ZERO); pte_t *pte = (pte_t *)__get_free_page(GFP_KERNEL|__GFP_ZERO);
return pte; return pte;
...@@ -65,9 +65,9 @@ pte_free_kernel(struct mm_struct *mm, pte_t *pte) ...@@ -65,9 +65,9 @@ pte_free_kernel(struct mm_struct *mm, pte_t *pte)
} }
static inline pgtable_t static inline pgtable_t
pte_alloc_one(struct mm_struct *mm, unsigned long address) pte_alloc_one(struct mm_struct *mm)
{ {
pte_t *pte = pte_alloc_one_kernel(mm, address); pte_t *pte = pte_alloc_one_kernel(mm);
struct page *page; struct page *page;
if (!pte) if (!pte)
......
...@@ -278,7 +278,7 @@ static inline __attribute__ ((const)) int clz(unsigned int x) ...@@ -278,7 +278,7 @@ static inline __attribute__ ((const)) int clz(unsigned int x)
return res; return res;
} }
static inline int constant_fls(int x) static inline int constant_fls(unsigned int x)
{ {
int r = 32; int r = 32;
...@@ -312,7 +312,7 @@ static inline int constant_fls(int x) ...@@ -312,7 +312,7 @@ static inline int constant_fls(int x)
* @result: [1-32] * @result: [1-32]
* fls(1) = 1, fls(0x80000000) = 32, fls(0) = 0 * fls(1) = 1, fls(0x80000000) = 32, fls(0) = 0
*/ */
static inline __attribute__ ((const)) int fls(unsigned long x) static inline __attribute__ ((const)) int fls(unsigned int x)
{ {
if (__builtin_constant_p(x)) if (__builtin_constant_p(x))
return constant_fls(x); return constant_fls(x);
......
...@@ -90,8 +90,7 @@ static inline int __get_order_pte(void) ...@@ -90,8 +90,7 @@ static inline int __get_order_pte(void)
return get_order(PTRS_PER_PTE * sizeof(pte_t)); return get_order(PTRS_PER_PTE * sizeof(pte_t));
} }
static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm)
unsigned long address)
{ {
pte_t *pte; pte_t *pte;
...@@ -102,7 +101,7 @@ static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, ...@@ -102,7 +101,7 @@ static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
} }
static inline pgtable_t static inline pgtable_t
pte_alloc_one(struct mm_struct *mm, unsigned long address) pte_alloc_one(struct mm_struct *mm)
{ {
pgtable_t pte_pg; pgtable_t pte_pg;
struct page *page; struct page *page;
......
...@@ -142,7 +142,7 @@ void do_page_fault(unsigned long address, struct pt_regs *regs) ...@@ -142,7 +142,7 @@ void do_page_fault(unsigned long address, struct pt_regs *regs)
fault = handle_mm_fault(vma, address, flags); fault = handle_mm_fault(vma, address, flags);
/* If Pagefault was interrupted by SIGKILL, exit page fault "early" */ /* If Pagefault was interrupted by SIGKILL, exit page fault "early" */
if (unlikely(fatal_signal_pending(current))) { if (fatal_signal_pending(current)) {
if ((fault & VM_FAULT_ERROR) && !(fault & VM_FAULT_RETRY)) if ((fault & VM_FAULT_ERROR) && !(fault & VM_FAULT_RETRY))
up_read(&mm->mmap_sem); up_read(&mm->mmap_sem);
if (user_mode(regs)) if (user_mode(regs))
......
...@@ -81,7 +81,7 @@ static inline void clean_pte_table(pte_t *pte) ...@@ -81,7 +81,7 @@ static inline void clean_pte_table(pte_t *pte)
* +------------+ * +------------+
*/ */
static inline pte_t * static inline pte_t *
pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr) pte_alloc_one_kernel(struct mm_struct *mm)
{ {
pte_t *pte; pte_t *pte;
...@@ -93,7 +93,7 @@ pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr) ...@@ -93,7 +93,7 @@ pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr)
} }
static inline pgtable_t static inline pgtable_t
pte_alloc_one(struct mm_struct *mm, unsigned long addr) pte_alloc_one(struct mm_struct *mm)
{ {
struct page *pte; struct page *pte;
......
...@@ -91,13 +91,13 @@ extern pgd_t *pgd_alloc(struct mm_struct *mm); ...@@ -91,13 +91,13 @@ extern pgd_t *pgd_alloc(struct mm_struct *mm);
extern void pgd_free(struct mm_struct *mm, pgd_t *pgdp); extern void pgd_free(struct mm_struct *mm, pgd_t *pgdp);
static inline pte_t * static inline pte_t *
pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr) pte_alloc_one_kernel(struct mm_struct *mm)
{ {
return (pte_t *)__get_free_page(PGALLOC_GFP); return (pte_t *)__get_free_page(PGALLOC_GFP);
} }
static inline pgtable_t static inline pgtable_t
pte_alloc_one(struct mm_struct *mm, unsigned long addr) pte_alloc_one(struct mm_struct *mm)
{ {
struct page *pte; struct page *pte;
......
...@@ -54,7 +54,7 @@ static inline unsigned long __ffs(unsigned long x) ...@@ -54,7 +54,7 @@ static inline unsigned long __ffs(unsigned long x)
* This is defined the same way as ffs. * This is defined the same way as ffs.
* Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32. * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
*/ */
static inline int fls(int x) static inline int fls(unsigned int x)
{ {
if (!x) if (!x)
return 0; return 0;
......
...@@ -40,7 +40,7 @@ static __always_inline unsigned long __ffs(unsigned long x) ...@@ -40,7 +40,7 @@ static __always_inline unsigned long __ffs(unsigned long x)
/* /*
* asm-generic/bitops/fls.h * asm-generic/bitops/fls.h
*/ */
static __always_inline int fls(int x) static __always_inline int fls(unsigned int x)
{ {
asm volatile( asm volatile(
"ff1 %0\n" "ff1 %0\n"
......
...@@ -211,7 +211,7 @@ static inline long ffz(int x) ...@@ -211,7 +211,7 @@ static inline long ffz(int x)
* This is defined the same way as ffs. * This is defined the same way as ffs.
* Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32. * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
*/ */
static inline int fls(int x) static inline int fls(unsigned int x)
{ {
int r; int r;
......
...@@ -59,8 +59,7 @@ static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) ...@@ -59,8 +59,7 @@ static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
free_page((unsigned long) pgd); free_page((unsigned long) pgd);
} }
static inline struct page *pte_alloc_one(struct mm_struct *mm, static inline struct page *pte_alloc_one(struct mm_struct *mm)
unsigned long address)
{ {
struct page *pte; struct page *pte;
...@@ -75,8 +74,7 @@ static inline struct page *pte_alloc_one(struct mm_struct *mm, ...@@ -75,8 +74,7 @@ static inline struct page *pte_alloc_one(struct mm_struct *mm,
} }
/* _kernel variant gets to use a different allocator */ /* _kernel variant gets to use a different allocator */
static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm)
unsigned long address)
{ {
gfp_t flags = GFP_KERNEL | __GFP_ZERO; gfp_t flags = GFP_KERNEL | __GFP_ZERO;
return (pte_t *) __get_free_page(flags); return (pte_t *) __get_free_page(flags);
......
...@@ -388,8 +388,7 @@ ia64_fls (unsigned long x) ...@@ -388,8 +388,7 @@ ia64_fls (unsigned long x)
* Find the last (most significant) bit set. Returns 0 for x==0 and * Find the last (most significant) bit set. Returns 0 for x==0 and
* bits are numbered from 1..32 (e.g., fls(9) == 4). * bits are numbered from 1..32 (e.g., fls(9) == 4).
*/ */
static inline int static inline int fls(unsigned int t)
fls (int t)
{ {
unsigned long x = t & 0xffffffffu; unsigned long x = t & 0xffffffffu;
......
...@@ -83,7 +83,7 @@ pmd_populate_kernel(struct mm_struct *mm, pmd_t * pmd_entry, pte_t * pte) ...@@ -83,7 +83,7 @@ pmd_populate_kernel(struct mm_struct *mm, pmd_t * pmd_entry, pte_t * pte)
pmd_val(*pmd_entry) = __pa(pte); pmd_val(*pmd_entry) = __pa(pte);
} }
static inline pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long addr) static inline pgtable_t pte_alloc_one(struct mm_struct *mm)
{ {
struct page *page; struct page *page;
void *pg; void *pg;
...@@ -99,8 +99,7 @@ static inline pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long addr) ...@@ -99,8 +99,7 @@ static inline pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long addr)
return page; return page;
} }
static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm)
unsigned long addr)
{ {
return quicklist_alloc(0, GFP_KERNEL, NULL); return quicklist_alloc(0, GFP_KERNEL, NULL);
} }
......
...@@ -502,7 +502,7 @@ static inline unsigned long __ffs(unsigned long x) ...@@ -502,7 +502,7 @@ static inline unsigned long __ffs(unsigned long x)
/* /*
* fls: find last bit set. * fls: find last bit set.
*/ */
static inline int fls(int x) static inline int fls(unsigned int x)
{ {
int cnt; int cnt;
......
...@@ -12,8 +12,7 @@ extern inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) ...@@ -12,8 +12,7 @@ extern inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
extern const char bad_pmd_string[]; extern const char bad_pmd_string[];
extern inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, extern inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm)
unsigned long address)
{ {
unsigned long page = __get_free_page(GFP_DMA); unsigned long page = __get_free_page(GFP_DMA);
...@@ -32,8 +31,6 @@ extern inline pmd_t *pmd_alloc_kernel(pgd_t *pgd, unsigned long address) ...@@ -32,8 +31,6 @@ extern inline pmd_t *pmd_alloc_kernel(pgd_t *pgd, unsigned long address)
#define pmd_alloc_one_fast(mm, address) ({ BUG(); ((pmd_t *)1); }) #define pmd_alloc_one_fast(mm, address) ({ BUG(); ((pmd_t *)1); })
#define pmd_alloc_one(mm, address) ({ BUG(); ((pmd_t *)2); }) #define pmd_alloc_one(mm, address) ({ BUG(); ((pmd_t *)2); })
#define pte_alloc_one_fast(mm, addr) pte_alloc_one(mm, addr)
#define pmd_populate(mm, pmd, page) (pmd_val(*pmd) = \ #define pmd_populate(mm, pmd, page) (pmd_val(*pmd) = \
(unsigned long)(page_address(page))) (unsigned long)(page_address(page)))
...@@ -50,8 +47,7 @@ static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t page, ...@@ -50,8 +47,7 @@ static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t page,
#define __pmd_free_tlb(tlb, pmd, address) do { } while (0) #define __pmd_free_tlb(tlb, pmd, address) do { } while (0)
static inline struct page *pte_alloc_one(struct mm_struct *mm, static inline struct page *pte_alloc_one(struct mm_struct *mm)
unsigned long address)
{ {
struct page *page = alloc_pages(GFP_DMA, 0); struct page *page = alloc_pages(GFP_DMA, 0);
pte_t *pte; pte_t *pte;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment