From: 黄涛 Date: Tue, 12 Oct 2010 09:48:27 +0000 (+0800) Subject: spi_gpio: fix sleep in atomic X-Git-Tag: firefly_0821_release~11069 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=1a48e7059e47f3bcda5f89ed706499e781c30314;p=firefly-linux-kernel-4.4.55.git spi_gpio: fix sleep in atomic fix this bug: BUG: sleeping function called from invalid context at mm/slab.c:3018 in_atomic(): 1, irqs_disabled(): 128, pid: 1, name: swapper 1 lock held by swapper/1: #0: (&gpio_lock_class#2){......}, at: [] __setup_irq+0xe4/0x320 [] (unwind_backtrace+0x0/0xdc) from [] (dump_stack+0x18/0x1c) [] (dump_stack+0x18/0x1c) from [] (__might_sleep+0x124/0x144) [] (__might_sleep+0x124/0x144) from [] (kmem_cache_alloc+0x44/0x62c) [] (kmem_cache_alloc+0x44/0x62c) from [] (spi_gpio_irq_set_type+0x2c/0xac) [] (spi_gpio_irq_set_type+0x2c/0xac) from [] (__irq_set_trigger+0x3c/0x8c) [] (__irq_set_trigger+0x3c/0x8c) from [] (__setup_irq+0x158/0x320) [] (__setup_irq+0x158/0x320) from [] (request_threaded_irq+0xe4/0x130) [] (request_threaded_irq+0xe4/0x130) from [] (rockchip_headsetobserve_probe+0xdc/0x114) [] (rockchip_headsetobserve_probe+0xdc/0x114) from [] (platform_drv_probe+0x20/0x24) [] (platform_drv_probe+0x20/0x24) from [] (driver_probe_device+0xb0/0x160) [] (driver_probe_device+0xb0/0x160) from [] (__driver_attach+0x68/0x8c) [] (__driver_attach+0x68/0x8c) from [] (bus_for_each_dev+0x54/0x94) [] (bus_for_each_dev+0x54/0x94) from [] (driver_attach+0x20/0x28) [] (driver_attach+0x20/0x28) from [] (bus_add_driver+0xa8/0x240) [] (bus_add_driver+0xa8/0x240) from [] (driver_register+0xb0/0x140) [] (driver_register+0xb0/0x140) from [] (platform_driver_register+0x4c/0x60) [] (platform_driver_register+0x4c/0x60) from [] (rockchip_headsetobserve_init+0x14/0x20) [] (rockchip_headsetobserve_init+0x14/0x20) from [] (do_one_initcall+0x64/0x1c0) [] (do_one_initcall+0x64/0x1c0) from [] (kernel_init+0xa4/0x11c) [] (kernel_init+0xa4/0x11c) from [] (kernel_thread_exit+0x0/0x8) --- diff --git a/drivers/fpga/spi_gpio.c b/drivers/fpga/spi_gpio.c index 8d4de9e36b25..06620ca56fa5 100755 --- a/drivers/fpga/spi_gpio.c +++ b/drivers/fpga/spi_gpio.c @@ -1050,7 +1050,7 @@ static int spi_gpio_irq_set_type(unsigned int irq, unsigned int type) struct spi_fpga_port *port = pFpgaPort; struct spi_gpio_irq_transfer *t; unsigned long flags; - t = kzalloc(sizeof(struct spi_gpio_irq_transfer), GFP_KERNEL); + t = kzalloc(sizeof(struct spi_gpio_irq_transfer), GFP_ATOMIC); if (!t) { printk("err:%s:ENOMEM\n",__FUNCTION__);