library: bug fix if libnuma.so unavailable, <STAT> api

All our numa logic was well encapsulated under #ifndef
NUMA_DISABLE (as ./configure --disable-numa), with the
exception of 1 case label. The reason it didn't create
any problems is because the sole consumer (top) itself
responded to the presence of #define NUMA_DISABLE too.

But if that option wasn't used, an oops still awaited.

When experimenting with a 32-bit library plus a 64-bit
kernel, a bug was revealed should the numa library not
have been found. Our 'reap' function must tolerate the
potential of a 0 return from that stacks_fetch_tics().

Now, if numa is desired but not possible, we'll be ok.

[ and, we'll build numa history from fresher sources ]

Signed-off-by: Jim Warner <james.warner@comcast.net>
This commit is contained in:
Jim Warner 2016-06-17 00:00:00 -05:00 committed by Craig Small
parent 5a244c1095
commit dea4033418

View File

@ -751,6 +751,7 @@ static int stacks_fetch_tics (
this->result.stacks = this->anchor; this->result.stacks = this->anchor;
this->fetch.dirty_stacks = 1; this->fetch.dirty_stacks = 1;
// callers beware, this might be zero (maybe no libnuma.so) ...
return this->result.total; return this->result.total;
} // end: stacks_fetch_tics } // end: stacks_fetch_tics
@ -1029,12 +1030,14 @@ PROCPS_EXPORT struct stat_reaped *procps_stat_reap (
return NULL; return NULL;
break; break;
case STAT_REAP_CPUS_AND_NODES: case STAT_REAP_CPUS_AND_NODES:
if (0 > make_numa_hist(info))
return NULL;
if (!stacks_fetch_tics(info, &info->cpus)) if (!stacks_fetch_tics(info, &info->cpus))
return NULL; return NULL;
if (!stacks_fetch_tics(info, &info->nodes)) #ifndef NUMA_DISABLE
if (0 > make_numa_hist(info))
return NULL; return NULL;
// tolerate an unexpected absence of libnuma.so ...
stacks_fetch_tics(info, &info->nodes);
#endif
break; break;
default: default:
return NULL; return NULL;