Re: [PATCH v21 09/24] ovpn: implement packet processing

From: Sabrina Dubroca
Date: Wed Mar 05 2025 - 05:07:06 EST


2025-03-05, 00:35:09 +0100, Antonio Quartulli wrote:
> On 04/03/2025 20:02, Sabrina Dubroca wrote:
> > 2025-03-04, 01:33:39 +0100, Antonio Quartulli wrote:
> > [...]
> > > +static inline struct ovpn_crypto_key_slot *
> > > +ovpn_crypto_key_id_to_slot(const struct ovpn_crypto_state *cs, u8 key_id)
> > > +{
> > > + struct ovpn_crypto_key_slot *ks;
> > > + u8 idx;
> > > +
> > > + if (unlikely(!cs))
> > > + return NULL;
> > > +
> > > + rcu_read_lock();
> > > + idx = cs->primary_idx;
> >
> > I'd go with slots[0] and slots[1], since it doesn't really matter
> > whether we check the primary or secondary first. It would avoid a
> > possible reload of cs->primary_idx (which might be updated
> > concurrently by a key swap and cause us to look into the same slot
> > twice) -- a READ_ONCE would also prevent that.
>
> Reason for looking into primary first is that we will most likely need the
> primary key to decrypt the incoming traffic.
>
> Secondary is used only during a small (if at all) time window where we moved
> to a new key, but our peer was still sending traffic encrypted with the old
> (secondary) key.
>
> Therefore optimizing for primary-first may make a non-negligible difference
> under heavy load.
>
> Code doesn't get more complex due to this logic, therefore I'd keep this
> version (with READ_ONCE(cs->primary_idx)), unless there is a strong argument
> against it.

Ok, sounds reasonable.

--
Sabrina