diff mbox

perf tools: ensure return negitive value when write header error

Message ID 1413428909-80017-1-git-send-email-wangnan0@huawei.com
State Superseded
Headers show

Commit Message

Wang Nan Oct. 16, 2014, 3:08 a.m. UTC
When 'perf record' write headers, it calls write_xxx in
tools/perf/util/header.c, and check return value. It rolls back all
working only when return value is negative.

This patch ensures write_cpudesc() and write_total_mem() return negative number
when error. Without this patch, headers reported by 'perf report' header is
error in some platform. Following output is caputured on ARM, which doesn't
contain "Processor" field in /proc/cpuinfo. See "cpudesc", "total memory" and
"cmdline" field.

   bash-4.2# perf record ls
   ...
   [ perf record: Woken up 1 times to write data ]
   [ perf record: Captured and wrote 0.001 MB perf.data (~36 samples) ]
   bash-4.2# perf report --stdio --header
   Error:
   The perf.data file has no samples!
   # ========
   # captured on: Fri Sep 12 10:09:10 2014
   # hostname : arma15el
   # os release : 3.17.0+
   # perf version : 3.10.53
   # arch : armv7l
   # nrcpus online : 4
   # nrcpus avail : 1
   # cpudesc : (null)
   # total memory : 0 kB
   # cmdline :
   # event : name = cycles, type = 0, config = 0x0, config1 = 0x0, config2 = 0x0, excl_usr = 0, excl_kern = 0, excl_host = 0, excl_guest = 1, precise_ip = 0
   # pmu mappings: not available
   # ========
   #

Signed-off-by: Wang Nan <wangnan0@huawei.com>
---
 tools/perf/util/header.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

Comments

Namhyung Kim Oct. 22, 2014, 7 a.m. UTC | #1
On Thu, 16 Oct 2014 11:08:29 +0800, Wang Nan wrote:
> When 'perf record' write headers, it calls write_xxx in
> tools/perf/util/header.c, and check return value. It rolls back all
> working only when return value is negative.
>
> This patch ensures write_cpudesc() and write_total_mem() return negative number
> when error. Without this patch, headers reported by 'perf report' header is
> error in some platform. Following output is caputured on ARM, which doesn't
> contain "Processor" field in /proc/cpuinfo. See "cpudesc", "total memory" and
> "cmdline" field.
>
>    bash-4.2# perf record ls
>    ...
>    [ perf record: Woken up 1 times to write data ]
>    [ perf record: Captured and wrote 0.001 MB perf.data (~36 samples) ]
>    bash-4.2# perf report --stdio --header
>    Error:
>    The perf.data file has no samples!
>    # ========
>    # captured on: Fri Sep 12 10:09:10 2014
>    # hostname : arma15el
>    # os release : 3.17.0+
>    # perf version : 3.10.53
>    # arch : armv7l
>    # nrcpus online : 4
>    # nrcpus avail : 1
>    # cpudesc : (null)
>    # total memory : 0 kB
>    # cmdline :
>    # event : name = cycles, type = 0, config = 0x0, config1 = 0x0, config2 = 0x0, excl_usr = 0, excl_kern = 0, excl_host = 0, excl_guest = 1, precise_ip = 0
>    # pmu mappings: not available
>    # ========
>    #
>
> Signed-off-by: Wang Nan <wangnan0@huawei.com>

I guess the total_memory, cmdline and pmu mappings are somehow affected
by the broken cpudesc.  Do they have their own problem on ARM?

Anyway I think it's good to check the result properly, so

Acked-by: Namhyung Kim <namhyung@kernel.org>

Thanks,
Namhyung


> ---
>  tools/perf/util/header.c | 7 +++++--
>  1 file changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
> index ce0de00..39b80ac 100644
> --- a/tools/perf/util/header.c
> +++ b/tools/perf/util/header.c
> @@ -605,8 +605,10 @@ static int write_cpudesc(int fd, struct perf_header *h __maybe_unused,
>  			break;
>  	}
>  
> -	if (ret)
> +	if (ret) {
> +		ret = -1;
>  		goto done;
> +	}
>  
>  	s = buf;
>  
> @@ -950,7 +952,8 @@ static int write_total_mem(int fd, struct perf_header *h __maybe_unused,
>  		n = sscanf(buf, "%*s %"PRIu64, &mem);
>  		if (n == 1)
>  			ret = do_write(fd, &mem, sizeof(mem));
> -	}
> +	} else
> +		ret = -1;
>  	free(buf);
>  	fclose(fp);
>  	return ret;
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/
Wang Nan Oct. 22, 2014, 7:52 a.m. UTC | #2
On 2014/10/22 15:00, Namhyung Kim wrote:
> On Thu, 16 Oct 2014 11:08:29 +0800, Wang Nan wrote:
>> When 'perf record' write headers, it calls write_xxx in
>> tools/perf/util/header.c, and check return value. It rolls back all
>> working only when return value is negative.
>>
>> This patch ensures write_cpudesc() and write_total_mem() return negative number
>> when error. Without this patch, headers reported by 'perf report' header is
>> error in some platform. Following output is caputured on ARM, which doesn't
>> contain "Processor" field in /proc/cpuinfo. See "cpudesc", "total memory" and
>> "cmdline" field.
>>
>>    bash-4.2# perf record ls
>>    ...
>>    [ perf record: Woken up 1 times to write data ]
>>    [ perf record: Captured and wrote 0.001 MB perf.data (~36 samples) ]
>>    bash-4.2# perf report --stdio --header
>>    Error:
>>    The perf.data file has no samples!
>>    # ========
>>    # captured on: Fri Sep 12 10:09:10 2014
>>    # hostname : arma15el
>>    # os release : 3.17.0+
>>    # perf version : 3.10.53
>>    # arch : armv7l
>>    # nrcpus online : 4
>>    # nrcpus avail : 1
>>    # cpudesc : (null)
>>    # total memory : 0 kB
>>    # cmdline :
>>    # event : name = cycles, type = 0, config = 0x0, config1 = 0x0, config2 = 0x0, excl_usr = 0, excl_kern = 0, excl_host = 0, excl_guest = 1, precise_ip = 0
>>    # pmu mappings: not available
>>    # ========
>>    #
>>
>> Signed-off-by: Wang Nan <wangnan0@huawei.com>
> 
> I guess the total_memory, cmdline and pmu mappings are somehow affected
> by the broken cpudesc.  Do they have their own problem on ARM?
> 

The buggy output is caused by cpudesc's problem. I didn't trigger their own problem on ARM because
'total memory' and cmdline are always success. I find the error in write_total_mem() by checking
code by hand.

Thanks.

> Anyway I think it's good to check the result properly, so
> 
> Acked-by: Namhyung Kim <namhyung@kernel.org>
> 
> Thanks,
> Namhyung
> 
> 
>> ---
>>  tools/perf/util/header.c | 7 +++++--
>>  1 file changed, 5 insertions(+), 2 deletions(-)
>>
>> diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
>> index ce0de00..39b80ac 100644
>> --- a/tools/perf/util/header.c
>> +++ b/tools/perf/util/header.c
>> @@ -605,8 +605,10 @@ static int write_cpudesc(int fd, struct perf_header *h __maybe_unused,
>>  			break;
>>  	}
>>  
>> -	if (ret)
>> +	if (ret) {
>> +		ret = -1;
>>  		goto done;
>> +	}
>>  
>>  	s = buf;
>>  
>> @@ -950,7 +952,8 @@ static int write_total_mem(int fd, struct perf_header *h __maybe_unused,
>>  		n = sscanf(buf, "%*s %"PRIu64, &mem);
>>  		if (n == 1)
>>  			ret = do_write(fd, &mem, sizeof(mem));
>> -	}
>> +	} else
>> +		ret = -1;
>>  	free(buf);
>>  	fclose(fp);
>>  	return ret;


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/
Wang Nan Oct. 23, 2014, 2:19 a.m. UTC | #3
Hi Ingo,

Could you please collect this patch which fixes a perf problem?

Thanks.

On 2014/10/22 15:00, Namhyung Kim wrote:
> On Thu, 16 Oct 2014 11:08:29 +0800, Wang Nan wrote:
>> When 'perf record' write headers, it calls write_xxx in
>> tools/perf/util/header.c, and check return value. It rolls back all
>> working only when return value is negative.
>>
>> This patch ensures write_cpudesc() and write_total_mem() return negative number
>> when error. Without this patch, headers reported by 'perf report' header is
>> error in some platform. Following output is caputured on ARM, which doesn't
>> contain "Processor" field in /proc/cpuinfo. See "cpudesc", "total memory" and
>> "cmdline" field.
>>
>>    bash-4.2# perf record ls
>>    ...
>>    [ perf record: Woken up 1 times to write data ]
>>    [ perf record: Captured and wrote 0.001 MB perf.data (~36 samples) ]
>>    bash-4.2# perf report --stdio --header
>>    Error:
>>    The perf.data file has no samples!
>>    # ========
>>    # captured on: Fri Sep 12 10:09:10 2014
>>    # hostname : arma15el
>>    # os release : 3.17.0+
>>    # perf version : 3.10.53
>>    # arch : armv7l
>>    # nrcpus online : 4
>>    # nrcpus avail : 1
>>    # cpudesc : (null)
>>    # total memory : 0 kB
>>    # cmdline :
>>    # event : name = cycles, type = 0, config = 0x0, config1 = 0x0, config2 = 0x0, excl_usr = 0, excl_kern = 0, excl_host = 0, excl_guest = 1, precise_ip = 0
>>    # pmu mappings: not available
>>    # ========
>>    #
>>
>> Signed-off-by: Wang Nan <wangnan0@huawei.com>
> 
> I guess the total_memory, cmdline and pmu mappings are somehow affected
> by the broken cpudesc.  Do they have their own problem on ARM?
> 
> Anyway I think it's good to check the result properly, so
> 
> Acked-by: Namhyung Kim <namhyung@kernel.org>
> 
> Thanks,
> Namhyung
> 
> 
>> ---
>>  tools/perf/util/header.c | 7 +++++--
>>  1 file changed, 5 insertions(+), 2 deletions(-)
>>
>> diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
>> index ce0de00..39b80ac 100644
>> --- a/tools/perf/util/header.c
>> +++ b/tools/perf/util/header.c
>> @@ -605,8 +605,10 @@ static int write_cpudesc(int fd, struct perf_header *h __maybe_unused,
>>  			break;
>>  	}
>>  
>> -	if (ret)
>> +	if (ret) {
>> +		ret = -1;
>>  		goto done;
>> +	}
>>  
>>  	s = buf;
>>  
>> @@ -950,7 +952,8 @@ static int write_total_mem(int fd, struct perf_header *h __maybe_unused,
>>  		n = sscanf(buf, "%*s %"PRIu64, &mem);
>>  		if (n == 1)
>>  			ret = do_write(fd, &mem, sizeof(mem));
>> -	}
>> +	} else
>> +		ret = -1;
>>  	free(buf);
>>  	fclose(fp);
>>  	return ret;


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/
Arnaldo Carvalho de Melo Oct. 23, 2014, 9:47 p.m. UTC | #4
Em Wed, Oct 22, 2014 at 04:00:12PM +0900, Namhyung Kim escreveu:
> On Thu, 16 Oct 2014 11:08:29 +0800, Wang Nan wrote:
> > When 'perf record' write headers, it calls write_xxx in
> > tools/perf/util/header.c, and check return value. It rolls back all
> > working only when return value is negative.
> >
> > This patch ensures write_cpudesc() and write_total_mem() return negative number
> > when error. Without this patch, headers reported by 'perf report' header is
> > error in some platform. Following output is caputured on ARM, which doesn't
> > contain "Processor" field in /proc/cpuinfo. See "cpudesc", "total memory" and
> > "cmdline" field.
> >
> >    bash-4.2# perf record ls
> >    ...
> >    [ perf record: Woken up 1 times to write data ]
> >    [ perf record: Captured and wrote 0.001 MB perf.data (~36 samples) ]
> >    bash-4.2# perf report --stdio --header
> >    Error:
> >    The perf.data file has no samples!
> >    # ========
> >    # captured on: Fri Sep 12 10:09:10 2014
> >    # hostname : arma15el
> >    # os release : 3.17.0+
> >    # perf version : 3.10.53
> >    # arch : armv7l
> >    # nrcpus online : 4
> >    # nrcpus avail : 1
> >    # cpudesc : (null)
> >    # total memory : 0 kB
> >    # cmdline :
> >    # event : name = cycles, type = 0, config = 0x0, config1 = 0x0, config2 = 0x0, excl_usr = 0, excl_kern = 0, excl_host = 0, excl_guest = 1, precise_ip = 0
> >    # pmu mappings: not available
> >    # ========
> >    #
> >
> > Signed-off-by: Wang Nan <wangnan0@huawei.com>
> 
> I guess the total_memory, cmdline and pmu mappings are somehow affected
> by the broken cpudesc.  Do they have their own problem on ARM?
> 
> Anyway I think it's good to check the result properly, so
> 
> Acked-by: Namhyung Kim <namhyung@kernel.org>

Thanks, applied

- Arnaldo
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/
diff mbox

Patch

diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index ce0de00..39b80ac 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -605,8 +605,10 @@  static int write_cpudesc(int fd, struct perf_header *h __maybe_unused,
 			break;
 	}
 
-	if (ret)
+	if (ret) {
+		ret = -1;
 		goto done;
+	}
 
 	s = buf;
 
@@ -950,7 +952,8 @@  static int write_total_mem(int fd, struct perf_header *h __maybe_unused,
 		n = sscanf(buf, "%*s %"PRIu64, &mem);
 		if (n == 1)
 			ret = do_write(fd, &mem, sizeof(mem));
-	}
+	} else
+		ret = -1;
 	free(buf);
 	fclose(fp);
 	return ret;