Magellan Linux

Contents of /trunk/kernel26-alx/patches-2.6.27-r3/0151-2.6.27.52-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1176 - (show annotations) (download)
Thu Oct 14 15:11:06 2010 UTC (13 years, 7 months ago) by niro
File size: 3635 byte(s)
-2.6.27-alx-r3: new magellan 0.5.2 kernel
1 diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
2 index 3384255..9d3c576 100644
3 --- a/arch/x86/mm/fault.c
4 +++ b/arch/x86/mm/fault.c
5 @@ -589,6 +589,7 @@ void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code)
6 unsigned long address;
7 int write, si_code;
8 int fault;
9 + int should_exit_no_context = 0;
10 #ifdef CONFIG_X86_64
11 unsigned long flags;
12 #endif
13 @@ -876,6 +877,9 @@ no_context:
14 oops_end(flags, regs, SIGKILL);
15 #endif
16
17 + if (should_exit_no_context)
18 + return;
19 +
20 /*
21 * We ran out of memory, or some other thing happened to us that made
22 * us unable to handle the page fault gracefully.
23 @@ -901,8 +905,11 @@ do_sigbus:
24 up_read(&mm->mmap_sem);
25
26 /* Kernel mode? Handle exceptions or die */
27 - if (!(error_code & PF_USER))
28 + if (!(error_code & PF_USER)) {
29 + should_exit_no_context = 1;
30 goto no_context;
31 + }
32 +
33 #ifdef CONFIG_X86_32
34 /* User space => ok to do another page fault */
35 if (is_prefetch(regs, address, error_code))
36 diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
37 index d8be92a..0325100 100644
38 --- a/fs/proc/task_mmu.c
39 +++ b/fs/proc/task_mmu.c
40 @@ -205,6 +205,7 @@ static void show_map_vma(struct seq_file *m, struct vm_area_struct *vma)
41 struct file *file = vma->vm_file;
42 int flags = vma->vm_flags;
43 unsigned long ino = 0;
44 + unsigned long start;
45 dev_t dev = 0;
46 int len;
47
48 @@ -214,8 +215,13 @@ static void show_map_vma(struct seq_file *m, struct vm_area_struct *vma)
49 ino = inode->i_ino;
50 }
51
52 + /* We don't show the stack guard page in /proc/maps */
53 + start = vma->vm_start;
54 + if (vma->vm_flags & VM_GROWSDOWN)
55 + start += PAGE_SIZE;
56 +
57 seq_printf(m, "%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu %n",
58 - vma->vm_start,
59 + start,
60 vma->vm_end,
61 flags & VM_READ ? 'r' : '-',
62 flags & VM_WRITE ? 'w' : '-',
63 diff --git a/mm/memory.c b/mm/memory.c
64 index 1300b70f..f0282eb 100644
65 --- a/mm/memory.c
66 +++ b/mm/memory.c
67 @@ -2396,6 +2396,26 @@ out_nomap:
68 }
69
70 /*
71 + * This is like a special single-page "expand_downwards()",
72 + * except we must first make sure that 'address-PAGE_SIZE'
73 + * doesn't hit another vma.
74 + *
75 + * The "find_vma()" will do the right thing even if we wrap
76 + */
77 +static inline int check_stack_guard_page(struct vm_area_struct *vma, unsigned long address)
78 +{
79 + address &= PAGE_MASK;
80 + if ((vma->vm_flags & VM_GROWSDOWN) && address == vma->vm_start) {
81 + address -= PAGE_SIZE;
82 + if (find_vma(vma->vm_mm, address) != vma)
83 + return -ENOMEM;
84 +
85 + expand_stack(vma, address);
86 + }
87 + return 0;
88 +}
89 +
90 +/*
91 * We enter with non-exclusive mmap_sem (to exclude vma changes,
92 * but allow concurrent faults), and pte mapped but not yet locked.
93 * We return with mmap_sem still held, but pte unmapped and unlocked.
94 @@ -2408,9 +2428,13 @@ static int do_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma,
95 spinlock_t *ptl;
96 pte_t entry;
97
98 - /* Allocate our own private page. */
99 pte_unmap(page_table);
100
101 + /* Check if we need to add a guard page to the stack */
102 + if (check_stack_guard_page(vma, address) < 0)
103 + return VM_FAULT_SIGBUS;
104 +
105 + /* Allocate our own private page. */
106 if (unlikely(anon_vma_prepare(vma)))
107 goto oom;
108 page = alloc_zeroed_user_highpage_movable(vma, address);
109 diff --git a/mm/mmap.c b/mm/mmap.c
110 index f3e5bfe..08a32cf 100644
111 --- a/mm/mmap.c
112 +++ b/mm/mmap.c
113 @@ -1573,7 +1573,7 @@ static int acct_stack_growth(struct vm_area_struct * vma, unsigned long size, un
114 * Overcommit.. This must be the final test, as it will
115 * update security statistics.
116 */
117 - if (security_vm_enough_memory(grow))
118 + if (security_vm_enough_memory_mm(mm, grow))
119 return -ENOMEM;
120
121 /* Ok, everything looks good - let it rip */