From patchwork Thu Apr 18 10:33:09 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Konstantin Ananyev X-Patchwork-Id: 139488 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 5E6C243E9F; Thu, 18 Apr 2024 12:33:36 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 6BF5240696; Thu, 18 Apr 2024 12:33:35 +0200 (CEST) Received: from forward500b.mail.yandex.net (forward500b.mail.yandex.net [178.154.239.144]) by mails.dpdk.org (Postfix) with ESMTP id 9CF3A40042 for ; Thu, 18 Apr 2024 12:33:33 +0200 (CEST) Received: from mail-nwsmtp-smtp-production-main-22.iva.yp-c.yandex.net (mail-nwsmtp-smtp-production-main-22.iva.yp-c.yandex.net [IPv6:2a02:6b8:c0c:7907:0:640:8f19:0]) by forward500b.mail.yandex.net (Yandex) with ESMTPS id DA2B5608DF; Thu, 18 Apr 2024 13:33:32 +0300 (MSK) Received: by mail-nwsmtp-smtp-production-main-22.iva.yp-c.yandex.net (smtp/Yandex) with ESMTPSA id GXCBSvCo7Ko0-KcNLNLAs; Thu, 18 Apr 2024 13:33:31 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail; t=1713436411; bh=yXAdBpOSeerebgYB6cDHc0WxJMWfYtwlmhNHTKiGdHg=; h=Cc:Message-Id:References:Date:In-Reply-To:Subject:To:From; b=IEIoqAV47vYGeKnXY9zzlu8hYv06kRgZpnjX90lEnCQjl9kyy0fOaZ3rZal0s4C6M fPbC8SKcZb3a35XJZm3JRzQYQk3yFI6+/zjCKPeoxVuTh1EtYQOqqhpRkezMsfpihs hy6UzIyj5UopmDxNIu8HZEWvzjdd8QjTuUsshnQQ= Authentication-Results: mail-nwsmtp-smtp-production-main-22.iva.yp-c.yandex.net; dkim=pass header.i=@yandex.ru From: Konstantin Ananyev To: dev@dpdk.org Cc: thomas@monjalon.net, ferruh.yigit@amd.com, andrew.rybchenko@oktetlabs.ru, yipeng1.wang@intel.com, sameh.gobriel@intel.com, bruce.richardson@intel.com, vladimir.medvedkin@intel.com, honnappa.nagarahalli@arm.com, roretzla@linux.microsoft.com, Konstantin Ananyev Subject: [RFC 1/6] eal/linux: remove VLA warnings Date: Thu, 18 Apr 2024 11:33:09 +0100 Message-Id: <20240418103314.40705-2-konstantin.v.ananyev@yandex.ru> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240418103314.40705-1-konstantin.v.ananyev@yandex.ru> References: <20240418103314.40705-1-konstantin.v.ananyev@yandex.ru> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org From: Konstantin Ananyev 1) ./lib/eal/linux/eal_interrupts.c:1073:16: warning: ISO C90 forbids variable length array ‘events’ [-Wvla] eal_intr_handle_interrupts() is called by eal_intr_thread_main() so it seems ok to simply alloc space for events from heap and reuse the same buffer through the life of the thread. 2) ./lib/eal/linux/eal_interrupts.c:1319:16: warning: ISO C90 forbids variable length array ‘evs’ [-Wvla] make eal_epoll_wait() to use fixed size array and use it though multiple iterations to preocess upt to @maxevents events. Note that techically it is not one to one raplacement, as here we might reduce number of events returned by first call to epoll_wait(..., timeout); Signed-off-by: Konstantin Ananyev Acked-by: Morten Brørup --- lib/eal/linux/eal_interrupts.c | 59 ++++++++++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 7 deletions(-) diff --git a/lib/eal/linux/eal_interrupts.c b/lib/eal/linux/eal_interrupts.c index 6436f796eb..58e3b8e12c 100644 --- a/lib/eal/linux/eal_interrupts.c +++ b/lib/eal/linux/eal_interrupts.c @@ -34,6 +34,8 @@ #define EAL_INTR_EPOLL_WAIT_FOREVER (-1) #define NB_OTHER_INTR 1 +#define MAX_ITER_EVNUM RTE_EVENT_ETH_INTR_RING_SIZE + static RTE_DEFINE_PER_LCORE(int, _epfd) = -1; /**< epoll fd per thread */ /** @@ -1068,9 +1070,9 @@ eal_intr_process_interrupts(struct epoll_event *events, int nfds) * void */ static void -eal_intr_handle_interrupts(int pfd, unsigned totalfds) +eal_intr_handle_interrupts(int pfd, struct epoll_event events[], + unsigned totalfds) { - struct epoll_event events[totalfds]; int nfds = 0; for(;;) { @@ -1106,6 +1108,12 @@ eal_intr_handle_interrupts(int pfd, unsigned totalfds) static __rte_noreturn uint32_t eal_intr_thread_main(__rte_unused void *arg) { + uint32_t n, nb_event; + struct epoll_event *events, *p; + + nb_event = 0; + events = NULL; + /* host thread, never break out */ for (;;) { /* build up the epoll fd with all descriptors we are to @@ -1159,8 +1167,23 @@ eal_intr_thread_main(__rte_unused void *arg) numfds++; } rte_spinlock_unlock(&intr_lock); + + /* alloc space for events, when necessary */ + if (numfds > nb_event) { + n = numfds + MAX_ITER_EVNUM; + p = realloc(events, n * sizeof(events[0])); + if (p == NULL) { + EAL_LOG(ERR, "failed to allocate %u events", + numfds); + numfds = nb_event; + } else { + nb_event = n; + events = p; + } + } + /* serve the interrupt */ - eal_intr_handle_interrupts(pfd, numfds); + eal_intr_handle_interrupts(pfd, events, numfds); /** * when we return, we need to rebuild the @@ -1168,6 +1191,8 @@ eal_intr_thread_main(__rte_unused void *arg) */ close(pfd); } + + free(events); } int @@ -1316,8 +1341,9 @@ static int eal_epoll_wait(int epfd, struct rte_epoll_event *events, int maxevents, int timeout, bool interruptible) { - struct epoll_event evs[maxevents]; int rc; + uint32_t i, k, n, num; + struct epoll_event evs[MAX_ITER_EVNUM]; if (!events) { EAL_LOG(ERR, "rte_epoll_event can't be NULL"); @@ -1328,12 +1354,31 @@ eal_epoll_wait(int epfd, struct rte_epoll_event *events, if (epfd == RTE_EPOLL_PER_THREAD) epfd = rte_intr_tls_epfd(); + num = maxevents; + n = RTE_MIN(RTE_DIM(evs), num); + + /* Process events in chunks of MAX_ITER_EVNUM */ + while (1) { - rc = epoll_wait(epfd, evs, maxevents, timeout); + rc = epoll_wait(epfd, evs, n, timeout); if (likely(rc > 0)) { + /* epoll_wait has at least one fd ready to read */ - rc = eal_epoll_process_event(evs, rc, events); - break; + for (i = 0, k = 0; rc > 0;) { + k += rc; + rc = eal_epoll_process_event(evs, rc, + events + i); + i += rc; + + /* + * try to read more events that are already + * available (up to maxevents in total). + */ + n = RTE_MIN(RTE_DIM(evs), num - k); + rc = (n == 0) ? 0 : epoll_wait(epfd, evs, n, 0); + } + return i; + } else if (rc < 0) { if (errno == EINTR) { if (interruptible)