From nobody Mon Mar 06 17:06:24 2023 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4PVlNX2Hlgz3w83Q; Mon, 6 Mar 2023 17:06:36 +0000 (UTC) (envelope-from melifaro@FreeBSD.org) Received: from smtp.freebsd.org (smtp.freebsd.org [96.47.72.83]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "smtp.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4PVlNX1lv6z434k; Mon, 6 Mar 2023 17:06:36 +0000 (UTC) (envelope-from melifaro@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1678122396; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=FRlMSYlNDt6A0q0qJXeL/PgScbkTPA1nndNOIIg3DD0=; b=k3hdF5NTpgCJkCTabVMGTqVfIqyXS9g6dG/QEzGEPnFROl0ldi9ToOCOPrfRJVZRZPDenN 7917wTgmFen5Wd8VMSTU1xQ4iDXutULYaC0oVQjPxte1WMyDB/ADZ2UD/nnSN4nYZN89fJ RpQK2aGY44LPHrTj9hqWQdK86AzVn2O8PwpEBRiPVCQsRp5Ikbr8956iCZ9NAXR1nU0Lhd 0g1sgMRQPjVXhH02NRRcKqG/DrfMzZTK6uXd0NDHpoe3L6U5W9fmPji77O3ZdfU9OitquZ PE5TJrA17flLciONLhqF64c9lwo8skK/SUoKvkjFphCUw51LTfwA2wxauNCPGQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1678122396; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=FRlMSYlNDt6A0q0qJXeL/PgScbkTPA1nndNOIIg3DD0=; b=xk1ftW6Uu8IdUNF9RUx3zmnwno5m3hOYFmLgDaBeork5fWOJP1qBidwvsQZeaw3OJL99il I+0g6pr6EH/V6/IyrKxicAyi3RMYdjrsTXad+cb28+P07jCTbkOVfNb+m2LezEsrzwZZbu RYwY1HanIMlppfy/2Tf/tXf6QGlxQNMhc/VHJxMaavHFGLEejM7Z8y3Bvgzuwg4va64HZT grBq0nz9ky1fORjf8OlGfx53uPoFu9zZtzwmTtsIgqABW6y4oHLD1Aa1RXL7n1g0N5JIXs o8+qyetQSZlIxsKQKcO8xnFiuF0Tv0bGGnr4lkhKmiNX0GKMM4PB704yCz+08A== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1678122396; a=rsa-sha256; cv=none; b=gtzqlDI/3cVo3ApkR/e/lH58dBinaHz7S1XE0OcGwC0R104jXzz81Djaq25CVzClDB3xpy o2AKybMS5jrCLrWtC0o0X9Bcni2J596o2qi+t6ePPgJGfLs34dt71dpKMVvIJ72ipQYHR2 l8qySDm9g/wLufHRCCQY6u3gJLVamrj7bCRH0wgnkj/e7PoKXknGJby3zLfwspdlsINRXb eJ77SQcPOt3d1edJw18tFM5ZtGBxWwWUt2Kbf7dzT7oesfyT5NudfdYD7/iZXh8CWNeauD hfakD8RzePN9L8ulB//sDU+T+L3ucqMaRkEhPyDDCrcUK7p0tnJ3RwOICSyJpQ== Received: from smtpclient.apple (unknown [IPv6:2a02:8084:d6bb:510:a88f:9fc6:d013:a3bf]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) (Authenticated sender: melifaro/mail) by smtp.freebsd.org (Postfix) with ESMTPSA id 4PVlNW4MNQz19jC; Mon, 6 Mar 2023 17:06:35 +0000 (UTC) (envelope-from melifaro@FreeBSD.org) Content-Type: text/plain; charset=utf-8 List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3731.400.51.1.1\)) Subject: Re: df2b419a4105 - main - ifnet: add if_foreach_sleep() to allow ifnet iterations with sleep. From: Alexander Chernikov In-Reply-To: Date: Mon, 6 Mar 2023 17:06:24 +0000 Cc: "" , "" , "" Content-Transfer-Encoding: quoted-printable Message-Id: <6CBFEAF8-1873-4DD3-B359-C7E972F6D7CD@FreeBSD.org> References: <202303061508.326F8TiR076654@gitrepo.freebsd.org> To: Ravi Pokala X-Mailer: Apple Mail (2.3731.400.51.1.1) X-ThisMailContainsUnwantedMimeParts: N > On 6 Mar 2023, at 16:35, Ravi Pokala wrote: >=20 > Hi Alexander, Hi Ravi, >=20 > Knowing ~nothing about ifnet, if I were to see 'if_foreach_sleep()', = my first thought would be that the loop itself was sleeping between each = iteration, not that the callback was allowed to sleep. Perhaps this = should be renamed 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 concerns 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: > on behalf of "Alexander V. = Chernikov" > > Date: 2023-03-06, Monday at 07:08 > To: >, = >, = > > Subject: git: df2b419a4105 - main - ifnet: add if_foreach_sleep() to = allow ifnet iterations with sleep. >=20 >=20 > The branch main has been updated by melifaro: >=20 >=20 > URL: = https://cgit.FreeBSD.org/src/commit/?id=3Ddf2b419a4105588384a89a57442ed6c6= ca002455 = >=20 >=20 > commit df2b419a4105588384a89a57442ed6c6ca002455 > Author: Alexander V. Chernikov > > AuthorDate: 2023-03-04 10:09:09 +0000 > Commit: Alexander V. Chernikov > > 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 = > --- > 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 = @cb 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 = matched 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_foreach_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