[PATCH] [ARM] highmem: fix SMP preemption bug in kmap_high_l1_vipt

Nicolas Pitre nico at fluxnic.net
Thu Jul 29 10:59:52 EDT 2010


On Wed, 28 Jul 2010, gking at nvidia.com wrote:

> From: Andrew Howe <ahowe at nvidia.com>
> 
> smp_processor_id() must not be called from a preemptible context (this
> is checked by CONFIG_DEBUG_PREEMPT).  kmap_high_l1_vipt() was doing so.
> This lead to a problem where the wrong per_cpu kmap_high_l1_vipt_depth
> could be incremented, causing a BUG_ON(*depth <= 0); in
> kunmap_high_l1_vipt().
> 
> The solution is to move the call to smp_processor_id() after the call
> to preempt_disable().
> 
> Signed-off-by: Gary King <gking at nvidia.com>

Acked-by: Nicolas Pitre <nico.as.pitre at linaro.org>

Please forward to RMK's patch system.


> ---
>  arch/arm/mm/highmem.c |   13 ++++++++-----
>  1 files changed, 8 insertions(+), 5 deletions(-)
> 
> diff --git a/arch/arm/mm/highmem.c b/arch/arm/mm/highmem.c
> index 086816b..6ab2440 100644
> --- a/arch/arm/mm/highmem.c
> +++ b/arch/arm/mm/highmem.c
> @@ -163,19 +163,22 @@ static DEFINE_PER_CPU(int, kmap_high_l1_vipt_depth);
>  
>  void *kmap_high_l1_vipt(struct page *page, pte_t *saved_pte)
>  {
> -	unsigned int idx, cpu = smp_processor_id();
> -	int *depth = &per_cpu(kmap_high_l1_vipt_depth, cpu);
> +	unsigned int idx, cpu;
> +	int *depth;
>  	unsigned long vaddr, flags;
>  	pte_t pte, *ptep;
>  
> +	if (!in_interrupt())
> +		preempt_disable();
> +
> +	cpu = smp_processor_id();
> +	depth = &per_cpu(kmap_high_l1_vipt_depth, cpu);
> +
>  	idx = KM_L1_CACHE + KM_TYPE_NR * cpu;
>  	vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
>  	ptep = TOP_PTE(vaddr);
>  	pte = mk_pte(page, kmap_prot);
>  
> -	if (!in_interrupt())
> -		preempt_disable();
> -
>  	raw_local_irq_save(flags);
>  	(*depth)++;
>  	if (pte_val(*ptep) == pte_val(pte)) {
> -- 
> 1.7.0.4
> 
> 
> -----------------------------------------------------------------------------------
> This email message is for the sole use of the intended recipient(s) and may contain
> confidential information.  Any unauthorized review, use, disclosure or distribution
> is prohibited.  If you are not the intended recipient, please contact the sender by
> reply email and destroy all copies of the original message.
> -----------------------------------------------------------------------------------
> 



More information about the linux-arm-kernel mailing list