Skip site navigation (1)Skip section navigation (2)
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&gt;>
>=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&gt;>
> ---
> 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>