From: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
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 <konstantin.ananyev@huawei.com>
Subject: [RFC 1/6] eal/linux: remove VLA warnings
Date: Thu, 18 Apr 2024 11:33:09 +0100 [thread overview]
Message-ID: <20240418103314.40705-2-konstantin.v.ananyev@yandex.ru> (raw)
In-Reply-To: <20240418103314.40705-1-konstantin.v.ananyev@yandex.ru>
From: Konstantin Ananyev <konstantin.ananyev@huawei.com>
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 <konstantin.ananyev@huawei.com>
---
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)
--
2.35.3
next prev parent reply other threads:[~2024-04-18 10:33 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-18 10:33 [RFC 0/6] core libs: " Konstantin Ananyev
2024-04-18 10:33 ` Konstantin Ananyev [this message]
2024-04-19 12:23 ` [RFC 1/6] eal/linux: " Morten Brørup
2024-04-18 10:33 ` [RFC 2/6] eal/common: " Konstantin Ananyev
2024-04-19 11:54 ` Morten Brørup
2024-04-18 10:33 ` [RFC 3/6] ethdev: " Konstantin Ananyev
2024-04-19 12:06 ` Morten Brørup
2024-04-18 10:33 ` [RFC 4/6] hash: " Konstantin Ananyev
2024-04-19 12:08 ` Morten Brørup
2024-04-18 10:33 ` [RFC 5/6] hash/thash: " Konstantin Ananyev
2024-04-19 12:17 ` Morten Brørup
2024-04-19 12:53 ` Konstantin Ananyev
2024-04-19 13:10 ` Morten Brørup
2024-04-18 10:33 ` [RFC 6/6] rcu: " Konstantin Ananyev
2024-04-19 12:21 ` Morten Brørup
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240418103314.40705-2-konstantin.v.ananyev@yandex.ru \
--to=konstantin.v.ananyev@yandex.ru \
--cc=andrew.rybchenko@oktetlabs.ru \
--cc=bruce.richardson@intel.com \
--cc=dev@dpdk.org \
--cc=ferruh.yigit@amd.com \
--cc=honnappa.nagarahalli@arm.com \
--cc=konstantin.ananyev@huawei.com \
--cc=roretzla@linux.microsoft.com \
--cc=sameh.gobriel@intel.com \
--cc=thomas@monjalon.net \
--cc=vladimir.medvedkin@intel.com \
--cc=yipeng1.wang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).