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. 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 */