2013/6/3 Michael Ellerman <michael@xxxxxxxxxxxxxx>: > I was hitting this on my system, where it's 65536. So fix the todo and > read it from /proc. > > I left a fallback to the hardcoded values in case /proc is not mounted > or something else goes wrong. Looks good to me, but please also fclose() in read_pid_max(). > --- > include/pids.h | 1 + > pids.c | 41 ++++++++++++++++++++++++++++++++++++----- > trinity.c | 2 ++ > 3 files changed, 39 insertions(+), 5 deletions(-) > > diff --git a/include/pids.h b/include/pids.h > index 6a19630..b93ec4c 100644 > --- a/include/pids.h > +++ b/include/pids.h > @@ -14,6 +14,7 @@ int find_pid_slot(pid_t mypid); > bool pidmap_empty(void); > void dump_pid_slots(void); > int pid_is_valid(pid_t); > +void pids_init(void); > > #define pid_alive(_pid) kill(_pid, 0) > > diff --git a/pids.c b/pids.c > index 7b8a73b..cfdd5d8 100644 > --- a/pids.c > +++ b/pids.c > @@ -36,17 +36,48 @@ void dump_pid_slots(void) > printf("## slot%d: %d\n", i, shm->pids[i]); > } > > -int pid_is_valid(pid_t pid) > +static pid_t pidmax; > + > +int read_pid_max(void) > { > - pid_t pidmax; > + unsigned long result; > + char *end, buf[32]; > + FILE *fp; > + > + fp = fopen("/proc/sys/kernel/pid_max", "r"); > + if (!fp) { > + perror("fopen"); > + return -1; > + } > + > + if (!fgets(buf, sizeof(buf), fp)) > + return -1; > + > + result = strtoul(buf, &end, 10); > + if (end == buf) > + return -1; > + > + pidmax = result; > + > + return 0; > +} > > -// FIXME: Read this from /proc/sys/kernel/pid_max on startup > +void pids_init(void) > +{ > + if (read_pid_max()) { > #ifdef __x86_64__ > - pidmax = 4194304; > + pidmax = 4194304; > #else > - pidmax = 32768; > + pidmax = 32768; > #endif > + printf("Couldn't read pid_max from proc\n"); > + } > > + printf("Using pid_max = %d\n", pidmax); > +} > + > +int pid_is_valid(pid_t pid) > +{ > if ((pid > pidmax) || (pid < 1)) { > output(0, "Sanity check failed! Found pid %d!\n", pid); > return FALSE; > diff --git a/trinity.c b/trinity.c > index b95d287..0b88150 100644 > --- a/trinity.c > +++ b/trinity.c > @@ -212,6 +212,8 @@ int main(int argc, char* argv[]) > > parse_devices(); > > + pids_init(); > + > setup_main_signals(); > > if (check_tainted() != 0) { > -- > 1.7.10.4 > > -- > To unsubscribe from this list: send the line "unsubscribe trinity" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe trinity" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html