Messages in this thread | ![/](/images/icornerl.gif) | | From | David Howells <> | Subject | Re: [RFC PATCH] keys: flush work when accessing /proc/key-users | Date | Mon, 11 Dec 2023 14:02:47 +0000 |
| |
Eric Biggers <ebiggers@kernel.org> wrote:
> If there was a function that fully and synchronously releases a key's quota, > fs/crypto/ could call it before unlinking the key. key_payload_reserve(key, > 0) almost does the trick, but it would release the key's bytes, not the key > itself.
Umm... The point of the quota is that the key is occupying unswappable kernel memory (partly true in the case of big_key) and we need to limit that. Further, the key is not released until it is unlinked.
> However, that would only fix the flakiness of the key quota for fs/crypto/, > not for other users of the keyrings service. Maybe this suggests that > key_put() should release the key's quota right away if the key's refcount > drops to 0?
That I would be okay with as the key should be removed in short order.
Note that you'd have to change the spinlocks on key->user->lock to irq-locking types. Or maybe we can do without them, at least for key gc, and use atomic counters. key_invalidate() should probably drop the quota also.
I'm also working up a patch so that key types can be marked for immediate gc if they expire, rather than there being a period (key_gc_delay) in which they cause EKEYEXPIRED rather than ENOKEY to be returned for better indication to userspace as to what's happened when a filesystem op fails to to key problems.
> Either way, note that where fs/crypto/ does key_put() on a whole keyring at > once, it would first need to call keyring_clear() to clear it synchronously.
What if there's another link on the keyring? Should it still be cleared?
Do we need faster disposal of keys? Perhaps keeping a list of keys that need destroying rather than scanning the entire key set for them. We still need to scan non-destroyed keyrings, though, to find the pointers to defunct keys unless I have some sort of backpointer list.
David
| ![\](/images/icornerr.gif) |