CC: [email protected] CC: [email protected] CC: [email protected] TO: Alexandre Ghiti <[email protected]> CC: Palmer Dabbelt <[email protected]>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: df0cc57e057f18e44dac8e6c18aba47ab53202f9 commit: 0aba691a7443a7541c1dc56423e0c92cc6ea7164 riscv: Introduce va_kernel_pa_offset for 32-bit kernel date: 5 months ago :::::: branch date: 6 hours ago :::::: commit date: 5 months ago config: riscv-randconfig-c006-20220109 (https://download.01.org/0day-ci/archive/20220110/[email protected]/config) compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project f3a344d2125fa37e59bae1b0874442c650a19607) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # install riscv cross compiling tool for clang build # apt-get install binutils-riscv64-linux-gnu # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=0aba691a7443a7541c1dc56423e0c92cc6ea7164 git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git git fetch --no-tags linus master git checkout 0aba691a7443a7541c1dc56423e0c92cc6ea7164 # save the config file to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=riscv clang-analyzer If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <[email protected]> clang-analyzer warnings: (new ones prefixed by >>) ^~~~ include/linux/compiler.h:69:3: note: expanded from macro '__trace_if_value' (cond) ? \ ^~~~ drivers/hwmon/pmbus/zl6100.c:118:2: note: '?' condition is false if (negative) ^ include/linux/compiler.h:56:28: note: expanded from macro 'if' #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) ^ include/linux/compiler.h:58:69: note: expanded from macro '__trace_if_var' #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) ^ include/linux/compiler.h:69:2: note: expanded from macro '__trace_if_value' (cond) ? \ ^ drivers/hwmon/pmbus/zl6100.c:118:2: note: Taking false branch if (negative) ^ include/linux/compiler.h:56:23: note: expanded from macro 'if' #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) ^ drivers/hwmon/pmbus/zl6100.c:122:41: note: The result of the left shift is undefined because the left operand is negative return (mantissa & 0x7ff) | ((exponent << 11) & 0xf800); ~~~~~~~~ ^ Suppressed 3 warnings (3 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 7 warnings generated. drivers/target/target_core_xcopy.c:124:2: warning: Value stored to 'ript' is never read [clang-analyzer-deadcode.DeadStores] ript = get_unaligned_be16(&desc[2]); ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/target/target_core_xcopy.c:124:2: note: Value stored to 'ript' is never read ript = get_unaligned_be16(&desc[2]); ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/target/target_core_xcopy.c:302:6: warning: Value stored to 'dc' during its initialization is never read [clang-analyzer-deadcode.DeadStores] int dc = (desc[1] & 0x02); ^~ ~~~~~~~~~~~~~~~~ drivers/target/target_core_xcopy.c:302:6: note: Value stored to 'dc' during its initialization is never read int dc = (desc[1] & 0x02); ^~ ~~~~~~~~~~~~~~~~ drivers/target/target_core_xcopy.c:418:23: warning: Value stored to 'xpt_cmd' during its initialization is never read [clang-analyzer-deadcode.DeadStores] struct xcopy_pt_cmd *xpt_cmd = container_of(se_cmd, ^~~~~~~ drivers/target/target_core_xcopy.c:418:23: note: Value stored to 'xpt_cmd' during its initialization is never read struct xcopy_pt_cmd *xpt_cmd = container_of(se_cmd, ^~~~~~~ drivers/target/target_core_xcopy.c:800:2: warning: Value stored to 'list_id' is never read [clang-analyzer-deadcode.DeadStores] list_id = p[0]; ^ ~~~~ drivers/target/target_core_xcopy.c:800:2: note: Value stored to 'list_id' is never read list_id = p[0]; ^ ~~~~ drivers/target/target_core_xcopy.c:801:2: warning: Value stored to 'list_id_usage' is never read [clang-analyzer-deadcode.DeadStores] list_id_usage = (p[1] & 0x18) >> 3; ^ ~~~~~~~~~~~~~~~~~~ drivers/target/target_core_xcopy.c:801:2: note: Value stored to 'list_id_usage' is never read list_id_usage = (p[1] & 0x18) >> 3; ^ ~~~~~~~~~~~~~~~~~~ Suppressed 2 warnings (2 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 2 warnings generated. Suppressed 2 warnings (2 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 4 warnings generated. drivers/target/target_core_file.c:144:3: warning: Value stored to 'dev_size' is never read [clang-analyzer-deadcode.DeadStores] dev_size = (i_size_read(file->f_mapping->host) - ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/target/target_core_file.c:144:3: note: Value stored to 'dev_size' is never read dev_size = (i_size_read(file->f_mapping->host) - ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Suppressed 3 warnings (3 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 4 warnings generated. Suppressed 4 warnings (4 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 4 warnings generated. Suppressed 4 warnings (4 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 4 warnings generated. Suppressed 4 warnings (4 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 4 warnings generated. Suppressed 4 warnings (4 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 4 warnings generated. Suppressed 4 warnings (4 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 2 warnings generated. Suppressed 2 warnings (2 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 2 warnings generated. Suppressed 2 warnings (2 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 2 warnings generated. Suppressed 2 warnings (2 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 2 warnings generated. Suppressed 2 warnings (2 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 5 warnings generated. >> drivers/nvme/host/core.c:872:4: warning: Potential leak of memory pointed to >> by '_x' [clang-analyzer-unix.Malloc] clear_bit_unlock(0, &ns->ctrl->discard_page_busy); ^ drivers/nvme/host/core.c:845:10: note: Calling 'kzalloc' range = kzalloc(alloc_size, GFP_ATOMIC | __GFP_NOWARN); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/slab.h:721:9: note: Memory is allocated return kmalloc(size, flags | __GFP_ZERO); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/nvme/host/core.c:845:10: note: Returned allocated memory range = kzalloc(alloc_size, GFP_ATOMIC | __GFP_NOWARN); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/nvme/host/core.c:846:6: note: Assuming 'range' is non-null if (!range) { ^ include/linux/compiler.h:56:47: note: expanded from macro 'if' #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) ^~~~ include/linux/compiler.h:58:52: note: expanded from macro '__trace_if_var' #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) ^~~~ drivers/nvme/host/core.c:846:2: note: '?' condition is false if (!range) { ^ include/linux/compiler.h:56:28: note: expanded from macro 'if' #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) ^ include/linux/compiler.h:58:31: note: expanded from macro '__trace_if_var' #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) ^ drivers/nvme/host/core.c:846:7: note: 'range' is non-null if (!range) { ^ include/linux/compiler.h:56:47: note: expanded from macro 'if' #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) ^~~~ include/linux/compiler.h:58:86: note: expanded from macro '__trace_if_var' #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) ^~~~ include/linux/compiler.h:69:3: note: expanded from macro '__trace_if_value' (cond) ? \ ^~~~ drivers/nvme/host/core.c:846:2: note: '?' condition is false if (!range) { ^ include/linux/compiler.h:56:28: note: expanded from macro 'if' #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) ^ include/linux/compiler.h:58:69: note: expanded from macro '__trace_if_var' #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) ^ include/linux/compiler.h:69:2: note: expanded from macro '__trace_if_value' (cond) ? \ ^ drivers/nvme/host/core.c:846:2: note: Taking false branch if (!range) { ^ include/linux/compiler.h:56:23: note: expanded from macro 'if' #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) ^ drivers/nvme/host/core.c:858:2: note: Assuming field 'bio' is null __rq_for_each_bio(bio, req) { ^ include/linux/blkdev.h:848:2: note: expanded from macro '__rq_for_each_bio' if ((rq->bio)) \ ^~~~~~~~~~~~~~ include/linux/compiler.h:56:45: note: expanded from macro 'if' #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/compiler.h:58:52: note: expanded from macro '__trace_if_var' #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) ^~~~ drivers/nvme/host/core.c:858:2: note: '?' condition is false __rq_for_each_bio(bio, req) { ^ include/linux/blkdev.h:848:2: note: expanded from macro '__rq_for_each_bio' if ((rq->bio)) \ ^ include/linux/compiler.h:56:28: note: expanded from macro 'if' #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) ^ include/linux/compiler.h:58:31: note: expanded from macro '__trace_if_var' #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) ^ drivers/nvme/host/core.c:858:2: note: Field 'bio' is null __rq_for_each_bio(bio, req) { ^ include/linux/blkdev.h:848:11: note: expanded from macro '__rq_for_each_bio' if ((rq->bio)) \ ^ drivers/nvme/host/core.c:858:2: note: '?' condition is false __rq_for_each_bio(bio, req) { ^ include/linux/blkdev.h:848:2: note: expanded from macro '__rq_for_each_bio' if ((rq->bio)) \ ^ include/linux/compiler.h:56:28: note: expanded from macro 'if' #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) ^ include/linux/compiler.h:58:69: note: expanded from macro '__trace_if_var' #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) -- include/linux/compiler.h:58:31: note: expanded from macro '__trace_if_var' #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) ^ drivers/nvme/host/core.c:871:7: note: '_x' is >= -1073741824 if (virt_to_page(range) == ns->ctrl->discard_page) ^ arch/riscv/include/asm/page.h:152:42: note: expanded from macro 'virt_to_page' #define virt_to_page(vaddr) (pfn_to_page(virt_to_pfn(vaddr))) ^ arch/riscv/include/asm/page.h:149:41: note: expanded from macro 'virt_to_pfn' #define virt_to_pfn(vaddr) (phys_to_pfn(__pa(vaddr))) ^ arch/riscv/include/asm/page.h:143:18: note: expanded from macro '__pa' #define __pa(x) __virt_to_phys((unsigned long)(x)) ^ note: (skipping 6 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all) include/linux/compiler.h:56:47: note: expanded from macro 'if' #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~ include/linux/compiler.h:58:86: note: expanded from macro '__trace_if_var' #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) ~~~~~~~~~~~~~~~~~^~~~~ include/linux/compiler.h:69:3: note: expanded from macro '__trace_if_value' (cond) ? \ ^~~~ drivers/nvme/host/core.c:871:7: note: Left side of '&&' is true if (virt_to_page(range) == ns->ctrl->discard_page) ^ arch/riscv/include/asm/page.h:152:42: note: expanded from macro 'virt_to_page' #define virt_to_page(vaddr) (pfn_to_page(virt_to_pfn(vaddr))) ^ arch/riscv/include/asm/page.h:149:41: note: expanded from macro 'virt_to_pfn' #define virt_to_pfn(vaddr) (phys_to_pfn(__pa(vaddr))) ^ arch/riscv/include/asm/page.h:143:18: note: expanded from macro '__pa' #define __pa(x) __virt_to_phys((unsigned long)(x)) ^ arch/riscv/include/asm/page.h:138:27: note: expanded from macro '__virt_to_phys' #define __virt_to_phys(x) __va_to_pa_nodebug(x) ^ arch/riscv/include/asm/page.h:130:2: note: expanded from macro '__va_to_pa_nodebug' is_linear_mapping(_x) ? \ ^ arch/riscv/include/asm/page.h:109:3: note: expanded from macro 'is_linear_mapping' ((x) >= PAGE_OFFSET && (!IS_ENABLED(CONFIG_64BIT) || (x) < kernel_map.virt_addr)) ^ drivers/nvme/host/core.c:871:7: note: Left side of '||' is true if (virt_to_page(range) == ns->ctrl->discard_page) ^ arch/riscv/include/asm/page.h:152:42: note: expanded from macro 'virt_to_page' #define virt_to_page(vaddr) (pfn_to_page(virt_to_pfn(vaddr))) ^ arch/riscv/include/asm/page.h:149:41: note: expanded from macro 'virt_to_pfn' #define virt_to_pfn(vaddr) (phys_to_pfn(__pa(vaddr))) ^ arch/riscv/include/asm/page.h:143:18: note: expanded from macro '__pa' #define __pa(x) __virt_to_phys((unsigned long)(x)) ^ arch/riscv/include/asm/page.h:138:27: note: expanded from macro '__virt_to_phys' #define __virt_to_phys(x) __va_to_pa_nodebug(x) ^ arch/riscv/include/asm/page.h:130:2: note: expanded from macro '__va_to_pa_nodebug' is_linear_mapping(_x) ? \ ^ arch/riscv/include/asm/page.h:109:52: note: expanded from macro 'is_linear_mapping' ((x) >= PAGE_OFFSET && (!IS_ENABLED(CONFIG_64BIT) || (x) < kernel_map.virt_addr)) ^ drivers/nvme/host/core.c:871:3: note: Assuming the condition is true if (virt_to_page(range) == ns->ctrl->discard_page) ^ include/linux/compiler.h:56:44: note: expanded from macro 'if' #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/compiler.h:58:86: note: expanded from macro '__trace_if_var' #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) ~~~~~~~~~~~~~~~~~^~~~~ include/linux/compiler.h:69:3: note: expanded from macro '__trace_if_value' (cond) ? \ ^~~~ drivers/nvme/host/core.c:871:3: note: '?' condition is true if (virt_to_page(range) == ns->ctrl->discard_page) ^ include/linux/compiler.h:56:28: note: expanded from macro 'if' #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) ^ include/linux/compiler.h:58:69: note: expanded from macro '__trace_if_var' #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) ^ include/linux/compiler.h:69:2: note: expanded from macro '__trace_if_value' (cond) ? \ ^ drivers/nvme/host/core.c:871:3: note: Taking true branch if (virt_to_page(range) == ns->ctrl->discard_page) ^ include/linux/compiler.h:56:23: note: expanded from macro 'if' #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) ^ drivers/nvme/host/core.c:872:4: note: Potential leak of memory pointed to by '_x' clear_bit_unlock(0, &ns->ctrl->discard_page_busy); ^ >> drivers/nvme/host/core.c:872:4: warning: Potential leak of memory pointed to >> by '_y' [clang-analyzer-unix.Malloc] clear_bit_unlock(0, &ns->ctrl->discard_page_busy); ^ drivers/nvme/host/core.c:845:10: note: Calling 'kzalloc' range = kzalloc(alloc_size, GFP_ATOMIC | __GFP_NOWARN); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/slab.h:721:9: note: Memory is allocated return kmalloc(size, flags | __GFP_ZERO); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/nvme/host/core.c:845:10: note: Returned allocated memory range = kzalloc(alloc_size, GFP_ATOMIC | __GFP_NOWARN); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/nvme/host/core.c:846:6: note: Assuming 'range' is non-null if (!range) { ^ include/linux/compiler.h:56:47: note: expanded from macro 'if' #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) ^~~~ include/linux/compiler.h:58:52: note: expanded from macro '__trace_if_var' #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) ^~~~ drivers/nvme/host/core.c:846:2: note: '?' condition is false if (!range) { ^ include/linux/compiler.h:56:28: note: expanded from macro 'if' #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) ^ include/linux/compiler.h:58:31: note: expanded from macro '__trace_if_var' #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) ^ drivers/nvme/host/core.c:846:7: note: 'range' is non-null if (!range) { ^ include/linux/compiler.h:56:47: note: expanded from macro 'if' #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) ^~~~ include/linux/compiler.h:58:86: note: expanded from macro '__trace_if_var' #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) ^~~~ include/linux/compiler.h:69:3: note: expanded from macro '__trace_if_value' (cond) ? \ ^~~~ drivers/nvme/host/core.c:846:2: note: '?' condition is false if (!range) { ^ include/linux/compiler.h:56:28: note: expanded from macro 'if' #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) ^ include/linux/compiler.h:58:69: note: expanded from macro '__trace_if_var' #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) ^ include/linux/compiler.h:69:2: note: expanded from macro '__trace_if_value' (cond) ? \ ^ drivers/nvme/host/core.c:846:2: note: Taking false branch if (!range) { ^ include/linux/compiler.h:56:23: note: expanded from macro 'if' #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) ^ drivers/nvme/host/core.c:858:2: note: Assuming field 'bio' is null __rq_for_each_bio(bio, req) { ^ include/linux/blkdev.h:848:2: note: expanded from macro '__rq_for_each_bio' if ((rq->bio)) \ ^~~~~~~~~~~~~~ include/linux/compiler.h:56:45: note: expanded from macro 'if' #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/compiler.h:58:52: note: expanded from macro '__trace_if_var' #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) ^~~~ drivers/nvme/host/core.c:858:2: note: '?' condition is false __rq_for_each_bio(bio, req) { ^ include/linux/blkdev.h:848:2: note: expanded from macro '__rq_for_each_bio' if ((rq->bio)) \ ^ include/linux/compiler.h:56:28: note: expanded from macro 'if' #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) ^ include/linux/compiler.h:58:31: note: expanded from macro '__trace_if_var' #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) ^ drivers/nvme/host/core.c:858:2: note: Field 'bio' is null __rq_for_each_bio(bio, req) { ^ include/linux/blkdev.h:848:11: note: expanded from macro '__rq_for_each_bio' if ((rq->bio)) \ ^ drivers/nvme/host/core.c:858:2: note: '?' condition is false __rq_for_each_bio(bio, req) { ^ include/linux/blkdev.h:848:2: note: expanded from macro '__rq_for_each_bio' if ((rq->bio)) \ ^ include/linux/compiler.h:56:28: note: expanded from macro 'if' #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) ^ include/linux/compiler.h:58:69: note: expanded from macro '__trace_if_var' #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) vim +/_x +872 drivers/nvme/host/core.c 8093f7ca73c163 Ming Lin 2016-04-12 830 fc17b6534eb839 Christoph Hellwig 2017-06-03 831 static blk_status_t nvme_setup_discard(struct nvme_ns *ns, struct request *req, 8093f7ca73c163 Ming Lin 2016-04-12 832 struct nvme_command *cmnd) 8093f7ca73c163 Ming Lin 2016-04-12 833 { b35ba01ea69791 Christoph Hellwig 2017-02-08 834 unsigned short segments = blk_rq_nr_discard_segments(req), n = 0; 8093f7ca73c163 Ming Lin 2016-04-12 835 struct nvme_dsm_range *range; b35ba01ea69791 Christoph Hellwig 2017-02-08 836 struct bio *bio; 8093f7ca73c163 Ming Lin 2016-04-12 837 530436c45ef2e4 Eduard Hasenleithner 2019-11-12 838 /* 530436c45ef2e4 Eduard Hasenleithner 2019-11-12 839 * Some devices do not consider the DSM 'Number of Ranges' field when 530436c45ef2e4 Eduard Hasenleithner 2019-11-12 840 * determining how much data to DMA. Always allocate memory for maximum 530436c45ef2e4 Eduard Hasenleithner 2019-11-12 841 * number of segments to prevent device reading beyond end of buffer. 530436c45ef2e4 Eduard Hasenleithner 2019-11-12 842 */ 530436c45ef2e4 Eduard Hasenleithner 2019-11-12 843 static const size_t alloc_size = sizeof(*range) * NVME_DSM_MAX_RANGES; 530436c45ef2e4 Eduard Hasenleithner 2019-11-12 844 530436c45ef2e4 Eduard Hasenleithner 2019-11-12 845 range = kzalloc(alloc_size, GFP_ATOMIC | __GFP_NOWARN); cb5b7262b011cf Jens Axboe 2018-12-12 846 if (!range) { cb5b7262b011cf Jens Axboe 2018-12-12 847 /* cb5b7262b011cf Jens Axboe 2018-12-12 848 * If we fail allocation our range, fallback to the controller cb5b7262b011cf Jens Axboe 2018-12-12 849 * discard page. If that's also busy, it's safe to return cb5b7262b011cf Jens Axboe 2018-12-12 850 * busy, as we know we can make progress once that's freed. cb5b7262b011cf Jens Axboe 2018-12-12 851 */ cb5b7262b011cf Jens Axboe 2018-12-12 852 if (test_and_set_bit_lock(0, &ns->ctrl->discard_page_busy)) fc17b6534eb839 Christoph Hellwig 2017-06-03 853 return BLK_STS_RESOURCE; 8093f7ca73c163 Ming Lin 2016-04-12 854 cb5b7262b011cf Jens Axboe 2018-12-12 855 range = page_address(ns->ctrl->discard_page); cb5b7262b011cf Jens Axboe 2018-12-12 856 } cb5b7262b011cf Jens Axboe 2018-12-12 857 b35ba01ea69791 Christoph Hellwig 2017-02-08 858 __rq_for_each_bio(bio, req) { 314d48dd224897 Damien Le Moal 2019-10-21 859 u64 slba = nvme_sect_to_lba(ns, bio->bi_iter.bi_sector); b35ba01ea69791 Christoph Hellwig 2017-02-08 860 u32 nlb = bio->bi_iter.bi_size >> ns->lba_shift; b35ba01ea69791 Christoph Hellwig 2017-02-08 861 8cb6af7b3a6d47 Keith Busch 2018-01-31 862 if (n < segments) { b35ba01ea69791 Christoph Hellwig 2017-02-08 863 range[n].cattr = cpu_to_le32(0); b35ba01ea69791 Christoph Hellwig 2017-02-08 864 range[n].nlb = cpu_to_le32(nlb); b35ba01ea69791 Christoph Hellwig 2017-02-08 865 range[n].slba = cpu_to_le64(slba); 8cb6af7b3a6d47 Keith Busch 2018-01-31 866 } b35ba01ea69791 Christoph Hellwig 2017-02-08 867 n++; b35ba01ea69791 Christoph Hellwig 2017-02-08 868 } b35ba01ea69791 Christoph Hellwig 2017-02-08 869 b35ba01ea69791 Christoph Hellwig 2017-02-08 870 if (WARN_ON_ONCE(n != segments)) { cb5b7262b011cf Jens Axboe 2018-12-12 @871 if (virt_to_page(range) == ns->ctrl->discard_page) cb5b7262b011cf Jens Axboe 2018-12-12 @872 clear_bit_unlock(0, &ns->ctrl->discard_page_busy); cb5b7262b011cf Jens Axboe 2018-12-12 873 else b35ba01ea69791 Christoph Hellwig 2017-02-08 874 kfree(range); fc17b6534eb839 Christoph Hellwig 2017-06-03 875 return BLK_STS_IOERR; b35ba01ea69791 Christoph Hellwig 2017-02-08 876 } 8093f7ca73c163 Ming Lin 2016-04-12 877 8093f7ca73c163 Ming Lin 2016-04-12 878 cmnd->dsm.opcode = nvme_cmd_dsm; ed754e5deeb17f Christoph Hellwig 2017-11-09 879 cmnd->dsm.nsid = cpu_to_le32(ns->head->ns_id); f1dd03a84dbf3e Christoph Hellwig 2017-03-31 880 cmnd->dsm.nr = cpu_to_le32(segments - 1); 8093f7ca73c163 Ming Lin 2016-04-12 881 cmnd->dsm.attributes = cpu_to_le32(NVME_DSMGMT_AD); 8093f7ca73c163 Ming Lin 2016-04-12 882 f9d03f96b98800 Christoph Hellwig 2016-12-08 883 req->special_vec.bv_page = virt_to_page(range); f9d03f96b98800 Christoph Hellwig 2016-12-08 884 req->special_vec.bv_offset = offset_in_page(range); 530436c45ef2e4 Eduard Hasenleithner 2019-11-12 885 req->special_vec.bv_len = alloc_size; f9d03f96b98800 Christoph Hellwig 2016-12-08 886 req->rq_flags |= RQF_SPECIAL_PAYLOAD; 8093f7ca73c163 Ming Lin 2016-04-12 887 fc17b6534eb839 Christoph Hellwig 2017-06-03 888 return BLK_STS_OK; 8093f7ca73c163 Ming Lin 2016-04-12 889 } 8093f7ca73c163 Ming Lin 2016-04-12 890 :::::: The code at line 872 was first introduced by commit :::::: cb5b7262b011cfb793519bf97e54dff5282da23c nvme: provide fallback for discard alloc failure :::::: TO: Jens Axboe <[email protected]> :::::: CC: Christoph Hellwig <[email protected]> --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/[email protected] _______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
