linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jiri Olsa <jolsa@kernel.org>
To: linux-kernel@vger.kernel.org
Cc: Jiri Olsa <jolsa@kernel.org>,
	Arnaldo Carvalho de Melo <acme@kernel.org>,
	Corey Ashford <cjashfor@linux.vnet.ibm.com>,
	David Ahern <dsahern@gmail.com>,
	Frederic Weisbecker <fweisbec@gmail.com>,
	Ingo Molnar <mingo@kernel.org>,
	Jean Pihet <jean.pihet@linaro.org>,
	Namhyung Kim <namhyung@kernel.org>,
	Paul Mackerras <paulus@samba.org>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>
Subject: [PATCH 07/14] perf tools: Add file size check and factor dso__data_read_offset
Date: Thu, 15 May 2014 19:23:28 +0200	[thread overview]
Message-ID: <1400174615-2121-8-git-send-email-jolsa@kernel.org> (raw)
In-Reply-To: <1400174615-2121-1-git-send-email-jolsa@kernel.org>

Adding file size check, because the lseek will succeed
for any offset behind file size. Factoring the code
the check the offset earli in the flow.

Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jean Pihet <jean.pihet@linaro.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/dso.c | 78 ++++++++++++++++++++++++++++++++++++++-------------
 tools/perf/util/dso.h |  1 +
 2 files changed, 59 insertions(+), 20 deletions(-)

diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c
index 316e087..ad0e2da 100644
--- a/tools/perf/util/dso.c
+++ b/tools/perf/util/dso.c
@@ -197,6 +197,7 @@ static void close_data_fd(struct dso *dso)
 	if (dso->data.fd >= 0) {
 		close(dso->data.fd);
 		dso->data.fd = -1;
+		dso->data.file_size = 0;
 		dso__list_del(dso);
 	}
 }
@@ -366,17 +367,10 @@ dso_cache__memcpy(struct dso_cache *cache, u64 offset,
 }
 
 static ssize_t
-dso_cache__read(struct dso *dso, struct machine *machine,
-		 u64 offset, u8 *data, ssize_t size)
+dso_cache__read(struct dso *dso, u64 offset, u8 *data, ssize_t size)
 {
-	bool new_fd = dso->data.fd == -1;
 	struct dso_cache *cache;
 	ssize_t ret;
-	int fd;
-
-	fd = dso__data_fd(dso, machine);
-	if (fd < 0)
-		return -1;
 
 	do {
 		u64 cache_offset;
@@ -390,10 +384,10 @@ dso_cache__read(struct dso *dso, struct machine *machine,
 		cache_offset = offset & DSO__DATA_CACHE_MASK;
 		ret = -EINVAL;
 
-		if (-1 == lseek(fd, cache_offset, SEEK_SET))
+		if (-1 == lseek(dso->data.fd, cache_offset, SEEK_SET))
 			break;
 
-		ret = read(fd, cache->data, DSO__DATA_CACHE_SIZE);
+		ret = read(dso->data.fd, cache->data, DSO__DATA_CACHE_SIZE);
 		if (ret <= 0)
 			break;
 
@@ -408,15 +402,11 @@ dso_cache__read(struct dso *dso, struct machine *machine,
 	if (ret <= 0)
 		free(cache);
 
-	/* Check the cache only if we just added new fd. */
-	if (new_fd)
-		data_close();
-
 	return ret;
 }
 
-static ssize_t dso_cache_read(struct dso *dso, struct machine *machine,
-			      u64 offset, u8 *data, ssize_t size)
+static ssize_t dso_cache_read(struct dso *dso, u64 offset,
+			      u8 *data, ssize_t size)
 {
 	struct dso_cache *cache;
 
@@ -424,11 +414,10 @@ static ssize_t dso_cache_read(struct dso *dso, struct machine *machine,
 	if (cache)
 		return dso_cache__memcpy(cache, offset, data, size);
 	else
-		return dso_cache__read(dso, machine, offset, data, size);
+		return dso_cache__read(dso, offset, data, size);
 }
 
-ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine,
-			      u64 offset, u8 *data, ssize_t size)
+static ssize_t cached_read(struct dso *dso, u64 offset, u8 *data, ssize_t size)
 {
 	ssize_t r = 0;
 	u8 *p = data;
@@ -436,7 +425,7 @@ ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine,
 	do {
 		ssize_t ret;
 
-		ret = dso_cache_read(dso, machine, offset, p, size);
+		ret = dso_cache_read(dso, offset, p, size);
 		if (ret < 0)
 			return ret;
 
@@ -456,6 +445,55 @@ ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine,
 	return r;
 }
 
+static int data_file_size(struct dso *dso)
+{
+	struct stat st;
+
+	if (!dso->data.file_size) {
+		if (fstat(dso->data.fd, &st)) {
+			pr_err("dso mmap failed, fstat: %s\n", strerror(errno));
+			return -1;
+		}
+		dso->data.file_size = st.st_size;
+	}
+
+	return 0;
+}
+
+static ssize_t data_read_offset(struct dso *dso, u64 offset,
+				u8 *data, ssize_t size)
+{
+	if (data_file_size(dso))
+		return -1;
+
+	/* Check the offset sanity. */
+	if (offset > dso->data.file_size)
+		return -1;
+
+	if (offset + size < offset)
+		return -1;
+
+	return cached_read(dso, offset, data, size);
+}
+
+ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine,
+			      u64 offset, u8 *data, ssize_t size)
+{
+	bool new_fd = dso->data.fd == -1;
+	ssize_t ret;
+
+	if (dso__data_fd(dso, machine) < 0)
+		return -1;
+
+	ret = data_read_offset(dso, offset, data, size);
+
+	/* Check the cache only if we just added new fd. */
+	if (new_fd)
+		data_close();
+
+	return ret;
+}
+
 ssize_t dso__data_read_addr(struct dso *dso, struct map *map,
 			    struct machine *machine, u64 addr,
 			    u8 *data, ssize_t size)
diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h
index 90988bf..da47b13 100644
--- a/tools/perf/util/dso.h
+++ b/tools/perf/util/dso.h
@@ -103,6 +103,7 @@ struct dso {
 	struct {
 		struct rb_root	 cache;
 		int		 fd;
+		size_t		 file_size;
 		struct list_head open_entry;
 	} data;
 
-- 
1.8.3.1


  parent reply	other threads:[~2014-05-15 17:24 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-15 17:23 [PATCHv2 00/14] perf tools: Speedup DWARF unwind Jiri Olsa
2014-05-15 17:23 ` [PATCH 01/14] perf tools: Cache register accesses for unwind processing Jiri Olsa
2014-05-15 17:23 ` [PATCH 02/14] perf tools: Separate dso data related variables Jiri Olsa
2014-05-15 17:23 ` [PATCH 03/14] perf tools: Add data_fd into dso object Jiri Olsa
2014-05-15 17:23 ` [PATCH 04/14] perf tools: Add global list of opened dso objects Jiri Olsa
2014-05-15 17:23 ` [PATCH 05/14] perf tools: Add global count " Jiri Olsa
2014-05-15 17:23 ` [PATCH 06/14] perf tools: Cache dso data file descriptor Jiri Olsa
2014-05-27  1:05   ` Namhyung Kim
2014-05-27  7:37     ` Jiri Olsa
2014-05-29  0:02       ` Namhyung Kim
2014-05-29  9:01         ` Jiri Olsa
2014-05-15 17:23 ` Jiri Olsa [this message]
2014-05-15 17:23 ` [PATCH 08/14] perf tools: Allow to close dso fd in case of open failure Jiri Olsa
2014-05-15 17:23 ` [PATCH 09/14] perf tools: Add dso__data_* interface descriptons Jiri Olsa
2014-05-27  1:06   ` Namhyung Kim
2014-05-27  7:38     ` Jiri Olsa
2014-05-15 17:23 ` [PATCH 10/14] perf tests: Spawn child for each test Jiri Olsa
2014-05-27  1:08   ` Namhyung Kim
2014-05-27  7:39     ` Jiri Olsa
2014-05-15 17:23 ` [PATCH 11/14] perf tests: Allow reuse of test_file function Jiri Olsa
2014-05-15 17:23 ` [PATCH 12/14] perf tests: Add test interface for dso data fd limit Jiri Olsa
2014-05-27  1:10   ` Namhyung Kim
2014-05-27  7:51     ` Jiri Olsa
2014-05-15 17:23 ` [PATCH 13/14] perf tests: Add test for caching dso file descriptors Jiri Olsa
2014-05-27  1:36   ` Namhyung Kim
2014-05-27  7:54     ` Jiri Olsa
2014-05-29  0:06       ` Namhyung Kim
2014-05-29  8:37         ` Jiri Olsa
2014-05-30  2:11           ` Namhyung Kim
2014-05-30  8:42             ` Jiri Olsa
2014-05-15 17:23 ` [PATCH 14/14] perf tests: Add test for closing dso objects on EMFILE error Jiri Olsa
2014-05-27  1:43   ` Namhyung Kim
2014-05-27  7:59     ` Jiri Olsa
2014-05-23  8:13 ` [PATCHv2 00/14] perf tools: Speedup DWARF unwind Jiri Olsa
2014-05-23 13:26   ` Jean Pihet
2014-05-26 17:36     ` Jiri Olsa

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1400174615-2121-8-git-send-email-jolsa@kernel.org \
    --to=jolsa@kernel.org \
    --cc=a.p.zijlstra@chello.nl \
    --cc=acme@kernel.org \
    --cc=cjashfor@linux.vnet.ibm.com \
    --cc=dsahern@gmail.com \
    --cc=fweisbec@gmail.com \
    --cc=jean.pihet@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=namhyung@kernel.org \
    --cc=paulus@samba.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).