CC: llvm(a)lists.linux.dev CC: kbuild-all(a)lists.01.org BCC: lkp(a)intel.com CC: linux-kernel(a)vger.kernel.org TO: Daejun Park CC: "Martin K. Petersen" CC: "Greg Kroah-Hartman" CC: Bart Van Assche CC: Can Guo CC: Bean Huo CC: Stanley Chu tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: 4ea3c6425269d33da53c79d539ce9554117cf4d4 commit: f02bc9754a6887bf5e286889265d24ce5e3b1952 scsi: ufs: ufshpb: Introduce Host Performance Buffer feature date: 8 months ago :::::: branch date: 6 hours ago :::::: commit date: 8 months ago config: arm-randconfig-c002-20220410 (https://download.01.org/0day-ci/archive/20220411/202204110819.kuDfJPsr-lkp(a)intel.com/config) compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project 256c6b0ba14e8a7ab6373b61b7193ea8c0a3651c) 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=f02bc9754a6887bf5e286889265d24ce5e3b1952 git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git git fetch --no-tags linus master git checkout f02bc9754a6887bf5e286889265d24ce5e3b1952 # save the config file to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=arm clang-analyzer If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot clang-analyzer warnings: (new ones prefixed by >>) INIT_LIST_HEAD(&pages); ^~~~~~~~~~~~~~~~~~~~~~ drivers/dma-buf/heaps/system_heap.c:361:9: note: Assuming 'size_remaining' is <= 0 while (size_remaining > 0) { ^~~~~~~~~~~~~~~~~~ drivers/dma-buf/heaps/system_heap.c:361:2: note: Loop condition is false. Execution continues on line 381 while (size_remaining > 0) { ^ drivers/dma-buf/heaps/system_heap.c:382:6: note: Assuming the condition is true if (sg_alloc_table(table, i, GFP_KERNEL)) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/dma-buf/heaps/system_heap.c:382:2: note: Taking true branch if (sg_alloc_table(table, i, GFP_KERNEL)) ^ drivers/dma-buf/heaps/system_heap.c:383:3: note: Control jumps to line 413 goto free_buffer; ^ drivers/dma-buf/heaps/system_heap.c:413:2: note: Left side of '&&' is false list_for_each_entry_safe(page, tmp_page, &pages, lru) ^ include/linux/list.h:715:13: note: expanded from macro 'list_for_each_entry_safe' for (pos = list_first_entry(head, typeof(*pos), member), \ ^ include/linux/list.h:522:2: note: expanded from macro 'list_first_entry' list_entry((ptr)->next, type, member) ^ include/linux/list.h:511:2: note: expanded from macro 'list_entry' container_of(ptr, type, member) ^ include/linux/kernel.h:495:61: note: expanded from macro 'container_of' BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ ^ drivers/dma-buf/heaps/system_heap.c:413:2: note: Taking false branch list_for_each_entry_safe(page, tmp_page, &pages, lru) ^ include/linux/list.h:715:13: note: expanded from macro 'list_for_each_entry_safe' for (pos = list_first_entry(head, typeof(*pos), member), \ ^ include/linux/list.h:522:2: note: expanded from macro 'list_first_entry' list_entry((ptr)->next, type, member) ^ include/linux/list.h:511:2: note: expanded from macro 'list_entry' container_of(ptr, type, member) ^ note: (skipping 2 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all) include/linux/compiler_types.h:328:2: note: expanded from macro 'compiletime_assert' _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) ^ include/linux/compiler_types.h:316:2: note: expanded from macro '_compiletime_assert' __compiletime_assert(condition, msg, prefix, suffix) ^ include/linux/compiler_types.h:308:3: note: expanded from macro '__compiletime_assert' if (!(condition)) \ ^ drivers/dma-buf/heaps/system_heap.c:413:2: note: Loop condition is false. Exiting loop list_for_each_entry_safe(page, tmp_page, &pages, lru) ^ include/linux/list.h:715:13: note: expanded from macro 'list_for_each_entry_safe' for (pos = list_first_entry(head, typeof(*pos), member), \ ^ include/linux/list.h:522:2: note: expanded from macro 'list_first_entry' list_entry((ptr)->next, type, member) ^ include/linux/list.h:511:2: note: expanded from macro 'list_entry' container_of(ptr, type, member) ^ note: (skipping 2 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all) include/linux/compiler_types.h:328:2: note: expanded from macro 'compiletime_assert' _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) ^ include/linux/compiler_types.h:316:2: note: expanded from macro '_compiletime_assert' __compiletime_assert(condition, msg, prefix, suffix) ^ include/linux/compiler_types.h:306:2: note: expanded from macro '__compiletime_assert' do { \ ^ drivers/dma-buf/heaps/system_heap.c:413:2: note: Assigned value is garbage or undefined list_for_each_entry_safe(page, tmp_page, &pages, lru) ^ include/linux/list.h:716:7: note: expanded from macro 'list_for_each_entry_safe' n = list_next_entry(pos, member); \ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/list.h:555:2: note: expanded from macro 'list_next_entry' list_entry((pos)->member.next, typeof(*(pos)), member) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/list.h:511:2: note: expanded from macro 'list_entry' container_of(ptr, type, member) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/kernel.h:494:2: note: expanded from macro 'container_of' void *__mptr = (void *)(ptr); \ ^ ~~~~~~~~~~~~~ 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. 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. 8 warnings generated. >> drivers/scsi/ufs/ufshpb.c:54: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/scsi/ufs/ufshpb.c:475:6: note: Assuming 'lun' is < field 'max_lu_supported' if (lun >= hba->dev_info.max_lu_supported) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/scsi/ufs/ufshpb.c:475:2: note: Taking false branch if (lun >= hba->dev_info.max_lu_supported) ^ drivers/scsi/ufs/ufshpb.c:479:6: note: 'ret' is 0 if (ret) ^~~ drivers/scsi/ufs/ufshpb.c:479:2: note: Taking false branch if (ret) ^ drivers/scsi/ufs/ufshpb.c:482:8: note: Calling 'ufshpb_alloc_hpb_lu' hpb = ufshpb_alloc_hpb_lu(hba, lun, &hba->ufshpb_dev, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/scsi/ufs/ufshpb.c:257:6: note: Assuming 'hpb' is non-null if (!hpb) ^~~~ drivers/scsi/ufs/ufshpb.c:257:2: note: Taking false branch if (!hpb) ^ drivers/scsi/ufs/ufshpb.c:264:8: note: Calling 'ufshpb_lu_hpb_init' ret = ufshpb_lu_hpb_init(hba, hpb); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/scsi/ufs/ufshpb.c:241:8: note: Calling 'ufshpb_alloc_region_tbl' ret = ufshpb_alloc_region_tbl(hba, hpb); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/scsi/ufs/ufshpb.c:120:6: note: Assuming 'rgn_table' is non-null if (!rgn_table) ^~~~~~~~~~ drivers/scsi/ufs/ufshpb.c:120:2: note: Taking false branch if (!rgn_table) ^ drivers/scsi/ufs/ufshpb.c:125:20: note: Assuming 'rgn_idx' is < field 'rgns_per_lu' for (rgn_idx = 0; rgn_idx < hpb->rgns_per_lu; rgn_idx++) { ^~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/scsi/ufs/ufshpb.c:125:2: note: Loop condition is true. Entering loop body for (rgn_idx = 0; rgn_idx < hpb->rgns_per_lu; rgn_idx++) { ^ drivers/scsi/ufs/ufshpb.c:132:7: note: Assuming the condition is true if (rgn_idx == hpb->rgns_per_lu - 1) { ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/scsi/ufs/ufshpb.c:132:3: note: Taking true branch if (rgn_idx == hpb->rgns_per_lu - 1) { ^ drivers/scsi/ufs/ufshpb.c:139:7: note: 'ret' is 0 if (ret) ^~~ drivers/scsi/ufs/ufshpb.c:139:3: note: Taking false branch if (ret) ^ drivers/scsi/ufs/ufshpb.c:141:3: note: Calling 'ufshpb_init_subregion_tbl' ufshpb_init_subregion_tbl(hpb, rgn, last_srgn); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/scsi/ufs/ufshpb.c:43:2: note: 'srgn' declared without an initial value struct ufshpb_subregion *srgn; ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/scsi/ufs/ufshpb.c:45:21: note: Assuming 'srgn_idx' is >= field 'srgn_cnt' for (srgn_idx = 0; srgn_idx < rgn->srgn_cnt; srgn_idx++) { ^~~~~~~~~~~~~~~~~~~~~~~~ drivers/scsi/ufs/ufshpb.c:45:2: note: Loop condition is false. Execution continues on line 53 for (srgn_idx = 0; srgn_idx < rgn->srgn_cnt; srgn_idx++) { ^ drivers/scsi/ufs/ufshpb.c:53: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/scsi/ufs/ufshpb.c:53:15: note: Left side of '&&' is true if (unlikely(last && hpb->last_srgn_entries)) ^ drivers/scsi/ufs/ufshpb.c:53: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/scsi/ufs/ufshpb.c:53:2: note: Taking true branch if (unlikely(last && hpb->last_srgn_entries)) ^ drivers/scsi/ufs/ufshpb.c:54: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/scsi/ufs/ufshpb.c:104: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:36: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/scsi/ufs/ufshpb.c:78:23: note: Assuming field 'num_pinned' is 0 hpb->lu_pinned_end = hpb_lu_info->num_pinned ? ^~~~~~~~~~~~~~~~~~~~~~~ drivers/scsi/ufs/ufshpb.c:78:23: note: '?' condition is false drivers/scsi/ufs/ufshpb.c:84:2: note: Left side of '&&' is false do_div(rgn_mem_size, HPB_ENTRY_BLOCK_SIZE); ^ include/asm-generic/div64.h:229:35: note: expanded from macro 'do_div' if (__builtin_constant_p(__base) && \ ^ drivers/scsi/ufs/ufshpb.c:84:2: note: 4 is >= 4 do_div(rgn_mem_size, HPB_ENTRY_BLOCK_SIZE); ^ include/asm-generic/div64.h:233:13: note: expanded from macro 'do_div' } else if (__div64_const32_is_OK && \ ^~~~~~~~~~~~~~~~~~~~~ arch/arm/include/asm/div64.h:64:32: note: expanded from macro '__div64_const32_is_OK' #define __div64_const32_is_OK (__GNUC__ >= 4) ^~~~~~~~ note: expanded from here drivers/scsi/ufs/ufshpb.c:84:2: note: Left side of '&&' is true do_div(rgn_mem_size, HPB_ENTRY_BLOCK_SIZE); ^ include/asm-generic/div64.h:233:13: note: expanded from macro 'do_div' } else if (__div64_const32_is_OK && \ ^ arch/arm/include/asm/div64.h:64:31: note: expanded from macro '__div64_const32_is_OK' #define __div64_const32_is_OK (__GNUC__ >= 4) ^ drivers/scsi/ufs/ufshpb.c:84:2: note: Left side of '&&' is false do_div(rgn_mem_size, HPB_ENTRY_BLOCK_SIZE); ^ include/asm-generic/div64.h:234:35: note: expanded from macro 'do_div' __builtin_constant_p(__base) && \ ^ drivers/scsi/ufs/ufshpb.c:84:2: note: Assuming the condition is true do_div(rgn_mem_size, HPB_ENTRY_BLOCK_SIZE); ^ include/asm-generic/div64.h:241: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/scsi/ufs/ufshpb.c:84:2: note: Taking true branch do_div(rgn_mem_size, HPB_ENTRY_BLOCK_SIZE); ^ include/asm-generic/div64.h:241:9: note: expanded from macro 'do_div' } else if (likely(((n) >> 32) == 0)) { \ ^ drivers/scsi/ufs/ufshpb.c:89:2: note: Left side of '&&' is false do_div(tmp, HPB_ENTRY_SIZE); ^ include/asm-generic/div64.h:229:35: note: expanded from macro 'do_div' if (__builtin_constant_p(__base) && \ ^ drivers/scsi/ufs/ufshpb.c:89:2: note: 4 is >= 4 do_div(tmp, HPB_ENTRY_SIZE); ^ include/asm-generic/div64.h:233:13: note: expanded from macro 'do_div' } else if (__div64_const32_is_OK && \ ^~~~~~~~~~~~~~~~~~~~~ arch/arm/include/asm/div64.h:64:32: note: expanded from macro '__div64_const32_is_OK' #define __div64_const32_is_OK (__GNUC__ >= 4) ^~~~~~~~ note: expanded from here drivers/scsi/ufs/ufshpb.c:89:2: note: Left side of '&&' is true do_div(tmp, HPB_ENTRY_SIZE); ^ include/asm-generic/div64.h:233:13: note: expanded from macro 'do_div' } else if (__div64_const32_is_OK && \ ^ arch/arm/include/asm/div64.h:64:31: note: expanded from macro '__div64_const32_is_OK' #define __div64_const32_is_OK (__GNUC__ >= 4) ^ drivers/scsi/ufs/ufshpb.c:89:2: note: Left side of '&&' is false do_div(tmp, HPB_ENTRY_SIZE); ^ include/asm-generic/div64.h:234:35: note: expanded from macro 'do_div' __builtin_constant_p(__base) && \ ^ drivers/scsi/ufs/ufshpb.c:89:2: note: Assuming the condition is true do_div(tmp, HPB_ENTRY_SIZE); ^ include/asm-generic/div64.h:241: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/scsi/ufs/ufshpb.c:89:2: note: Taking true branch do_div(tmp, HPB_ENTRY_SIZE); vim +54 drivers/scsi/ufs/ufshpb.c f02bc9754a6887 Daejun Park 2021-07-12 38 f02bc9754a6887 Daejun Park 2021-07-12 39 static void ufshpb_init_subregion_tbl(struct ufshpb_lu *hpb, f02bc9754a6887 Daejun Park 2021-07-12 40 struct ufshpb_region *rgn, bool last) f02bc9754a6887 Daejun Park 2021-07-12 41 { f02bc9754a6887 Daejun Park 2021-07-12 42 int srgn_idx; f02bc9754a6887 Daejun Park 2021-07-12 43 struct ufshpb_subregion *srgn; f02bc9754a6887 Daejun Park 2021-07-12 44 f02bc9754a6887 Daejun Park 2021-07-12 45 for (srgn_idx = 0; srgn_idx < rgn->srgn_cnt; srgn_idx++) { f02bc9754a6887 Daejun Park 2021-07-12 46 srgn = rgn->srgn_tbl + srgn_idx; f02bc9754a6887 Daejun Park 2021-07-12 47 f02bc9754a6887 Daejun Park 2021-07-12 48 srgn->rgn_idx = rgn->rgn_idx; f02bc9754a6887 Daejun Park 2021-07-12 49 srgn->srgn_idx = srgn_idx; f02bc9754a6887 Daejun Park 2021-07-12 50 srgn->srgn_state = HPB_SRGN_UNUSED; f02bc9754a6887 Daejun Park 2021-07-12 51 } f02bc9754a6887 Daejun Park 2021-07-12 52 f02bc9754a6887 Daejun Park 2021-07-12 53 if (unlikely(last && hpb->last_srgn_entries)) f02bc9754a6887 Daejun Park 2021-07-12 @54 srgn->is_last = true; f02bc9754a6887 Daejun Park 2021-07-12 55 } f02bc9754a6887 Daejun Park 2021-07-12 56 f02bc9754a6887 Daejun Park 2021-07-12 57 static int ufshpb_alloc_subregion_tbl(struct ufshpb_lu *hpb, f02bc9754a6887 Daejun Park 2021-07-12 58 struct ufshpb_region *rgn, int srgn_cnt) f02bc9754a6887 Daejun Park 2021-07-12 59 { f02bc9754a6887 Daejun Park 2021-07-12 60 rgn->srgn_tbl = kvcalloc(srgn_cnt, sizeof(struct ufshpb_subregion), f02bc9754a6887 Daejun Park 2021-07-12 61 GFP_KERNEL); f02bc9754a6887 Daejun Park 2021-07-12 62 if (!rgn->srgn_tbl) f02bc9754a6887 Daejun Park 2021-07-12 63 return -ENOMEM; f02bc9754a6887 Daejun Park 2021-07-12 64 f02bc9754a6887 Daejun Park 2021-07-12 65 rgn->srgn_cnt = srgn_cnt; f02bc9754a6887 Daejun Park 2021-07-12 66 return 0; f02bc9754a6887 Daejun Park 2021-07-12 67 } f02bc9754a6887 Daejun Park 2021-07-12 68 f02bc9754a6887 Daejun Park 2021-07-12 69 static void ufshpb_lu_parameter_init(struct ufs_hba *hba, f02bc9754a6887 Daejun Park 2021-07-12 70 struct ufshpb_lu *hpb, f02bc9754a6887 Daejun Park 2021-07-12 71 struct ufshpb_dev_info *hpb_dev_info, f02bc9754a6887 Daejun Park 2021-07-12 72 struct ufshpb_lu_info *hpb_lu_info) f02bc9754a6887 Daejun Park 2021-07-12 73 { f02bc9754a6887 Daejun Park 2021-07-12 74 u32 entries_per_rgn; f02bc9754a6887 Daejun Park 2021-07-12 75 u64 rgn_mem_size, tmp; f02bc9754a6887 Daejun Park 2021-07-12 76 f02bc9754a6887 Daejun Park 2021-07-12 77 hpb->lu_pinned_start = hpb_lu_info->pinned_start; f02bc9754a6887 Daejun Park 2021-07-12 78 hpb->lu_pinned_end = hpb_lu_info->num_pinned ? f02bc9754a6887 Daejun Park 2021-07-12 79 (hpb_lu_info->pinned_start + hpb_lu_info->num_pinned - 1) f02bc9754a6887 Daejun Park 2021-07-12 80 : PINNED_NOT_SET; f02bc9754a6887 Daejun Park 2021-07-12 81 f02bc9754a6887 Daejun Park 2021-07-12 82 rgn_mem_size = (1ULL << hpb_dev_info->rgn_size) * HPB_RGN_SIZE_UNIT f02bc9754a6887 Daejun Park 2021-07-12 83 * HPB_ENTRY_SIZE; f02bc9754a6887 Daejun Park 2021-07-12 84 do_div(rgn_mem_size, HPB_ENTRY_BLOCK_SIZE); f02bc9754a6887 Daejun Park 2021-07-12 85 hpb->srgn_mem_size = (1ULL << hpb_dev_info->srgn_size) f02bc9754a6887 Daejun Park 2021-07-12 86 * HPB_RGN_SIZE_UNIT / HPB_ENTRY_BLOCK_SIZE * HPB_ENTRY_SIZE; f02bc9754a6887 Daejun Park 2021-07-12 87 f02bc9754a6887 Daejun Park 2021-07-12 88 tmp = rgn_mem_size; f02bc9754a6887 Daejun Park 2021-07-12 89 do_div(tmp, HPB_ENTRY_SIZE); f02bc9754a6887 Daejun Park 2021-07-12 90 entries_per_rgn = (u32)tmp; f02bc9754a6887 Daejun Park 2021-07-12 91 hpb->entries_per_rgn_shift = ilog2(entries_per_rgn); f02bc9754a6887 Daejun Park 2021-07-12 92 hpb->entries_per_rgn_mask = entries_per_rgn - 1; f02bc9754a6887 Daejun Park 2021-07-12 93 f02bc9754a6887 Daejun Park 2021-07-12 94 hpb->entries_per_srgn = hpb->srgn_mem_size / HPB_ENTRY_SIZE; f02bc9754a6887 Daejun Park 2021-07-12 95 hpb->entries_per_srgn_shift = ilog2(hpb->entries_per_srgn); f02bc9754a6887 Daejun Park 2021-07-12 96 hpb->entries_per_srgn_mask = hpb->entries_per_srgn - 1; f02bc9754a6887 Daejun Park 2021-07-12 97 f02bc9754a6887 Daejun Park 2021-07-12 98 tmp = rgn_mem_size; f02bc9754a6887 Daejun Park 2021-07-12 99 do_div(tmp, hpb->srgn_mem_size); f02bc9754a6887 Daejun Park 2021-07-12 100 hpb->srgns_per_rgn = (int)tmp; f02bc9754a6887 Daejun Park 2021-07-12 101 f02bc9754a6887 Daejun Park 2021-07-12 102 hpb->rgns_per_lu = DIV_ROUND_UP(hpb_lu_info->num_blocks, f02bc9754a6887 Daejun Park 2021-07-12 103 entries_per_rgn); f02bc9754a6887 Daejun Park 2021-07-12 @104 hpb->srgns_per_lu = DIV_ROUND_UP(hpb_lu_info->num_blocks, f02bc9754a6887 Daejun Park 2021-07-12 105 (hpb->srgn_mem_size / HPB_ENTRY_SIZE)); f02bc9754a6887 Daejun Park 2021-07-12 106 hpb->last_srgn_entries = hpb_lu_info->num_blocks f02bc9754a6887 Daejun Park 2021-07-12 107 % (hpb->srgn_mem_size / HPB_ENTRY_SIZE); f02bc9754a6887 Daejun Park 2021-07-12 108 f02bc9754a6887 Daejun Park 2021-07-12 109 hpb->pages_per_srgn = DIV_ROUND_UP(hpb->srgn_mem_size, PAGE_SIZE); f02bc9754a6887 Daejun Park 2021-07-12 110 } f02bc9754a6887 Daejun Park 2021-07-12 111 -- 0-DAY CI Kernel Test Service https://01.org/lkp