:::::: :::::: Manual check reason: "low confidence static check warning: drivers/ufs/core/ufshpb.c:1583:17: warning: Access to field 'is_last' results in a dereference of an undefined pointer value (loaded from variable 'srgn') [clang-analyzer-core.NullDereference]" ::::::
CC: [email protected] CC: [email protected] BCC: [email protected] CC: [email protected] TO: Bart Van Assche <[email protected]> CC: "Martin K. Petersen" <[email protected]> CC: Bean Huo <[email protected]> tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: 018ab4fabddd94f1c96f3b59e180691b9e88d5d8 commit: dd11376b9f1b73aca3f8c6eb541486bbb6996f05 scsi: ufs: Split the drivers/scsi/ufs directory date: 4 weeks ago :::::: branch date: 8 hours ago :::::: commit date: 4 weeks ago config: arm-randconfig-c002-20220613 (https://download.01.org/0day-ci/archive/20220615/[email protected]/config) compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project d378268ead93c85803c270277f0243737b536ae7) 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 arm cross compiling tool for clang build # apt-get install binutils-arm-linux-gnueabi # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=dd11376b9f1b73aca3f8c6eb541486bbb6996f05 git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git git fetch --no-tags linus master git checkout dd11376b9f1b73aca3f8c6eb541486bbb6996f05 # save the config file COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=arm clang-analyzer If you fix the issue, kindly add following tag where applicable Reported-by: kernel test robot <[email protected]> clang-analyzer warnings: (new ones prefixed by >>) include/linux/of.h:265:2: note: expanded from macro 'for_each_of_allnodes_from' for (dn = __of_find_all_nodes(from); dn; dn = __of_find_all_nodes(dn)) ^ drivers/of/unittest.c:3131:6: note: 'of_symbols' is non-null if (of_symbols) { ^~~~~~~~~~ drivers/of/unittest.c:3131:2: note: Taking true branch if (of_symbols) { ^ drivers/of/unittest.c:3133:29: note: Access to field 'properties' results in a dereference of an undefined pointer value (loaded from variable 'overlay_base_symbols') for_each_property_of_node(overlay_base_symbols, prop) { ^ include/linux/of.h:359:12: note: expanded from macro 'for_each_property_of_node' for (pp = dn->properties; pp != NULL; pp = pp->next) ^~ Suppressed 48 warnings (48 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. 55 warnings generated. drivers/ufs/core/ufshpb.c:306:2: warning: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling] memcpy(ppn_buf, page_address(page) + (offset * HPB_ENTRY_SIZE), ^ include/linux/fortify-string.h:369:26: note: expanded from macro 'memcpy' #define memcpy(p, q, s) __fortify_memcpy_chk(p, q, s, \ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/fortify-string.h:362:2: note: expanded from macro '__fortify_memcpy_chk' __underlying_##op(p, q, __fortify_size); \ ^~~~~~~~~~~~~~~~~ note: expanded from here include/linux/fortify-string.h:45:29: note: expanded from macro '__underlying_memcpy' #define __underlying_memcpy __builtin_memcpy ^~~~~~~~~~~~~~~~ drivers/ufs/core/ufshpb.c:306:2: note: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11 memcpy(ppn_buf, page_address(page) + (offset * HPB_ENTRY_SIZE), ^ include/linux/fortify-string.h:369:26: note: expanded from macro 'memcpy' #define memcpy(p, q, s) __fortify_memcpy_chk(p, q, s, \ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/fortify-string.h:362:2: note: expanded from macro '__fortify_memcpy_chk' __underlying_##op(p, q, __fortify_size); \ ^~~~~~~~~~~~~~~~~ note: expanded from here include/linux/fortify-string.h:45:29: note: expanded from macro '__underlying_memcpy' #define __underlying_memcpy __builtin_memcpy ^~~~~~~~~~~~~~~~ drivers/ufs/core/ufshpb.c:336:2: warning: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling] memcpy(&cdb[6], &ppn_tmp, sizeof(__be64)); ^ include/linux/fortify-string.h:369:26: note: expanded from macro 'memcpy' #define memcpy(p, q, s) __fortify_memcpy_chk(p, q, s, \ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/fortify-string.h:362:2: note: expanded from macro '__fortify_memcpy_chk' __underlying_##op(p, q, __fortify_size); \ ^~~~~~~~~~~~~~~~~ note: expanded from here include/linux/fortify-string.h:45:29: note: expanded from macro '__underlying_memcpy' #define __underlying_memcpy __builtin_memcpy ^~~~~~~~~~~~~~~~ drivers/ufs/core/ufshpb.c:336:2: note: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11 memcpy(&cdb[6], &ppn_tmp, sizeof(__be64)); ^ include/linux/fortify-string.h:369:26: note: expanded from macro 'memcpy' #define memcpy(p, q, s) __fortify_memcpy_chk(p, q, s, \ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/fortify-string.h:362:2: note: expanded from macro '__fortify_memcpy_chk' __underlying_##op(p, q, __fortify_size); \ ^~~~~~~~~~~~~~~~~ note: expanded from here include/linux/fortify-string.h:45:29: note: expanded from macro '__underlying_memcpy' #define __underlying_memcpy __builtin_memcpy ^~~~~~~~~~~~~~~~ drivers/ufs/core/ufshpb.c:754:3: warning: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling] clear_page(page_address(mctx->m_page[i])); ^ arch/arm/include/asm/page-nommu.h:11:26: note: expanded from macro 'clear_page' #define clear_page(page) memset((page), 0, PAGE_SIZE) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/fortify-string.h:272:25: note: expanded from macro 'memset' #define memset(p, c, s) __fortify_memset_chk(p, c, s, \ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/fortify-string.h:265:2: note: expanded from macro '__fortify_memset_chk' __underlying_memset(p, c, __fortify_size); \ ^~~~~~~~~~~~~~~~~~~ include/linux/fortify-string.h:47:29: note: expanded from macro '__underlying_memset' #define __underlying_memset __builtin_memset ^~~~~~~~~~~~~~~~ drivers/ufs/core/ufshpb.c:754:3: note: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11 clear_page(page_address(mctx->m_page[i])); ^ arch/arm/include/asm/page-nommu.h:11:26: note: expanded from macro 'clear_page' #define clear_page(page) memset((page), 0, PAGE_SIZE) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/fortify-string.h:272:25: note: expanded from macro 'memset' #define memset(p, c, s) __fortify_memset_chk(p, c, s, \ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/fortify-string.h:265:2: note: expanded from macro '__fortify_memset_chk' __underlying_memset(p, c, __fortify_size); \ ^~~~~~~~~~~~~~~~~~~ include/linux/fortify-string.h:47:29: note: expanded from macro '__underlying_memset' #define __underlying_memset __builtin_memset ^~~~~~~~~~~~~~~~ >> drivers/ufs/core/ufshpb.c:1583:17: warning: Access to field 'is_last' >> results in a dereference of an undefined pointer value (loaded from variable >> 'srgn') [clang-analyzer-core.NullDereference] srgn->is_last = true; ^ drivers/ufs/core/ufshpb.c:2498:6: note: Assuming 'lun' is < field 'max_lu_supported' if (lun >= hba->dev_info.max_lu_supported) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/ufs/core/ufshpb.c:2498:2: note: Taking false branch if (lun >= hba->dev_info.max_lu_supported) ^ drivers/ufs/core/ufshpb.c:2502:6: note: 'ret' is 0 if (ret) ^~~ drivers/ufs/core/ufshpb.c:2502:2: note: Taking false branch if (ret) ^ drivers/ufs/core/ufshpb.c:2505:8: note: Calling 'ufshpb_alloc_hpb_lu' hpb = ufshpb_alloc_hpb_lu(hba, sdev, &hba->ufshpb_dev, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/ufs/core/ufshpb.c:2230:6: note: Assuming 'hpb' is non-null if (!hpb) ^~~~ drivers/ufs/core/ufshpb.c:2230:2: note: Taking false branch if (!hpb) ^ drivers/ufs/core/ufshpb.c:2238:8: note: Calling 'ufshpb_lu_hpb_init' ret = ufshpb_lu_hpb_init(hba, hpb); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/ufs/core/ufshpb.c:2153:2: note: Loop condition is false. Exiting loop spin_lock_init(&hpb->rgn_state_lock); ^ include/linux/spinlock.h:339:34: note: expanded from macro 'spin_lock_init' # define spin_lock_init(_lock) \ ^ drivers/ufs/core/ufshpb.c:2154:2: note: Loop condition is false. Exiting loop spin_lock_init(&hpb->rsp_list_lock); ^ include/linux/spinlock.h:339:34: note: expanded from macro 'spin_lock_init' # define spin_lock_init(_lock) \ ^ drivers/ufs/core/ufshpb.c:2155:2: note: Loop condition is false. Exiting loop spin_lock_init(&hpb->param_lock); ^ include/linux/spinlock.h:339:34: note: expanded from macro 'spin_lock_init' # define spin_lock_init(_lock) \ ^ drivers/ufs/core/ufshpb.c:2162:2: note: Loop condition is false. Exiting loop INIT_WORK(&hpb->map_work, ufshpb_map_work_handler); ^ include/linux/workqueue.h:245:2: note: expanded from macro 'INIT_WORK' __INIT_WORK((_work), (_func), 0) ^ include/linux/workqueue.h:236:2: note: expanded from macro '__INIT_WORK' do { \ ^ drivers/ufs/core/ufshpb.c:2163:6: note: Assuming field 'is_hcm' is false if (hpb->is_hcm) { ^~~~~~~~~~~ drivers/ufs/core/ufshpb.c:2163:2: note: Taking false branch if (hpb->is_hcm) { ^ drivers/ufs/core/ufshpb.c:2172:6: note: Assuming field 'map_req_cache' is non-null if (!hpb->map_req_cache) { ^~~~~~~~~~~~~~~~~~~ drivers/ufs/core/ufshpb.c:2172:2: note: Taking false branch if (!hpb->map_req_cache) { ^ drivers/ufs/core/ufshpb.c:2181:6: note: Assuming field 'm_page_cache' is non-null if (!hpb->m_page_cache) { ^~~~~~~~~~~~~~~~~~ drivers/ufs/core/ufshpb.c:2181:2: note: Taking false branch if (!hpb->m_page_cache) { ^ drivers/ufs/core/ufshpb.c:2189:6: note: 'ret' is 0 if (ret) { ^~~ drivers/ufs/core/ufshpb.c:2189:2: note: Taking false branch if (ret) { ^ drivers/ufs/core/ufshpb.c:2195:8: note: Calling 'ufshpb_alloc_region_tbl' ret = ufshpb_alloc_region_tbl(hba, hpb); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/ufs/core/ufshpb.c:1659:6: note: Assuming 'rgn_table' is non-null if (!rgn_table) ^~~~~~~~~~ drivers/ufs/core/ufshpb.c:1659:2: note: Taking false branch if (!rgn_table) ^ drivers/ufs/core/ufshpb.c:1662:20: note: Assuming 'rgn_idx' is < field 'rgns_per_lu' for (rgn_idx = 0; rgn_idx < hpb->rgns_per_lu; rgn_idx++) { ^~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/ufs/core/ufshpb.c:1662:2: note: Loop condition is true. Entering loop body for (rgn_idx = 0; rgn_idx < hpb->rgns_per_lu; rgn_idx++) { ^ drivers/ufs/core/ufshpb.c:1669:3: note: Loop condition is false. Exiting loop spin_lock_init(&rgn->rgn_lock); ^ include/linux/spinlock.h:339:34: note: expanded from macro 'spin_lock_init' # define spin_lock_init(_lock) \ ^ drivers/ufs/core/ufshpb.c:1675:7: note: Assuming the condition is true if (rgn_idx == hpb->rgns_per_lu - 1) { ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/ufs/core/ufshpb.c:1675:3: note: Taking true branch if (rgn_idx == hpb->rgns_per_lu - 1) { ^ drivers/ufs/core/ufshpb.c:1682:7: note: 'ret' is 0 if (ret) ^~~ drivers/ufs/core/ufshpb.c:1682:3: note: Taking false branch if (ret) ^ drivers/ufs/core/ufshpb.c:1684:3: note: Calling 'ufshpb_init_subregion_tbl' ufshpb_init_subregion_tbl(hpb, rgn, last_srgn); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/ufs/core/ufshpb.c:1572:2: note: 'srgn' declared without an initial value struct ufshpb_subregion *srgn; ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/ufs/core/ufshpb.c:1574:2: note: Assuming 'srgn_idx' is >= field 'srgn_cnt' for_each_sub_region(rgn, srgn_idx, srgn) { ^ drivers/ufs/core/ufshpb.h:143:8: note: expanded from macro 'for_each_sub_region' ((i) < (rgn)->srgn_cnt) && ((srgn) = &(rgn)->srgn_tbl[i]); \ ^~~~~~~~~~~~~~~~~~~~~ drivers/ufs/core/ufshpb.c:1574:2: note: Left side of '&&' is false for_each_sub_region(rgn, srgn_idx, srgn) { ^ drivers/ufs/core/ufshpb.h:143:31: note: expanded from macro 'for_each_sub_region' ((i) < (rgn)->srgn_cnt) && ((srgn) = &(rgn)->srgn_tbl[i]); \ ^ drivers/ufs/core/ufshpb.c:1582:15: note: 'last' is true if (unlikely(last && hpb->last_srgn_entries)) ^ include/linux/compiler.h:78:42: note: expanded from macro 'unlikely' # define unlikely(x) __builtin_expect(!!(x), 0) ^ drivers/ufs/core/ufshpb.c:1582:15: note: Left side of '&&' is true if (unlikely(last && hpb->last_srgn_entries)) ^ drivers/ufs/core/ufshpb.c:1582:6: note: Assuming the condition is false if (unlikely(last && hpb->last_srgn_entries)) ^ include/linux/compiler.h:78:40: note: expanded from macro 'unlikely' # define unlikely(x) __builtin_expect(!!(x), 0) ^~~~ drivers/ufs/core/ufshpb.c:1582:2: note: Taking true branch if (unlikely(last && hpb->last_srgn_entries)) ^ drivers/ufs/core/ufshpb.c:1583:17: note: Access to field 'is_last' results in a dereference of an undefined pointer value (loaded from variable 'srgn') srgn->is_last = true; ~~~~ ^ >> drivers/ufs/core/ufshpb.c:1640:22: warning: Division by zero >> [clang-analyzer-core.DivideZero] hpb->srgns_per_lu = DIV_ROUND_UP(hpb_lu_info->num_blocks, ^ include/linux/math.h:37:22: note: expanded from macro 'DIV_ROUND_UP' #define DIV_ROUND_UP __KERNEL_DIV_ROUND_UP ^ include/uapi/linux/const.h:34:54: note: expanded from macro '__KERNEL_DIV_ROUND_UP' #define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) ~~~~~~~~~~~~~~~~^~~~~ drivers/ufs/core/ufshpb.c:1606:6: note: Assuming the condition is true if (ufshpb_is_legacy(hba)) ^~~~~~~~~~~~~~~~~~~~~ drivers/ufs/core/ufshpb.c:1606:2: note: Taking true branch if (ufshpb_is_legacy(hba)) ^ drivers/ufs/core/ufshpb.c:1612:23: note: Assuming field 'num_pinned' is 0 hpb->lu_pinned_end = hpb_lu_info->num_pinned ? ^~~~~~~~~~~~~~~~~~~~~~~ drivers/ufs/core/ufshpb.c:1612:23: note: '?' condition is false drivers/ufs/core/ufshpb.c:1620:2: note: Left side of '&&' is false do_div(rgn_mem_size, HPB_ENTRY_BLOCK_SIZE); ^ include/asm-generic/div64.h:223:35: note: expanded from macro 'do_div' if (__builtin_constant_p(__base) && \ ^ drivers/ufs/core/ufshpb.c:1620:2: note: Left side of '&&' is false do_div(rgn_mem_size, HPB_ENTRY_BLOCK_SIZE); ^ include/asm-generic/div64.h:227:42: note: expanded from macro 'do_div' } else if (__builtin_constant_p(__base) && \ ^ drivers/ufs/core/ufshpb.c:1620:2: note: Assuming the condition is true do_div(rgn_mem_size, HPB_ENTRY_BLOCK_SIZE); ^ include/asm-generic/div64.h:234:20: note: expanded from macro 'do_div' } else if (likely(((n) >> 32) == 0)) { \ ~~~~~~~^~~~~~~~~~~~~~~~~ include/linux/compiler.h:77:40: note: expanded from macro 'likely' # define likely(x) __builtin_expect(!!(x), 1) ^ drivers/ufs/core/ufshpb.c:1620:2: note: Taking true branch do_div(rgn_mem_size, HPB_ENTRY_BLOCK_SIZE); ^ include/asm-generic/div64.h:234:9: note: expanded from macro 'do_div' } else if (likely(((n) >> 32) == 0)) { \ ^ drivers/ufs/core/ufshpb.c:1625:2: note: Left side of '&&' is false do_div(tmp, HPB_ENTRY_SIZE); ^ include/asm-generic/div64.h:223:35: note: expanded from macro 'do_div' if (__builtin_constant_p(__base) && \ ^ drivers/ufs/core/ufshpb.c:1625:2: note: Left side of '&&' is false do_div(tmp, HPB_ENTRY_SIZE); ^ include/asm-generic/div64.h:227:42: note: expanded from macro 'do_div' } else if (__builtin_constant_p(__base) && \ ^ drivers/ufs/core/ufshpb.c:1625:2: note: Assuming the condition is true do_div(tmp, HPB_ENTRY_SIZE); ^ include/asm-generic/div64.h:234:20: note: expanded from macro 'do_div' } else if (likely(((n) >> 32) == 0)) { \ ~~~~~~~^~~~~~~~~~~~~~~~~ include/linux/compiler.h:77:40: note: expanded from macro 'likely' # define likely(x) __builtin_expect(!!(x), 1) ^ drivers/ufs/core/ufshpb.c:1625:2: note: Taking true branch do_div(tmp, HPB_ENTRY_SIZE); ^ include/asm-generic/div64.h:234:9: note: expanded from macro 'do_div' } else if (likely(((n) >> 32) == 0)) { \ ^ drivers/ufs/core/ufshpb.c:1627:31: note: '?' condition is false hpb->entries_per_rgn_shift = ilog2(entries_per_rgn); ^ include/linux/log2.h:158:2: note: expanded from macro 'ilog2' __builtin_constant_p(n) ? \ ^ drivers/ufs/core/ufshpb.c:1627:31: note: '?' condition is true hpb->entries_per_rgn_shift = ilog2(entries_per_rgn); ^ include/linux/log2.h:161:2: note: expanded from macro 'ilog2' (sizeof(n) <= 4) ? \ ^ drivers/ufs/core/ufshpb.c:1631:32: note: '?' condition is false hpb->entries_per_srgn_shift = ilog2(hpb->entries_per_srgn); ^ include/linux/log2.h:158:2: note: expanded from macro 'ilog2' __builtin_constant_p(n) ? \ ^ drivers/ufs/core/ufshpb.c:1631:32: note: '?' condition is true hpb->entries_per_srgn_shift = ilog2(hpb->entries_per_srgn); ^ include/linux/log2.h:161:2: note: expanded from macro 'ilog2' (sizeof(n) <= 4) ? \ ^ drivers/ufs/core/ufshpb.c:1635:2: note: Left side of '&&' is false do_div(tmp, hpb->srgn_mem_size); ^ include/asm-generic/div64.h:223:35: note: expanded from macro 'do_div' vim +1583 drivers/ufs/core/ufshpb.c 4b5f49079c52a7 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1567 f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1568 static void ufshpb_init_subregion_tbl(struct ufshpb_lu *hpb, f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1569 struct ufshpb_region *rgn, bool last) f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1570 { f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1571 int srgn_idx; f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1572 struct ufshpb_subregion *srgn; f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1573 4b5f49079c52a7 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1574 for_each_sub_region(rgn, srgn_idx, srgn) { 4b5f49079c52a7 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1575 INIT_LIST_HEAD(&srgn->list_act_srgn); f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1576 f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1577 srgn->rgn_idx = rgn->rgn_idx; f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1578 srgn->srgn_idx = srgn_idx; f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1579 srgn->srgn_state = HPB_SRGN_UNUSED; f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1580 } f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1581 f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 @1582 if (unlikely(last && hpb->last_srgn_entries)) f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 @1583 srgn->is_last = true; f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1584 } f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1585 f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1586 static int ufshpb_alloc_subregion_tbl(struct ufshpb_lu *hpb, f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1587 struct ufshpb_region *rgn, int srgn_cnt) f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1588 { f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1589 rgn->srgn_tbl = kvcalloc(srgn_cnt, sizeof(struct ufshpb_subregion), f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1590 GFP_KERNEL); f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1591 if (!rgn->srgn_tbl) f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1592 return -ENOMEM; f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1593 f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1594 rgn->srgn_cnt = srgn_cnt; f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1595 return 0; f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1596 } f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1597 f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1598 static void ufshpb_lu_parameter_init(struct ufs_hba *hba, f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1599 struct ufshpb_lu *hpb, f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1600 struct ufshpb_dev_info *hpb_dev_info, f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1601 struct ufshpb_lu_info *hpb_lu_info) f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1602 { f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1603 u32 entries_per_rgn; f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1604 u64 rgn_mem_size, tmp; f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1605 41d8a9333cc96f drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1606 if (ufshpb_is_legacy(hba)) 41d8a9333cc96f drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1607 hpb->pre_req_max_tr_len = HPB_LEGACY_CHUNK_HIGH; 41d8a9333cc96f drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1608 else 9ec5128a8b5631 drivers/scsi/ufs/ufshpb.c Avri Altman 2021-10-31 1609 hpb->pre_req_max_tr_len = hpb_dev_info->max_hpb_single_cmd; 41d8a9333cc96f drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1610 f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1611 hpb->lu_pinned_start = hpb_lu_info->pinned_start; f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1612 hpb->lu_pinned_end = hpb_lu_info->num_pinned ? f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1613 (hpb_lu_info->pinned_start + hpb_lu_info->num_pinned - 1) f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1614 : PINNED_NOT_SET; 4b5f49079c52a7 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1615 hpb->lru_info.max_lru_active_cnt = 4b5f49079c52a7 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1616 hpb_lu_info->max_active_rgns - hpb_lu_info->num_pinned; f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1617 f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1618 rgn_mem_size = (1ULL << hpb_dev_info->rgn_size) * HPB_RGN_SIZE_UNIT f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1619 * HPB_ENTRY_SIZE; f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1620 do_div(rgn_mem_size, HPB_ENTRY_BLOCK_SIZE); f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1621 hpb->srgn_mem_size = (1ULL << hpb_dev_info->srgn_size) f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1622 * HPB_RGN_SIZE_UNIT / HPB_ENTRY_BLOCK_SIZE * HPB_ENTRY_SIZE; f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1623 f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1624 tmp = rgn_mem_size; f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1625 do_div(tmp, HPB_ENTRY_SIZE); f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1626 entries_per_rgn = (u32)tmp; f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1627 hpb->entries_per_rgn_shift = ilog2(entries_per_rgn); f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1628 hpb->entries_per_rgn_mask = entries_per_rgn - 1; f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1629 f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1630 hpb->entries_per_srgn = hpb->srgn_mem_size / HPB_ENTRY_SIZE; f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1631 hpb->entries_per_srgn_shift = ilog2(hpb->entries_per_srgn); f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1632 hpb->entries_per_srgn_mask = hpb->entries_per_srgn - 1; f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1633 f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1634 tmp = rgn_mem_size; f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1635 do_div(tmp, hpb->srgn_mem_size); f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1636 hpb->srgns_per_rgn = (int)tmp; f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1637 f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1638 hpb->rgns_per_lu = DIV_ROUND_UP(hpb_lu_info->num_blocks, f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1639 entries_per_rgn); f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 @1640 hpb->srgns_per_lu = DIV_ROUND_UP(hpb_lu_info->num_blocks, f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1641 (hpb->srgn_mem_size / HPB_ENTRY_SIZE)); f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1642 hpb->last_srgn_entries = hpb_lu_info->num_blocks f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1643 % (hpb->srgn_mem_size / HPB_ENTRY_SIZE); f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1644 f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1645 hpb->pages_per_srgn = DIV_ROUND_UP(hpb->srgn_mem_size, PAGE_SIZE); 119ee38c10fa34 drivers/scsi/ufs/ufshpb.c Avri Altman 2021-07-12 1646 119ee38c10fa34 drivers/scsi/ufs/ufshpb.c Avri Altman 2021-07-12 1647 if (hpb_dev_info->control_mode == HPB_HOST_CONTROL) 119ee38c10fa34 drivers/scsi/ufs/ufshpb.c Avri Altman 2021-07-12 1648 hpb->is_hcm = true; f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1649 } f02bc9754a6887 drivers/scsi/ufs/ufshpb.c Daejun Park 2021-07-12 1650 :::::: The code at line 1583 was first introduced by commit :::::: f02bc9754a6887bf5e286889265d24ce5e3b1952 scsi: ufs: ufshpb: Introduce Host Performance Buffer feature :::::: TO: Daejun Park <[email protected]> :::::: CC: Martin K. Petersen <[email protected]> -- 0-DAY CI Kernel Test Service https://01.org/lkp _______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
