• Breno Leitao's avatar
    blk-iocost: Pass gendisk to ioc_refresh_params · e33b9365
    Breno Leitao authored
    Current kernel (d2980d8d) crashes
    when blk_iocost_init for `nvme1` disk.
    
    	BUG: kernel NULL pointer dereference, address: 0000000000000050
    	#PF: supervisor read access in kernel mode
    	#PF: error_code(0x0000) - not-present page
    
    	blk_iocost_init (include/asm-generic/qspinlock.h:128
    			 include/linux/spinlock.h:203
    			 include/linux/spinlock_api_smp.h:158
    			 include/linux/spinlock.h:400
    			 block/blk-iocost.c:2884)
    	ioc_qos_write (block/blk-iocost.c:3198)
    	? kretprobe_perf_func (kernel/trace/trace_kprobe.c:1566)
    	? kernfs_fop_write_iter (include/linux/slab.h:584 fs/kernfs/file.c:311)
    	? __kmem_cache_alloc_node (mm/slab.h:? mm/slub.c:3452 mm/slub.c:3491)
    	? _copy_from_iter (arch/x86/include/asm/uaccess_64.h:46
    			   arch/x86/include/asm/uaccess_64.h:52
    			   lib/iov_iter.c:183 lib/iov_iter.c:628)
    	? kretprobe_dispatcher (kernel/trace/trace_kprobe.c:1693)
    	cgroup_file_write (kernel/cgroup/cgroup.c:4061)
    	kernfs_fop_write_iter (fs/kernfs/file.c:334)
    	vfs_write (include/linux/fs.h:1849 fs/read_write.c:491
    		   fs/read_write.c:584)
    	ksys_write (fs/read_write.c:637)
    	do_syscall_64 (arch/x86/entry/common.c:50 arch/x86/entry/common.c:80)
    	entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:120)
    
    This happens because ioc_refresh_params() is being called without
    a properly initialized ioc->rqos, which is happening later in the callee
    side.
    
    ioc_refresh_params() -> ioc_autop_idx() tries to access
    ioc->rqos.disk->queue but ioc->rqos.disk is NULL, causing the BUG above.
    
    Create function, called ioc_refresh_params_disk(), that is similar to
    ioc_refresh_params() but where the "struct gendisk" could be passed as
    an explicit argument. This function will be called when ioc->rqos.disk
    is not initialized.
    
    Fixes: ce57b558 ("blk-rq-qos: make rq_qos_add and rq_qos_del more useful")
    Signed-off-by: default avatarBreno Leitao <leitao@debian.org>
    Acked-by: default avatarTejun Heo <tj@kernel.org>
    Link: https://lore.kernel.org/r/20230228111654.1778120-1-leitao@debian.orgReviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    e33b9365
blk-iocost.c 97.7 KB