mirror of https://github.com/xzeldon/htop.git
Portable affinity using hwloc
This commit is contained in:
parent
35657208d7
commit
474d26cea8
4
Action.c
4
Action.c
|
@ -271,7 +271,7 @@ static Htop_Reaction actionQuit() {
|
||||||
static Htop_Reaction actionSetAffinity(State* st) {
|
static Htop_Reaction actionSetAffinity(State* st) {
|
||||||
if (st->pl->cpuCount == 1)
|
if (st->pl->cpuCount == 1)
|
||||||
return HTOP_OK;
|
return HTOP_OK;
|
||||||
#if (HAVE_LIBHWLOC || HAVE_NATIVE_AFFINITY)
|
#if (HAVE_LIBHWLOC || HAVE_LINUX_AFFINITY)
|
||||||
Panel* panel = st->panel;
|
Panel* panel = st->panel;
|
||||||
|
|
||||||
Process* p = (Process*) Panel_getSelected(panel);
|
Process* p = (Process*) Panel_getSelected(panel);
|
||||||
|
@ -405,7 +405,7 @@ static struct { const char* key; const char* info; } helpRight[] = {
|
||||||
{ .key = " F9 k: ", .info = "kill process/tagged processes" },
|
{ .key = " F9 k: ", .info = "kill process/tagged processes" },
|
||||||
{ .key = " F7 ]: ", .info = "higher priority (root only)" },
|
{ .key = " F7 ]: ", .info = "higher priority (root only)" },
|
||||||
{ .key = " F8 [: ", .info = "lower priority (+ nice)" },
|
{ .key = " F8 [: ", .info = "lower priority (+ nice)" },
|
||||||
#if (HAVE_LIBHWLOC || HAVE_NATIVE_AFFINITY)
|
#if (HAVE_LIBHWLOC || HAVE_LINUX_AFFINITY)
|
||||||
{ .key = " a: ", .info = "set CPU affinity" },
|
{ .key = " a: ", .info = "set CPU affinity" },
|
||||||
#endif
|
#endif
|
||||||
{ .key = " e: ", .info = "show process environment" },
|
{ .key = " e: ", .info = "show process environment" },
|
||||||
|
|
19
Affinity.c
19
Affinity.c
|
@ -10,8 +10,13 @@ in the source distribution for its full text.
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#ifdef HAVE_LIBHWLOC
|
#ifdef HAVE_LIBHWLOC
|
||||||
#include <hwloc/linux.h>
|
#include <hwloc.h>
|
||||||
#elif HAVE_NATIVE_AFFINITY
|
#if __linux__
|
||||||
|
#define HTOP_HWLOC_CPUBIND_FLAG HWLOC_CPUBIND_THREAD
|
||||||
|
#else
|
||||||
|
#define HTOP_HWLOC_CPUBIND_FLAG HWLOC_CPUBIND_PROCESS
|
||||||
|
#endif
|
||||||
|
#elif HAVE_LINUX_AFFINITY
|
||||||
#include <sched.h>
|
#include <sched.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -55,7 +60,7 @@ void Affinity_add(Affinity* this, int id) {
|
||||||
|
|
||||||
Affinity* Affinity_get(Process* proc, ProcessList* pl) {
|
Affinity* Affinity_get(Process* proc, ProcessList* pl) {
|
||||||
hwloc_cpuset_t cpuset = hwloc_bitmap_alloc();
|
hwloc_cpuset_t cpuset = hwloc_bitmap_alloc();
|
||||||
bool ok = (hwloc_linux_get_tid_cpubind(pl->topology, proc->pid, cpuset) == 0);
|
bool ok = (hwloc_get_proc_cpubind(pl->topology, proc->pid, cpuset, HTOP_HWLOC_CPUBIND_FLAG) == 0);
|
||||||
Affinity* affinity = NULL;
|
Affinity* affinity = NULL;
|
||||||
if (ok) {
|
if (ok) {
|
||||||
affinity = Affinity_new(pl);
|
affinity = Affinity_new(pl);
|
||||||
|
@ -76,15 +81,15 @@ Affinity* Affinity_get(Process* proc, ProcessList* pl) {
|
||||||
|
|
||||||
bool Affinity_set(Process* proc, Affinity* this) {
|
bool Affinity_set(Process* proc, Affinity* this) {
|
||||||
hwloc_cpuset_t cpuset = hwloc_bitmap_alloc();
|
hwloc_cpuset_t cpuset = hwloc_bitmap_alloc();
|
||||||
for (int i = 0; i < affinity->used; i++) {
|
for (int i = 0; i < this->used; i++) {
|
||||||
hwloc_bitmap_set(cpuset, affinity->cpus[i]);
|
hwloc_bitmap_set(cpuset, this->cpus[i]);
|
||||||
}
|
}
|
||||||
bool ok = (hwloc_linux_set_tid_cpubind(this->pl->topology, proc->pid, cpuset) == 0);
|
bool ok = (hwloc_set_proc_cpubind(this->pl->topology, proc->pid, cpuset, HTOP_HWLOC_CPUBIND_FLAG) == 0);
|
||||||
hwloc_bitmap_free(cpuset);
|
hwloc_bitmap_free(cpuset);
|
||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif HAVE_NATIVE_AFFINITY
|
#elif HAVE_LINUX_AFFINITY
|
||||||
|
|
||||||
Affinity* Affinity_get(Process* proc, ProcessList* pl) {
|
Affinity* Affinity_get(Process* proc, ProcessList* pl) {
|
||||||
cpu_set_t cpuset;
|
cpu_set_t cpuset;
|
||||||
|
|
|
@ -10,7 +10,12 @@ in the source distribution for its full text.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef HAVE_LIBHWLOC
|
#ifdef HAVE_LIBHWLOC
|
||||||
#elif HAVE_NATIVE_AFFINITY
|
#if __linux__
|
||||||
|
#define HTOP_HWLOC_CPUBIND_FLAG HWLOC_CPUBIND_THREAD
|
||||||
|
#else
|
||||||
|
#define HTOP_HWLOC_CPUBIND_FLAG HWLOC_CPUBIND_PROCESS
|
||||||
|
#endif
|
||||||
|
#elif HAVE_LINUX_AFFINITY
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "Process.h"
|
#include "Process.h"
|
||||||
|
@ -36,7 +41,7 @@ Affinity* Affinity_get(Process* proc, ProcessList* pl);
|
||||||
|
|
||||||
bool Affinity_set(Process* proc, Affinity* this);
|
bool Affinity_set(Process* proc, Affinity* this);
|
||||||
|
|
||||||
#elif HAVE_NATIVE_AFFINITY
|
#elif HAVE_LINUX_AFFINITY
|
||||||
|
|
||||||
Affinity* Affinity_get(Process* proc, ProcessList* pl);
|
Affinity* Affinity_get(Process* proc, ProcessList* pl);
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,10 @@ in the source distribution for its full text.
|
||||||
#include "Process.h"
|
#include "Process.h"
|
||||||
#include "Settings.h"
|
#include "Settings.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBHWLOC
|
||||||
|
#include <hwloc.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef MAX_NAME
|
#ifndef MAX_NAME
|
||||||
#define MAX_NAME 128
|
#define MAX_NAME 128
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -16,6 +16,10 @@ in the source distribution for its full text.
|
||||||
#include "Process.h"
|
#include "Process.h"
|
||||||
#include "Settings.h"
|
#include "Settings.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBHWLOC
|
||||||
|
#include <hwloc.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef MAX_NAME
|
#ifndef MAX_NAME
|
||||||
#define MAX_NAME 128
|
#define MAX_NAME 128
|
||||||
#endif
|
#endif
|
||||||
|
|
12
configure.ac
12
configure.ac
|
@ -211,8 +211,8 @@ if test "$my_htop_platform" = "openbsd"; then
|
||||||
AC_CHECK_LIB([kvm], [kvm_open], [], [missing_libraries="$missing_libraries libkvm"])
|
AC_CHECK_LIB([kvm], [kvm_open], [], [missing_libraries="$missing_libraries libkvm"])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_ARG_ENABLE(native_affinity, [AC_HELP_STRING([--enable-native-affinity], [enable native sched_setaffinity and sched_getaffinity for affinity support, disables hwloc])], ,enable_native_affinity="yes")
|
AC_ARG_ENABLE(linux_affinity, [AC_HELP_STRING([--enable-linux-affinity], [enable Linux sched_setaffinity and sched_getaffinity for affinity support, disables hwloc])], ,enable_linux_affinity="yes")
|
||||||
if test "x$enable_native_affinity" = xyes -a "x$cross_compiling" = xno; then
|
if test "x$enable_linux_affinity" = xyes -a "x$cross_compiling" = xno; then
|
||||||
AC_MSG_CHECKING([for usable sched_setaffinity])
|
AC_MSG_CHECKING([for usable sched_setaffinity])
|
||||||
AC_RUN_IFELSE([
|
AC_RUN_IFELSE([
|
||||||
AC_LANG_PROGRAM([[
|
AC_LANG_PROGRAM([[
|
||||||
|
@ -225,17 +225,17 @@ if test "x$enable_native_affinity" = xyes -a "x$cross_compiling" = xno; then
|
||||||
if (errno == ENOSYS) return 1;
|
if (errno == ENOSYS) return 1;
|
||||||
]])],
|
]])],
|
||||||
[AC_MSG_RESULT([yes])],
|
[AC_MSG_RESULT([yes])],
|
||||||
[enable_native_affinity=no
|
[enable_linux_affinity=no
|
||||||
AC_MSG_RESULT([no])])
|
AC_MSG_RESULT([no])])
|
||||||
fi
|
fi
|
||||||
if test "x$enable_native_affinity" = xyes; then
|
if test "x$enable_linux_affinity" = xyes; then
|
||||||
AC_DEFINE(HAVE_NATIVE_AFFINITY, 1, [Define if native sched_setaffinity and sched_getaffinity are to be used.])
|
AC_DEFINE(HAVE_LINUX_AFFINITY, 1, [Define if Linux sched_setaffinity and sched_getaffinity are to be used.])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_ARG_ENABLE(hwloc, [AC_HELP_STRING([--enable-hwloc], [enable hwloc support for CPU affinity])],, enable_hwloc="no")
|
AC_ARG_ENABLE(hwloc, [AC_HELP_STRING([--enable-hwloc], [enable hwloc support for CPU affinity])],, enable_hwloc="no")
|
||||||
if test "x$enable_hwloc" = xyes
|
if test "x$enable_hwloc" = xyes
|
||||||
then
|
then
|
||||||
AC_CHECK_LIB([hwloc], [hwloc_linux_get_tid_cpubind], [], [missing_libraries="$missing_libraries libhwloc"])
|
AC_CHECK_LIB([hwloc], [hwloc_get_proc_cpubind], [], [missing_libraries="$missing_libraries libhwloc"])
|
||||||
AC_CHECK_HEADERS([hwloc.h],[:], [missing_headers="$missing_headers $ac_header"])
|
AC_CHECK_HEADERS([hwloc.h],[:], [missing_headers="$missing_headers $ac_header"])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue