:::::: :::::: Manual check reason: "low confidence static check warning: kernel/bpf/bpf_qp_trie.c:595:14: warning: Dereference of null pointer (loaded from variable 'grand_parent') [clang-analyzer-core.NullDereference]" ::::::
CC: [email protected] CC: [email protected] BCC: [email protected] In-Reply-To: <[email protected]> References: <[email protected]> TO: Hou Tao <[email protected]> Hi Hou, [FYI, it's a private test report for your RFC patch.] [auto build test WARNING on bpf-next/master] url: https://github.com/intel-lab-lkp/linux/commits/Hou-Tao/Add-support-for-qp-trie-map/20220726-204347 base: https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git master :::::: branch date: 7 days ago :::::: commit date: 7 days ago config: arm-randconfig-c002-20220731 (https://download.01.org/0day-ci/archive/20220803/[email protected]/config) compiler: clang version 16.0.0 (https://github.com/llvm/llvm-project 52cd00cabf479aa7eb6dbb063b7ba41ea57bce9e) 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://github.com/intel-lab-lkp/linux/commit/74890023aaa2d8ffed54d96d4999f10bf14ccfef git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Hou-Tao/Add-support-for-qp-trie-map/20220726-204347 git checkout 74890023aaa2d8ffed54d96d4999f10bf14ccfef # 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 >>) 7 warnings generated. Suppressed 7 warnings (7 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. Suppressed 7 warnings (7 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. Suppressed 7 warnings (7 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. 42 warnings generated. Suppressed 42 warnings (42 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. 42 warnings generated. Suppressed 42 warnings (42 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. 42 warnings generated. Suppressed 42 warnings (42 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. 42 warnings generated. Suppressed 42 warnings (42 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. 42 warnings generated. Suppressed 42 warnings (42 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. 29 warnings generated. Suppressed 29 warnings (29 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. Suppressed 8 warnings (8 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. 76 warnings generated. kernel/bpf/ringbuf.c:438: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(rec, data, size); ^~~~~~ kernel/bpf/ringbuf.c:438: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(rec, data, size); ^~~~~~ Suppressed 75 warnings (75 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. 82 warnings generated. kernel/bpf/bpf_local_storage.c:77:4: 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(SDATA(selem)->data, value, smap->map.value_size); ^~~~~~ kernel/bpf/bpf_local_storage.c:77:4: 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(SDATA(selem)->data, value, smap->map.value_size); ^~~~~~ Suppressed 81 warnings (81 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. 75 warnings generated. Suppressed 75 warnings (75 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. 53 warnings generated. kernel/bpf/bpf_qp_trie.c:280:3: 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(twigs->nodes, old->nodes, p * sizeof(*twigs->nodes)); ^~~~~~ kernel/bpf/bpf_qp_trie.c:280:3: 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(twigs->nodes, old->nodes, p * sizeof(*twigs->nodes)); ^~~~~~ kernel/bpf/bpf_qp_trie.c:285:3: 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(&twigs->nodes[p+1], &old->nodes[p+1], (nr - 1 - p) * sizeof(*twigs->nodes)); ^~~~~~ kernel/bpf/bpf_qp_trie.c:285:3: 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(&twigs->nodes[p+1], &old->nodes[p+1], (nr - 1 - p) * sizeof(*twigs->nodes)); ^~~~~~ kernel/bpf/bpf_qp_trie.c:313:3: 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(twigs->nodes, old->nodes, p * sizeof(*twigs->nodes)); ^~~~~~ kernel/bpf/bpf_qp_trie.c:313:3: 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(twigs->nodes, old->nodes, p * sizeof(*twigs->nodes)); ^~~~~~ kernel/bpf/bpf_qp_trie.c:318:3: 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(&twigs->nodes[p+1], &old->nodes[p], (nr - p) * sizeof(*twigs->nodes)); ^~~~~~ kernel/bpf/bpf_qp_trie.c:318:3: 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(&twigs->nodes[p+1], &old->nodes[p], (nr - p) * sizeof(*twigs->nodes)); ^~~~~~ kernel/bpf/bpf_qp_trie.c:341:3: 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(twigs->nodes, old->nodes, p * sizeof(*twigs->nodes)); ^~~~~~ kernel/bpf/bpf_qp_trie.c:341:3: 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(twigs->nodes, old->nodes, p * sizeof(*twigs->nodes)); ^~~~~~ kernel/bpf/bpf_qp_trie.c:343:3: 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(&twigs->nodes[p], &old->nodes[p+1], (nr - 1 - p) * sizeof(*twigs->nodes)); ^~~~~~ kernel/bpf/bpf_qp_trie.c:343:3: 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(&twigs->nodes[p], &old->nodes[p+1], (nr - 1 - p) * sizeof(*twigs->nodes)); ^~~~~~ kernel/bpf/bpf_qp_trie.c:365: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(new, k, key_size); ^~~~~~ kernel/bpf/bpf_qp_trie.c:365: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(new, k, key_size); ^~~~~~ kernel/bpf/bpf_qp_trie.c:366: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((void *)new + key_size, v, map->value_size); ^~~~~~ kernel/bpf/bpf_qp_trie.c:366: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((void *)new + key_size, v, map->value_size); ^~~~~~ >> kernel/bpf/bpf_qp_trie.c:595:14: warning: Dereference of null pointer >> (loaded from variable 'grand_parent') [clang-analyzer-core.NullDereference] old_twigs = *grand_parent; ^ kernel/bpf/bpf_qp_trie.c:998:2: note: Taking false branch if (!is_valid_key_data_len(trie_key, map->key_size)) ^ kernel/bpf/bpf_qp_trie.c:1002:2: note: Null pointer value stored to 'grand_parent' grand_parent = NULL; ^~~~~~~~~~~~~~~~~~~ kernel/bpf/bpf_qp_trie.c:1007:6: note: Assuming pointer value is null if (!*parent) ^~~~~~~~ kernel/bpf/bpf_qp_trie.c:1007:2: note: Taking false branch if (!*parent) ^ kernel/bpf/bpf_qp_trie.c:1011:2: note: Loop condition is false. Execution continues on line 1029 while (is_branch_node(*node)) { ^ kernel/bpf/bpf_qp_trie.c:1030:2: note: Taking false branch if (!is_same_key(found, trie_key)) ^ kernel/bpf/bpf_qp_trie.c:1034:6: note: Assuming 'nr' is equal to 2 if (nr != 2) ^~~~~~~ kernel/bpf/bpf_qp_trie.c:1034:2: note: Taking false branch if (nr != 2) ^ kernel/bpf/bpf_qp_trie.c:1037:34: note: Passing null pointer value via 2nd parameter 'grand_parent' err = qp_trie_merge_node(trie, grand_parent, *parent, parent_bitmap, bitmap); ^~~~~~~~~~~~ kernel/bpf/bpf_qp_trie.c:1037:9: note: Calling 'qp_trie_merge_node' err = qp_trie_merge_node(trie, grand_parent, *parent, parent_bitmap, bitmap); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ kernel/bpf/bpf_qp_trie.c:593:30: note: Assuming 'iip' is not equal to 0 new_sibling = parent->nodes[!iip]; ^~~~ kernel/bpf/bpf_qp_trie.c:595:14: note: Dereference of null pointer (loaded from variable 'grand_parent') old_twigs = *grand_parent; ^~~~~~~~~~~~~ >> kernel/bpf/bpf_qp_trie.c:648:18: warning: Division by zero >> [clang-analyzer-core.DivideZero] for (i = 0; i < ARRAY_SIZE(trie->locks); i++) ^ include/linux/kernel.h:55:38: note: expanded from macro 'ARRAY_SIZE' #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr)) ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~ kernel/bpf/bpf_qp_trie.c:644:6: note: Assuming 'trie' is non-null if (!trie) ^~~~~ kernel/bpf/bpf_qp_trie.c:644:2: note: Taking false branch if (!trie) ^ kernel/bpf/bpf_qp_trie.c:648:18: note: Division by zero for (i = 0; i < ARRAY_SIZE(trie->locks); i++) ^ include/linux/kernel.h:55:38: note: expanded from macro 'ARRAY_SIZE' #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr)) ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~ kernel/bpf/bpf_qp_trie.c:727: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(key, leaf, used); ^~~~~~ kernel/bpf/bpf_qp_trie.c:727: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(key, leaf, used); ^~~~~~ kernel/bpf/bpf_qp_trie.c:728:2: 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] memset(key + used, 0, key_size - used); ^~~~~~ kernel/bpf/bpf_qp_trie.c:728:2: 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 memset(key + used, 0, key_size - used); ^~~~~~ Suppressed 41 warnings (39 in non-user code, 2 with check filters). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 30 warnings generated. Suppressed 30 warnings (30 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. 31 warnings generated. Suppressed 31 warnings (30 in non-user code, 1 with check filters). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 30 warnings generated. Suppressed 30 warnings (30 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. 30 warnings generated. Suppressed 30 warnings (30 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. 30 warnings generated. Suppressed 30 warnings (30 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. 42 warnings generated. Suppressed 42 warnings (42 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. 29 warnings generated. Suppressed 29 warnings (29 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. 42 warnings generated. Suppressed 42 warnings (42 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. 31 warnings generated. Suppressed 31 warnings (31 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. 16 warnings generated. Suppressed 16 warnings (16 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. 20 warnings generated. drivers/hwtracing/stm/p_sys-t.c:107: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(&opriv->node, pn, sizeof(opriv->node)); ^~~~~~ drivers/hwtracing/stm/p_sys-t.c:107: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(&opriv->node, pn, sizeof(opriv->node)); ^~~~~~ drivers/hwtracing/stm/p_sys-t.c:123:9: warning: Call to function 'sprintf' 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 'sprintf_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling] return sprintf(page, "%pU\n", &pn->uuid); ^~~~~~~ drivers/hwtracing/stm/p_sys-t.c:123:9: note: Call to function 'sprintf' 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 'sprintf_s' in case of C11 return sprintf(page, "%pU\n", &pn->uuid); ^~~~~~~ drivers/hwtracing/stm/p_sys-t.c:148:9: warning: Call to function 'sprintf' 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 'sprintf_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling] return sprintf(page, "%d\n", pn->do_len); ^~~~~~~ drivers/hwtracing/stm/p_sys-t.c:148:9: note: Call to function 'sprintf' 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 'sprintf_s' in case of C11 return sprintf(page, "%d\n", pn->do_len); ^~~~~~~ drivers/hwtracing/stm/p_sys-t.c:173:9: warning: Call to function 'sprintf' 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 'sprintf_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling] return sprintf(page, "%u\n", jiffies_to_msecs(pn->ts_interval)); ^~~~~~~ drivers/hwtracing/stm/p_sys-t.c:173:9: note: Call to function 'sprintf' 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 'sprintf_s' in case of C11 return sprintf(page, "%u\n", jiffies_to_msecs(pn->ts_interval)); ^~~~~~~ drivers/hwtracing/stm/p_sys-t.c:204:9: warning: Call to function 'sprintf' 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 'sprintf_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling] return sprintf(page, "%u\n", jiffies_to_msecs(pn->clocksync_interval)); ^~~~~~~ drivers/hwtracing/stm/p_sys-t.c:204:9: note: Call to function 'sprintf' 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 'sprintf_s' in case of C11 return sprintf(page, "%u\n", jiffies_to_msecs(pn->clocksync_interval)); ^~~~~~~ Suppressed 15 warnings (15 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. 33 warnings generated. fs/io-wq.c:634:2: warning: Call to function 'snprintf' 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 'snprintf_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling] snprintf(buf, sizeof(buf), "iou-wrk-%d", wq->task->pid); ^~~~~~~~ fs/io-wq.c:634:2: note: Call to function 'snprintf' 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 'snprintf_s' in case of C11 snprintf(buf, sizeof(buf), "iou-wrk-%d", wq->task->pid); vim +/grand_parent +595 kernel/bpf/bpf_qp_trie.c 74890023aaa2d8 Hou Tao 2022-07-26 582 74890023aaa2d8 Hou Tao 2022-07-26 583 static int qp_trie_merge_node(struct qp_trie *trie, struct qp_trie_branch **grand_parent, 74890023aaa2d8 Hou Tao 2022-07-26 584 struct qp_trie_branch *parent, unsigned int parent_bitmap, 74890023aaa2d8 Hou Tao 2022-07-26 585 unsigned int bitmap) 74890023aaa2d8 Hou Tao 2022-07-26 586 { 74890023aaa2d8 Hou Tao 2022-07-26 587 struct qp_trie_branch *old_twigs, *new_twigs; 74890023aaa2d8 Hou Tao 2022-07-26 588 struct bpf_map *map = &trie->map; 74890023aaa2d8 Hou Tao 2022-07-26 589 void *new_sibling; 74890023aaa2d8 Hou Tao 2022-07-26 590 unsigned int iip; 74890023aaa2d8 Hou Tao 2022-07-26 591 74890023aaa2d8 Hou Tao 2022-07-26 592 iip = calc_twig_index(parent->bitmap, bitmap); 74890023aaa2d8 Hou Tao 2022-07-26 593 new_sibling = parent->nodes[!iip]; 74890023aaa2d8 Hou Tao 2022-07-26 594 74890023aaa2d8 Hou Tao 2022-07-26 @595 old_twigs = *grand_parent; 74890023aaa2d8 Hou Tao 2022-07-26 596 new_twigs = qp_trie_branch_replace(map, old_twigs, parent_bitmap, new_sibling); 74890023aaa2d8 Hou Tao 2022-07-26 597 if (!new_twigs) 74890023aaa2d8 Hou Tao 2022-07-26 598 return -ENOMEM; 74890023aaa2d8 Hou Tao 2022-07-26 599 74890023aaa2d8 Hou Tao 2022-07-26 600 rcu_assign_pointer(*grand_parent, new_twigs); 74890023aaa2d8 Hou Tao 2022-07-26 601 74890023aaa2d8 Hou Tao 2022-07-26 602 qp_trie_branch_free(old_twigs, QP_TRIE_TWIGS_FREE_NONE_IDX); 74890023aaa2d8 Hou Tao 2022-07-26 603 qp_trie_branch_free(parent, iip); 74890023aaa2d8 Hou Tao 2022-07-26 604 74890023aaa2d8 Hou Tao 2022-07-26 605 atomic_dec(&trie->entries); 74890023aaa2d8 Hou Tao 2022-07-26 606 74890023aaa2d8 Hou Tao 2022-07-26 607 return 0; 74890023aaa2d8 Hou Tao 2022-07-26 608 } 74890023aaa2d8 Hou Tao 2022-07-26 609 74890023aaa2d8 Hou Tao 2022-07-26 610 /* key and value are allocated together in qp_trie_init_leaf_node() */ 74890023aaa2d8 Hou Tao 2022-07-26 611 static inline bool is_valid_k_v_size(unsigned int key_size, unsigned int value_size) 74890023aaa2d8 Hou Tao 2022-07-26 612 { 74890023aaa2d8 Hou Tao 2022-07-26 613 return round_up((u64)key_size + value_size, QP_TRIE_LEAF_ALLOC_ALIGN) <= 74890023aaa2d8 Hou Tao 2022-07-26 614 KMALLOC_MAX_SIZE; 74890023aaa2d8 Hou Tao 2022-07-26 615 } 74890023aaa2d8 Hou Tao 2022-07-26 616 74890023aaa2d8 Hou Tao 2022-07-26 617 static int qp_trie_alloc_check(union bpf_attr *attr) 74890023aaa2d8 Hou Tao 2022-07-26 618 { 74890023aaa2d8 Hou Tao 2022-07-26 619 if (!bpf_capable()) 74890023aaa2d8 Hou Tao 2022-07-26 620 return -EPERM; 74890023aaa2d8 Hou Tao 2022-07-26 621 74890023aaa2d8 Hou Tao 2022-07-26 622 if (!(attr->map_flags | BPF_F_NO_PREALLOC) || 74890023aaa2d8 Hou Tao 2022-07-26 623 attr->map_flags & ~QP_TRIE_CREATE_FLAG_MASK || 74890023aaa2d8 Hou Tao 2022-07-26 624 !bpf_map_flags_access_ok(attr->map_flags)) 74890023aaa2d8 Hou Tao 2022-07-26 625 return -EINVAL; 74890023aaa2d8 Hou Tao 2022-07-26 626 74890023aaa2d8 Hou Tao 2022-07-26 627 if (!attr->max_entries || attr->key_size < QP_TRIE_MIN_KEY_SIZE || 74890023aaa2d8 Hou Tao 2022-07-26 628 !attr->value_size) 74890023aaa2d8 Hou Tao 2022-07-26 629 return -EINVAL; 74890023aaa2d8 Hou Tao 2022-07-26 630 74890023aaa2d8 Hou Tao 2022-07-26 631 if (attr->key_size > QP_TRIE_MAX_KEY_SIZE || 74890023aaa2d8 Hou Tao 2022-07-26 632 !is_valid_k_v_size(attr->key_size, attr->value_size)) 74890023aaa2d8 Hou Tao 2022-07-26 633 return -E2BIG; 74890023aaa2d8 Hou Tao 2022-07-26 634 74890023aaa2d8 Hou Tao 2022-07-26 635 return 0; 74890023aaa2d8 Hou Tao 2022-07-26 636 } 74890023aaa2d8 Hou Tao 2022-07-26 637 74890023aaa2d8 Hou Tao 2022-07-26 638 static struct bpf_map *qp_trie_alloc(union bpf_attr *attr) 74890023aaa2d8 Hou Tao 2022-07-26 639 { 74890023aaa2d8 Hou Tao 2022-07-26 640 struct qp_trie *trie; 74890023aaa2d8 Hou Tao 2022-07-26 641 unsigned int i; 74890023aaa2d8 Hou Tao 2022-07-26 642 74890023aaa2d8 Hou Tao 2022-07-26 643 trie = bpf_map_area_alloc(sizeof(*trie), bpf_map_attr_numa_node(attr)); 74890023aaa2d8 Hou Tao 2022-07-26 644 if (!trie) 74890023aaa2d8 Hou Tao 2022-07-26 645 return ERR_PTR(-ENOMEM); 74890023aaa2d8 Hou Tao 2022-07-26 646 74890023aaa2d8 Hou Tao 2022-07-26 647 /* roots are zeroed by bpf_map_area_alloc() */ 74890023aaa2d8 Hou Tao 2022-07-26 @648 for (i = 0; i < ARRAY_SIZE(trie->locks); i++) 74890023aaa2d8 Hou Tao 2022-07-26 649 spin_lock_init(&trie->locks[i]); 74890023aaa2d8 Hou Tao 2022-07-26 650 74890023aaa2d8 Hou Tao 2022-07-26 651 atomic_set(&trie->entries, 0); 74890023aaa2d8 Hou Tao 2022-07-26 652 bpf_map_init_from_attr(&trie->map, attr); 74890023aaa2d8 Hou Tao 2022-07-26 653 74890023aaa2d8 Hou Tao 2022-07-26 654 return &trie->map; 74890023aaa2d8 Hou Tao 2022-07-26 655 } 74890023aaa2d8 Hou Tao 2022-07-26 656 -- 0-DAY CI Kernel Test Service https://01.org/lkp _______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
