Commit eefbab599531240adaffa1d23900afbc8b0342bd
Exists in
master
and in
4 other branches
Merge branch 'frv' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-2.6-frv
* 'frv' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-2.6-frv: FRV: Use generic show_interrupts() FRV: Convert genirq namespace frv: Select GENERIC_HARDIRQS_NO_DEPRECATED frv: Convert cpu irq_chip to new functions frv: Convert mb93493 irq_chip to new functions frv: Convert mb93093 irq_chip to new function frv: Convert mb93091 irq_chip to new functions frv: Fix typo from __do_IRQ overhaul frv: Remove stale irq_chip.end FRV: Do some cleanups FRV: Missing node arg in alloc_thread_info_node() macro NOMMU: implement access_remote_vm NOMMU: support SMP dynamic percpu_alloc NOMMU: percpu should use is_vmalloc_addr().
Showing 7 changed files Side-by-side Diff
arch/frv/Kconfig
arch/frv/include/asm/system.h
... | ... | @@ -45,21 +45,12 @@ |
45 | 45 | #define wmb() asm volatile ("membar" : : :"memory") |
46 | 46 | #define read_barrier_depends() do { } while (0) |
47 | 47 | |
48 | -#ifdef CONFIG_SMP | |
49 | -#define smp_mb() mb() | |
50 | -#define smp_rmb() rmb() | |
51 | -#define smp_wmb() wmb() | |
52 | -#define smp_read_barrier_depends() read_barrier_depends() | |
53 | -#define set_mb(var, value) \ | |
54 | - do { xchg(&var, (value)); } while (0) | |
55 | -#else | |
56 | 48 | #define smp_mb() barrier() |
57 | 49 | #define smp_rmb() barrier() |
58 | 50 | #define smp_wmb() barrier() |
59 | 51 | #define smp_read_barrier_depends() do {} while(0) |
60 | 52 | #define set_mb(var, value) \ |
61 | 53 | do { var = (value); barrier(); } while (0) |
62 | -#endif | |
63 | 54 | |
64 | 55 | extern void die_if_kernel(const char *, ...) __attribute__((format(printf, 1, 2))); |
65 | 56 | extern void free_initmem(void); |
arch/frv/include/asm/thread_info.h
... | ... | @@ -21,6 +21,8 @@ |
21 | 21 | |
22 | 22 | #define THREAD_SIZE 8192 |
23 | 23 | |
24 | +#define __HAVE_ARCH_TASK_STRUCT_ALLOCATOR | |
25 | + | |
24 | 26 | /* |
25 | 27 | * low level task data that entry.S needs immediate access to |
26 | 28 | * - this struct should fit entirely inside of one cache line |
... | ... | @@ -87,7 +89,7 @@ |
87 | 89 | #define alloc_thread_info_node(tsk, node) \ |
88 | 90 | kzalloc_node(THREAD_SIZE, GFP_KERNEL, node) |
89 | 91 | #else |
90 | -#define alloc_thread_info_node(tsk) \ | |
92 | +#define alloc_thread_info_node(tsk, node) \ | |
91 | 93 | kmalloc_node(THREAD_SIZE, GFP_KERNEL, node) |
92 | 94 | #endif |
93 | 95 |
arch/frv/kernel/irq-mb93091.c
include/linux/vmalloc.h
... | ... | @@ -95,10 +95,27 @@ |
95 | 95 | |
96 | 96 | extern int map_vm_area(struct vm_struct *area, pgprot_t prot, |
97 | 97 | struct page ***pages); |
98 | +#ifdef CONFIG_MMU | |
98 | 99 | extern int map_kernel_range_noflush(unsigned long start, unsigned long size, |
99 | 100 | pgprot_t prot, struct page **pages); |
100 | 101 | extern void unmap_kernel_range_noflush(unsigned long addr, unsigned long size); |
101 | 102 | extern void unmap_kernel_range(unsigned long addr, unsigned long size); |
103 | +#else | |
104 | +static inline int | |
105 | +map_kernel_range_noflush(unsigned long start, unsigned long size, | |
106 | + pgprot_t prot, struct page **pages) | |
107 | +{ | |
108 | + return size >> PAGE_SHIFT; | |
109 | +} | |
110 | +static inline void | |
111 | +unmap_kernel_range_noflush(unsigned long addr, unsigned long size) | |
112 | +{ | |
113 | +} | |
114 | +static inline void | |
115 | +unmap_kernel_range(unsigned long addr, unsigned long size) | |
116 | +{ | |
117 | +} | |
118 | +#endif | |
102 | 119 | |
103 | 120 | /* Allocate/destroy a 'vmalloc' VM area. */ |
104 | 121 | extern struct vm_struct *alloc_vm_area(size_t size); |
105 | 122 | |
... | ... | @@ -116,11 +133,26 @@ |
116 | 133 | extern __init void vm_area_register_early(struct vm_struct *vm, size_t align); |
117 | 134 | |
118 | 135 | #ifdef CONFIG_SMP |
136 | +# ifdef CONFIG_MMU | |
119 | 137 | struct vm_struct **pcpu_get_vm_areas(const unsigned long *offsets, |
120 | 138 | const size_t *sizes, int nr_vms, |
121 | 139 | size_t align); |
122 | 140 | |
123 | 141 | void pcpu_free_vm_areas(struct vm_struct **vms, int nr_vms); |
142 | +# else | |
143 | +static inline struct vm_struct ** | |
144 | +pcpu_get_vm_areas(const unsigned long *offsets, | |
145 | + const size_t *sizes, int nr_vms, | |
146 | + size_t align) | |
147 | +{ | |
148 | + return NULL; | |
149 | +} | |
150 | + | |
151 | +static inline void | |
152 | +pcpu_free_vm_areas(struct vm_struct **vms, int nr_vms) | |
153 | +{ | |
154 | +} | |
155 | +# endif | |
124 | 156 | #endif |
125 | 157 | |
126 | 158 | #endif /* _LINUX_VMALLOC_H */ |
mm/nommu.c
... | ... | @@ -1971,22 +1971,11 @@ |
1971 | 1971 | } |
1972 | 1972 | EXPORT_SYMBOL(filemap_fault); |
1973 | 1973 | |
1974 | -/* | |
1975 | - * Access another process' address space. | |
1976 | - * - source/target buffer must be kernel space | |
1977 | - */ | |
1978 | -int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write) | |
1974 | +static int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm, | |
1975 | + unsigned long addr, void *buf, int len, int write) | |
1979 | 1976 | { |
1980 | 1977 | struct vm_area_struct *vma; |
1981 | - struct mm_struct *mm; | |
1982 | 1978 | |
1983 | - if (addr + len < addr) | |
1984 | - return 0; | |
1985 | - | |
1986 | - mm = get_task_mm(tsk); | |
1987 | - if (!mm) | |
1988 | - return 0; | |
1989 | - | |
1990 | 1979 | down_read(&mm->mmap_sem); |
1991 | 1980 | |
1992 | 1981 | /* the access must start within one of the target process's mappings */ |
... | ... | @@ -2010,6 +1999,43 @@ |
2010 | 1999 | } |
2011 | 2000 | |
2012 | 2001 | up_read(&mm->mmap_sem); |
2002 | + | |
2003 | + return len; | |
2004 | +} | |
2005 | + | |
2006 | +/** | |
2007 | + * @access_remote_vm - access another process' address space | |
2008 | + * @mm: the mm_struct of the target address space | |
2009 | + * @addr: start address to access | |
2010 | + * @buf: source or destination buffer | |
2011 | + * @len: number of bytes to transfer | |
2012 | + * @write: whether the access is a write | |
2013 | + * | |
2014 | + * The caller must hold a reference on @mm. | |
2015 | + */ | |
2016 | +int access_remote_vm(struct mm_struct *mm, unsigned long addr, | |
2017 | + void *buf, int len, int write) | |
2018 | +{ | |
2019 | + return __access_remote_vm(NULL, mm, addr, buf, len, write); | |
2020 | +} | |
2021 | + | |
2022 | +/* | |
2023 | + * Access another process' address space. | |
2024 | + * - source/target buffer must be kernel space | |
2025 | + */ | |
2026 | +int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write) | |
2027 | +{ | |
2028 | + struct mm_struct *mm; | |
2029 | + | |
2030 | + if (addr + len < addr) | |
2031 | + return 0; | |
2032 | + | |
2033 | + mm = get_task_mm(tsk); | |
2034 | + if (!mm) | |
2035 | + return 0; | |
2036 | + | |
2037 | + len = __access_remote_vm(tsk, mm, addr, buf, len, write); | |
2038 | + | |
2013 | 2039 | mmput(mm); |
2014 | 2040 | return len; |
2015 | 2041 | } |
mm/percpu.c
... | ... | @@ -1008,8 +1008,7 @@ |
1008 | 1008 | } |
1009 | 1009 | |
1010 | 1010 | if (in_first_chunk) { |
1011 | - if ((unsigned long)addr < VMALLOC_START || | |
1012 | - (unsigned long)addr >= VMALLOC_END) | |
1011 | + if (!is_vmalloc_addr(addr)) | |
1013 | 1012 | return __pa(addr); |
1014 | 1013 | else |
1015 | 1014 | return page_to_phys(vmalloc_to_page(addr)); |