smp.c (10034aabca9032246762daaca3152f3e79380ea0) | smp.c (03b505eae6a276b8c38b6222694afb6cea10b1cc) |
---|---|
1/* 2 * linux/arch/arm/kernel/smp.c 3 * 4 * Copyright (C) 2002 ARM Limited, All Rights Reserved. 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 as 8 * published by the Free Software Foundation. --- 24 unchanged lines hidden (view full) --- 33#include <asm/mmu_context.h> 34#include <asm/pgtable.h> 35#include <asm/pgalloc.h> 36#include <asm/processor.h> 37#include <asm/sections.h> 38#include <asm/tlbflush.h> 39#include <asm/ptrace.h> 40#include <asm/localtimer.h> | 1/* 2 * linux/arch/arm/kernel/smp.c 3 * 4 * Copyright (C) 2002 ARM Limited, All Rights Reserved. 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 as 8 * published by the Free Software Foundation. --- 24 unchanged lines hidden (view full) --- 33#include <asm/mmu_context.h> 34#include <asm/pgtable.h> 35#include <asm/pgalloc.h> 36#include <asm/processor.h> 37#include <asm/sections.h> 38#include <asm/tlbflush.h> 39#include <asm/ptrace.h> 40#include <asm/localtimer.h> |
41#include <asm/smp_plat.h> | |
42 43/* 44 * as from 2.5, kernels no longer have an init_tasks structure 45 * so we need some other way of telling a new secondary core 46 * where to place its SVC stack 47 */ 48struct secondary_data secondary_data; 49 --- 600 unchanged lines hidden (view full) --- 650 651/* 652 * not supported here 653 */ 654int setup_profiling_timer(unsigned int multiplier) 655{ 656 return -EINVAL; 657} | 41 42/* 43 * as from 2.5, kernels no longer have an init_tasks structure 44 * so we need some other way of telling a new secondary core 45 * where to place its SVC stack 46 */ 47struct secondary_data secondary_data; 48 --- 600 unchanged lines hidden (view full) --- 649 650/* 651 * not supported here 652 */ 653int setup_profiling_timer(unsigned int multiplier) 654{ 655 return -EINVAL; 656} |
658 659static void 660on_each_cpu_mask(void (*func)(void *), void *info, int wait, 661 const struct cpumask *mask) 662{ 663 preempt_disable(); 664 665 smp_call_function_many(mask, func, info, wait); 666 if (cpumask_test_cpu(smp_processor_id(), mask)) 667 func(info); 668 669 preempt_enable(); 670} 671 672/**********************************************************************/ 673 674/* 675 * TLB operations 676 */ 677struct tlb_args { 678 struct vm_area_struct *ta_vma; 679 unsigned long ta_start; 680 unsigned long ta_end; 681}; 682 683static inline void ipi_flush_tlb_all(void *ignored) 684{ 685 local_flush_tlb_all(); 686} 687 688static inline void ipi_flush_tlb_mm(void *arg) 689{ 690 struct mm_struct *mm = (struct mm_struct *)arg; 691 692 local_flush_tlb_mm(mm); 693} 694 695static inline void ipi_flush_tlb_page(void *arg) 696{ 697 struct tlb_args *ta = (struct tlb_args *)arg; 698 699 local_flush_tlb_page(ta->ta_vma, ta->ta_start); 700} 701 702static inline void ipi_flush_tlb_kernel_page(void *arg) 703{ 704 struct tlb_args *ta = (struct tlb_args *)arg; 705 706 local_flush_tlb_kernel_page(ta->ta_start); 707} 708 709static inline void ipi_flush_tlb_range(void *arg) 710{ 711 struct tlb_args *ta = (struct tlb_args *)arg; 712 713 local_flush_tlb_range(ta->ta_vma, ta->ta_start, ta->ta_end); 714} 715 716static inline void ipi_flush_tlb_kernel_range(void *arg) 717{ 718 struct tlb_args *ta = (struct tlb_args *)arg; 719 720 local_flush_tlb_kernel_range(ta->ta_start, ta->ta_end); 721} 722 723void flush_tlb_all(void) 724{ 725 if (tlb_ops_need_broadcast()) 726 on_each_cpu(ipi_flush_tlb_all, NULL, 1); 727 else 728 local_flush_tlb_all(); 729} 730 731void flush_tlb_mm(struct mm_struct *mm) 732{ 733 if (tlb_ops_need_broadcast()) 734 on_each_cpu_mask(ipi_flush_tlb_mm, mm, 1, mm_cpumask(mm)); 735 else 736 local_flush_tlb_mm(mm); 737} 738 739void flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr) 740{ 741 if (tlb_ops_need_broadcast()) { 742 struct tlb_args ta; 743 ta.ta_vma = vma; 744 ta.ta_start = uaddr; 745 on_each_cpu_mask(ipi_flush_tlb_page, &ta, 1, mm_cpumask(vma->vm_mm)); 746 } else 747 local_flush_tlb_page(vma, uaddr); 748} 749 750void flush_tlb_kernel_page(unsigned long kaddr) 751{ 752 if (tlb_ops_need_broadcast()) { 753 struct tlb_args ta; 754 ta.ta_start = kaddr; 755 on_each_cpu(ipi_flush_tlb_kernel_page, &ta, 1); 756 } else 757 local_flush_tlb_kernel_page(kaddr); 758} 759 760void flush_tlb_range(struct vm_area_struct *vma, 761 unsigned long start, unsigned long end) 762{ 763 if (tlb_ops_need_broadcast()) { 764 struct tlb_args ta; 765 ta.ta_vma = vma; 766 ta.ta_start = start; 767 ta.ta_end = end; 768 on_each_cpu_mask(ipi_flush_tlb_range, &ta, 1, mm_cpumask(vma->vm_mm)); 769 } else 770 local_flush_tlb_range(vma, start, end); 771} 772 773void flush_tlb_kernel_range(unsigned long start, unsigned long end) 774{ 775 if (tlb_ops_need_broadcast()) { 776 struct tlb_args ta; 777 ta.ta_start = start; 778 ta.ta_end = end; 779 on_each_cpu(ipi_flush_tlb_kernel_range, &ta, 1); 780 } else 781 local_flush_tlb_kernel_range(start, end); 782} | |