From: sashiko-bot@kernel.org
To: "Jarkko Sakkinen" <jarkko@kernel.org>,
"David Howells" <dhowells@redhat.com>
Cc: bpf@vger.kernel.org, dm-devel@lists.linux.dev,
fsverity@lists.linux.dev, keyrings@vger.kernel.org,
linux-security-module@vger.kernel.org,
"Alasdair Kergon" <agk@redhat.com>,
"Alexei Starovoitov" <ast@kernel.org>,
"Alex Shi" <alexs@kernel.org>,
"Andrew Morton" <akpm@linux-foundation.org>,
"Andrii Nakryiko" <andrii@kernel.org>,
"Benjamin Marzinski" <bmarzins@redhat.com>,
"Daniel Borkmann" <daniel@iogearbox.net>,
"Dongliang Mu" <dzm91@hust.edu.cn>,
"Eduard Zingerman" <eddyz87@gmail.com>,
"Emil Tsalapatis" <emil@etsalapatis.com>,
"Eric Biggers" <ebiggers@kernel.org>,
"Ignat Korchagin" <ignat@linux.win>,
"Ihor Solodrai" <ihor.solodrai@linux.dev>,
"James Morris" <jmorris@namei.org>,
"Jiri Olsa" <jolsa@kernel.org>,
"Jonathan Corbet" <corbet@lwn.net>,
"Kumar Kartikeya Dwivedi" <memxor@gmail.com>,
"Martin KaFai Lau" <martin.lau@linux.dev>,
"Mike Snitzer" <snitzer@kernel.org>,
"Mikulas Patocka" <mpatocka@redhat.com>,
"Paul Moore" <paul@paul-moore.com>,
"Randy Dunlap" <rdunlap@infradead.org>,
"Serge E. Hallyn" <serge@hallyn.com>,
"Shuah Khan" <skhan@linuxfoundation.org>,
"Song Liu" <song@kernel.org>, "Theodore Y. Ts'o" <tytso@mit.edu>,
"Yanteng Si" <si.yanteng@linux.dev>,
"Yonghong Song" <yonghong.song@linux.dev>,
"Linus Torvalds" <torvalds@linux-foundation.org>
Subject: Re: [PATCH v7 2/3] KEYS: Replace assoc_array with rhashtable
Date: Tue, 10 Nov 2026 03:56:03 +0000 [thread overview]
Message-ID: <sashiko-outbox-206155@kernel.org> (raw)
In-Reply-To: <20261110033738.2495880-3-jarkko@kernel.org>
Thank you for your contribution! Sashiko AI review found 2 potential
issues to consider:
- [Medium] keys: missing insecure_elasticity and unbounded -EBUSY loop
in __key_link_begin()
- [Low] keys: mixed goto and delayed __free() initialization in
__key_link_begin()
--
commit 2ac2cea452f12974dec0263462b3e701c718671c
Author: Jarkko Sakkinen <jarkko@kernel.org>
KEYS: Replace assoc_array with rhashtable
This commit replaces the associative array in struct key with a
keyring_index backed by an rhashtable for direct lookups and an
RCU-protected list of keyring_link entries for ordered traversal.
> diff --git a/security/keys/keyring.c b/security/keys/keyring.c
> index ac48d6204915a..772fa0e35f9db 100644
> --- a/security/keys/keyring.c
> +++ b/security/keys/keyring.c
> @@ -31,25 +33,152 @@
[ ... ]
> +static const struct rhashtable_params keyring_link_params = {
> + .head_offset = offsetof(struct keyring_link, node),
> + .hashfn = keyring_hashfn,
> + .obj_hashfn = keyring_obj_hashfn,
> + .obj_cmpfn = keyring_obj_cmpfn,
> + .min_size = 4,
> + .nelem_hint = 3,
> + .automatic_shrinking = true,
> +};
[ ... ]
> @@ -1317,56 +1155,94 @@ int __key_move_lock(struct key *l_keyring, struct key *u_keyring,
[ ... ]
> int __key_link_begin(struct key *keyring,
> const struct keyring_index_key *index_key,
> - struct assoc_array_edit **_edit)
> + struct keyring_edit *edit)
> {
> - struct assoc_array_edit *edit;
> + struct keyring_link *link __free(kfree) = NULL;
> + struct keyring_link *replace;
> + struct keyring_index *links;
> int ret;
>
> kenter("%d,%s,%s,",
> keyring->serial, index_key->type->name, index_key->description);
>
> - BUG_ON(index_key->desc_len == 0);
> - BUG_ON(*_edit != NULL);
> + if (WARN_ON(index_key->desc_len == 0) || WARN_ON(edit->new))
> + return -EINVAL;
>
> - *_edit = NULL;
> + edit->new = NULL;
> + edit->old = NULL;
>
> ret = -EKEYREVOKED;
> if (test_bit(KEY_FLAG_REVOKED, &keyring->flags))
> goto error;
>
> - /* Create an edit script that will insert/replace the key in the
> - * keyring tree.
> - */
> - edit = assoc_array_insert(&keyring->keys,
> - &keyring_assoc_array_ops,
> - index_key,
> - NULL);
> - if (IS_ERR(edit)) {
> - ret = PTR_ERR(edit);
> + links = keyring_get_index(keyring);
> + if (IS_ERR(links)) {
> + ret = PTR_ERR(links);
> goto error;
> }
>
> + ret = -ENOMEM;
> + link = kzalloc_obj(struct keyring_link);
> + if (!link)
> + goto error;
[Severity: Low]
This isn't a bug, but per the cleanup.h conventions, link should be
defined and initialized at its kzalloc_obj() allocation site rather than
declared as NULL at the top of __key_link_begin() and mixed with goto
error paths.
> + link->hash = index_key->hash;
> +
> + replace = keyring_find_link(links, index_key);
> /* If we're not replacing a link in-place then we're going to need some
> * extra quota.
> */
> - if (!edit->dead_leaf) {
> + if (!replace) {
> ret = key_payload_reserve(keyring,
> keyring->datalen + KEYQUOTA_LINK_BYTES);
> if (ret < 0)
> - goto error_cancel;
> + goto error;
> +
> + do {
> + ret = rhashtable_insert_fast(&links->ht, &link->node,
> + keyring_link_params);
> + if (ret == -EBUSY)
> + fsleep(100);
> + } while (ret == -EBUSY);
[Severity: Medium]
As reported by Eric Biggers on v5 [1], should keyring_link_params set
.insecure_elasticity = true instead of looping on -EBUSY here?
Without .insecure_elasticity, rhashtable_insert_fast() enforces the
16-entry bucket chain limit (RHT_ELASTICITY) and returns -EBUSY to trigger
a rehash. Because keyring_obj_hashfn() only hashes the 32-bit link->hash
via jhash_1word(), entries with colliding 32-bit SipHash digests cannot be
split by rehashing with a new seed, so __key_link_begin() can spin
indefinitely in this loop while holding keyring->sem. This was fixed in
v6 by setting .insecure_elasticity = true and dropping the retry loop, but
appears to have been lost in v7.
[1] https://lore.kernel.org/r/20261107032551.GA1990@sol
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261110033738.2495880-1-jarkko@kernel.org?part=2
next prev parent reply other threads:[~2026-11-10 3:56 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-10 3:37 [PATCH v7 0/3] KEYS: Replace assoc_array with rhashtable Jarkko Sakkinen
2026-11-10 3:37 ` [PATCH v7 1/3] KEYS: Introduce keyring_is_empty() Jarkko Sakkinen
2026-11-10 3:43 ` sashiko-bot
2026-11-10 3:37 ` [PATCH v7 2/3] KEYS: Replace assoc_array with rhashtable Jarkko Sakkinen
2026-11-10 3:56 ` sashiko-bot [this message]
2026-11-10 4:11 ` Jarkko Sakkinen
2026-11-10 3:37 ` [PATCH v7 3/3] lib: Remove assoc_array Jarkko Sakkinen
2026-11-10 3:41 ` sashiko-bot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=sashiko-outbox-206155@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=agk@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=alexs@kernel.org \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bmarzins@redhat.com \
--cc=bpf@vger.kernel.org \
--cc=corbet@lwn.net \
--cc=daniel@iogearbox.net \
--cc=dhowells@redhat.com \
--cc=dm-devel@lists.linux.dev \
--cc=dzm91@hust.edu.cn \
--cc=ebiggers@kernel.org \
--cc=eddyz87@gmail.com \
--cc=emil@etsalapatis.com \
--cc=fsverity@lists.linux.dev \
--cc=ignat@linux.win \
--cc=ihor.solodrai@linux.dev \
--cc=jarkko@kernel.org \
--cc=jmorris@namei.org \
--cc=jolsa@kernel.org \
--cc=keyrings@vger.kernel.org \
--cc=linux-security-module@vger.kernel.org \
--cc=martin.lau@linux.dev \
--cc=memxor@gmail.com \
--cc=mpatocka@redhat.com \
--cc=paul@paul-moore.com \
--cc=rdunlap@infradead.org \
--cc=sashiko-reviews@lists.linux.dev \
--cc=serge@hallyn.com \
--cc=si.yanteng@linux.dev \
--cc=skhan@linuxfoundation.org \
--cc=snitzer@kernel.org \
--cc=song@kernel.org \
--cc=torvalds@linux-foundation.org \
--cc=tytso@mit.edu \
--cc=yonghong.song@linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.