1
1

Improve detection of CPU affinity support (for FreeBSD and Linux).

As with several other recent commits, don't check explicitly for an
OS platform, but rather detect the various API bits that are used
to implement CPU affinity setting.
Этот коммит содержится в:
Bruce A. Mah 2014-04-14 10:45:46 -07:00
родитель 5976bac34e
Коммит 40a1faf332
4 изменённых файлов: 36 добавлений и 27 удалений

Просмотреть файл

@ -75,4 +75,13 @@ if test "x$iperf3_cv_header_flowlabel" = "xyes"; then
AC_DEFINE([HAVE_FLOWLABEL], [1], [Have IPv6 flowlabel support.])
fi
# Check for CPU affinity support. FreeBSD and Linux do this differently
# unfortunately so we have to check separately for each of them.
# FreeBSD uses cpuset_setaffinity while Linux uses sched_setaffinity.
# Define HAVE_CPU_AFFINITY to indicate the CPU affinity setting as a
# generic concept is available.
AC_CHECK_FUNCS([cpuset_setaffinity sched_setaffinity],
AC_DEFINE([HAVE_CPU_AFFINITY], [1],
[Have CPU affinity support.]))
AC_OUTPUT([Makefile src/Makefile examples/Makefile])

Просмотреть файл

@ -16,10 +16,10 @@
#include <sys/socket.h>
#include <netinet/tcp.h>
#if defined(__FreeBSD__)
#if defined(HAVE_CPUSET_SETAFFINITY)
#include <sys/param.h>
#include <sys/cpuset.h>
#endif
#endif /* HAVE_CPUSET_SETAFFINITY */
#include "timer.h"
#include "queue.h"
@ -167,9 +167,9 @@ struct iperf_test
int duration; /* total duration of test (-t flag) */
char *diskfile_name; /* -F option */
int affinity, server_affinity; /* -A option */
#if (__FreeBSD__)
#if defined(HAVE_CPUSET_SETAFFINITY)
cpuset_t cpumask;
#endif
#endif /* HAVE_CPUSET_SETAFFINITY */
char *title; /* -T option */
char *congestion; /* -C option */
char *pidfile; /* -P option */

Просмотреть файл

@ -35,10 +35,10 @@
#include <setjmp.h>
#include <stdarg.h>
#if defined(__FreeBSD__)
#if defined(HAVE_CPUSET_SETAFFINITY)
#include <sys/param.h>
#include <sys/cpuset.h>
#endif
#endif /* HAVE_CPUSET_SETAFFINITY */
#include "config.h"
#include "net.h"
@ -568,9 +568,9 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
{"zerocopy", no_argument, NULL, 'Z'},
{"omit", required_argument, NULL, 'O'},
{"file", required_argument, NULL, 'F'},
#if defined(linux) || defined(__FreeBSD__)
#if defined(HAVE_CPU_AFFINITY)
{"affinity", required_argument, NULL, 'A'},
#endif
#endif /* HAVE_CPU_AFFINITY */
{"title", required_argument, NULL, 'T'},
#if defined(HAVE_TCP_CONGESTION)
{"linux-congestion", required_argument, NULL, 'C'},
@ -587,9 +587,9 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
int flag;
int blksize;
int server_flag, client_flag, rate_flag, duration_flag;
#if defined(linux) || defined(__FreeBSD__)
#if defined(HAVE_CPU_AFFINITY)
char* comma;
#endif
#endif /* HAVE_CPU_AFFINITY */
char* slash;
blksize = 0;
@ -769,7 +769,7 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
test->diskfile_name = optarg;
break;
case 'A':
#if defined(linux) || defined(__FreeBSD__)
#if defined(HAVE_CPU_AFFINITY)
test->affinity = atoi(optarg);
if (test->affinity < 0 || test->affinity > 1024) {
i_errno = IEAFFINITY;
@ -784,10 +784,10 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
}
client_flag = 1;
}
#else
#else /* HAVE_CPU_AFFINITY */
i_errno = IEUNIMP;
return -1;
#endif
#endif /* HAVE_CPU_AFFINITY */
break;
case 'T':
test->title = strdup(optarg);
@ -1570,9 +1570,9 @@ iperf_defaults(struct iperf_test *testp)
testp->diskfile_name = (char*) 0;
testp->affinity = -1;
testp->server_affinity = -1;
#if defined(__FreeBSD__)
#if defined(HAVE_CPUSET_SETAFFINITY)
CPU_ZERO(&testp->cpumask);
#endif
#endif /* HAVE_CPUSET_SETAFFINITY */
testp->title = NULL;
testp->congestion = NULL;
testp->server_port = PORT;
@ -1754,9 +1754,9 @@ iperf_reset_test(struct iperf_test *test)
test->omit = OMIT;
test->duration = DURATION;
test->server_affinity = -1;
#if defined(__FreeBSD__)
#if defined(HAVE_CPUSET_SETAFFINITY)
CPU_ZERO(&test->cpumask);
#endif
#endif /* HAVE_CPUSET_SETAFFINITY */
test->state = 0;
if(test->title) {
@ -2578,7 +2578,7 @@ iperf_json_finish(struct iperf_test *test)
int
iperf_setaffinity(struct iperf_test *test, int affinity)
{
#ifdef linux
#if defined(HAVE_SCHED_SETAFFINITY)
cpu_set_t cpu_set;
CPU_ZERO(&cpu_set);
@ -2588,7 +2588,7 @@ iperf_setaffinity(struct iperf_test *test, int affinity)
return -1;
}
return 0;
#elif (__FreeBSD__)
#elif defined(HAVE_CPUSET_SETAFFINITY)
cpuset_t cpumask;
if(cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_PID, -1,
@ -2606,16 +2606,16 @@ iperf_setaffinity(struct iperf_test *test, int affinity)
return -1;
}
return 0;
#else /* Linux or FreeBSD */
#else /* neither HAVE_SCHED_SETAFFINITY nor HAVE_CPUSET_SETAFFINITY */
i_errno = IEAFFINITY;
return -1;
#endif /* Linux or FreeBSD*/
#endif /* neither HAVE_SCHED_SETAFFINITY nor HAVE_CPUSET_SETAFFINITY */
}
int
iperf_clearaffinity(struct iperf_test *test)
{
#ifdef linux
#if defined(HAVE_SCHED_SETAFFINITY)
cpu_set_t cpu_set;
int i;
@ -2627,17 +2627,17 @@ iperf_clearaffinity(struct iperf_test *test)
return -1;
}
return 0;
#elif (__FreeBSD__)
#elif defined(HAVE_CPUSET_SETAFFINITY)
if(cpuset_setaffinity(CPU_LEVEL_WHICH,CPU_WHICH_PID, -1,
sizeof(cpuset_t), &test->cpumask) != 0) {
i_errno = IEAFFINITY;
return -1;
}
return 0;
#else /* Linux or FreeBSD */
#else /* neither HAVE_SCHED_SETAFFINITY nor HAVE_CPUSET_SETAFFINITY */
i_errno = IEAFFINITY;
return -1;
#endif /* Linux or FreeBSD */
#endif /* neither HAVE_SCHED_SETAFFINITY nor HAVE_CPUSET_SETAFFINITY */
}
int

Просмотреть файл

@ -75,9 +75,9 @@ const char usage_longstr[] = "Usage: iperf [-s|-c host] [options]\n"
" -f, --format [kmgKMG] format to report: Kbits, Mbits, KBytes, MBytes\n"
" -i, --interval # seconds between periodic bandwidth reports\n"
" -F, --file name xmit/recv the specified file\n"
#if defined(linux) || defined(__FreeBSD__)
#if defined(HAVE_CPU_AFFINITY)
" -A, --affinity n/n,m set CPU affinity\n"
#endif
#endif /* HAVE_CPU_AFFINITY */
" -V, --verbose more detailed output\n"
" -J, --json output in JSON format\n"
" --logfile f send output to a log file\n"