On Mon, Apr 17, 2023 at 05:43:05PM +0300, Vitaliy Makkoveev wrote:
> On Mon, Apr 17, 2023 at 02:58:59PM +0200, Alexander Bluhm wrote:
> > On Mon, Apr 17, 2023 at 01:20:28AM +0300, Vitaliy Makkoveev wrote:
> > > It performs read-only access to netlock protected data.
> >
> > OK bluhm@
> >
> > Could you somewhere document that ifnetlist is protected by netlock?
> >
>
> We use both kernel and net lock for protect `ifnetlist'. This is the
> exception, so I propose to document this like below.
OK bluhm@
> Index: sys/net/if.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if.c,v
> retrieving revision 1.688
> diff -u -p -r1.688 if.c
> --- sys/net/if.c 8 Apr 2023 13:49:38 -0000 1.688
> +++ sys/net/if.c 17 Apr 2023 14:42:10 -0000
> @@ -272,6 +272,10 @@ ifinit(void)
>
> static struct if_idxmap if_idxmap;
>
> +/*
> + * XXXSMP: For `ifnetlist' modification both kernel and net locks
> + * should be taken. For read-only access only one lock of them required.
> + */
> struct ifnet_head ifnetlist = TAILQ_HEAD_INITIALIZER(ifnetlist);
>
> static inline unsigned int
> Index: sys/net/if_var.h
> ===================================================================
> RCS file: /cvs/src/sys/net/if_var.h,v
> retrieving revision 1.123
> diff -u -p -r1.123 if_var.h
> --- sys/net/if_var.h 5 Apr 2023 19:35:23 -0000 1.123
> +++ sys/net/if_var.h 17 Apr 2023 14:42:10 -0000
> @@ -121,7 +121,7 @@ TAILQ_HEAD(ifnet_head, ifnet); /* the a
> struct ifnet { /* and the entries */
> void *if_softc; /* [I] lower-level data for this if */
> struct refcnt if_refcnt;
> - TAILQ_ENTRY(ifnet) if_list; /* [K] all struct ifnets are chained */
> + TAILQ_ENTRY(ifnet) if_list; /* [NK] all struct ifnets are chained */
> TAILQ_HEAD(, ifaddr) if_addrlist; /* [N] list of addresses per if */
> TAILQ_HEAD(, ifmaddr) if_maddrlist; /* [N] list of multicast records */
> TAILQ_HEAD(, ifg_list) if_groups; /* [N] list of groups per if */