Commit eefbab599531240adaffa1d23900afbc8b0342bd

Authored by Linus Torvalds

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

... ... @@ -363,7 +363,6 @@
363 363  
364 364 config ARCH_SUSPEND_POSSIBLE
365 365 def_bool y
366   - depends on !SMP
367 366  
368 367 source kernel/power/Kconfig
369 368 endmenu
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
... ... @@ -47,7 +47,7 @@
47 47  
48 48 static void frv_fpga_ack(struct irq_data *d)
49 49 {
50   - __clr_IFR(1 << (irq - IRQ_BASE_FPGA));
  50 + __clr_IFR(1 << (d->irq - IRQ_BASE_FPGA));
51 51 }
52 52  
53 53 static void frv_fpga_mask_ack(struct irq_data *d)
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 */
... ... @@ -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 }
... ... @@ -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));