The per-interface group list is protected by the net lock and already documented as such.
The global interface group list `ifg_head' is also protected by the net lock and all access to it (all within if.c) take it accordingly. OK? --- sys/net/if.c | 3 ++- sys/net/if_var.h | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/sys/net/if.c b/sys/net/if.c index ad7d8ea5956..6a0ac9ee77f 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -226,7 +226,8 @@ void if_idxmap_alloc(struct ifnet *); void if_idxmap_insert(struct ifnet *); void if_idxmap_remove(struct ifnet *); -TAILQ_HEAD(, ifg_group) ifg_head = TAILQ_HEAD_INITIALIZER(ifg_head); +TAILQ_HEAD(, ifg_group) ifg_head = + TAILQ_HEAD_INITIALIZER(ifg_head); /* [N] list of interface groups */ LIST_HEAD(, if_clone) if_cloners = LIST_HEAD_INITIALIZER(if_cloners); /* [I] list of clonable interfaces */ diff --git a/sys/net/if_var.h b/sys/net/if_var.h index 6272be882f4..275ea85bd2a 100644 --- a/sys/net/if_var.h +++ b/sys/net/if_var.h @@ -267,18 +267,18 @@ struct ifg_group { u_int ifg_refcnt; caddr_t ifg_pf_kif; int ifg_carp_demoted; - TAILQ_HEAD(, ifg_member) ifg_members; - TAILQ_ENTRY(ifg_group) ifg_next; + TAILQ_HEAD(, ifg_member) ifg_members; /* [N] list of members per group */ + TAILQ_ENTRY(ifg_group) ifg_next; /* [N] all groups are chained */ }; struct ifg_member { - TAILQ_ENTRY(ifg_member) ifgm_next; + TAILQ_ENTRY(ifg_member) ifgm_next; /* [N] all members are chained */ struct ifnet *ifgm_ifp; }; struct ifg_list { struct ifg_group *ifgl_group; - TAILQ_ENTRY(ifg_list) ifgl_next; + TAILQ_ENTRY(ifg_list) ifgl_next; /* [N] all groups are chained */ }; #define IFNET_SLOWTIMO 1 /* granularity is 1 second */ -- 2.38.1