From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: passt.top; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: passt.top; dkim=pass (2048-bit key; secure) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.a=rsa-sha256 header.s=202510 header.b=Dlbhav08; dkim-atps=neutral Received: from mail.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3]) by passt.top (Postfix) with ESMTPS id F07265A061C for ; Thu, 23 Oct 2025 03:42:17 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=202510; t=1761183731; bh=vi3s0BE1Sp/tKVEPYaTZ692BxZAmAc4IhnBlpE3H0Qo=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=Dlbhav08DdMm2WMsP4r03eg2W2Zq02vBhM1KD46nceiQ1tyqlhdfviioJ2gd5oyeC pSGoHNsiS5TVhPOJPkq36KkxetOQgtWTgKqBZ5G86QBs9tTPTzBzxgHLsEhbzCtvOi sCGRcDqdktVd9/1xqMmxocloSiCTalAFpWXRAWEPRrbzgHjUTO6aT+bSgjUBndeFwi MrS2CX2CABvRkR4nm5UV8vb/ge8Wfb9kvb89lL7NFzTetqEr7R1gbpQivCPZDYH2XJ 4NVFivj+RZZfEj/0zYJ1DSvKPMPpqHDJ7pPcBS4vLiajGD14ZXIu6y+B8dNS5rM6Nw qZV1AZxYhnPuA== Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4csTKv23sqz4wM5; Thu, 23 Oct 2025 12:42:11 +1100 (AEDT) Date: Thu, 23 Oct 2025 12:42:04 +1100 From: David Gibson To: Laurent Vivier Subject: Re: [PATCH v5 7/7] passt: Move main event loop processing into passt_worker() Message-ID: References: <20251021210116.314674-1-lvivier@redhat.com> <20251021210116.314674-8-lvivier@redhat.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="Mru5L4BrsOoyXEi8" Content-Disposition: inline In-Reply-To: <20251021210116.314674-8-lvivier@redhat.com> Message-ID-Hash: 2FUG4X7GZJGVBC2FYDO5EUFRNGX6UL24 X-Message-ID-Hash: 2FUG4X7GZJGVBC2FYDO5EUFRNGX6UL24 X-MailFrom: dgibson@gandalf.ozlabs.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: passt-dev@passt.top X-Mailman-Version: 3.3.8 Precedence: list List-Id: Development discussion and patches for passt Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: --Mru5L4BrsOoyXEi8 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Tue, Oct 21, 2025 at 11:01:16PM +0200, Laurent Vivier wrote: > Extract the epoll event processing logic from main() into a separate > passt_worker() function. This refactoring prepares the code for future > threading support where passt_worker() will be called as a worker thread > callback. >=20 > The new function handles: > - Processing epoll events and dispatching to protocol handlers > - Event statistics tracking and printing > - Post-handler periodic tasks (timers, deferred work) > - Migration handling >=20 > No functional changes, purely a code restructuring. >=20 > Signed-off-by: Laurent Vivier Reviewed-by: David Gibson > --- > passt.c | 160 +++++++++++++++++++++++++++++++------------------------- > 1 file changed, 88 insertions(+), 72 deletions(-) >=20 > diff --git a/passt.c b/passt.c > index f1d78b79e2c3..5eabfa8f0c51 100644 > --- a/passt.c > +++ b/passt.c > @@ -229,6 +229,92 @@ static void print_stats(const struct ctx *c, const s= truct passt_stats *stats, > lines_printed++; > } > =20 > +/** > + * passt_worker() - Process epoll events and handle protocol operations > + * @opaque: Pointer to execution context (struct ctx) > + * @nfds: Number of file descriptors ready (epoll_wait return value) > + * @events: epoll_event array of ready file descriptors > + */ > +static void passt_worker(void *opaque, int nfds, struct epoll_event *eve= nts) > +{ > + static struct passt_stats stats =3D { 0 }; > + struct ctx *c =3D opaque; > + struct timespec now; > + int i; > + > + if (clock_gettime(CLOCK_MONOTONIC, &now)) > + err_perror("Failed to get CLOCK_MONOTONIC time"); > + > + for (i =3D 0; i < nfds; i++) { > + union epoll_ref ref =3D *((union epoll_ref *)&events[i].data.u64); > + uint32_t eventmask =3D events[i].events; > + > + trace("%s: epoll event on %s %i (events: 0x%08x)", > + c->mode =3D=3D MODE_PASTA ? "pasta" : "passt", > + EPOLL_TYPE_STR(ref.type), ref.fd, eventmask); > + > + switch (ref.type) { > + case EPOLL_TYPE_TAP_PASTA: > + tap_handler_pasta(c, eventmask, &now); > + break; > + case EPOLL_TYPE_TAP_PASST: > + tap_handler_passt(c, eventmask, &now); > + break; > + case EPOLL_TYPE_TAP_LISTEN: > + tap_listen_handler(c, eventmask); > + break; > + case EPOLL_TYPE_NSQUIT_INOTIFY: > + pasta_netns_quit_inotify_handler(c, ref.fd); > + break; > + case EPOLL_TYPE_NSQUIT_TIMER: > + pasta_netns_quit_timer_handler(c, ref); > + break; > + case EPOLL_TYPE_TCP: > + tcp_sock_handler(c, ref, eventmask); > + break; > + case EPOLL_TYPE_TCP_SPLICE: > + tcp_splice_sock_handler(c, ref, eventmask); > + break; > + case EPOLL_TYPE_TCP_LISTEN: > + tcp_listen_handler(c, ref, &now); > + break; > + case EPOLL_TYPE_TCP_TIMER: > + tcp_timer_handler(c, ref); > + break; > + case EPOLL_TYPE_UDP_LISTEN: > + udp_listen_sock_handler(c, ref, eventmask, &now); > + break; > + case EPOLL_TYPE_UDP: > + udp_sock_handler(c, ref, eventmask, &now); > + break; > + case EPOLL_TYPE_PING: > + icmp_sock_handler(c, ref); > + break; > + case EPOLL_TYPE_VHOST_CMD: > + vu_control_handler(c->vdev, c->fd_tap, eventmask); > + break; > + case EPOLL_TYPE_VHOST_KICK: > + vu_kick_cb(c->vdev, ref, &now); > + break; > + case EPOLL_TYPE_REPAIR_LISTEN: > + repair_listen_handler(c, eventmask); > + break; > + case EPOLL_TYPE_REPAIR: > + repair_handler(c, eventmask); > + break; > + default: > + /* Can't happen */ > + ASSERT(0); > + } > + stats.events[ref.type]++; > + print_stats(c, &stats, &now); > + } > + > + post_handler(c, &now); > + > + migrate_handler(c); > +} > + > /** > * main() - Entry point and main loop > * @argc: Argument count > @@ -246,8 +332,7 @@ static void print_stats(const struct ctx *c, const st= ruct passt_stats *stats, > int main(int argc, char **argv) > { > struct epoll_event events[NUM_EPOLL_EVENTS]; > - struct passt_stats stats =3D { 0 }; > - int nfds, i, devnull_fd =3D -1; > + int nfds, devnull_fd =3D -1; > struct ctx c =3D { 0 }; > struct rlimit limit; > struct timespec now; > @@ -355,77 +440,8 @@ loop: > if (nfds =3D=3D -1 && errno !=3D EINTR) > die_perror("epoll_wait() failed in main loop"); > =20 > - if (clock_gettime(CLOCK_MONOTONIC, &now)) > - err_perror("Failed to get CLOCK_MONOTONIC time"); > - > - for (i =3D 0; i < nfds; i++) { > - union epoll_ref ref =3D *((union epoll_ref *)&events[i].data.u64); > - uint32_t eventmask =3D events[i].events; > - > - trace("%s: epoll event on %s %i (events: 0x%08x)", > - c.mode =3D=3D MODE_PASTA ? "pasta" : "passt", > - EPOLL_TYPE_STR(ref.type), ref.fd, eventmask); > - > - switch (ref.type) { > - case EPOLL_TYPE_TAP_PASTA: > - tap_handler_pasta(&c, eventmask, &now); > - break; > - case EPOLL_TYPE_TAP_PASST: > - tap_handler_passt(&c, eventmask, &now); > - break; > - case EPOLL_TYPE_TAP_LISTEN: > - tap_listen_handler(&c, eventmask); > - break; > - case EPOLL_TYPE_NSQUIT_INOTIFY: > - pasta_netns_quit_inotify_handler(&c, ref.fd); > - break; > - case EPOLL_TYPE_NSQUIT_TIMER: > - pasta_netns_quit_timer_handler(&c, ref); > - break; > - case EPOLL_TYPE_TCP: > - tcp_sock_handler(&c, ref, eventmask); > - break; > - case EPOLL_TYPE_TCP_SPLICE: > - tcp_splice_sock_handler(&c, ref, eventmask); > - break; > - case EPOLL_TYPE_TCP_LISTEN: > - tcp_listen_handler(&c, ref, &now); > - break; > - case EPOLL_TYPE_TCP_TIMER: > - tcp_timer_handler(&c, ref); > - break; > - case EPOLL_TYPE_UDP_LISTEN: > - udp_listen_sock_handler(&c, ref, eventmask, &now); > - break; > - case EPOLL_TYPE_UDP: > - udp_sock_handler(&c, ref, eventmask, &now); > - break; > - case EPOLL_TYPE_PING: > - icmp_sock_handler(&c, ref); > - break; > - case EPOLL_TYPE_VHOST_CMD: > - vu_control_handler(c.vdev, c.fd_tap, eventmask); > - break; > - case EPOLL_TYPE_VHOST_KICK: > - vu_kick_cb(c.vdev, ref, &now); > - break; > - case EPOLL_TYPE_REPAIR_LISTEN: > - repair_listen_handler(&c, eventmask); > - break; > - case EPOLL_TYPE_REPAIR: > - repair_handler(&c, eventmask); > - break; > - default: > - /* Can't happen */ > - ASSERT(0); > - } > - stats.events[ref.type]++; > - print_stats(&c, &stats, &now); > - } > - > - post_handler(&c, &now); > =20 > - migrate_handler(&c); > + passt_worker(&c, nfds, events); > =20 > goto loop; > } > --=20 > 2.51.0 >=20 --=20 David Gibson (he or they) | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you, not the other way | around. http://www.ozlabs.org/~dgibson --Mru5L4BrsOoyXEi8 Content-Type: application/pgp-signature; name=signature.asc -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEEO+dNsU4E3yXUXRK2zQJF27ox2GcFAmj5h+sACgkQzQJF27ox 2GcN+RAAozyfernkA6pf+4omEdC8wPSIaImYeivnex6mBksiTru9AX716MRWOXJ8 4viPUpjqud/nqKo71GKfi68Bck0DTnwaDTR61/QYvUqjL33jwsGSSbOYyWFSbdXO 33XFB4CmQQoweIhPu+tnvA25fcE/vFnA0EKkfJfIJMEEh73afuI3GgrHjp9GSNTD +UTXdfOaM9Mt0iF+idYDHKacr1oONfjH6AF/8xZi+CotI3JvSGau1bHNCGETEANn t0quRwwYjLkqZT/w8hHqLb4B/4ToMvGBrhwSSiQTEX+4xTVhWWE8qjKSFoCzSi5N I2zWcbEp9G77V40+4E8GNj8IEXNckT+djyqMma+2bKENBMj5gGSeNuWmsThBJX7a Pew8j02kjGCybHlVcFtdsW465MMRxzlvwMQgN203BfpWxRm9tPCnrYgA/0kKYSp7 0pDEjQyOAEbfHwCaQou3ZhrArg5ZZSMf16lQs/gyS46dpJTDp/9nY+ZlRUs+LhLa ZtNfQBXU1K79smDBsETYQOAqj4Oambim9uO7sW6ASu4YlSRyPXj8rB+7OFO39tQ9 cuw5MsEmuOsH1f2cRwZyabWi9juzn2XxEtj7G9/QfM3cH74Drr0/jDNW93x482wn kzDHlYRDW/WlTdpc2E0oqC4XTWEShkbTK0a+xoKmUjwg2cYnv0s= =DGcL -----END PGP SIGNATURE----- --Mru5L4BrsOoyXEi8--