git: da72505f9c6a - main - radix_trie: pass fewer params to node_get
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 27 Jun 2023 17:22:31 UTC
The branch main has been updated by dougm: URL: https://cgit.FreeBSD.org/src/commit/?id=da72505f9c6a95009ef710fb1c2b4f2c63cce509 commit da72505f9c6a95009ef710fb1c2b4f2c63cce509 Author: Doug Moore <dougm@FreeBSD.org> AuthorDate: 2023-06-27 17:21:11 +0000 Commit: Doug Moore <dougm@FreeBSD.org> CommitDate: 2023-06-27 17:21:11 +0000 radix_trie: pass fewer params to node_get Let node_get calculate it's own owner value. Don't pass the count parameter, since it's always 2. Save 16 bytes in insert(). Move, without modifying, slot and trimkey to handle use-before-declaration problem. Reviewed by: markj Differential Revision: https://reviews.freebsd.org/D40723 --- sys/kern/subr_pctrie.c | 47 ++++++++++++++++++++++------------------------- sys/vm/vm_radix.c | 44 +++++++++++++++++++++----------------------- 2 files changed, 43 insertions(+), 48 deletions(-) diff --git a/sys/kern/subr_pctrie.c b/sys/kern/subr_pctrie.c index b5dee2163a40..0f28e5ebb2f1 100644 --- a/sys/kern/subr_pctrie.c +++ b/sys/kern/subr_pctrie.c @@ -92,13 +92,29 @@ enum pctrie_access { PCTRIE_SMR, PCTRIE_LOCKED, PCTRIE_UNSERIALIZED }; static __inline void pctrie_node_store(smr_pctnode_t *p, void *val, enum pctrie_access access); +/* + * Return the position in the array for a given level. + */ +static __inline int +pctrie_slot(uint64_t index, uint16_t level) +{ + return ((index >> (level * PCTRIE_WIDTH)) & PCTRIE_MASK); +} + +/* Computes the key (index) with the low-order 'level' radix-digits zeroed. */ +static __inline uint64_t +pctrie_trimkey(uint64_t index, uint16_t level) +{ + return (index & -PCTRIE_UNITLEVEL(level)); +} + /* * Allocate a node. Pre-allocation should ensure that the request * will always be satisfied. */ static struct pctrie_node * -pctrie_node_get(struct pctrie *ptree, pctrie_alloc_t allocfn, uint64_t owner, - uint16_t count, uint16_t clevel) +pctrie_node_get(struct pctrie *ptree, pctrie_alloc_t allocfn, uint64_t index, + uint16_t clevel) { struct pctrie_node *node; @@ -116,8 +132,8 @@ pctrie_node_get(struct pctrie *ptree, pctrie_alloc_t allocfn, uint64_t owner, PCTRIE_UNSERIALIZED); node->pn_last = 0; } - node->pn_owner = owner; - node->pn_count = count; + node->pn_owner = pctrie_trimkey(index, clevel + 1); + node->pn_count = 2; node->pn_clev = clevel; return (node); } @@ -146,23 +162,6 @@ pctrie_node_put(struct pctrie *ptree, struct pctrie_node *node, freefn(ptree, node); } -/* - * Return the position in the array for a given level. - */ -static __inline int -pctrie_slot(uint64_t index, uint16_t level) -{ - - return ((index >> (level * PCTRIE_WIDTH)) & PCTRIE_MASK); -} - -/* Computes the key (index) with the low-order 'level' radix-digits zeroed. */ -static __inline uint64_t -pctrie_trimkey(uint64_t index, uint16_t level) -{ - return (index & -PCTRIE_UNITLEVEL(level)); -} - /* * Fetch a node pointer from a slot. */ @@ -376,8 +375,7 @@ pctrie_insert(struct pctrie *ptree, uint64_t *val, pctrie_alloc_t allocfn) panic("%s: key %jx is already present", __func__, (uintmax_t)index); clev = pctrie_keydiff(*m, index); - tmp = pctrie_node_get(ptree, allocfn, - pctrie_trimkey(index, clev + 1), 2, clev); + tmp = pctrie_node_get(ptree, allocfn, index, clev); if (tmp == NULL) return (ENOMEM); /* These writes are not yet visible due to ordering. */ @@ -408,8 +406,7 @@ pctrie_insert(struct pctrie *ptree, uint64_t *val, pctrie_alloc_t allocfn) */ newind = node->pn_owner; clev = pctrie_keydiff(newind, index); - tmp = pctrie_node_get(ptree, allocfn, - pctrie_trimkey(index, clev + 1), 2, clev); + tmp = pctrie_node_get(ptree, allocfn, index, clev); if (tmp == NULL) return (ENOMEM); slot = pctrie_slot(newind, clev); diff --git a/sys/vm/vm_radix.c b/sys/vm/vm_radix.c index a34de9e6ff92..b3d0d92f9969 100644 --- a/sys/vm/vm_radix.c +++ b/sys/vm/vm_radix.c @@ -119,11 +119,27 @@ static smr_t vm_radix_smr; static void vm_radix_node_store(smrnode_t *p, struct vm_radix_node *v, enum vm_radix_access access); +/* + * Return the position in the array for a given level. + */ +static __inline int +vm_radix_slot(vm_pindex_t index, uint16_t level) +{ + return ((index >> (level * VM_RADIX_WIDTH)) & VM_RADIX_MASK); +} + +/* Computes the key (index) with the low-order 'level' radix-digits zeroed. */ +static __inline vm_pindex_t +vm_radix_trimkey(vm_pindex_t index, uint16_t level) +{ + return (index & -VM_RADIX_UNITLEVEL(level)); +} + /* * Allocate a radix node. */ static struct vm_radix_node * -vm_radix_node_get(vm_pindex_t owner, uint16_t count, uint16_t clevel) +vm_radix_node_get(vm_pindex_t index, uint16_t clevel) { struct vm_radix_node *rnode; @@ -141,8 +157,8 @@ vm_radix_node_get(vm_pindex_t owner, uint16_t count, uint16_t clevel) NULL, UNSERIALIZED); rnode->rn_last = 0; } - rnode->rn_owner = owner; - rnode->rn_count = count; + rnode->rn_owner = vm_radix_trimkey(index, clevel + 1); + rnode->rn_count = 2; rnode->rn_clev = clevel; return (rnode); } @@ -171,23 +187,6 @@ vm_radix_node_put(struct vm_radix_node *rnode, int8_t last) uma_zfree_smr(vm_radix_node_zone, rnode); } -/* - * Return the position in the array for a given level. - */ -static __inline int -vm_radix_slot(vm_pindex_t index, uint16_t level) -{ - - return ((index >> (level * VM_RADIX_WIDTH)) & VM_RADIX_MASK); -} - -/* Computes the key (index) with the low-order 'level' radix-digits zeroed. */ -static __inline vm_pindex_t -vm_radix_trimkey(vm_pindex_t index, uint16_t level) -{ - return (index & -VM_RADIX_UNITLEVEL(level)); -} - /* * Fetch a node pointer from a slot in another node. */ @@ -416,8 +415,7 @@ vm_radix_insert(struct vm_radix *rtree, vm_page_t page) panic("%s: key %jx is already present", __func__, (uintmax_t)index); clev = vm_radix_keydiff(m->pindex, index); - tmp = vm_radix_node_get(vm_radix_trimkey(index, - clev + 1), 2, clev); + tmp = vm_radix_node_get(index, clev); if (tmp == NULL) return (ENOMEM); /* These writes are not yet visible due to ordering. */ @@ -447,7 +445,7 @@ vm_radix_insert(struct vm_radix *rtree, vm_page_t page) */ newind = rnode->rn_owner; clev = vm_radix_keydiff(newind, index); - tmp = vm_radix_node_get(vm_radix_trimkey(index, clev + 1), 2, clev); + tmp = vm_radix_node_get(index, clev); if (tmp == NULL) return (ENOMEM); slot = vm_radix_slot(newind, clev);