Patch "net/qla3xxx: fix schedule while atomic in ql_sem_spinlock" has been added to the 4.14-stable tree

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

 



This is a note to let you know that I've just added the patch titled

    net/qla3xxx: fix schedule while atomic in ql_sem_spinlock

to the 4.14-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     net-qla3xxx-fix-schedule-while-atomic-in-ql_sem_spin.patch
and it can be found in the queue-4.14 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit a729954fbc7d2899723fba67f3ddbef2189be994
Author: Zheyu Ma <zheyuma97@xxxxxxxxx>
Date:   Thu May 20 12:32:36 2021 +0000

    net/qla3xxx: fix schedule while atomic in ql_sem_spinlock
    
    [ Upstream commit 13a6f3153922391e90036ba2267d34eed63196fc ]
    
    When calling the 'ql_sem_spinlock', the driver has already acquired the
    spin lock, so the driver should not call 'ssleep' in atomic context.
    
    This bug can be fixed by using 'mdelay' instead of 'ssleep'.
    
    The KASAN's log reveals it:
    
    [    3.238124 ] BUG: scheduling while atomic: swapper/0/1/0x00000002
    [    3.238748 ] 2 locks held by swapper/0/1:
    [    3.239151 ]  #0: ffff88810177b240 (&dev->mutex){....}-{3:3}, at:
    __device_driver_lock+0x41/0x60
    [    3.240026 ]  #1: ffff888107c60e28 (&qdev->hw_lock){....}-{2:2}, at:
    ql3xxx_probe+0x2aa/0xea0
    [    3.240873 ] Modules linked in:
    [    3.241187 ] irq event stamp: 460854
    [    3.241541 ] hardirqs last  enabled at (460853): [<ffffffff843051bf>]
    _raw_spin_unlock_irqrestore+0x4f/0x70
    [    3.242245 ] hardirqs last disabled at (460854): [<ffffffff843058ca>]
    _raw_spin_lock_irqsave+0x2a/0x70
    [    3.242245 ] softirqs last  enabled at (446076): [<ffffffff846002e4>]
    __do_softirq+0x2e4/0x4b1
    [    3.242245 ] softirqs last disabled at (446069): [<ffffffff811ba5e0>]
    irq_exit_rcu+0x100/0x110
    [    3.242245 ] Preemption disabled at:
    [    3.242245 ] [<ffffffff828ca5ba>] ql3xxx_probe+0x2aa/0xea0
    [    3.242245 ] Kernel panic - not syncing: scheduling while atomic
    [    3.242245 ] CPU: 2 PID: 1 Comm: swapper/0 Not tainted
    5.13.0-rc1-00145
    -gee7dc339169-dirty #16
    [    3.242245 ] Call Trace:
    [    3.242245 ]  dump_stack+0xba/0xf5
    [    3.242245 ]  ? ql3xxx_probe+0x1f0/0xea0
    [    3.242245 ]  panic+0x15a/0x3f2
    [    3.242245 ]  ? vprintk+0x76/0x150
    [    3.242245 ]  ? ql3xxx_probe+0x2aa/0xea0
    [    3.242245 ]  __schedule_bug+0xae/0xe0
    [    3.242245 ]  __schedule+0x72e/0xa00
    [    3.242245 ]  schedule+0x43/0xf0
    [    3.242245 ]  schedule_timeout+0x28b/0x500
    [    3.242245 ]  ? del_timer_sync+0xf0/0xf0
    [    3.242245 ]  ? msleep+0x2f/0x70
    [    3.242245 ]  msleep+0x59/0x70
    [    3.242245 ]  ql3xxx_probe+0x307/0xea0
    [    3.242245 ]  ? _raw_spin_unlock_irqrestore+0x3a/0x70
    [    3.242245 ]  ? pci_device_remove+0x110/0x110
    [    3.242245 ]  local_pci_probe+0x45/0xa0
    [    3.242245 ]  pci_device_probe+0x12b/0x1d0
    [    3.242245 ]  really_probe+0x2a9/0x610
    [    3.242245 ]  driver_probe_device+0x90/0x1d0
    [    3.242245 ]  ? mutex_lock_nested+0x1b/0x20
    [    3.242245 ]  device_driver_attach+0x68/0x70
    [    3.242245 ]  __driver_attach+0x124/0x1b0
    [    3.242245 ]  ? device_driver_attach+0x70/0x70
    [    3.242245 ]  bus_for_each_dev+0xbb/0x110
    [    3.242245 ]  ? rdinit_setup+0x45/0x45
    [    3.242245 ]  driver_attach+0x27/0x30
    [    3.242245 ]  bus_add_driver+0x1eb/0x2a0
    [    3.242245 ]  driver_register+0xa9/0x180
    [    3.242245 ]  __pci_register_driver+0x82/0x90
    [    3.242245 ]  ? yellowfin_init+0x25/0x25
    [    3.242245 ]  ql3xxx_driver_init+0x23/0x25
    [    3.242245 ]  do_one_initcall+0x7f/0x3d0
    [    3.242245 ]  ? rdinit_setup+0x45/0x45
    [    3.242245 ]  ? rcu_read_lock_sched_held+0x4f/0x80
    [    3.242245 ]  kernel_init_freeable+0x2aa/0x301
    [    3.242245 ]  ? rest_init+0x2c0/0x2c0
    [    3.242245 ]  kernel_init+0x18/0x190
    [    3.242245 ]  ? rest_init+0x2c0/0x2c0
    [    3.242245 ]  ? rest_init+0x2c0/0x2c0
    [    3.242245 ]  ret_from_fork+0x1f/0x30
    [    3.242245 ] Dumping ftrace buffer:
    [    3.242245 ]    (ftrace buffer empty)
    [    3.242245 ] Kernel Offset: disabled
    [    3.242245 ] Rebooting in 1 seconds.
    
    Reported-by: Zheyu Ma <zheyuma97@xxxxxxxxx>
    Signed-off-by: Zheyu Ma <zheyuma97@xxxxxxxxx>
    Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/ethernet/qlogic/qla3xxx.c b/drivers/net/ethernet/qlogic/qla3xxx.c
index cc53ee26bd3e..a8bb061e1a8a 100644
--- a/drivers/net/ethernet/qlogic/qla3xxx.c
+++ b/drivers/net/ethernet/qlogic/qla3xxx.c
@@ -115,7 +115,7 @@ static int ql_sem_spinlock(struct ql3_adapter *qdev,
 		value = readl(&port_regs->CommonRegs.semaphoreReg);
 		if ((value & (sem_mask >> 16)) == sem_bits)
 			return 0;
-		ssleep(1);
+		mdelay(1000);
 	} while (--seconds);
 	return -1;
 }



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux