[RESEND PATCH] cred: separate the refcount from frequently read fields
Mateusz Guzik
mjguzik at gmail.com
Fri Aug 23 12:33:05 UTC 2024
On Fri, Aug 23, 2024 at 2:06 AM Linus Torvalds
<torvalds at linux-foundation.org> wrote:
>
> On Thu, 22 Aug 2024 at 21:15, Mateusz Guzik <mjguzik at gmail.com> wrote:
> >
> > The refcount shares the cacheline with uid, gid and other frequently
> > read fields.
>
> So moving the refcount around looks sensible, but I don't see why you
> moved 'non_rcu' away from the rcu head union.
>
> Isn't 'non_rcu' accessed exactly when the refcount is accessed too? So
> putting it in the same cacheline with ->usage would seem to make
> sense, and you literally moved the RCU head there.
>
> Why not move it as a union, and keep the non-rcu bit with the RCU head?
>
> Yes, it is rarely actually written to and as such can be "mostly
> read-only", but since it is both read and written next to refcounts,
> why do that?
>
> Did I miss some common use?
>
It gets looked at every time you grab a ref.
The layout with the change is this:
/* --- cacheline 1 boundary (64 bytes) --- */
kuid_t uid
__attribute__((__aligned__(64))); /* 64 4 */
kgid_t gid; /* 68 4 */
kuid_t suid; /* 72 4 */
kgid_t sgid; /* 76 4 */
kuid_t euid; /* 80 4 */
kgid_t egid; /* 84 4 */
kuid_t fsuid; /* 88 4 */
kgid_t fsgid; /* 92 4 */
unsigned int securebits; /* 96 4 */
bool non_rcu; /* 100 1 */
/* XXX 3 bytes hole, try to pack */
kernel_cap_t cap_inheritable; /* 104 8 */
kernel_cap_t cap_permitted; /* 112 8 */
kernel_cap_t cap_effective; /* 120 8 */
/* --- cacheline 2 boundary (128 bytes) --- */
Thus consumers which grab the ref and then look at the most commonly
used fields get the non_rcu + rest combo "for free".
consumers which already had a ref don't suffer any extra misses
--
Mateusz Guzik <mjguzik gmail.com>
More information about the Linux-security-module-archive
mailing list