top: add some flexibility to dlopen() for numa support

A recent libnuma potential corruption problem solution
suggests that libnuma could change in the future so as
to not spew to stderr. This then raises a question how
top could exploit any such library change since we are
currently locked into version #1 of the library by way
of our dlopen("libnuma.so.1", RTLD_LAZY) runtime call.

While not an ultimate solution, this commit will first
try for the most recent version of that library during
top's startup before trying the original libnuma.so.1.
We do this via the unqualified library soname symlink.

For this new dlopen() call to succeed, technically the
numa 'devel' package would usually have been required,
but that's not always true with every distro. And when
the libnuma.so symlink isn't present, it can always be
manually added should a newer & better behaved library
arrive & users tire of the stderr warning at top exit.

Reference(s):
commit 24bd950cb2e1722d459461f0f9c0c30a4b9ffdaa

Signed-off-by: Jim Warner <james.warner@comcast.net>
This commit is contained in:
Jim Warner 2013-11-07 00:00:00 -06:00 committed by Craig Small
parent 9c776bbcde
commit bdb2fe0056

View File

@ -3246,8 +3246,9 @@ static void before (char *me) {
#if defined(PRETEND_NUMA) || defined(PRETEND8CPUS) #if defined(PRETEND_NUMA) || defined(PRETEND8CPUS)
Numa_node_tot = Numa_max_node() + 1; Numa_node_tot = Numa_max_node() + 1;
#else #else
Libnuma_handle = dlopen("libnuma.so.1", RTLD_LAZY); // we'll try for the most recent version, then a version we know works...
if (Libnuma_handle) { if ((Libnuma_handle = dlopen("libnuma.so", RTLD_LAZY))
|| (Libnuma_handle = dlopen("libnuma.so.1", RTLD_LAZY))) {
Numa_max_node = dlsym(Libnuma_handle, "numa_max_node"); Numa_max_node = dlsym(Libnuma_handle, "numa_max_node");
Numa_node_of_cpu = dlsym(Libnuma_handle, "numa_node_of_cpu"); Numa_node_of_cpu = dlsym(Libnuma_handle, "numa_node_of_cpu");
if (Numa_max_node && Numa_node_of_cpu) if (Numa_max_node && Numa_node_of_cpu)
@ -3265,7 +3266,7 @@ static void before (char *me) {
#endif #endif
// lastly, establish a robust signals environment // lastly, establish a robust signals environment
sigemptyset(&sa.sa_mask); sigemptyset(&sa.sa_mask);
// with user position perserved through SIGWINCH, we must avoid SA_RESTART // with user position preserved through SIGWINCH, we must avoid SA_RESTART
sa.sa_flags = 0; sa.sa_flags = 0;
for (i = SIGRTMAX; i; i--) { for (i = SIGRTMAX; i; i--) {
switch (i) { switch (i) {