diff mbox

mmc: block: Delete gendisk before cleaning up the request queue

Message ID 1521704940-45406-1-git-send-email-shawn.lin@rock-chips.com (mailing list archive)
State New, archived
Headers show

Commit Message

Shawn Lin March 22, 2018, 7:49 a.m. UTC
dd if=/dev/urandom of=/dev/mmcblk1 bs=4k count=10000
with a SD card hotplug during transfer reports a warning below:

Remove the disk, partition and bdi sysfs attributes before cleaning
up the request queue associated with the disk.

[  410.331226] mmc1: card 59b4 removed
[  410.348583] WARNING: CPU: 0 PID: 5 at block/blk-core.c:785
blk_cleanup_queue+0x138/0x140
[  410.349294] Modules linked in:
[  410.349570] CPU: 0 PID: 5 Comm: kworker/0:0 Not tainted
4.16.0-rc6-next-20180321-00004-gc2ad6a7 #263
[  410.350363] Hardware name: Excavator-RK3399 Board (DT)
[  410.350819] Workqueue: events_freezable mmc_rescan
[  410.351242] pstate: 60000005 (nZCv daif -PAN -UAO)
[  410.351663] pc : blk_cleanup_queue+0x138/0x140
[  410.352054] lr : blk_cleanup_queue+0xac/0x140
[  410.352436] sp : ffff0000092cbb90
[  410.352727] x29: ffff0000092cbb90 x28: 0000000000000000
[  410.353195] x27: ffff8000f6f23030 x26: ffff00000904e610
[  410.353662] x25: ffff8000f17cc808 x24: ffff8000f1038200
[  410.354128] x23: 0000000000000060 x22: 0000000000000000
[  410.354595] x21: ffff8000f11748d8 x20: ffff8000f1038200
[  410.355061] x19: ffff8000f1174200 x18: 0000ffff936347d8
[  410.355528] x17: 0000ffff935b93c0 x16: ffff0000081263f8
[  410.355994] x15: 0000000000000000 x14: 0000000000000400
[  410.356461] x13: 0000000000000001 x12: 0000000000000001
[  410.356927] x11: 0000000000000040 x10: ffff8000f2400028
[  410.357393] x9 : ffff8000f2400040 x8 : 0000000000000000
[  410.357860] x7 : ffff8000f6f3a340 x6 : ffff8000f6f3a340
[  410.358326] x5 : ffff8000f2400000 x4 : ffff8000f6f3a340
[  410.358792] x3 : 0000000000000000 x2 : 39c1333e45670800
[  410.359259] x1 : 0000000000000000 x0 : 0000000000000003
[  410.359726] Call trace:
[  410.359943]  blk_cleanup_queue+0x138/0x140
[  410.360305]  mmc_cleanup_queue+0x2c/0x48
[  410.360652]  mmc_blk_remove_req+0x1c/0x98
[  410.361005]  mmc_blk_remove+0x180/0x1c0
[  410.361343]  mmc_bus_remove+0x1c/0x28
[  410.361670]  device_release_driver_internal+0x154/0x1f0
[  410.362128]  device_release_driver+0x14/0x20
[  410.362504]  bus_remove_device+0xc8/0x108
[  410.362858]  device_del+0x120/0x350
[  410.363167]  mmc_remove_card+0x5c/0xb8
[  410.363498]  mmc_sd_detect+0x40/0x78
[  410.363813]  mmc_rescan+0x19c/0x368
[  410.364123]  process_one_work+0x1ac/0x318
[  410.364477]  worker_thread+0x50/0x450
[  410.364801]  kthread+0xf8/0x128
[  410.365081]  ret_from_fork+0x10/0x18
[  410.365395] ---[ end trace 268e87a46c28968c ]---

Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
---

 drivers/mmc/core/block.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Adrian Hunter March 22, 2018, 8:26 a.m. UTC | #1
On 22/03/18 09:49, Shawn Lin wrote:
> dd if=/dev/urandom of=/dev/mmcblk1 bs=4k count=10000
> with a SD card hotplug during transfer reports a warning below:

What kernel version / commit was it?

> 
> Remove the disk, partition and bdi sysfs attributes before cleaning
> up the request queue associated with the disk.
> 
> [  410.331226] mmc1: card 59b4 removed
> [  410.348583] WARNING: CPU: 0 PID: 5 at block/blk-core.c:785
> blk_cleanup_queue+0x138/0x140
> [  410.349294] Modules linked in:
> [  410.349570] CPU: 0 PID: 5 Comm: kworker/0:0 Not tainted
> 4.16.0-rc6-next-20180321-00004-gc2ad6a7 #263
> [  410.350363] Hardware name: Excavator-RK3399 Board (DT)
> [  410.350819] Workqueue: events_freezable mmc_rescan
> [  410.351242] pstate: 60000005 (nZCv daif -PAN -UAO)
> [  410.351663] pc : blk_cleanup_queue+0x138/0x140
> [  410.352054] lr : blk_cleanup_queue+0xac/0x140
> [  410.352436] sp : ffff0000092cbb90
> [  410.352727] x29: ffff0000092cbb90 x28: 0000000000000000
> [  410.353195] x27: ffff8000f6f23030 x26: ffff00000904e610
> [  410.353662] x25: ffff8000f17cc808 x24: ffff8000f1038200
> [  410.354128] x23: 0000000000000060 x22: 0000000000000000
> [  410.354595] x21: ffff8000f11748d8 x20: ffff8000f1038200
> [  410.355061] x19: ffff8000f1174200 x18: 0000ffff936347d8
> [  410.355528] x17: 0000ffff935b93c0 x16: ffff0000081263f8
> [  410.355994] x15: 0000000000000000 x14: 0000000000000400
> [  410.356461] x13: 0000000000000001 x12: 0000000000000001
> [  410.356927] x11: 0000000000000040 x10: ffff8000f2400028
> [  410.357393] x9 : ffff8000f2400040 x8 : 0000000000000000
> [  410.357860] x7 : ffff8000f6f3a340 x6 : ffff8000f6f3a340
> [  410.358326] x5 : ffff8000f2400000 x4 : ffff8000f6f3a340
> [  410.358792] x3 : 0000000000000000 x2 : 39c1333e45670800
> [  410.359259] x1 : 0000000000000000 x0 : 0000000000000003
> [  410.359726] Call trace:
> [  410.359943]  blk_cleanup_queue+0x138/0x140
> [  410.360305]  mmc_cleanup_queue+0x2c/0x48
> [  410.360652]  mmc_blk_remove_req+0x1c/0x98
> [  410.361005]  mmc_blk_remove+0x180/0x1c0
> [  410.361343]  mmc_bus_remove+0x1c/0x28
> [  410.361670]  device_release_driver_internal+0x154/0x1f0
> [  410.362128]  device_release_driver+0x14/0x20
> [  410.362504]  bus_remove_device+0xc8/0x108
> [  410.362858]  device_del+0x120/0x350
> [  410.363167]  mmc_remove_card+0x5c/0xb8
> [  410.363498]  mmc_sd_detect+0x40/0x78
> [  410.363813]  mmc_rescan+0x19c/0x368
> [  410.364123]  process_one_work+0x1ac/0x318
> [  410.364477]  worker_thread+0x50/0x450
> [  410.364801]  kthread+0xf8/0x128
> [  410.365081]  ret_from_fork+0x10/0x18
> [  410.365395] ---[ end trace 268e87a46c28968c ]---
> 
> Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
> ---
> 
>  drivers/mmc/core/block.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
> index a2b9c25..02485e3 100644
> --- a/drivers/mmc/core/block.c
> +++ b/drivers/mmc/core/block.c
> @@ -2659,7 +2659,6 @@ static void mmc_blk_remove_req(struct mmc_blk_data *md)
>  		 * from being accepted.
>  		 */
>  		card = md->queue.card;
> -		mmc_cleanup_queue(&md->queue);
>  		if (md->disk->flags & GENHD_FL_UP) {
>  			device_remove_file(disk_to_dev(md->disk), &md->force_ro);
>  			if ((md->area_type & MMC_BLK_DATA_AREA_BOOT) &&
> @@ -2669,6 +2668,7 @@ static void mmc_blk_remove_req(struct mmc_blk_data *md)
>  
>  			del_gendisk(md->disk);
>  		}
> +		mmc_cleanup_queue(&md->queue);
>  		mmc_blk_put(md);
>  	}
>  }
>
Shawn Lin March 22, 2018, 8:43 a.m. UTC | #2
On 2018/3/22 16:26, Adrian Hunter wrote:
> On 22/03/18 09:49, Shawn Lin wrote:
>> dd if=/dev/urandom of=/dev/mmcblk1 bs=4k count=10000
>> with a SD card hotplug during transfer reports a warning below:
> 
> What kernel version / commit was it?

Actually the log below has it, it is clean : 4.16.0-rc6-next-20180321

> 
>>
>> Remove the disk, partition and bdi sysfs attributes before cleaning
>> up the request queue associated with the disk.
>>
>> [  410.331226] mmc1: card 59b4 removed
>> [  410.348583] WARNING: CPU: 0 PID: 5 at block/blk-core.c:785
>> blk_cleanup_queue+0x138/0x140
>> [  410.349294] Modules linked in:
>> [  410.349570] CPU: 0 PID: 5 Comm: kworker/0:0 Not tainted
>> 4.16.0-rc6-next-20180321-00004-gc2ad6a7 #263
>> [  410.350363] Hardware name: Excavator-RK3399 Board (DT)
>> [  410.350819] Workqueue: events_freezable mmc_rescan
>> [  410.351242] pstate: 60000005 (nZCv daif -PAN -UAO)
>> [  410.351663] pc : blk_cleanup_queue+0x138/0x140
>> [  410.352054] lr : blk_cleanup_queue+0xac/0x140
>> [  410.352436] sp : ffff0000092cbb90
>> [  410.352727] x29: ffff0000092cbb90 x28: 0000000000000000
>> [  410.353195] x27: ffff8000f6f23030 x26: ffff00000904e610
>> [  410.353662] x25: ffff8000f17cc808 x24: ffff8000f1038200
>> [  410.354128] x23: 0000000000000060 x22: 0000000000000000
>> [  410.354595] x21: ffff8000f11748d8 x20: ffff8000f1038200
>> [  410.355061] x19: ffff8000f1174200 x18: 0000ffff936347d8
>> [  410.355528] x17: 0000ffff935b93c0 x16: ffff0000081263f8
>> [  410.355994] x15: 0000000000000000 x14: 0000000000000400
>> [  410.356461] x13: 0000000000000001 x12: 0000000000000001
>> [  410.356927] x11: 0000000000000040 x10: ffff8000f2400028
>> [  410.357393] x9 : ffff8000f2400040 x8 : 0000000000000000
>> [  410.357860] x7 : ffff8000f6f3a340 x6 : ffff8000f6f3a340
>> [  410.358326] x5 : ffff8000f2400000 x4 : ffff8000f6f3a340
>> [  410.358792] x3 : 0000000000000000 x2 : 39c1333e45670800
>> [  410.359259] x1 : 0000000000000000 x0 : 0000000000000003
>> [  410.359726] Call trace:
>> [  410.359943]  blk_cleanup_queue+0x138/0x140
>> [  410.360305]  mmc_cleanup_queue+0x2c/0x48
>> [  410.360652]  mmc_blk_remove_req+0x1c/0x98
>> [  410.361005]  mmc_blk_remove+0x180/0x1c0
>> [  410.361343]  mmc_bus_remove+0x1c/0x28
>> [  410.361670]  device_release_driver_internal+0x154/0x1f0
>> [  410.362128]  device_release_driver+0x14/0x20
>> [  410.362504]  bus_remove_device+0xc8/0x108
>> [  410.362858]  device_del+0x120/0x350
>> [  410.363167]  mmc_remove_card+0x5c/0xb8
>> [  410.363498]  mmc_sd_detect+0x40/0x78
>> [  410.363813]  mmc_rescan+0x19c/0x368
>> [  410.364123]  process_one_work+0x1ac/0x318
>> [  410.364477]  worker_thread+0x50/0x450
>> [  410.364801]  kthread+0xf8/0x128
>> [  410.365081]  ret_from_fork+0x10/0x18
>> [  410.365395] ---[ end trace 268e87a46c28968c ]---
>>
>> Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
>> ---
>>
>>   drivers/mmc/core/block.c | 2 +-
>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
>> index a2b9c25..02485e3 100644
>> --- a/drivers/mmc/core/block.c
>> +++ b/drivers/mmc/core/block.c
>> @@ -2659,7 +2659,6 @@ static void mmc_blk_remove_req(struct mmc_blk_data *md)
>>   		 * from being accepted.
>>   		 */
>>   		card = md->queue.card;
>> -		mmc_cleanup_queue(&md->queue);
>>   		if (md->disk->flags & GENHD_FL_UP) {
>>   			device_remove_file(disk_to_dev(md->disk), &md->force_ro);
>>   			if ((md->area_type & MMC_BLK_DATA_AREA_BOOT) &&
>> @@ -2669,6 +2668,7 @@ static void mmc_blk_remove_req(struct mmc_blk_data *md)
>>   
>>   			del_gendisk(md->disk);
>>   		}
>> +		mmc_cleanup_queue(&md->queue);
>>   		mmc_blk_put(md);
>>   	}
>>   }
>>
> 
> 
> 
>
Adrian Hunter March 22, 2018, 9:31 a.m. UTC | #3
On 22/03/18 10:43, Shawn Lin wrote:
> On 2018/3/22 16:26, Adrian Hunter wrote:
>> On 22/03/18 09:49, Shawn Lin wrote:
>>> dd if=/dev/urandom of=/dev/mmcblk1 bs=4k count=10000
>>> with a SD card hotplug during transfer reports a warning below:
>>
>> What kernel version / commit was it?
> 
> Actually the log below has it, it is clean : 4.16.0-rc6-next-20180321

Ok so it seems to be coming from this patch in next:

commit a063057d7c731cffa7d10740e8ebc2970df8dbb3
Author: Bart Van Assche <bart.vanassche@wdc.com>
Date:   Wed Feb 28 10:15:33 2018 -0800

    block: Fix a race between request queue removal and the block cgroup controller

    Avoid that the following race can occur:

    blk_cleanup_queue()               blkcg_print_blkgs()
      spin_lock_irq(lock) (1)           spin_lock_irq(blkg->q->queue_lock) (2,5)
        q->queue_lock = &q->__queue_lock (3)
      spin_unlock_irq(lock) (4)
                                        spin_unlock_irq(blkg->q->queue_lock) (6)

    (1) take driver lock;
    (2) busy loop for driver lock;
    (3) override driver lock with internal lock;
    (4) unlock driver lock;
    (5) can take driver lock now;
    (6) but unlock internal lock.

    This change is safe because only the SCSI core and the NVME core keep
    a reference on a request queue after having called blk_cleanup_queue().
    Neither driver accesses any of the removed data structures between its
    blk_cleanup_queue() and blk_put_queue() calls.

    Reported-by: Joseph Qi <joseph.qi@linux.alibaba.com>
    Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com>
    Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com>
    Cc: Jan Kara <jack@suse.com>
    Signed-off-by: Jens Axboe <axboe@kernel.dk>


> 
>>
>>>
>>> Remove the disk, partition and bdi sysfs attributes before cleaning
>>> up the request queue associated with the disk.
>>>
>>> [  410.331226] mmc1: card 59b4 removed
>>> [  410.348583] WARNING: CPU: 0 PID: 5 at block/blk-core.c:785
>>> blk_cleanup_queue+0x138/0x140
>>> [  410.349294] Modules linked in:
>>> [  410.349570] CPU: 0 PID: 5 Comm: kworker/0:0 Not tainted
>>> 4.16.0-rc6-next-20180321-00004-gc2ad6a7 #263
>>> [  410.350363] Hardware name: Excavator-RK3399 Board (DT)
>>> [  410.350819] Workqueue: events_freezable mmc_rescan
>>> [  410.351242] pstate: 60000005 (nZCv daif -PAN -UAO)
>>> [  410.351663] pc : blk_cleanup_queue+0x138/0x140
>>> [  410.352054] lr : blk_cleanup_queue+0xac/0x140
>>> [  410.352436] sp : ffff0000092cbb90
>>> [  410.352727] x29: ffff0000092cbb90 x28: 0000000000000000
>>> [  410.353195] x27: ffff8000f6f23030 x26: ffff00000904e610
>>> [  410.353662] x25: ffff8000f17cc808 x24: ffff8000f1038200
>>> [  410.354128] x23: 0000000000000060 x22: 0000000000000000
>>> [  410.354595] x21: ffff8000f11748d8 x20: ffff8000f1038200
>>> [  410.355061] x19: ffff8000f1174200 x18: 0000ffff936347d8
>>> [  410.355528] x17: 0000ffff935b93c0 x16: ffff0000081263f8
>>> [  410.355994] x15: 0000000000000000 x14: 0000000000000400
>>> [  410.356461] x13: 0000000000000001 x12: 0000000000000001
>>> [  410.356927] x11: 0000000000000040 x10: ffff8000f2400028
>>> [  410.357393] x9 : ffff8000f2400040 x8 : 0000000000000000
>>> [  410.357860] x7 : ffff8000f6f3a340 x6 : ffff8000f6f3a340
>>> [  410.358326] x5 : ffff8000f2400000 x4 : ffff8000f6f3a340
>>> [  410.358792] x3 : 0000000000000000 x2 : 39c1333e45670800
>>> [  410.359259] x1 : 0000000000000000 x0 : 0000000000000003
>>> [  410.359726] Call trace:
>>> [  410.359943]  blk_cleanup_queue+0x138/0x140
>>> [  410.360305]  mmc_cleanup_queue+0x2c/0x48
>>> [  410.360652]  mmc_blk_remove_req+0x1c/0x98
>>> [  410.361005]  mmc_blk_remove+0x180/0x1c0
>>> [  410.361343]  mmc_bus_remove+0x1c/0x28
>>> [  410.361670]  device_release_driver_internal+0x154/0x1f0
>>> [  410.362128]  device_release_driver+0x14/0x20
>>> [  410.362504]  bus_remove_device+0xc8/0x108
>>> [  410.362858]  device_del+0x120/0x350
>>> [  410.363167]  mmc_remove_card+0x5c/0xb8
>>> [  410.363498]  mmc_sd_detect+0x40/0x78
>>> [  410.363813]  mmc_rescan+0x19c/0x368
>>> [  410.364123]  process_one_work+0x1ac/0x318
>>> [  410.364477]  worker_thread+0x50/0x450
>>> [  410.364801]  kthread+0xf8/0x128
>>> [  410.365081]  ret_from_fork+0x10/0x18
>>> [  410.365395] ---[ end trace 268e87a46c28968c ]---
>>>
>>> Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
>>> ---
>>>
>>>   drivers/mmc/core/block.c | 2 +-
>>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
>>> index a2b9c25..02485e3 100644
>>> --- a/drivers/mmc/core/block.c
>>> +++ b/drivers/mmc/core/block.c
>>> @@ -2659,7 +2659,6 @@ static void mmc_blk_remove_req(struct mmc_blk_data
>>> *md)
>>>            * from being accepted.
>>>            */
>>>           card = md->queue.card;
>>> -        mmc_cleanup_queue(&md->queue);
>>>           if (md->disk->flags & GENHD_FL_UP) {
>>>               device_remove_file(disk_to_dev(md->disk), &md->force_ro);
>>>               if ((md->area_type & MMC_BLK_DATA_AREA_BOOT) &&
>>> @@ -2669,6 +2668,7 @@ static void mmc_blk_remove_req(struct mmc_blk_data
>>> *md)
>>>                 del_gendisk(md->disk);
>>>           }
>>> +        mmc_cleanup_queue(&md->queue);
>>>           mmc_blk_put(md);
>>>       }
>>>   }
>>>
>>
>>
>>
>>
> 
>
Ulf Hansson March 22, 2018, 9:47 a.m. UTC | #4
On 22 March 2018 at 10:31, Adrian Hunter <adrian.hunter@intel.com> wrote:
> On 22/03/18 10:43, Shawn Lin wrote:
>> On 2018/3/22 16:26, Adrian Hunter wrote:
>>> On 22/03/18 09:49, Shawn Lin wrote:
>>>> dd if=/dev/urandom of=/dev/mmcblk1 bs=4k count=10000
>>>> with a SD card hotplug during transfer reports a warning below:
>>>
>>> What kernel version / commit was it?
>>
>> Actually the log below has it, it is clean : 4.16.0-rc6-next-20180321
>
> Ok so it seems to be coming from this patch in next:
>
> commit a063057d7c731cffa7d10740e8ebc2970df8dbb3
> Author: Bart Van Assche <bart.vanassche@wdc.com>
> Date:   Wed Feb 28 10:15:33 2018 -0800
>
>     block: Fix a race between request queue removal and the block cgroup controller
>
>     Avoid that the following race can occur:
>
>     blk_cleanup_queue()               blkcg_print_blkgs()
>       spin_lock_irq(lock) (1)           spin_lock_irq(blkg->q->queue_lock) (2,5)
>         q->queue_lock = &q->__queue_lock (3)
>       spin_unlock_irq(lock) (4)
>                                         spin_unlock_irq(blkg->q->queue_lock) (6)
>
>     (1) take driver lock;
>     (2) busy loop for driver lock;
>     (3) override driver lock with internal lock;
>     (4) unlock driver lock;
>     (5) can take driver lock now;
>     (6) but unlock internal lock.
>
>     This change is safe because only the SCSI core and the NVME core keep
>     a reference on a request queue after having called blk_cleanup_queue().
>     Neither driver accesses any of the removed data structures between its
>     blk_cleanup_queue() and blk_put_queue() calls.
>
>     Reported-by: Joseph Qi <joseph.qi@linux.alibaba.com>
>     Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com>
>     Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com>
>     Cc: Jan Kara <jack@suse.com>
>     Signed-off-by: Jens Axboe <axboe@kernel.dk>

Looks like a reasonable analyze!

Shawn, could you please re-post your patch to linux-block, Jens,
cc:mmc-list, me and Adrian.

I think the patch should be picked up by Jens and go via his tree.

Kind regards
Uffe

>
>
>>
>>>
>>>>
>>>> Remove the disk, partition and bdi sysfs attributes before cleaning
>>>> up the request queue associated with the disk.
>>>>
>>>> [  410.331226] mmc1: card 59b4 removed
>>>> [  410.348583] WARNING: CPU: 0 PID: 5 at block/blk-core.c:785
>>>> blk_cleanup_queue+0x138/0x140
>>>> [  410.349294] Modules linked in:
>>>> [  410.349570] CPU: 0 PID: 5 Comm: kworker/0:0 Not tainted
>>>> 4.16.0-rc6-next-20180321-00004-gc2ad6a7 #263
>>>> [  410.350363] Hardware name: Excavator-RK3399 Board (DT)
>>>> [  410.350819] Workqueue: events_freezable mmc_rescan
>>>> [  410.351242] pstate: 60000005 (nZCv daif -PAN -UAO)
>>>> [  410.351663] pc : blk_cleanup_queue+0x138/0x140
>>>> [  410.352054] lr : blk_cleanup_queue+0xac/0x140
>>>> [  410.352436] sp : ffff0000092cbb90
>>>> [  410.352727] x29: ffff0000092cbb90 x28: 0000000000000000
>>>> [  410.353195] x27: ffff8000f6f23030 x26: ffff00000904e610
>>>> [  410.353662] x25: ffff8000f17cc808 x24: ffff8000f1038200
>>>> [  410.354128] x23: 0000000000000060 x22: 0000000000000000
>>>> [  410.354595] x21: ffff8000f11748d8 x20: ffff8000f1038200
>>>> [  410.355061] x19: ffff8000f1174200 x18: 0000ffff936347d8
>>>> [  410.355528] x17: 0000ffff935b93c0 x16: ffff0000081263f8
>>>> [  410.355994] x15: 0000000000000000 x14: 0000000000000400
>>>> [  410.356461] x13: 0000000000000001 x12: 0000000000000001
>>>> [  410.356927] x11: 0000000000000040 x10: ffff8000f2400028
>>>> [  410.357393] x9 : ffff8000f2400040 x8 : 0000000000000000
>>>> [  410.357860] x7 : ffff8000f6f3a340 x6 : ffff8000f6f3a340
>>>> [  410.358326] x5 : ffff8000f2400000 x4 : ffff8000f6f3a340
>>>> [  410.358792] x3 : 0000000000000000 x2 : 39c1333e45670800
>>>> [  410.359259] x1 : 0000000000000000 x0 : 0000000000000003
>>>> [  410.359726] Call trace:
>>>> [  410.359943]  blk_cleanup_queue+0x138/0x140
>>>> [  410.360305]  mmc_cleanup_queue+0x2c/0x48
>>>> [  410.360652]  mmc_blk_remove_req+0x1c/0x98
>>>> [  410.361005]  mmc_blk_remove+0x180/0x1c0
>>>> [  410.361343]  mmc_bus_remove+0x1c/0x28
>>>> [  410.361670]  device_release_driver_internal+0x154/0x1f0
>>>> [  410.362128]  device_release_driver+0x14/0x20
>>>> [  410.362504]  bus_remove_device+0xc8/0x108
>>>> [  410.362858]  device_del+0x120/0x350
>>>> [  410.363167]  mmc_remove_card+0x5c/0xb8
>>>> [  410.363498]  mmc_sd_detect+0x40/0x78
>>>> [  410.363813]  mmc_rescan+0x19c/0x368
>>>> [  410.364123]  process_one_work+0x1ac/0x318
>>>> [  410.364477]  worker_thread+0x50/0x450
>>>> [  410.364801]  kthread+0xf8/0x128
>>>> [  410.365081]  ret_from_fork+0x10/0x18
>>>> [  410.365395] ---[ end trace 268e87a46c28968c ]---
>>>>
>>>> Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
>>>> ---
>>>>
>>>>   drivers/mmc/core/block.c | 2 +-
>>>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>>>
>>>> diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
>>>> index a2b9c25..02485e3 100644
>>>> --- a/drivers/mmc/core/block.c
>>>> +++ b/drivers/mmc/core/block.c
>>>> @@ -2659,7 +2659,6 @@ static void mmc_blk_remove_req(struct mmc_blk_data
>>>> *md)
>>>>            * from being accepted.
>>>>            */
>>>>           card = md->queue.card;
>>>> -        mmc_cleanup_queue(&md->queue);
>>>>           if (md->disk->flags & GENHD_FL_UP) {
>>>>               device_remove_file(disk_to_dev(md->disk), &md->force_ro);
>>>>               if ((md->area_type & MMC_BLK_DATA_AREA_BOOT) &&
>>>> @@ -2669,6 +2668,7 @@ static void mmc_blk_remove_req(struct mmc_blk_data
>>>> *md)
>>>>                 del_gendisk(md->disk);
>>>>           }
>>>> +        mmc_cleanup_queue(&md->queue);
>>>>           mmc_blk_put(md);
>>>>       }
>>>>   }
>>>>
>>>
>>>
>>>
>>>
>>
>>
>
Shawn Lin March 22, 2018, 11:04 a.m. UTC | #5
在 2018/3/22 17:47, Ulf Hansson 写道:
> On 22 March 2018 at 10:31, Adrian Hunter <adrian.hunter@intel.com> wrote:
>> On 22/03/18 10:43, Shawn Lin wrote:
>>> On 2018/3/22 16:26, Adrian Hunter wrote:
>>>> On 22/03/18 09:49, Shawn Lin wrote:
>>>>> dd if=/dev/urandom of=/dev/mmcblk1 bs=4k count=10000
>>>>> with a SD card hotplug during transfer reports a warning below:
>>>>
>>>> What kernel version / commit was it?
>>>
>>> Actually the log below has it, it is clean : 4.16.0-rc6-next-20180321
>>
>> Ok so it seems to be coming from this patch in next:
>>
>> commit a063057d7c731cffa7d10740e8ebc2970df8dbb3
>> Author: Bart Van Assche <bart.vanassche@wdc.com>
>> Date:   Wed Feb 28 10:15:33 2018 -0800
>>
>>      block: Fix a race between request queue removal and the block cgroup controller
>>
>>      Avoid that the following race can occur:
>>
>>      blk_cleanup_queue()               blkcg_print_blkgs()
>>        spin_lock_irq(lock) (1)           spin_lock_irq(blkg->q->queue_lock) (2,5)
>>          q->queue_lock = &q->__queue_lock (3)
>>        spin_unlock_irq(lock) (4)
>>                                          spin_unlock_irq(blkg->q->queue_lock) (6)
>>
>>      (1) take driver lock;
>>      (2) busy loop for driver lock;
>>      (3) override driver lock with internal lock;
>>      (4) unlock driver lock;
>>      (5) can take driver lock now;
>>      (6) but unlock internal lock.
>>
>>      This change is safe because only the SCSI core and the NVME core keep
>>      a reference on a request queue after having called blk_cleanup_queue().
>>      Neither driver accesses any of the removed data structures between its
>>      blk_cleanup_queue() and blk_put_queue() calls.
>>
>>      Reported-by: Joseph Qi <joseph.qi@linux.alibaba.com>
>>      Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com>
>>      Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com>
>>      Cc: Jan Kara <jack@suse.com>
>>      Signed-off-by: Jens Axboe <axboe@kernel.dk>
> 
> Looks like a reasonable analyze!
> 
> Shawn, could you please re-post your patch to linux-block, Jens,
> cc:mmc-list, me and Adrian.
> 

Sure, I have sent to Jens.

> I think the patch should be picked up by Jens and go via his tree.
> 
> Kind regards
> Uffe
> 
>>
>>
>>>
>>>>
>>>>>
>>>>> Remove the disk, partition and bdi sysfs attributes before cleaning
>>>>> up the request queue associated with the disk.
>>>>>
>>>>> [  410.331226] mmc1: card 59b4 removed
>>>>> [  410.348583] WARNING: CPU: 0 PID: 5 at block/blk-core.c:785
>>>>> blk_cleanup_queue+0x138/0x140
>>>>> [  410.349294] Modules linked in:
>>>>> [  410.349570] CPU: 0 PID: 5 Comm: kworker/0:0 Not tainted
>>>>> 4.16.0-rc6-next-20180321-00004-gc2ad6a7 #263
>>>>> [  410.350363] Hardware name: Excavator-RK3399 Board (DT)
>>>>> [  410.350819] Workqueue: events_freezable mmc_rescan
>>>>> [  410.351242] pstate: 60000005 (nZCv daif -PAN -UAO)
>>>>> [  410.351663] pc : blk_cleanup_queue+0x138/0x140
>>>>> [  410.352054] lr : blk_cleanup_queue+0xac/0x140
>>>>> [  410.352436] sp : ffff0000092cbb90
>>>>> [  410.352727] x29: ffff0000092cbb90 x28: 0000000000000000
>>>>> [  410.353195] x27: ffff8000f6f23030 x26: ffff00000904e610
>>>>> [  410.353662] x25: ffff8000f17cc808 x24: ffff8000f1038200
>>>>> [  410.354128] x23: 0000000000000060 x22: 0000000000000000
>>>>> [  410.354595] x21: ffff8000f11748d8 x20: ffff8000f1038200
>>>>> [  410.355061] x19: ffff8000f1174200 x18: 0000ffff936347d8
>>>>> [  410.355528] x17: 0000ffff935b93c0 x16: ffff0000081263f8
>>>>> [  410.355994] x15: 0000000000000000 x14: 0000000000000400
>>>>> [  410.356461] x13: 0000000000000001 x12: 0000000000000001
>>>>> [  410.356927] x11: 0000000000000040 x10: ffff8000f2400028
>>>>> [  410.357393] x9 : ffff8000f2400040 x8 : 0000000000000000
>>>>> [  410.357860] x7 : ffff8000f6f3a340 x6 : ffff8000f6f3a340
>>>>> [  410.358326] x5 : ffff8000f2400000 x4 : ffff8000f6f3a340
>>>>> [  410.358792] x3 : 0000000000000000 x2 : 39c1333e45670800
>>>>> [  410.359259] x1 : 0000000000000000 x0 : 0000000000000003
>>>>> [  410.359726] Call trace:
>>>>> [  410.359943]  blk_cleanup_queue+0x138/0x140
>>>>> [  410.360305]  mmc_cleanup_queue+0x2c/0x48
>>>>> [  410.360652]  mmc_blk_remove_req+0x1c/0x98
>>>>> [  410.361005]  mmc_blk_remove+0x180/0x1c0
>>>>> [  410.361343]  mmc_bus_remove+0x1c/0x28
>>>>> [  410.361670]  device_release_driver_internal+0x154/0x1f0
>>>>> [  410.362128]  device_release_driver+0x14/0x20
>>>>> [  410.362504]  bus_remove_device+0xc8/0x108
>>>>> [  410.362858]  device_del+0x120/0x350
>>>>> [  410.363167]  mmc_remove_card+0x5c/0xb8
>>>>> [  410.363498]  mmc_sd_detect+0x40/0x78
>>>>> [  410.363813]  mmc_rescan+0x19c/0x368
>>>>> [  410.364123]  process_one_work+0x1ac/0x318
>>>>> [  410.364477]  worker_thread+0x50/0x450
>>>>> [  410.364801]  kthread+0xf8/0x128
>>>>> [  410.365081]  ret_from_fork+0x10/0x18
>>>>> [  410.365395] ---[ end trace 268e87a46c28968c ]---
>>>>>
>>>>> Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
>>>>> ---
>>>>>
>>>>>    drivers/mmc/core/block.c | 2 +-
>>>>>    1 file changed, 1 insertion(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
>>>>> index a2b9c25..02485e3 100644
>>>>> --- a/drivers/mmc/core/block.c
>>>>> +++ b/drivers/mmc/core/block.c
>>>>> @@ -2659,7 +2659,6 @@ static void mmc_blk_remove_req(struct mmc_blk_data
>>>>> *md)
>>>>>             * from being accepted.
>>>>>             */
>>>>>            card = md->queue.card;
>>>>> -        mmc_cleanup_queue(&md->queue);
>>>>>            if (md->disk->flags & GENHD_FL_UP) {
>>>>>                device_remove_file(disk_to_dev(md->disk), &md->force_ro);
>>>>>                if ((md->area_type & MMC_BLK_DATA_AREA_BOOT) &&
>>>>> @@ -2669,6 +2668,7 @@ static void mmc_blk_remove_req(struct mmc_blk_data
>>>>> *md)
>>>>>                  del_gendisk(md->disk);
>>>>>            }
>>>>> +        mmc_cleanup_queue(&md->queue);
>>>>>            mmc_blk_put(md);
>>>>>        }
>>>>>    }
>>>>>
>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> 
>
diff mbox

Patch

diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
index a2b9c25..02485e3 100644
--- a/drivers/mmc/core/block.c
+++ b/drivers/mmc/core/block.c
@@ -2659,7 +2659,6 @@  static void mmc_blk_remove_req(struct mmc_blk_data *md)
 		 * from being accepted.
 		 */
 		card = md->queue.card;
-		mmc_cleanup_queue(&md->queue);
 		if (md->disk->flags & GENHD_FL_UP) {
 			device_remove_file(disk_to_dev(md->disk), &md->force_ro);
 			if ((md->area_type & MMC_BLK_DATA_AREA_BOOT) &&
@@ -2669,6 +2668,7 @@  static void mmc_blk_remove_req(struct mmc_blk_data *md)
 
 			del_gendisk(md->disk);
 		}
+		mmc_cleanup_queue(&md->queue);
 		mmc_blk_put(md);
 	}
 }