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=EFYhM4IF; dkim-atps=neutral Received: from mail.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3]) by passt.top (Postfix) with ESMTPS id 740095A026F for ; Mon, 20 Oct 2025 03:43:16 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=202510; t=1760924594; bh=8/QnQkmMUoaEtq7uaMLIpUB3Ds3YjXYFrBZXYqTKWrY=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=EFYhM4IFjcBTZa+35fWGQdD7McJAGZl8VXhMl4nXloAlqPXI2dnDsOlwU7PK+79sv POD6LT+pSZlCFZJRUl8Yojm9ByXQ6/M+eGUfGjUWbpSiSddWXzPJKL9H4pcuj2g/0V t6ul0T5fjqF0LkeXv03qEcOiUD+SQx1djmw3NkMMLalldM2E6NN+4/8pRrMmup98Vn oAUN++FE+UpBcy0g1wgbS7OZvJT6WVqFXMz03HdFz1xBh3vp8mKa5tHUu1nFFH9lEH XmHkRQZt90zTbmDWDVu9C+5TnofXY9PyMBiSArq59dKiqi72vlDlN2Js5Ch/B23fBk LWNaecvzPJ0Og== Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4cqdVV37Q3z4wBj; Mon, 20 Oct 2025 12:43:14 +1100 (AEDT) Date: Mon, 20 Oct 2025 12:43:02 +1100 From: David Gibson To: Laurent Vivier Subject: Re: [PATCH v4 7/7] passt: Move main event loop processing into passt_worker() Message-ID: References: <20251017103129.229412-1-lvivier@redhat.com> <20251017103129.229412-8-lvivier@redhat.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="PJ2IL24FC3FxyXaT" Content-Disposition: inline In-Reply-To: <20251017103129.229412-8-lvivier@redhat.com> Message-ID-Hash: R4RZZKZPX2JTQ4Y6KY7S23Y575WCGRWJ X-Message-ID-Hash: R4RZZKZPX2JTQ4Y6KY7S23Y575WCGRWJ 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: --PJ2IL24FC3FxyXaT Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Fri, Oct 17, 2025 at 12:31:29PM +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 Looks good as far as it goes, and I've though often in the past that it would make more sense for the "engine" to go in its own function. Wondering if it would make more sense to include the epoll_wait() itself and the loop in this function, rather than leaving that outside. > --- > passt.c | 160 +++++++++++++++++++++++++++++++------------------------- > 1 file changed, 88 insertions(+), 72 deletions(-) >=20 > diff --git a/passt.c b/passt.c > index 37f2c897be84..5bfa4c6353d9 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 *ev= ents) > +{ > + 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 --PJ2IL24FC3FxyXaT Content-Type: application/pgp-signature; name=signature.asc -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEEO+dNsU4E3yXUXRK2zQJF27ox2GcFAmj1k6YACgkQzQJF27ox 2GdYjA/+LfYpQM1cf//riqI6ZnXBX7YJVpcg7sCI+D+2YeBf06gDIgPuqWbHWavO tYj6+qva6N1XbV3krcG/NhV2lvgRDEmrxlO3Nk2eYS6pssGa2GY67w54D7miMRI6 hN3/6OKiQCZJM7RssdmpcEnOHd8K2IHIgog+BlSbg7Ii1eP2gb1YlqA0msv8Uktr mnRjTWdtjWkZXGvK6SBFH49CocFH0ARCPpuF/7e1C7RvXxu0FEYOk5Rdjkh53B2F uTfaP8R2iZsfjo8WbNAxasCXGqCI1r+Ry8LRxBt6maKY/Cl51FVtv5JeBhJYYAvk gyjhbmZBFKse6Pp2m/fhH7oVQBUP8CuhJvhVcBI1FOIaYSHyfnkfzpCI/ilzUsH4 HpTjxLBqd+zpz27ivRYD/+8G7YZzFOs5UU2nPPwyv4Anrz2XtZwty6DIpmoeCuG8 106Fn+vST4EWXG5FmXoyRH0X2nKxZJsD50lH7qFqKJl4TWGnGBbQ0EJlpxTPxmN5 rlyz93vNqDVaaeSHHzUlNwRzp7pfPiquDLIYoDFz1yt4k8koLNhI5QiGz5RRaoD0 WShAnS0omMQLbotn5gx+EF+exfCPvK+Ls9XuuKYAbjM1eXZXZq5amG6SZs+HGpxp VHEkAg/x6DRH5CT7XX+JO6tTDjubml6X0ukyR0eTa1nRCrvuryA= =S3aC -----END PGP SIGNATURE----- --PJ2IL24FC3FxyXaT--