From mboxrd@z Thu Jan 1 00:00:00 1970 From: George Beshers Date: Mon, 05 Mar 2007 20:34:44 +0000 Subject: PATCH udev-106 /proc/stat buffer to small Message-Id: <45EC7EE4.5000903@sgi.com> MIME-Version: 1 Content-Type: multipart/mixed; boundary="------------060707090209010509050609" List-Id: To: linux-hotplug@vger.kernel.org This is a multi-part message in MIME format. --------------060707090209010509050609 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit I am assuming that this is the correct place to post udev patches for consideration, feel free to inform me otherwise :-). George --------------060707090209010509050609 Content-Type: text/x-patch; name="udev.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="udev.patch" This came up on a system with 1024cores (well 768cpus and 256 hyper-threads) where the buffer size for reading /proc/stat was not large enough causing udev to fail during the boot process. The read_proc_stat(void) eliminates this problem. routine makes sure that the --- udev-105/udevd.c 2007-02-02 19:24:48.000000000 -0500 +++ udev-105.new/udevd.c 2007-02-19 13:47:54.000000000 -0500 @@ -357,25 +357,58 @@ return memsize / 1024; } -static int cpu_count(void) +/* + * Use the same buffer for cpu_count() and running_processes() + */ + +static char* stat_buf = NULL; +static int stat_buf_size = 4096; + +static int read_proc_stat(void) { int f; - char buf[32768]; int len; - const char *pos; - int count = 0; - f = open("/proc/stat", O_RDONLY); - if (f == -1) - return -1; + if (stat_buf == NULL) { + stat_buf = malloc(stat_buf_size); + if (stat_buf == NULL) + return -1; + } - len = read(f, buf, sizeof(buf)-1); + do { + f = open("/proc/stat", O_RDONLY); + if (f == -1) + return -1; + + len = read(f, stat_buf, stat_buf_size-1); + if (len < stat_buf_size-1) + break; + + stat_buf_size *= 2; + stat_buf = realloc(stat_buf, stat_buf_size); + if (stat_buf == NULL) + return -1; + } while (1); close(f); + if (len <= 0) return -1; - buf[len] = '\0'; + stat_buf[len] = '\0'; + return len; +} + - pos = strstr(buf, "cpu"); +static int cpu_count(void) +{ + int len; + const char *pos; + int count = 0; + + len = read_proc_stat(); + if (len <= 0) + return -1; + + pos = strstr(stat_buf, "cpu"); if (pos == NULL) return -1; @@ -392,23 +425,15 @@ static int running_processes(void) { - int f; - char buf[32768]; int len; int running; const char *pos; - f = open("/proc/stat", O_RDONLY); - if (f == -1) - return -1; - - len = read(f, buf, sizeof(buf)-1); - close(f); + len = read_proc_stat(); if (len <= 0) return -1; - buf[len] = '\0'; - pos = strstr(buf, "procs_running "); + pos = strstr(stat_buf, "procs_running "); if (pos == NULL) return -1; --------------060707090209010509050609 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys-and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV --------------060707090209010509050609 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Linux-hotplug-devel mailing list http://linux-hotplug.sourceforge.net Linux-hotplug-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel --------------060707090209010509050609--