LKML Archive mirror
 help / color / mirror / Atom feed
* perf: commit 55b4462 causes perf record to hang
@ 2011-01-10 18:47 David Ahern
  2011-01-10 19:40 ` Arnaldo Carvalho de Melo
  2011-01-10 20:00 ` Arnaldo Carvalho de Melo
  0 siblings, 2 replies; 6+ messages in thread
From: David Ahern @ 2011-01-10 18:47 UTC (permalink / raw
  To: Thomas Gleixner, Ingo Molnar, a.p.zijlstra, paulus,
	Arnaldo Carvalho de Melo, tzanussi, imunsie
  Cc: linux-kernel, linux-perf-users

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

With latest version of perf-core branch, a variant of perf record hangs:

# /tmp/build-perf/perf record -v -e cs -fo /tmp/perf.data  -- sleep 1
couldn't open /proc/-1/status
couldn't open /proc/-1/maps
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.003 MB /tmp/perf.data (~120 samples) ]

It sits there forever. Back trace is:

(gdb) bt
#0  0x0000000000447658 in __perf_session__process_events
(session=0xab9500, data_offset=208,
    data_size=2896, file_size=3104, ops=0x685580) at util/session.c:1006
#1  0x00000000004107dd in process_buildids () at builtin-record.c:466
#2  0x000000000041084d in atexit_header () at builtin-record.c:477
#3  0x00007f45cc3e89e1 in exit () from /lib64/libc.so.6
#4  0x0000000000404749 in handle_internal_command (argc=9,
argv=0x7fffc59e2c70) at perf.c:359
#5  0x000000000040488e in run_argv (argcp=0x7fffc59e2b5c,
argv=0x7fffc59e2b50) at perf.c:403
#6  0x0000000000404a98 in main (argc=9, argv=0x7fffc59e2c70) at perf.c:489


git bisect traced the hang to

commit 55b44629f599a2305265ae9c77f9d9bcfd6ddc17
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Tue Nov 30 17:49:46 2010 +0000

    perf session: Use sensible mmap size

    On 64bit we can map the whole file in one go, on 32bit we can at
least map
    32MB and not map/unmap tiny chunks of the file.

    Base the progress bar on 1/16 of the data size.

    Preparatory patch to get rid of the malloc/memcpy/free of trace data.


If I revert the changes (attached porting of it) perf-record does not hang.

David

[-- Attachment #2: perf-hang-revert.patch --]
[-- Type: text/plain, Size: 3003 bytes --]

diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 6fb4694..5d35e13 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -143,15 +143,7 @@ struct perf_session *perf_session__new(const char *filename, int mode,
 	INIT_LIST_HEAD(&self->dead_threads);
 	self->hists_tree = RB_ROOT;
 	self->last_match = NULL;
-	/*
-	 * On 64bit we can mmap the data file in one go. No need for tiny mmap
-	 * slices. On 32bit we use 32MB.
-	 */
-#if BITS_PER_LONG == 64
-	self->mmap_window = ULLONG_MAX;
-#else
-	self->mmap_window = 32 * 1024 * 1024ULL;
-#endif
+	self->mmap_window = 32;
 	self->machines = RB_ROOT;
 	self->repipe = repipe;
 	INIT_LIST_HEAD(&self->ordered_samples.samples);
@@ -949,14 +941,19 @@ int __perf_session__process_events(struct perf_session *session,
 				   u64 data_offset, u64 data_size,
 				   u64 file_size, struct perf_event_ops *ops)
 {
-	u64 head, page_offset, file_offset, file_pos, progress_next;
+	u64 head, page_offset, file_offset, file_pos;
 	int err, mmap_prot, mmap_flags, map_idx = 0;
 	struct ui_progress *progress;
-	size_t	page_size, mmap_size;
+	size_t	page_size;
 	char *buf, *mmaps[8];
 	event_t *event;
 	uint32_t size;
 
+	progress = ui_progress__new("Processing events...", session->size);
+	if (progress == NULL)
+		return -1;
+
+
 	perf_event_ops__fill_defaults(ops);
 
 	page_size = sysconf(_SC_PAGESIZE);
@@ -968,15 +965,6 @@ int __perf_session__process_events(struct perf_session *session,
 	if (data_offset + data_size < file_size)
 		file_size = data_offset + data_size;
 
-	progress_next = file_size / 16;
-	progress = ui_progress__new("Processing events...", file_size);
-	if (progress == NULL)
-		return -1;
-
-	mmap_size = session->mmap_window;
-	if (mmap_size > file_size)
-		mmap_size = file_size;
-
 	memset(mmaps, 0, sizeof(mmaps));
 
 	mmap_prot  = PROT_READ;
@@ -987,13 +975,14 @@ int __perf_session__process_events(struct perf_session *session,
 		mmap_flags = MAP_PRIVATE;
 	}
 remap:
-	buf = mmap(NULL, mmap_size, mmap_prot, mmap_flags, session->fd,
-		   file_offset);
+	buf = mmap(NULL, page_size * session->mmap_window, mmap_prot,
+		   mmap_flags, session->fd, file_offset);
 	if (buf == MAP_FAILED) {
 		pr_err("failed to mmap file\n");
 		err = -errno;
 		goto out_err;
 	}
+	ui_progress__update(progress, file_offset);
 	mmaps[map_idx] = buf;
 	map_idx = (map_idx + 1) & (ARRAY_SIZE(mmaps) - 1);
 	file_pos = file_offset + head;
@@ -1007,9 +996,9 @@ more:
 	if (size == 0)
 		size = 8;
 
-	if (head + event->header.size >= mmap_size) {
+	if (head + event->header.size >= page_size * session->mmap_window) {
 		if (mmaps[map_idx]) {
-			munmap(mmaps[map_idx], mmap_size);
+			munmap(mmaps[map_idx], page_size * session->mmap_window);
 			mmaps[map_idx] = NULL;
 		}
 
@@ -1039,11 +1028,6 @@ more:
 	head += size;
 	file_pos += size;
 
-	if (file_pos >= progress_next) {
-		progress_next += file_size / 16;
-		ui_progress__update(progress, file_pos);
-	}
-
 	if (file_pos < file_size)
 		goto more;
 

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: perf: commit 55b4462 causes perf record to hang
  2011-01-10 18:47 perf: commit 55b4462 causes perf record to hang David Ahern
@ 2011-01-10 19:40 ` Arnaldo Carvalho de Melo
  2011-01-10 20:00 ` Arnaldo Carvalho de Melo
  1 sibling, 0 replies; 6+ messages in thread
From: Arnaldo Carvalho de Melo @ 2011-01-10 19:40 UTC (permalink / raw
  To: David Ahern
  Cc: Thomas Gleixner, Ingo Molnar, a.p.zijlstra, paulus, tzanussi,
	imunsie, linux-kernel, linux-perf-users

Em Mon, Jan 10, 2011 at 11:47:43AM -0700, David Ahern escreveu:
> With latest version of perf-core branch, a variant of perf record hangs:
> 
> # /tmp/build-perf/perf record -v -e cs -fo /tmp/perf.data  -- sleep 1
> couldn't open /proc/-1/status
> couldn't open /proc/-1/maps
> [ perf record: Woken up 1 times to write data ]
> [ perf record: Captured and wrote 0.003 MB /tmp/perf.data (~120 samples) ]
> 
> It sits there forever. Back trace is:

Yeah, this was reported by Ingo too, I was looking at it now, thanks for
bisecting it, now trying to figure out why that patch is problematic.
 
> (gdb) bt
> #0  0x0000000000447658 in __perf_session__process_events
> (session=0xab9500, data_offset=208,
>     data_size=2896, file_size=3104, ops=0x685580) at util/session.c:1006
> #1  0x00000000004107dd in process_buildids () at builtin-record.c:466
> #2  0x000000000041084d in atexit_header () at builtin-record.c:477
> #3  0x00007f45cc3e89e1 in exit () from /lib64/libc.so.6
> #4  0x0000000000404749 in handle_internal_command (argc=9,
> argv=0x7fffc59e2c70) at perf.c:359
> #5  0x000000000040488e in run_argv (argcp=0x7fffc59e2b5c,
> argv=0x7fffc59e2b50) at perf.c:403
> #6  0x0000000000404a98 in main (argc=9, argv=0x7fffc59e2c70) at perf.c:489
> 
> 
> git bisect traced the hang to
> 
> commit 55b44629f599a2305265ae9c77f9d9bcfd6ddc17
> Author: Thomas Gleixner <tglx@linutronix.de>
> Date:   Tue Nov 30 17:49:46 2010 +0000
> 
>     perf session: Use sensible mmap size
> 
>     On 64bit we can map the whole file in one go, on 32bit we can at
> least map
>     32MB and not map/unmap tiny chunks of the file.
> 
>     Base the progress bar on 1/16 of the data size.
> 
>     Preparatory patch to get rid of the malloc/memcpy/free of trace data.
> 
> 
> If I revert the changes (attached porting of it) perf-record does not hang.
> 
> David

> diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
> index 6fb4694..5d35e13 100644
> --- a/tools/perf/util/session.c
> +++ b/tools/perf/util/session.c
> @@ -143,15 +143,7 @@ struct perf_session *perf_session__new(const char *filename, int mode,
>  	INIT_LIST_HEAD(&self->dead_threads);
>  	self->hists_tree = RB_ROOT;
>  	self->last_match = NULL;
> -	/*
> -	 * On 64bit we can mmap the data file in one go. No need for tiny mmap
> -	 * slices. On 32bit we use 32MB.
> -	 */
> -#if BITS_PER_LONG == 64
> -	self->mmap_window = ULLONG_MAX;
> -#else
> -	self->mmap_window = 32 * 1024 * 1024ULL;
> -#endif
> +	self->mmap_window = 32;
>  	self->machines = RB_ROOT;
>  	self->repipe = repipe;
>  	INIT_LIST_HEAD(&self->ordered_samples.samples);
> @@ -949,14 +941,19 @@ int __perf_session__process_events(struct perf_session *session,
>  				   u64 data_offset, u64 data_size,
>  				   u64 file_size, struct perf_event_ops *ops)
>  {
> -	u64 head, page_offset, file_offset, file_pos, progress_next;
> +	u64 head, page_offset, file_offset, file_pos;
>  	int err, mmap_prot, mmap_flags, map_idx = 0;
>  	struct ui_progress *progress;
> -	size_t	page_size, mmap_size;
> +	size_t	page_size;
>  	char *buf, *mmaps[8];
>  	event_t *event;
>  	uint32_t size;
>  
> +	progress = ui_progress__new("Processing events...", session->size);
> +	if (progress == NULL)
> +		return -1;
> +
> +
>  	perf_event_ops__fill_defaults(ops);
>  
>  	page_size = sysconf(_SC_PAGESIZE);
> @@ -968,15 +965,6 @@ int __perf_session__process_events(struct perf_session *session,
>  	if (data_offset + data_size < file_size)
>  		file_size = data_offset + data_size;
>  
> -	progress_next = file_size / 16;
> -	progress = ui_progress__new("Processing events...", file_size);
> -	if (progress == NULL)
> -		return -1;
> -
> -	mmap_size = session->mmap_window;
> -	if (mmap_size > file_size)
> -		mmap_size = file_size;
> -
>  	memset(mmaps, 0, sizeof(mmaps));
>  
>  	mmap_prot  = PROT_READ;
> @@ -987,13 +975,14 @@ int __perf_session__process_events(struct perf_session *session,
>  		mmap_flags = MAP_PRIVATE;
>  	}
>  remap:
> -	buf = mmap(NULL, mmap_size, mmap_prot, mmap_flags, session->fd,
> -		   file_offset);
> +	buf = mmap(NULL, page_size * session->mmap_window, mmap_prot,
> +		   mmap_flags, session->fd, file_offset);
>  	if (buf == MAP_FAILED) {
>  		pr_err("failed to mmap file\n");
>  		err = -errno;
>  		goto out_err;
>  	}
> +	ui_progress__update(progress, file_offset);
>  	mmaps[map_idx] = buf;
>  	map_idx = (map_idx + 1) & (ARRAY_SIZE(mmaps) - 1);
>  	file_pos = file_offset + head;
> @@ -1007,9 +996,9 @@ more:
>  	if (size == 0)
>  		size = 8;
>  
> -	if (head + event->header.size >= mmap_size) {
> +	if (head + event->header.size >= page_size * session->mmap_window) {
>  		if (mmaps[map_idx]) {
> -			munmap(mmaps[map_idx], mmap_size);
> +			munmap(mmaps[map_idx], page_size * session->mmap_window);
>  			mmaps[map_idx] = NULL;
>  		}
>  
> @@ -1039,11 +1028,6 @@ more:
>  	head += size;
>  	file_pos += size;
>  
> -	if (file_pos >= progress_next) {
> -		progress_next += file_size / 16;
> -		ui_progress__update(progress, file_pos);
> -	}
> -
>  	if (file_pos < file_size)
>  		goto more;
>  


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: perf: commit 55b4462 causes perf record to hang
  2011-01-10 18:47 perf: commit 55b4462 causes perf record to hang David Ahern
  2011-01-10 19:40 ` Arnaldo Carvalho de Melo
@ 2011-01-10 20:00 ` Arnaldo Carvalho de Melo
  2011-01-10 20:07   ` David Ahern
  2011-01-11  8:28   ` Thomas Gleixner
  1 sibling, 2 replies; 6+ messages in thread
From: Arnaldo Carvalho de Melo @ 2011-01-10 20:00 UTC (permalink / raw
  To: David Ahern
  Cc: Thomas Gleixner, Ingo Molnar, Peter Zijlstra, tzanussi,
	Paul Mackerras, imunsie, linux-kernel, linux-perf-users

Em Mon, Jan 10, 2011 at 11:47:43AM -0700, David Ahern escreveu:
> With latest version of perf-core branch, a variant of perf record hangs:
> # /tmp/build-perf/perf record -v -e cs -fo /tmp/perf.data  -- sleep 1
> [ perf record: Captured and wrote 0.003 MB /tmp/perf.data (~120 samples) ]
> 
> It sits there forever. Back trace is:
> 
> (gdb) bt
> #0  0x0000000000447658 in __perf_session__process_events (session=0xab9500, data_offset=208, data_size=2896, file_size=3104, ops=0x685580) at util/session.c:1006
> #1  0x00000000004107dd in process_buildids () at builtin-record.c:466
> #2  0x000000000041084d in atexit_header () at builtin-record.c:477
 
> git bisect traced the hang to
> 
> commit 55b44629f599a2305265ae9c77f9d9bcfd6ddc17
> Author: Thomas Gleixner <tglx@linutronix.de>
> Date:   Tue Nov 30 17:49:46 2010 +0000

Can you try with this patch, not reverting tglx's patch?

diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 6fb4694..313dac2 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -1007,7 +1007,7 @@ more:
 	if (size == 0)
 		size = 8;
 
-	if (head + event->header.size >= mmap_size) {
+	if (head + event->header.size > mmap_size) {
 		if (mmaps[map_idx]) {
 			munmap(mmaps[map_idx], mmap_size);
 			mmaps[map_idx] = NULL;

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: perf: commit 55b4462 causes perf record to hang
  2011-01-10 20:00 ` Arnaldo Carvalho de Melo
@ 2011-01-10 20:07   ` David Ahern
  2011-01-11  8:28   ` Thomas Gleixner
  1 sibling, 0 replies; 6+ messages in thread
From: David Ahern @ 2011-01-10 20:07 UTC (permalink / raw
  To: Arnaldo Carvalho de Melo
  Cc: Thomas Gleixner, Ingo Molnar, Peter Zijlstra, tzanussi,
	Paul Mackerras, imunsie, linux-kernel, linux-perf-users



On 01/10/11 13:00, Arnaldo Carvalho de Melo wrote:
> Em Mon, Jan 10, 2011 at 11:47:43AM -0700, David Ahern escreveu:
>> With latest version of perf-core branch, a variant of perf record hangs:
>> # /tmp/build-perf/perf record -v -e cs -fo /tmp/perf.data  -- sleep 1
>> [ perf record: Captured and wrote 0.003 MB /tmp/perf.data (~120 samples) ]
>>
>> It sits there forever. Back trace is:
>>
>> (gdb) bt
>> #0  0x0000000000447658 in __perf_session__process_events (session=0xab9500, data_offset=208, data_size=2896, file_size=3104, ops=0x685580) at util/session.c:1006
>> #1  0x00000000004107dd in process_buildids () at builtin-record.c:466
>> #2  0x000000000041084d in atexit_header () at builtin-record.c:477
>  
>> git bisect traced the hang to
>>
>> commit 55b44629f599a2305265ae9c77f9d9bcfd6ddc17
>> Author: Thomas Gleixner <tglx@linutronix.de>
>> Date:   Tue Nov 30 17:49:46 2010 +0000
> 
> Can you try with this patch, not reverting tglx's patch?
> 
> diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
> index 6fb4694..313dac2 100644
> --- a/tools/perf/util/session.c
> +++ b/tools/perf/util/session.c
> @@ -1007,7 +1007,7 @@ more:
>  	if (size == 0)
>  		size = 8;
>  
> -	if (head + event->header.size >= mmap_size) {
> +	if (head + event->header.size > mmap_size) {
>  		if (mmaps[map_idx]) {
>  			munmap(mmaps[map_idx], mmap_size);
>  			mmaps[map_idx] = NULL;


That does the trick -- perf-record exits fine.

David


> --
> To unsubscribe from this list: send the line "unsubscribe linux-perf-users" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: perf: commit 55b4462 causes perf record to hang
  2011-01-10 20:00 ` Arnaldo Carvalho de Melo
  2011-01-10 20:07   ` David Ahern
@ 2011-01-11  8:28   ` Thomas Gleixner
  2011-01-11 11:35     ` Arnaldo Carvalho de Melo
  1 sibling, 1 reply; 6+ messages in thread
From: Thomas Gleixner @ 2011-01-11  8:28 UTC (permalink / raw
  To: Arnaldo Carvalho de Melo
  Cc: David Ahern, Ingo Molnar, Peter Zijlstra, tzanussi,
	Paul Mackerras, imunsie, linux-kernel, linux-perf-users

On Mon, 10 Jan 2011, Arnaldo Carvalho de Melo wrote:

> Em Mon, Jan 10, 2011 at 11:47:43AM -0700, David Ahern escreveu:
> > With latest version of perf-core branch, a variant of perf record hangs:
> > # /tmp/build-perf/perf record -v -e cs -fo /tmp/perf.data  -- sleep 1
> > [ perf record: Captured and wrote 0.003 MB /tmp/perf.data (~120 samples) ]
> > 
> > It sits there forever. Back trace is:
> > 
> > (gdb) bt
> > #0  0x0000000000447658 in __perf_session__process_events (session=0xab9500, data_offset=208, data_size=2896, file_size=3104, ops=0x685580) at util/session.c:1006
> > #1  0x00000000004107dd in process_buildids () at builtin-record.c:466
> > #2  0x000000000041084d in atexit_header () at builtin-record.c:477
>  
> > git bisect traced the hang to
> > 
> > commit 55b44629f599a2305265ae9c77f9d9bcfd6ddc17
> > Author: Thomas Gleixner <tglx@linutronix.de>
> > Date:   Tue Nov 30 17:49:46 2010 +0000
> 
> Can you try with this patch, not reverting tglx's patch?
> 
> diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
> index 6fb4694..313dac2 100644
> --- a/tools/perf/util/session.c
> +++ b/tools/perf/util/session.c
> @@ -1007,7 +1007,7 @@ more:
>  	if (size == 0)
>  		size = 8;
>  
> -	if (head + event->header.size >= mmap_size) {
> +	if (head + event->header.size > mmap_size) {
>  		if (mmaps[map_idx]) {
>  			munmap(mmaps[map_idx], mmap_size);
>  			mmaps[map_idx] = NULL;
> 

/me feels stupid

      tglx

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: perf: commit 55b4462 causes perf record to hang
  2011-01-11  8:28   ` Thomas Gleixner
@ 2011-01-11 11:35     ` Arnaldo Carvalho de Melo
  0 siblings, 0 replies; 6+ messages in thread
From: Arnaldo Carvalho de Melo @ 2011-01-11 11:35 UTC (permalink / raw
  To: Thomas Gleixner
  Cc: David Ahern, Ingo Molnar, Peter Zijlstra, tzanussi,
	Paul Mackerras, imunsie, linux-kernel, linux-perf-users

Em Tue, Jan 11, 2011 at 09:28:25AM +0100, Thomas Gleixner escreveu:
> On Mon, 10 Jan 2011, Arnaldo Carvalho de Melo wrote:
> > Can you try with this patch, not reverting tglx's patch?
> > 
> > diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
> > index 6fb4694..313dac2 100644
> > --- a/tools/perf/util/session.c
> > +++ b/tools/perf/util/session.c
> > @@ -1007,7 +1007,7 @@ more:
> >  	if (size == 0)
> >  		size = 8;
> >  
> > -	if (head + event->header.size >= mmap_size) {
> > +	if (head + event->header.size > mmap_size) {
> >  		if (mmaps[map_idx]) {
> >  			munmap(mmaps[map_idx], mmap_size);
> >  			mmaps[map_idx] = NULL;
> > 
> 
> /me feels stupid

I feel like that sometimes too, probably more often than you :-P

- Arnaldo

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2011-01-11 11:35 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-01-10 18:47 perf: commit 55b4462 causes perf record to hang David Ahern
2011-01-10 19:40 ` Arnaldo Carvalho de Melo
2011-01-10 20:00 ` Arnaldo Carvalho de Melo
2011-01-10 20:07   ` David Ahern
2011-01-11  8:28   ` Thomas Gleixner
2011-01-11 11:35     ` Arnaldo Carvalho de Melo

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 read-only IMAP folder(s) and NNTP newsgroup(s).