diff options
Diffstat (limited to 'arch/sh/mm')
| -rw-r--r-- | arch/sh/mm/Kconfig | 6 | ||||
| -rw-r--r-- | arch/sh/mm/cache-debugfs.c | 6 | ||||
| -rw-r--r-- | arch/sh/mm/cache-sh4.c | 2 | ||||
| -rw-r--r-- | arch/sh/mm/consistent.c | 12 | ||||
| -rw-r--r-- | arch/sh/mm/fault_32.c | 63 | ||||
| -rw-r--r-- | arch/sh/mm/init.c | 74 | ||||
| -rw-r--r-- | arch/sh/mm/pg-nommu.c | 1 | ||||
| -rw-r--r-- | arch/sh/mm/pmb.c | 2 | ||||
| -rw-r--r-- | arch/sh/mm/tlb-nommu.c | 1 |
9 files changed, 124 insertions, 43 deletions
diff --git a/arch/sh/mm/Kconfig b/arch/sh/mm/Kconfig index 8a03926ea84f..555ec9714b9e 100644 --- a/arch/sh/mm/Kconfig +++ b/arch/sh/mm/Kconfig | |||
| @@ -132,7 +132,11 @@ config ARCH_SELECT_MEMORY_MODEL | |||
| 132 | 132 | ||
| 133 | config ARCH_ENABLE_MEMORY_HOTPLUG | 133 | config ARCH_ENABLE_MEMORY_HOTPLUG |
| 134 | def_bool y | 134 | def_bool y |
| 135 | depends on SPARSEMEM | 135 | depends on SPARSEMEM && MMU |
| 136 | |||
| 137 | config ARCH_ENABLE_MEMORY_HOTREMOVE | ||
| 138 | def_bool y | ||
| 139 | depends on SPARSEMEM && MMU | ||
| 136 | 140 | ||
| 137 | config ARCH_MEMORY_PROBE | 141 | config ARCH_MEMORY_PROBE |
| 138 | def_bool y | 142 | def_bool y |
diff --git a/arch/sh/mm/cache-debugfs.c b/arch/sh/mm/cache-debugfs.c index 0e189ccd4a77..5ba067b26591 100644 --- a/arch/sh/mm/cache-debugfs.c +++ b/arch/sh/mm/cache-debugfs.c | |||
| @@ -130,12 +130,18 @@ static int __init cache_debugfs_init(void) | |||
| 130 | dcache_dentry = debugfs_create_file("dcache", S_IRUSR, sh_debugfs_root, | 130 | dcache_dentry = debugfs_create_file("dcache", S_IRUSR, sh_debugfs_root, |
| 131 | (unsigned int *)CACHE_TYPE_DCACHE, | 131 | (unsigned int *)CACHE_TYPE_DCACHE, |
| 132 | &cache_debugfs_fops); | 132 | &cache_debugfs_fops); |
| 133 | if (!dcache_dentry) | ||
| 134 | return -ENOMEM; | ||
| 133 | if (IS_ERR(dcache_dentry)) | 135 | if (IS_ERR(dcache_dentry)) |
| 134 | return PTR_ERR(dcache_dentry); | 136 | return PTR_ERR(dcache_dentry); |
| 135 | 137 | ||
| 136 | icache_dentry = debugfs_create_file("icache", S_IRUSR, sh_debugfs_root, | 138 | icache_dentry = debugfs_create_file("icache", S_IRUSR, sh_debugfs_root, |
| 137 | (unsigned int *)CACHE_TYPE_ICACHE, | 139 | (unsigned int *)CACHE_TYPE_ICACHE, |
| 138 | &cache_debugfs_fops); | 140 | &cache_debugfs_fops); |
| 141 | if (!icache_dentry) { | ||
| 142 | debugfs_remove(dcache_dentry); | ||
| 143 | return -ENOMEM; | ||
| 144 | } | ||
| 139 | if (IS_ERR(icache_dentry)) { | 145 | if (IS_ERR(icache_dentry)) { |
| 140 | debugfs_remove(dcache_dentry); | 146 | debugfs_remove(dcache_dentry); |
| 141 | return PTR_ERR(icache_dentry); | 147 | return PTR_ERR(icache_dentry); |
diff --git a/arch/sh/mm/cache-sh4.c b/arch/sh/mm/cache-sh4.c index 1fdc8d90254a..5cfe08dbb59e 100644 --- a/arch/sh/mm/cache-sh4.c +++ b/arch/sh/mm/cache-sh4.c | |||
| @@ -261,7 +261,7 @@ void flush_dcache_page(struct page *page) | |||
| 261 | } | 261 | } |
| 262 | 262 | ||
| 263 | /* TODO: Selective icache invalidation through IC address array.. */ | 263 | /* TODO: Selective icache invalidation through IC address array.. */ |
| 264 | static inline void __uses_jump_to_uncached flush_icache_all(void) | 264 | static void __uses_jump_to_uncached flush_icache_all(void) |
| 265 | { | 265 | { |
| 266 | unsigned long flags, ccr; | 266 | unsigned long flags, ccr; |
| 267 | 267 | ||
diff --git a/arch/sh/mm/consistent.c b/arch/sh/mm/consistent.c index 64b8f7f96f9a..9f8ea3ada4db 100644 --- a/arch/sh/mm/consistent.c +++ b/arch/sh/mm/consistent.c | |||
| @@ -16,14 +16,6 @@ | |||
| 16 | #include <asm/addrspace.h> | 16 | #include <asm/addrspace.h> |
| 17 | #include <asm/io.h> | 17 | #include <asm/io.h> |
| 18 | 18 | ||
| 19 | struct dma_coherent_mem { | ||
| 20 | void *virt_base; | ||
| 21 | u32 device_base; | ||
| 22 | int size; | ||
| 23 | int flags; | ||
| 24 | unsigned long *bitmap; | ||
| 25 | }; | ||
| 26 | |||
| 27 | void *dma_alloc_coherent(struct device *dev, size_t size, | 19 | void *dma_alloc_coherent(struct device *dev, size_t size, |
| 28 | dma_addr_t *dma_handle, gfp_t gfp) | 20 | dma_addr_t *dma_handle, gfp_t gfp) |
| 29 | { | 21 | { |
| @@ -44,7 +36,7 @@ void *dma_alloc_coherent(struct device *dev, size_t size, | |||
| 44 | */ | 36 | */ |
| 45 | dma_cache_sync(dev, ret, size, DMA_BIDIRECTIONAL); | 37 | dma_cache_sync(dev, ret, size, DMA_BIDIRECTIONAL); |
| 46 | 38 | ||
| 47 | ret_nocache = ioremap_nocache(virt_to_phys(ret), size); | 39 | ret_nocache = (void __force *)ioremap_nocache(virt_to_phys(ret), size); |
| 48 | if (!ret_nocache) { | 40 | if (!ret_nocache) { |
| 49 | free_pages((unsigned long)ret, order); | 41 | free_pages((unsigned long)ret, order); |
| 50 | return NULL; | 42 | return NULL; |
| @@ -58,12 +50,10 @@ EXPORT_SYMBOL(dma_alloc_coherent); | |||
| 58 | void dma_free_coherent(struct device *dev, size_t size, | 50 | void dma_free_coherent(struct device *dev, size_t size, |
| 59 | void *vaddr, dma_addr_t dma_handle) | 51 | void *vaddr, dma_addr_t dma_handle) |
| 60 | { | 52 | { |
| 61 | struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL; | ||
| 62 | int order = get_order(size); | 53 | int order = get_order(size); |
| 63 | 54 | ||
| 64 | if (!dma_release_from_coherent(dev, order, vaddr)) { | 55 | if (!dma_release_from_coherent(dev, order, vaddr)) { |
| 65 | WARN_ON(irqs_disabled()); /* for portability */ | 56 | WARN_ON(irqs_disabled()); /* for portability */ |
| 66 | BUG_ON(mem && mem->flags & DMA_MEMORY_EXCLUSIVE); | ||
| 67 | free_pages((unsigned long)phys_to_virt(dma_handle), order); | 57 | free_pages((unsigned long)phys_to_virt(dma_handle), order); |
| 68 | iounmap(vaddr); | 58 | iounmap(vaddr); |
| 69 | } | 59 | } |
diff --git a/arch/sh/mm/fault_32.c b/arch/sh/mm/fault_32.c index 0c776fdfbdda..898d477e47c1 100644 --- a/arch/sh/mm/fault_32.c +++ b/arch/sh/mm/fault_32.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * Page fault handler for SH with an MMU. | 2 | * Page fault handler for SH with an MMU. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 1999 Niibe Yutaka | 4 | * Copyright (C) 1999 Niibe Yutaka |
| 5 | * Copyright (C) 2003 - 2007 Paul Mundt | 5 | * Copyright (C) 2003 - 2008 Paul Mundt |
| 6 | * | 6 | * |
| 7 | * Based on linux/arch/i386/mm/fault.c: | 7 | * Based on linux/arch/i386/mm/fault.c: |
| 8 | * Copyright (C) 1995 Linus Torvalds | 8 | * Copyright (C) 1995 Linus Torvalds |
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <linux/mm.h> | 15 | #include <linux/mm.h> |
| 16 | #include <linux/hardirq.h> | 16 | #include <linux/hardirq.h> |
| 17 | #include <linux/kprobes.h> | 17 | #include <linux/kprobes.h> |
| 18 | #include <linux/marker.h> | ||
| 18 | #include <asm/io_trapped.h> | 19 | #include <asm/io_trapped.h> |
| 19 | #include <asm/system.h> | 20 | #include <asm/system.h> |
| 20 | #include <asm/mmu_context.h> | 21 | #include <asm/mmu_context.h> |
| @@ -37,10 +38,10 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs, | |||
| 37 | int fault; | 38 | int fault; |
| 38 | siginfo_t info; | 39 | siginfo_t info; |
| 39 | 40 | ||
| 40 | #ifdef CONFIG_SH_KGDB | 41 | /* |
| 41 | if (kgdb_nofault && kgdb_bus_err_hook) | 42 | * We don't bother with any notifier callbacks here, as they are |
| 42 | kgdb_bus_err_hook(); | 43 | * all handled through the __do_page_fault() fast-path. |
| 43 | #endif | 44 | */ |
| 44 | 45 | ||
| 45 | tsk = current; | 46 | tsk = current; |
| 46 | si_code = SEGV_MAPERR; | 47 | si_code = SEGV_MAPERR; |
| @@ -61,7 +62,6 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs, | |||
| 61 | pgd = get_TTB() + offset; | 62 | pgd = get_TTB() + offset; |
| 62 | pgd_k = swapper_pg_dir + offset; | 63 | pgd_k = swapper_pg_dir + offset; |
| 63 | 64 | ||
| 64 | /* This will never happen with the folded page table. */ | ||
| 65 | if (!pgd_present(*pgd)) { | 65 | if (!pgd_present(*pgd)) { |
| 66 | if (!pgd_present(*pgd_k)) | 66 | if (!pgd_present(*pgd_k)) |
| 67 | goto bad_area_nosemaphore; | 67 | goto bad_area_nosemaphore; |
| @@ -71,9 +71,13 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs, | |||
| 71 | 71 | ||
| 72 | pud = pud_offset(pgd, address); | 72 | pud = pud_offset(pgd, address); |
| 73 | pud_k = pud_offset(pgd_k, address); | 73 | pud_k = pud_offset(pgd_k, address); |
| 74 | if (pud_present(*pud) || !pud_present(*pud_k)) | 74 | |
| 75 | goto bad_area_nosemaphore; | 75 | if (!pud_present(*pud)) { |
| 76 | set_pud(pud, *pud_k); | 76 | if (!pud_present(*pud_k)) |
| 77 | goto bad_area_nosemaphore; | ||
| 78 | set_pud(pud, *pud_k); | ||
| 79 | return; | ||
| 80 | } | ||
| 77 | 81 | ||
| 78 | pmd = pmd_offset(pud, address); | 82 | pmd = pmd_offset(pud, address); |
| 79 | pmd_k = pmd_offset(pud_k, address); | 83 | pmd_k = pmd_offset(pud_k, address); |
| @@ -242,6 +246,25 @@ do_sigbus: | |||
| 242 | goto no_context; | 246 | goto no_context; |
| 243 | } | 247 | } |
| 244 | 248 | ||
| 249 | static inline int notify_page_fault(struct pt_regs *regs, int trap) | ||
| 250 | { | ||
| 251 | int ret = 0; | ||
| 252 | |||
| 253 | trace_mark(kernel_arch_trap_entry, "trap_id %d ip #p%ld", | ||
| 254 | trap >> 5, instruction_pointer(regs)); | ||
| 255 | |||
| 256 | #ifdef CONFIG_KPROBES | ||
| 257 | if (!user_mode(regs)) { | ||
| 258 | preempt_disable(); | ||
| 259 | if (kprobe_running() && kprobe_fault_handler(regs, trap)) | ||
| 260 | ret = 1; | ||
| 261 | preempt_enable(); | ||
| 262 | } | ||
| 263 | #endif | ||
| 264 | |||
| 265 | return ret; | ||
| 266 | } | ||
| 267 | |||
| 245 | #ifdef CONFIG_SH_STORE_QUEUES | 268 | #ifdef CONFIG_SH_STORE_QUEUES |
| 246 | /* | 269 | /* |
| 247 | * This is a special case for the SH-4 store queues, as pages for this | 270 | * This is a special case for the SH-4 store queues, as pages for this |
| @@ -265,12 +288,18 @@ asmlinkage int __kprobes __do_page_fault(struct pt_regs *regs, | |||
| 265 | pmd_t *pmd; | 288 | pmd_t *pmd; |
| 266 | pte_t *pte; | 289 | pte_t *pte; |
| 267 | pte_t entry; | 290 | pte_t entry; |
| 291 | int ret = 0; | ||
| 292 | |||
| 293 | if (notify_page_fault(regs, lookup_exception_vector())) | ||
| 294 | goto out; | ||
| 268 | 295 | ||
| 269 | #ifdef CONFIG_SH_KGDB | 296 | #ifdef CONFIG_SH_KGDB |
| 270 | if (kgdb_nofault && kgdb_bus_err_hook) | 297 | if (kgdb_nofault && kgdb_bus_err_hook) |
| 271 | kgdb_bus_err_hook(); | 298 | kgdb_bus_err_hook(); |
| 272 | #endif | 299 | #endif |
| 273 | 300 | ||
| 301 | ret = 1; | ||
| 302 | |||
| 274 | /* | 303 | /* |
| 275 | * We don't take page faults for P1, P2, and parts of P4, these | 304 | * We don't take page faults for P1, P2, and parts of P4, these |
| 276 | * are always mapped, whether it be due to legacy behaviour in | 305 | * are always mapped, whether it be due to legacy behaviour in |
| @@ -280,24 +309,23 @@ asmlinkage int __kprobes __do_page_fault(struct pt_regs *regs, | |||
| 280 | pgd = pgd_offset_k(address); | 309 | pgd = pgd_offset_k(address); |
| 281 | } else { | 310 | } else { |
| 282 | if (unlikely(address >= TASK_SIZE || !current->mm)) | 311 | if (unlikely(address >= TASK_SIZE || !current->mm)) |
| 283 | return 1; | 312 | goto out; |
| 284 | 313 | ||
| 285 | pgd = pgd_offset(current->mm, address); | 314 | pgd = pgd_offset(current->mm, address); |
| 286 | } | 315 | } |
| 287 | 316 | ||
| 288 | pud = pud_offset(pgd, address); | 317 | pud = pud_offset(pgd, address); |
| 289 | if (pud_none_or_clear_bad(pud)) | 318 | if (pud_none_or_clear_bad(pud)) |
| 290 | return 1; | 319 | goto out; |
| 291 | pmd = pmd_offset(pud, address); | 320 | pmd = pmd_offset(pud, address); |
| 292 | if (pmd_none_or_clear_bad(pmd)) | 321 | if (pmd_none_or_clear_bad(pmd)) |
| 293 | return 1; | 322 | goto out; |
| 294 | |||
| 295 | pte = pte_offset_kernel(pmd, address); | 323 | pte = pte_offset_kernel(pmd, address); |
| 296 | entry = *pte; | 324 | entry = *pte; |
| 297 | if (unlikely(pte_none(entry) || pte_not_present(entry))) | 325 | if (unlikely(pte_none(entry) || pte_not_present(entry))) |
| 298 | return 1; | 326 | goto out; |
| 299 | if (unlikely(writeaccess && !pte_write(entry))) | 327 | if (unlikely(writeaccess && !pte_write(entry))) |
| 300 | return 1; | 328 | goto out; |
| 301 | 329 | ||
| 302 | if (writeaccess) | 330 | if (writeaccess) |
| 303 | entry = pte_mkdirty(entry); | 331 | entry = pte_mkdirty(entry); |
| @@ -314,5 +342,8 @@ asmlinkage int __kprobes __do_page_fault(struct pt_regs *regs, | |||
| 314 | set_pte(pte, entry); | 342 | set_pte(pte, entry); |
| 315 | update_mmu_cache(NULL, address, entry); | 343 | update_mmu_cache(NULL, address, entry); |
| 316 | 344 | ||
| 317 | return 0; | 345 | ret = 0; |
| 346 | out: | ||
| 347 | trace_mark(kernel_arch_trap_exit, MARK_NOARGS); | ||
| 348 | return ret; | ||
| 318 | } | 349 | } |
diff --git a/arch/sh/mm/init.c b/arch/sh/mm/init.c index b75a7acd62fb..2a53943924b2 100644 --- a/arch/sh/mm/init.c +++ b/arch/sh/mm/init.c | |||
| @@ -23,7 +23,19 @@ | |||
| 23 | 23 | ||
| 24 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); | 24 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); |
| 25 | pgd_t swapper_pg_dir[PTRS_PER_PGD]; | 25 | pgd_t swapper_pg_dir[PTRS_PER_PGD]; |
| 26 | unsigned long cached_to_uncached = 0; | 26 | |
| 27 | #ifdef CONFIG_SUPERH32 | ||
| 28 | /* | ||
| 29 | * Handle trivial transitions between cached and uncached | ||
| 30 | * segments, making use of the 1:1 mapping relationship in | ||
| 31 | * 512MB lowmem. | ||
| 32 | * | ||
| 33 | * This is the offset of the uncached section from its cached alias. | ||
| 34 | * Default value only valid in 29 bit mode, in 32bit mode will be | ||
| 35 | * overridden in pmb_init. | ||
| 36 | */ | ||
| 37 | unsigned long cached_to_uncached = P2SEG - P1SEG; | ||
| 38 | #endif | ||
| 27 | 39 | ||
| 28 | #ifdef CONFIG_MMU | 40 | #ifdef CONFIG_MMU |
| 29 | static void set_pte_phys(unsigned long addr, unsigned long phys, pgprot_t prot) | 41 | static void set_pte_phys(unsigned long addr, unsigned long phys, pgprot_t prot) |
| @@ -58,9 +70,7 @@ static void set_pte_phys(unsigned long addr, unsigned long phys, pgprot_t prot) | |||
| 58 | } | 70 | } |
| 59 | 71 | ||
| 60 | set_pte(pte, pfn_pte(phys >> PAGE_SHIFT, prot)); | 72 | set_pte(pte, pfn_pte(phys >> PAGE_SHIFT, prot)); |
| 61 | 73 | flush_tlb_one(get_asid(), addr); | |
| 62 | if (cached_to_uncached) | ||
| 63 | flush_tlb_one(get_asid(), addr); | ||
| 64 | } | 74 | } |
| 65 | 75 | ||
| 66 | /* | 76 | /* |
| @@ -113,7 +123,6 @@ void __init page_table_range_init(unsigned long start, unsigned long end, | |||
| 113 | if (!pmd_present(*pmd)) { | 123 | if (!pmd_present(*pmd)) { |
| 114 | pte_t *pte_table; | 124 | pte_t *pte_table; |
| 115 | pte_table = (pte_t *)alloc_bootmem_low_pages(PAGE_SIZE); | 125 | pte_table = (pte_t *)alloc_bootmem_low_pages(PAGE_SIZE); |
| 116 | memset(pte_table, 0, PAGE_SIZE); | ||
| 117 | pmd_populate_kernel(&init_mm, pmd, pte_table); | 126 | pmd_populate_kernel(&init_mm, pmd, pte_table); |
| 118 | } | 127 | } |
| 119 | 128 | ||
| @@ -165,15 +174,6 @@ void __init paging_init(void) | |||
| 165 | #ifdef CONFIG_SUPERH32 | 174 | #ifdef CONFIG_SUPERH32 |
| 166 | /* Set up the uncached fixmap */ | 175 | /* Set up the uncached fixmap */ |
| 167 | set_fixmap_nocache(FIX_UNCACHED, __pa(&__uncached_start)); | 176 | set_fixmap_nocache(FIX_UNCACHED, __pa(&__uncached_start)); |
| 168 | |||
| 169 | #ifdef CONFIG_29BIT | ||
| 170 | /* | ||
| 171 | * Handle trivial transitions between cached and uncached | ||
| 172 | * segments, making use of the 1:1 mapping relationship in | ||
| 173 | * 512MB lowmem. | ||
| 174 | */ | ||
| 175 | cached_to_uncached = P2SEG - P1SEG; | ||
| 176 | #endif | ||
| 177 | #endif | 177 | #endif |
| 178 | } | 178 | } |
| 179 | 179 | ||
| @@ -265,6 +265,35 @@ void free_initrd_mem(unsigned long start, unsigned long end) | |||
| 265 | } | 265 | } |
| 266 | #endif | 266 | #endif |
| 267 | 267 | ||
| 268 | #if THREAD_SHIFT < PAGE_SHIFT | ||
| 269 | static struct kmem_cache *thread_info_cache; | ||
| 270 | |||
| 271 | struct thread_info *alloc_thread_info(struct task_struct *tsk) | ||
| 272 | { | ||
| 273 | struct thread_info *ti; | ||
| 274 | |||
| 275 | ti = kmem_cache_alloc(thread_info_cache, GFP_KERNEL); | ||
| 276 | if (unlikely(ti == NULL)) | ||
| 277 | return NULL; | ||
| 278 | #ifdef CONFIG_DEBUG_STACK_USAGE | ||
| 279 | memset(ti, 0, THREAD_SIZE); | ||
| 280 | #endif | ||
| 281 | return ti; | ||
| 282 | } | ||
| 283 | |||
| 284 | void free_thread_info(struct thread_info *ti) | ||
| 285 | { | ||
| 286 | kmem_cache_free(thread_info_cache, ti); | ||
| 287 | } | ||
| 288 | |||
| 289 | void thread_info_cache_init(void) | ||
| 290 | { | ||
| 291 | thread_info_cache = kmem_cache_create("thread_info", THREAD_SIZE, | ||
| 292 | THREAD_SIZE, 0, NULL); | ||
| 293 | BUG_ON(thread_info_cache == NULL); | ||
| 294 | } | ||
| 295 | #endif /* THREAD_SHIFT < PAGE_SHIFT */ | ||
| 296 | |||
| 268 | #ifdef CONFIG_MEMORY_HOTPLUG | 297 | #ifdef CONFIG_MEMORY_HOTPLUG |
| 269 | int arch_add_memory(int nid, u64 start, u64 size) | 298 | int arch_add_memory(int nid, u64 start, u64 size) |
| 270 | { | 299 | { |
| @@ -292,4 +321,21 @@ int memory_add_physaddr_to_nid(u64 addr) | |||
| 292 | } | 321 | } |
| 293 | EXPORT_SYMBOL_GPL(memory_add_physaddr_to_nid); | 322 | EXPORT_SYMBOL_GPL(memory_add_physaddr_to_nid); |
| 294 | #endif | 323 | #endif |
| 324 | |||
| 325 | #ifdef CONFIG_MEMORY_HOTREMOVE | ||
| 326 | int remove_memory(u64 start, u64 size) | ||
| 327 | { | ||
| 328 | unsigned long start_pfn = start >> PAGE_SHIFT; | ||
| 329 | unsigned long end_pfn = start_pfn + (size >> PAGE_SHIFT); | ||
| 330 | int ret; | ||
| 331 | |||
| 332 | ret = offline_pages(start_pfn, end_pfn, 120 * HZ); | ||
| 333 | if (unlikely(ret)) | ||
| 334 | printk("%s: Failed, offline_pages() == %d\n", __func__, ret); | ||
| 335 | |||
| 336 | return ret; | ||
| 337 | } | ||
| 338 | EXPORT_SYMBOL_GPL(remove_memory); | ||
| 295 | #endif | 339 | #endif |
| 340 | |||
| 341 | #endif /* CONFIG_MEMORY_HOTPLUG */ | ||
diff --git a/arch/sh/mm/pg-nommu.c b/arch/sh/mm/pg-nommu.c index 677dd57f0877..91ed4e695ff7 100644 --- a/arch/sh/mm/pg-nommu.c +++ b/arch/sh/mm/pg-nommu.c | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
| 14 | #include <linux/string.h> | 14 | #include <linux/string.h> |
| 15 | #include <asm/page.h> | 15 | #include <asm/page.h> |
| 16 | #include <asm/uaccess.h> | ||
| 16 | 17 | ||
| 17 | void copy_page(void *to, void *from) | 18 | void copy_page(void *to, void *from) |
| 18 | { | 19 | { |
diff --git a/arch/sh/mm/pmb.c b/arch/sh/mm/pmb.c index cef727669c87..84241676265e 100644 --- a/arch/sh/mm/pmb.c +++ b/arch/sh/mm/pmb.c | |||
| @@ -394,6 +394,8 @@ static int __init pmb_debugfs_init(void) | |||
| 394 | 394 | ||
| 395 | dentry = debugfs_create_file("pmb", S_IFREG | S_IRUGO, | 395 | dentry = debugfs_create_file("pmb", S_IFREG | S_IRUGO, |
| 396 | sh_debugfs_root, NULL, &pmb_debugfs_fops); | 396 | sh_debugfs_root, NULL, &pmb_debugfs_fops); |
| 397 | if (!dentry) | ||
| 398 | return -ENOMEM; | ||
| 397 | if (IS_ERR(dentry)) | 399 | if (IS_ERR(dentry)) |
| 398 | return PTR_ERR(dentry); | 400 | return PTR_ERR(dentry); |
| 399 | 401 | ||
diff --git a/arch/sh/mm/tlb-nommu.c b/arch/sh/mm/tlb-nommu.c index 15111bc7ddd6..71c742b5aee3 100644 --- a/arch/sh/mm/tlb-nommu.c +++ b/arch/sh/mm/tlb-nommu.c | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #include <linux/kernel.h> | 10 | #include <linux/kernel.h> |
| 11 | #include <linux/mm.h> | 11 | #include <linux/mm.h> |
| 12 | #include <asm/pgtable.h> | 12 | #include <asm/pgtable.h> |
| 13 | #include <asm/tlbflush.h> | ||
| 13 | 14 | ||
| 14 | /* | 15 | /* |
| 15 | * Nothing too terribly exciting here .. | 16 | * Nothing too terribly exciting here .. |
