]> git.proxmox.com Git - mirror_kronosnet.git/commitdiff
[tx] clean up channel management code for internal communications
authorFabio M. Di Nitto <fdinitto@redhat.com>
Thu, 25 Jul 2019 09:18:19 +0000 (11:18 +0200)
committerFabio M. Di Nitto <fdinitto@redhat.com>
Thu, 25 Jul 2019 14:46:52 +0000 (16:46 +0200)
the code is still not in use but it's more clear and doesn't trigger
memory overrun

Signed-off-by: Fabio M. Di Nitto <fdinitto@redhat.com>
libknet/internals.h
libknet/threads_tx.c

index 7ee24877a893d0f8be66e0bb42b452bc0825ea1e..980d6293f280a2a565a102e4d7589bdabb2beba6 100644 (file)
@@ -33,7 +33,9 @@
 #define PCKT_FRAG_MAX UINT8_MAX
 #define PCKT_RX_BUFS  512
 
-#define KNET_EPOLL_MAX_EVENTS KNET_DATAFD_MAX
+#define KNET_EPOLL_MAX_EVENTS KNET_DATAFD_MAX + 1
+
+#define KNET_INTERNAL_DATA_CHANNEL KNET_DATAFD_MAX
 
 typedef void *knet_transport_link_t; /* per link transport handle */
 typedef void *knet_transport_t;      /* per knet_h transport handle */
@@ -151,7 +153,7 @@ struct knet_handle_stats_extra {
 struct knet_handle {
        knet_node_id_t host_id;
        unsigned int enabled:1;
-       struct knet_sock sockfd[KNET_DATAFD_MAX];
+       struct knet_sock sockfd[KNET_DATAFD_MAX + 1];
        int logfd;
        uint8_t log_levels[KNET_MAX_SUBSYSTEMS];
        int hostsockfd[2];
index 647867b1b45957d2bf04ee00b944f5ea27782250..f2a845285312d5e9c5480efe04a1b30ff8cf1bf1 100644 (file)
@@ -648,19 +648,25 @@ static void _handle_send_to_links(knet_handle_t knet_h, struct msghdr *msg, int
                docallback = 1;
                memset(&ev, 0, sizeof(struct epoll_event));
 
-               if (epoll_ctl(knet_h->send_to_links_epollfd,
-                             EPOLL_CTL_DEL, knet_h->sockfd[channel].sockfd[knet_h->sockfd[channel].is_created], &ev)) {
-                       log_err(knet_h, KNET_SUB_TX, "Unable to del datafd %d from linkfd epoll pool: %s",
-                               knet_h->sockfd[channel].sockfd[0], strerror(savederrno));
-               } else {
-                       knet_h->sockfd[channel].has_error = 1;
+               if (channel != KNET_INTERNAL_DATA_CHANNEL) {
+                       if (epoll_ctl(knet_h->send_to_links_epollfd,
+                                     EPOLL_CTL_DEL, knet_h->sockfd[channel].sockfd[knet_h->sockfd[channel].is_created], &ev)) {
+                               log_err(knet_h, KNET_SUB_TX, "Unable to del datafd %d from linkfd epoll pool: %s",
+                                       knet_h->sockfd[channel].sockfd[0], strerror(savederrno));
+                       } else {
+                               knet_h->sockfd[channel].has_error = 1;
+                       }
                }
+               /*
+                * TODO: add error handling for KNET_INTERNAL_DATA_CHANNEL
+                *       once we add support for internal knet communication
+                */
        } else {
                knet_h->recv_from_sock_buf->kh_type = type;
                _parse_recv_from_sock(knet_h, inlen, channel, 0);
        }
 
-       if (docallback) {
+       if ((docallback) && (channel != KNET_INTERNAL_DATA_CHANNEL)) {
                knet_h->sock_notify_fn(knet_h->sock_notify_fn_private_data,
                                       knet_h->sockfd[channel].sockfd[0],
                                       channel,
@@ -754,7 +760,7 @@ void *_handle_send_to_links_thread(void *data)
                for (i = 0; i < nev; i++) {
                        if (events[i].data.fd == knet_h->hostsockfd[0]) {
                                type = KNET_HEADER_TYPE_HOST_INFO;
-                               channel = -1;
+                               channel = KNET_INTERNAL_DATA_CHANNEL;
                        } else {
                                type = KNET_HEADER_TYPE_DATA;
                                for (channel = 0; channel < KNET_DATAFD_MAX; channel++) {