linux-btrace.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH]  Increased limits fix for blkparse
@ 2009-02-11 19:04 Alan D. Brunelle
  0 siblings, 0 replies; only message in thread
From: Alan D. Brunelle @ 2009-02-11 19:04 UTC (permalink / raw)
  To: linux-btrace

[-- Attachment #1: Type: text/plain, Size: 0 bytes --]



[-- Attachment #2: 0001-Increased-limits-fix-for-blkparse.patch --]
[-- Type: text/x-diff, Size: 3803 bytes --]

From 3dd2a470c37c0eb3952dab12b63f5451f5d18aa8 Mon Sep 17 00:00:00 2001
From: Alan D. Brunelle <alan.brunelle@hp.com>
Date: Wed, 11 Feb 2009 13:58:14 -0500
Subject: [PATCH] Increased limits fix for blkparse

As with blktrace & btt, added in code to blkparse to handle increasing
the file limits when open errors encountered.

I'm _not_ pushing this out as Jens isn't here, and I don't feel
comfortable playing with the blkparse stuff in his tree. [Anyways, it
seems best to extract this common code and put it somewhere for
blktrace, blkparse & btt to all reference.]

I'm posting this in case anyone else is running into problems with
handling large numbers of cpus/devices. [I'm working on 32 CPUs and 88
devices right now.]

Signed-off-by: Alan D. Brunelle <alan.brunelle@hp.com>
---
 blkparse.c |   77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 72 insertions(+), 5 deletions(-)

diff --git a/blkparse.c b/blkparse.c
index ef55697..922eb19 100644
--- a/blkparse.c
+++ b/blkparse.c
@@ -31,6 +31,8 @@
 #include <signal.h>
 #include <locale.h>
 #include <libgen.h>
+#include <sys/time.h>
+#include <sys/resource.h>
 
 #include "blktrace.h"
 #include "rbtree.h"
@@ -306,6 +308,71 @@ static int have_drv_data = 0;
 #define CPU_IDX(cpu)	((cpu) / CPUS_PER_LONG)
 #define CPU_BIT(cpu)	((cpu) & (CPUS_PER_LONG - 1))
 
+/*
+ * Due to the N(devs) parts of a lot of the output features provided
+ * by btt, it will fail opens on large(ish) systems. Here we try to
+ * keep bumping our open file limits, and if those fail, we return NULL.
+ *
+ * Root users will probably be OK with this, others...
+ */
+static int increase_limit(int resource, rlim_t increase)
+{
+	struct rlimit rlim;
+	int save_errno = errno;
+
+	if (!getrlimit(resource, &rlim)) {
+		rlim.rlim_cur += increase;
+		if (rlim.rlim_cur >= rlim.rlim_max)
+			rlim.rlim_max = rlim.rlim_cur + increase;
+
+		if (!setrlimit(resource, &rlim))
+			return 1;
+	}
+
+	errno = save_errno;
+	return 0;
+}
+
+static int handle_open_failure(void)
+{
+	if (errno == ENFILE || errno == EMFILE)
+		return increase_limit(RLIMIT_NOFILE, 16);
+	return 0;
+}
+
+FILE *my_fopen(const char *path, const char *mode)
+{
+	FILE *fp;
+
+	do {
+		fp = fopen(path, mode);
+	} while (fp == NULL && handle_open_failure());
+
+	return fp;
+}
+
+FILE *my_fdopen(int fd, const char *mode)
+{
+	FILE *fp;
+
+	do {
+		fp = fdopen(fd, mode);
+	} while (fp == NULL && handle_open_failure());
+
+	return fp;
+}
+
+int my_open(const char *path, int flags)
+{
+	int fd;
+
+	do {
+		fd = open(path, flags);
+	} while (fd < 0 && handle_open_failure());
+
+	return fd;
+}
+
 static void output_binary(void *buf, int len)
 {
 	if (dump_binary) {
@@ -2434,7 +2501,7 @@ static int setup_file(struct per_dev_info *pdi, int cpu)
 	if (!st.st_size)
 		return 1;
 
-	pci->fd = open(pci->fname, O_RDONLY);
+	pci->fd = my_open(pci->fname, O_RDONLY);
 	if (pci->fd < 0) {
 		perror(pci->fname);
 		return 0;
@@ -2569,7 +2636,7 @@ static int do_fifo(void)
 	if (!strcmp(pipename, "-"))
 		fd = dup(STDIN_FILENO);
 	else
-		fd = open(pipename, O_RDONLY);
+		fd = my_open(pipename, O_RDONLY);
 
 	if (fd == -1) {
 		perror("dup stdin");
@@ -2817,13 +2884,13 @@ int main(int argc, char *argv[])
 
 	if (text_output) {
 		if (!output_name) {
-			ofp = fdopen(STDOUT_FILENO, "w");
+			ofp = my_fdopen(STDOUT_FILENO, "w");
 			mode = _IOLBF;
 		} else {
 			char ofname[128];
 
 			snprintf(ofname, sizeof(ofname) - 1, "%s", output_name);
-			ofp = fopen(ofname, "w");
+			ofp = my_fopen(ofname, "w");
 			mode = _IOFBF;
 		}
 
@@ -2840,7 +2907,7 @@ int main(int argc, char *argv[])
 	}
 
 	if (dump_binary) {
-		dump_fp = fopen(dump_binary, "w");
+		dump_fp = my_fopen(dump_binary, "w");
 		if (!dump_fp) {
 			perror(dump_binary);
 			dump_binary = NULL;
-- 
1.5.6.3


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2009-02-11 19:04 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-02-11 19:04 [PATCH] Increased limits fix for blkparse Alan D. Brunelle

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).