On 13/09/20(Sun) 10:05, Klemens Nanni wrote:
>
> Here's a start at struct pppoe_softc; for every member I went through
> code paths looking for *_LOCK() or *_ASSERT_LOCKED().
>
> Pretty much all members are under the net lock, some are proctected by
> both net and kernel lock, e.g. the start routine is called with
> KERNEL_LOCK().
>
> I did not go through the sppp struct members yet.
>
> Does this look correct?
Without doing another audit but with the fact that pseudo-device are
generally run by a thread holding the NET_LOCK() I'd assume it's ok.
> From here on, I think we can start and already pull out a few of those
> members and put them under a new pppoe(4) specific lock.
First we should remove the KRENEL_LOCK() from around pppoeintr(). The
NET_LOCK() is not an issue right now.
One comment below, either way ok mpi@
> Index: if_pppoe.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_pppoe.c,v
> retrieving revision 1.70
> diff -u -p -r1.70 if_pppoe.c
> --- if_pppoe.c 28 Jul 2020 09:52:32 -0000 1.70
> +++ if_pppoe.c 20 Aug 2020 15:27:09 -0000
> @@ -114,27 +115,34 @@ struct pppoetag {
> #define PPPOE_DISC_MAXPADI 4 /* retry PADI four times
> (quickly) */
> #define PPPOE_DISC_MAXPADR 2 /* retry PADR twice */
>
> +/*
> + * Locks used to protect struct members and global data
> + * I immutable after creation
> + * K kernel lock
I wouldn't bother repeating 'I' and 'K' if they are not used in the
description below.
> + * N net lock
> + */
> +
> struct pppoe_softc {
> struct sppp sc_sppp; /* contains a struct ifnet as first
> element */
> - LIST_ENTRY(pppoe_softc) sc_list;
> - unsigned int sc_eth_ifidx;
> + LIST_ENTRY(pppoe_softc) sc_list;/* [N] */
> + unsigned int sc_eth_ifidx; /* [N] */
>
> - int sc_state; /* discovery phase or session connected
> */
> - struct ether_addr sc_dest; /* hardware address of concentrator */
> - u_int16_t sc_session; /* PPPoE session id */
> -
> - char *sc_service_name; /* if != NULL: requested name of
> service */
> - char *sc_concentrator_name; /* if != NULL: requested concentrator
> id */
> - u_int8_t *sc_ac_cookie; /* content of AC cookie we must echo
> back */
> - size_t sc_ac_cookie_len; /* length of cookie data */
> - u_int8_t *sc_relay_sid; /* content of relay SID we must echo
> back */
> - size_t sc_relay_sid_len; /* length of relay SID data */
> - u_int32_t sc_unique; /* our unique id */
> - struct timeout sc_timeout; /* timeout while not in session state */
> - int sc_padi_retried; /* number of PADI retries already done
> */
> - int sc_padr_retried; /* number of PADR retries already done
> */
> + int sc_state; /* [N] discovery phase or session
> connected */
> + struct ether_addr sc_dest; /* [N] hardware address of concentrator
> */
> + u_int16_t sc_session; /* [N] PPPoE session id */
> +
> + char *sc_service_name; /* [N] if != NULL: requested name of
> service */
> + char *sc_concentrator_name; /* [N] if != NULL: requested
> concentrator id */
> + u_int8_t *sc_ac_cookie; /* [N] content of AC cookie we must
> echo back */
> + size_t sc_ac_cookie_len; /* [N] length of cookie data */
> + u_int8_t *sc_relay_sid; /* [N] content of relay SID we must
> echo back */
> + size_t sc_relay_sid_len; /* [N] length of relay SID data */
> + u_int32_t sc_unique; /* [I] our unique id */
> + struct timeout sc_timeout; /* [N] timeout while not in session
> state */
> + int sc_padi_retried; /* [N] number of PADI retries already
> done */
> + int sc_padr_retried; /* [N] number of PADR retries already
> done */
>
> - struct timeval sc_session_time; /* time the session was established */
> + struct timeval sc_session_time; /* [N] time the session was established
> */
> };
>
> /* incoming traffic will be queued here */
>