Skip to content

Commit

Permalink
[global] drop usage of sendmmsg inside libknet
Browse files Browse the repository at this point in the history
as requested by different kernel developers, we should stop
using both sendmmsg and recvmmsg.

as temporary solution use Jan's compat wrappers. the whole TX/RX
code will need review to do a full proper switch since all
error codes will change and propagate differently to transport hooks
and knet_send_sync users

Signed-off-by: Fabio M. Di Nitto <fdinitto@redhat.com>
  • Loading branch information
fabbione committed Feb 15, 2017
1 parent d4a0f64 commit 7ad8432
Show file tree
Hide file tree
Showing 6 changed files with 29 additions and 44 deletions.
1 change: 0 additions & 1 deletion configure.ac
Expand Up @@ -184,7 +184,6 @@ AC_CHECK_FUNCS([strrchr])
AC_CHECK_FUNCS([strstr])
AC_CHECK_FUNCS([clock_gettime])
AC_CHECK_FUNCS([strcasecmp])
AC_CHECK_FUNCS([sendmmsg])
AC_CHECK_FUNCS([recvmmsg])
AC_CHECK_FUNCS([kevent])
# if neither sys/epoll.h nor kevent are present, we should fail.
Expand Down
34 changes: 0 additions & 34 deletions libknet/compat.c
Expand Up @@ -14,40 +14,6 @@

#include "compat.h"

#ifndef HAVE_SENDMMSG
int sendmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen,
unsigned int flags)
{
#ifdef SYS_sendmmsg
/*
* For systems where kernel supports sendmmsg but glibc doesn't (RHEL 6)
*/
return (syscall(SYS_sendmmsg, sockfd, msgvec, vlen, flags));
#else
/*
* Generic implementation of sendmmsg using sendmsg
*/
unsigned int i;
ssize_t ret;

if (vlen == 0) {
return (0);
}

for (i = 0; i < vlen; i++) {
ret = sendmsg(sockfd, &msgvec[i].msg_hdr, flags);
if (ret >= 0) {
msgvec[i].msg_len = ret;
} else {
break ;
}
}

return ((ret >= 0) ? vlen : ret);
#endif
}
#endif

#ifndef HAVE_RECVMMSG
extern int recvmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen,
unsigned int flags, struct timespec *timeout)
Expand Down
7 changes: 0 additions & 7 deletions libknet/compat.h
Expand Up @@ -17,20 +17,13 @@
/* FreeBSD has recvmmsg but it's a buggy wrapper */
#ifdef __FreeBSD__
#define recvmmsg COMPAT_recvmmsg
#define sendmmsg COMPAT_sendmmsg
#undef HAVE_RECVMMSG
#undef HAVE_SENDMMSG
#endif

#ifndef MSG_WAITFORONE
#define MSG_WAITFORONE 0x10000
#endif

#ifndef HAVE_SENDMMSG
extern int sendmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen,
unsigned int flags);
#endif

#ifndef HAVE_RECVMMSG
extern int recvmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen,
unsigned int flags, struct timespec *timeout);
Expand Down
4 changes: 2 additions & 2 deletions libknet/threads_tx.c
Expand Up @@ -49,8 +49,8 @@ static int _dispatch_to_links(knet_handle_t knet_h, struct knet_host *dst_host,
retry:
cur = &msg[prev_sent];

sent_msgs = sendmmsg(dst_host->link[dst_host->active_links[link_idx]].outsock,
(struct mmsghdr *)&cur[0], msgs_to_send - prev_sent, MSG_DONTWAIT | MSG_NOSIGNAL);
sent_msgs = _sendmmsg(dst_host->link[dst_host->active_links[link_idx]].outsock,
&cur[0], msgs_to_send - prev_sent, MSG_DONTWAIT | MSG_NOSIGNAL);
savederrno = errno;

err = knet_h->transport_ops[dst_host->link[dst_host->active_links[link_idx]].transport_type]->transport_tx_sock_error(knet_h, dst_host->link[dst_host->active_links[link_idx]].outsock, sent_msgs, savederrno);
Expand Down
25 changes: 25 additions & 0 deletions libknet/transport_common.c
Expand Up @@ -15,6 +15,31 @@
#include "common.h"
#include "transports.h"

/*
* reuse Jan Friesse's compat layer as wrapper to drop usage of sendmmsg
*
* TODO: kill those wrappers once we work on packet delivery guaranteed
*/

int _sendmmsg(int sockfd, struct knet_mmsghdr *msgvec, unsigned int vlen, unsigned int flags)
{
int savederrno = 0, err = 0;
unsigned int i;

for (i = 0; i < vlen; i++) {
err = sendmsg(sockfd, &msgvec[i].msg_hdr, flags);
savederrno = errno;
if (err >= 0) {
msgvec[i].msg_len = err;
} else {
break;
}
}

errno = savederrno;
return ((err >= 0) ? vlen : err);
}

int _configure_common_socket(knet_handle_t knet_h, int sock, const char *type)
{
int err = 0, savederrno = 0;
Expand Down
2 changes: 2 additions & 0 deletions libknet/transports.h
Expand Up @@ -21,4 +21,6 @@ void _close_socketpair(knet_handle_t knet_h, int *sock);
int _set_fd_tracker(knet_handle_t knet_h, int sockfd, uint8_t transport, uint8_t data_type, void *data);
int _is_valid_fd(knet_handle_t knet_h, int sockfd);

int _sendmmsg(int sockfd, struct knet_mmsghdr *msgvec, unsigned int vlen, unsigned int flags);

#endif

0 comments on commit 7ad8432

Please sign in to comment.