Date: Mon, 06 Mar 2023 11:03:38 -0800 From: Ravi Pokala <rpokala@freebsd.org> To: Alexander Chernikov <melifaro@FreeBSD.org> Cc: "<src-committers@freebsd.org>" <src-committers@FreeBSD.org>, "<dev-commits-src-all@freebsd.org>" <dev-commits-src-all@FreeBSD.org>, "<dev-commits-src-main@freebsd.org>" <dev-commits-src-main@FreeBSD.org> Subject: Re: df2b419a4105 - main - ifnet: add if_foreach_sleep() to allow ifnet iterations with sleep. Message-ID: <C6D592B3-FA34-4AC2-8A35-62C23533570A@panasas.com> In-Reply-To: <6CBFEAF8-1873-4DD3-B359-C7E972F6D7CD@FreeBSD.org> References: <202303061508.326F8TiR076654@gitrepo.freebsd.org> <C60C467C-C9D4-45AC-8229-5E9CB354F078@panasas.com> <6CBFEAF8-1873-4DD3-B359-C7E972F6D7CD@FreeBSD.org>
next in thread | previous in thread | raw e-mail | index | archive | help
> Naming is hard :-) IMO if_foreach_sleepable marks the intent better . Min= d adding you suggestion to the original review? If there are no opposing con= cerns after a couple of days, I=E2=80=99ll rename it. Done. Thank you! :-) -Ravi (rpokala@) =EF=BB=BF-----Original Message----- From: Alexander Chernikov <melifaro@FreeBSD.org <mailto:melifaro@FreeBSD.or= g>> Date: 2023-03-06, Monday at 09:06 To: Ravi Pokala <rpokala@freebsd.org <mailto:rpokala@freebsd.org>> Cc: "<src-committers@freebsd.org <mailto:src-committers@freebsd.org>>" <src= -committers@FreeBSD.org <mailto:src-committers@FreeBSD.org>>, "<dev-commits-= src-all@freebsd.org <mailto:dev-commits-src-all@freebsd.org>>" <dev-commits-= src-all@FreeBSD.org <mailto:dev-commits-src-all@FreeBSD.org>>, "<dev-commits= -src-main@freebsd.org <mailto:dev-commits-src-main@freebsd.org>>" <dev-commi= ts-src-main@FreeBSD.org <mailto:dev-commits-src-main@FreeBSD.org>> Subject: Re: df2b419a4105 - main - ifnet: add if_foreach_sleep() to allow i= fnet iterations with sleep. > On 6 Mar 2023, at 16:35, Ravi Pokala <rpokala@freebsd.org <mailto:rpokala= @freebsd.org>> wrote: >=20 > Hi Alexander, Hi Ravi, >=20 > Knowing ~nothing about ifnet, if I were to see 'if_foreach_sleep()', my f= irst thought would be that the loop itself was sleeping between each iterati= on, not that the callback was allowed to sleep. Perhaps this should be renam= ed to 'if_foreach_sleepable()=E2=80=99? Naming is hard :-) IMO if_foreach_sleepable marks the intent better . Mind = adding you suggestion to the original review? If there are no opposing conce= rns after a couple of days, I=E2=80=99ll rename it. >=20 > Just a thought. >=20 > Thanks, >=20 > Ravi (rpokala@) >=20 > =EF=BB=BF-----Original Message----- > From: <owner-src-committers@freebsd.org <mailto:owner-src-committers@free= bsd.org> <mailto:owner-src-committers@freebsd.org <mailto:owner-src-committe= rs@freebsd.org>>> on behalf of "Alexander V. Chernikov" <melifaro@FreeBSD.or= g <mailto:melifaro@FreeBSD.org> <mailto:melifaro@FreeBSD.org <mailto:melifar= o@FreeBSD.org>>> > Date: 2023-03-06, Monday at 07:08 > To: <src-committers@FreeBSD.org <mailto:src-committers@FreeBSD.org> <mail= to:src-committers@FreeBSD.org <mailto:src-committers@FreeBSD.org>>>, <dev-co= mmits-src-all@FreeBSD.org <mailto:dev-commits-src-all@FreeBSD.org> <mailto:d= ev-commits-src-all@FreeBSD.org <mailto:dev-commits-src-all@FreeBSD.org>>>, <= dev-commits-src-main@FreeBSD.org <mailto:dev-commits-src-main@FreeBSD.org> <= mailto:dev-commits-src-main@FreeBSD.org <mailto:dev-commits-src-main@FreeBSD= .org>>> > Subject: git: df2b419a4105 - main - ifnet: add if_foreach_sleep() to allo= w ifnet iterations with sleep. >=20 >=20 > The branch main has been updated by melifaro: >=20 >=20 > URL: https://cgit.FreeBSD.org/src/commit/?id=3Ddf2b419a4105588384a89a57442e= d6c6ca002455 <https://cgit.FreeBSD.org/src/commit/?id=3Ddf2b419a4105588384a89a= 57442ed6c6ca002455> <https://cgit.FreeBSD.org/src/commit/?id=3Ddf2b419a4105588= 384a89a57442ed6c6ca002455> <https://cgit.FreeBSD.org/src/commit/?id=3Ddf2b419a= 4105588384a89a57442ed6c6ca002455>> >=20 >=20 > commit df2b419a4105588384a89a57442ed6c6ca002455 > Author: Alexander V. Chernikov <melifaro@FreeBSD.org <mailto:melifaro@Fre= eBSD.org> <mailto:melifaro@FreeBSD.org <mailto:melifaro@FreeBSD.org>>> > AuthorDate: 2023-03-04 10:09:09 +0000 > Commit: Alexander V. Chernikov <melifaro@FreeBSD.org <mailto:melifaro@Fre= eBSD.org> <mailto:melifaro@FreeBSD.org <mailto:melifaro@FreeBSD.org>>> > CommitDate: 2023-03-06 15:08:08 +0000 >=20 >=20 > ifnet: add if_foreach_sleep() to allow ifnet iterations with sleep. >=20 >=20 > Subscribers: imp, ae, glebius >=20 >=20 > Differential Revision: https://reviews.freebsd.org/D38904 <https://review= s.freebsd.org/D38904> <https://reviews.freebsd.org/D38904> <https://reviews.= freebsd.org/D38904>> > --- > sys/net/if.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++= + > sys/net/if_var.h | 2 ++ > 2 files changed, 67 insertions(+) >=20 >=20 > diff --git a/sys/net/if.c b/sys/net/if.c > index 58711061eb5e..f3ef822178ff 100644 > --- a/sys/net/if.c > +++ b/sys/net/if.c > @@ -4535,6 +4535,71 @@ if_foreach(if_foreach_cb_t cb, void *cb_arg) > return (error); > } >=20 >=20 > +/* > + * Iterates over the list of interfaces, permitting callback function @c= b to sleep. > + * Stops iteration if @cb returns non-zero error code. > + * Returns the last error code from @cb. > + * @match_cb: optional match callback limiting the iteration to only mat= ched interfaces > + * @match_arg: argument to pass to @match_cb > + * @cb: iteration callback > + * @cb_arg: argument to pass to @cb > + */ > +int > +if_foreach_sleep(if_foreach_match_t match_cb, void *match_arg, if_foreac= h_cb_t cb, > + void *cb_arg) > +{ > + int match_count =3D 0, array_size =3D 16; /* 128 bytes for malloc */ > + struct ifnet **match_array =3D NULL; > + int error =3D 0; > + > + MPASS(cb); > + > + while (true) { > + struct ifnet **new_array; > + int new_size =3D array_size; > + struct epoch_tracker et; > + struct ifnet *ifp; > + > + while (new_size < match_count) > + new_size *=3D 2; > + new_array =3D malloc(new_size * sizeof(void *), M_TEMP, M_WAITOK); > + if (match_array !=3D NULL) > + memcpy(new_array, match_array, array_size * sizeof(void *)); > + free(match_array, M_TEMP); > + match_array =3D new_array; > + array_size =3D new_size; > + > + match_count =3D 0; > + NET_EPOCH_ENTER(et); > + CK_STAILQ_FOREACH(ifp, &V_ifnet, if_link) { > + if (match_cb !=3D NULL && !match_cb(ifp, match_arg)) > + continue; > + if (match_count < array_size) { > + if (if_try_ref(ifp)) > + match_array[match_count++] =3D ifp; > + } else > + match_count++; > + } > + NET_EPOCH_EXIT(et); > + > + if (match_count > array_size) { > + for (int i =3D 0; i < array_size; i++) > + if_rele(match_array[i]); > + continue; > + } else { > + for (int i =3D 0; i < match_count; i++) { > + if (error =3D=3D 0) > + error =3D cb(match_array[i], cb_arg); > + if_rele(match_array[i]); > + } > + free(match_array, M_TEMP); > + break; > + } > + } > + > + return (error); > +} > + > u_int > if_foreach_lladdr(if_t ifp, iflladdr_cb_t cb, void *cb_arg) > { > diff --git a/sys/net/if_var.h b/sys/net/if_var.h > index c9b2de736d10..3e4d6c883c13 100644 > --- a/sys/net/if_var.h > +++ b/sys/net/if_var.h > @@ -680,7 +680,9 @@ typedef u_int if_addr_cb_t(void *, struct ifaddr *, u= _int); > u_int if_foreach_addr_type(if_t ifp, int type, if_addr_cb_t cb, void *cb_= arg); >=20 >=20 > typedef int (*if_foreach_cb_t)(if_t, void *); > +typedef bool (*if_foreach_match_t)(if_t, void *); > int if_foreach(if_foreach_cb_t, void *); > +int if_foreach_sleep(if_foreach_match_t, void *, if_foreach_cb_t, void *= ); >=20 >=20 > /* Functions */ > void if_setinitfn(if_t ifp, if_init_fn_t); >=20 >=20 >=20 >=20
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?C6D592B3-FA34-4AC2-8A35-62C23533570A>