Re: [PATCH] MIPS: DMA: Fix BUG due to smp_processor_id() in preemptible code

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



2013/9/3 Jerin Jacob <jerinjacobk@xxxxxxxxx>:
> The use of current_cpu_type() in cpu_is_noncoherent_r10000() is not preemption-safe.
> Use boot_cpu_type() instead to make it preemption-safe.

Looks like this will conflict with: https://patchwork.linux-mips.org/patch/5776/

>
> <log>
> / # insmod mtd_readtest.ko dev=4
> mtd_readtest: MTD device: 4
> mtd_readtest: MTD device size 996671488, eraseblock size 524288, page size 4096, count of eraseblocks 1901, pages per eraseblock 128, OOB size 224
> mtd_readtest: scanning for bad eraseblocks
> mtd_readtest: scanned 1901 eraseblocks, 0 are bad
> mtd_readtest: testing page read
> BUG: using smp_processor_id() in preemptible [00000000] code: insmod/99
> caller is mips_dma_sync_single_for_cpu+0x2c/0x128
> CPU: 2 PID: 99 Comm: insmod Not tainted 3.10.4 #67
> Stack : 00000006 69735f63 00000000 00000000 00000000 00000000 808273d6 00000032
>           80820000 00000002 8d700000 8de48fa0 00000000 00000000 00000000 00000000
>           00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
>           00000000 00000000 00000000 8d6afb00 8d6afb24 80721f24 807b9927 8012c130
>           80820000 80721f24 00000002 00000063 8de48fa0 8082333c 807b98e6 8d6afaa0
>           ...
> Call Trace:
> [<80109984>] show_stack+0x64/0x7c
> [<80666230>] dump_stack+0x20/0x2c
> [<803a2210>] debug_smp_processor_id+0xe0/0xf0
> [<801116f0>] mips_dma_sync_single_for_cpu+0x2c/0x128
> [<8043456c>] nand_plat_read_page+0x16c/0x234
> [<8042fad4>] nand_do_read_ops+0x194/0x480
> [<804301dc>] nand_read+0x50/0x7c
> [<804261c8>] part_read+0x70/0xc0
> [<804231dc>] mtd_read+0x80/0xe4
> [<c0431354>] init_module+0x354/0x6f8 [mtd_readtest]
> [<8010057c>] do_one_initcall+0x140/0x1a4
> [<80176d7c>] load_module+0x1b5c/0x2258
> [<8017752c>] SyS_init_module+0xb4/0xec
> [<8010f3fc>] stack_done+0x20/0x44
>
> BUG: using smp_processor_id() in preemptible [00000000] code: insmod/99
> </log>
>
> Signed-off-by: Jerin Jacob <jerinjacobk@xxxxxxxxx>
> ---
>  arch/mips/mm/dma-default.c |    4 ++--
>  1 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/arch/mips/mm/dma-default.c b/arch/mips/mm/dma-default.c
> index aaccf1c..2f26835 100644
> --- a/arch/mips/mm/dma-default.c
> +++ b/arch/mips/mm/dma-default.c
> @@ -58,8 +58,8 @@ static inline struct page *dma_addr_to_page(struct device *dev,
>  static inline int cpu_is_noncoherent_r10000(struct device *dev)
>  {
>         return !plat_device_is_coherent(dev) &&
> -              (current_cpu_type() == CPU_R10000 ||
> -              current_cpu_type() == CPU_R12000);
> +              (boot_cpu_type() == CPU_R10000 ||
> +              boot_cpu_type() == CPU_R12000);
>  }
>
>  static gfp_t massage_gfp_flags(const struct device *dev, gfp_t gfp)
> --
> 1.7.6.5
>
>



-- 
Florian


[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux