Print this page
11871 smatch should not hammer linux procfs path
Reviewed by: John Levon <john.levon@joyent.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/tools/smatch/src/smatch_mem_tracker.c
          +++ new/usr/src/tools/smatch/src/smatch_mem_tracker.c
↓ open down ↓ 8 lines elided ↑ open up ↑
   9    9   * This program is distributed in the hope that it will be useful,
  10   10   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11   11   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12   12   * GNU General Public License for more details.
  13   13   *
  14   14   * You should have received a copy of the GNU General Public License
  15   15   * along with this program; if not, see http://www.gnu.org/copyleft/gpl.txt
  16   16   */
  17   17  
  18   18  #include "smatch.h"
       19 +#include <fcntl.h>
  19   20  #include <unistd.h>
       21 +#include <sys/procfs.h>
  20   22  
  21   23  static int my_id;
       24 +static int my_fd = -2;
  22   25  
  23   26  static unsigned long max_size;
  24   27  
  25   28  unsigned long get_mem_kb(void)
  26   29  {
  27      -        FILE *file;
  28      -        char buf[1024];
  29      -        unsigned long size;
       30 +        prpsinfo_t pbuf;
  30   31  
  31      -        file = fopen("/proc/self/statm", "r");
  32      -        if (!file)
  33      -                return 0;
  34      -        fread(buf, 1, sizeof(buf), file);
  35      -        fclose(file);
       32 +        if (my_fd == -2) {
       33 +                /* Do not repeatedly attempt this if it fails. */
       34 +                my_fd = open("/proc/self/psinfo", O_RDONLY);
       35 +        }
       36 +        if (my_fd == -1) {
       37 +                return (0);
       38 +        }
  36   39  
  37      -        size = strtoul(buf, NULL, 10);
  38      -        size = size * sysconf(_SC_PAGESIZE) / 1024;
  39      -        return size;
       40 +        if (pread(my_fd, &pbuf, sizeof (pbuf), 0) != sizeof (pbuf)) {
       41 +                return (0);
       42 +        }
       43 +
       44 +        return (pbuf.pr_rssize);
  40   45  }
  41   46  
  42   47  static void match_end_func(struct symbol *sym)
  43   48  {
  44   49          unsigned long size;
  45   50  
  46   51          if (option_mem) {
  47   52                  size = get_mem_kb();
  48   53                  if (size > max_size)
  49   54                          max_size = size;
↓ open down ↓ 14 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX