All of lore.kernel.org
 help / color / mirror / Atom feed
From: Cyril Hrubis <chrubis@suse.cz>
To: ltp@lists.linux.it
Subject: [LTP] [PATCH ltp] Add Intel PT full trace mode basic test case
Date: Tue, 11 Sep 2018 12:31:07 +0200	[thread overview]
Message-ID: <20180911103107.GA5168@rei> (raw)
In-Reply-To: <20180911023329.9376-1-ammy.yi@intel.com>

Hi!
> +++ b/testcases/kernel/tracing/pt_test/Makefile
> @@ -0,0 +1,21 @@
> +# Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved.
                       ^
		       This looks like obvious copy&paste mistake

> +# This program is free software; you can redistribute it and/or
> +# modify it under the terms of the GNU General Public License as
> +# published by the Free Software Foundation; either version 2 of
> +# the License, or (at your option) any later version.
> +#
> +# This program is distributed in the hope that it would be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program; if not, write the Free Software Foundation,
> +# Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
> +
> +top_srcdir		?= ../../../..
> +
> +include $(top_srcdir)/include/mk/testcases.mk
> +include $(top_srcdir)/testcases/kernel/mem/include/libmem.mk
   ^
   I doubt that this is needed here
> +include $(top_srcdir)/include/mk/generic_leaf_target.mk
> \ No newline at end of file
^
Missing newline at the end of file

> diff --git a/testcases/kernel/tracing/pt_test/pt_test.c b/testcases/kernel/tracing/pt_test/pt_test.c
> new file mode 100644
> index 000000000..0e85652e5
> --- /dev/null
> +++ b/testcases/kernel/tracing/pt_test/pt_test.c
> @@ -0,0 +1,207 @@
> +/*
> + * Copyright (C) 2018 Intel Corporation
> + *
> + * This program is free software: you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation, either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program. If not, see <http://www.gnu.org/licenses/>.
> + *
> + * author: Ammy Yi (ammy.yi@intel.com)
> + * date:   8/20/2018
> + */
> +
> +/*
> + * This test will check if Intel PT(Intel Processer Trace) full trace mode is
> + * working. It is only applied on X86 platforms.
> + */
> +
> +#include "tst_test.h"
> +#include <linux/perf_event.h>
> +#include <sys/syscall.h>
> +#include <sched.h>
> +#include <stdlib.h>
> +#include <stdio.h>
> +
> +#define PAGESIZE 4096
> +#define INTEL_PT_MEMSIZE 17*PAGESIZE
> +
> +#define BIT(nr)                 (1UL << (nr))
> +
> +#define INTEL_PT_PMU_TYPE "/sys/devices/intel_pt/type"
> +#define INTEL_PT_FORMAT_TSC "/sys/devices/intel_pt/format/tsc"
> +#define INTEL_PT_FORMAT_NRT "/sys/devices/intel_pt/format/noretcomp"
> +
> +//Intel PT event handle
> +int FDE = -1;
> +//map head and size
> +uint64_t ** BUFM = NULL;
> +long BUFSZ = 0;
> +
> +/*
> + * mapping management
> + */

Please avoid commenting the obvious.

> +uint64_t ** creaMap(int fde,long bufsize)
> +{
> +	int PROTo;
> +	long pbufSz;
> +	uint64_t **bufEv;
> +	struct perf_event_mmap_page *pc;
> +
> +	bufEv = malloc(2*sizeof(uint64_t *));
> +	if (!bufEv) {
> +		return NULL;
> +	}

You should use SAFE_MALLOC() instead.

> +	PROTo = PROT_READ | PROT_WRITE;
> +
> +	pbufSz = INTEL_PT_MEMSIZE;
> +
> +	bufEv[0] = mmap(NULL, pbufSz, PROT_READ | PROT_WRITE, MAP_SHARED, fde, 0);

SAFE_MMAP() here.

> +	if (bufEv[0]!=MAP_FAILED) {
> +		pc=(struct perf_event_mmap_page *)bufEv[0];
> +		pc->aux_offset=pbufSz;
> +		pc->aux_size=bufsize;
> +		bufEv[1] = mmap(NULL, bufsize, PROTo, MAP_SHARED, fde, pbufSz);

And here.

> +
> +	}
> +	return bufEv;
> +}
> +
> +
> +/*
> + * get sysfs value
> + */

Here as well, do not comment the obvious.

> +int Intel_PT_pmu_value(char *dir)
> +{
> +	char *value;
> +	int temp = 0, val = 0;
> +	char delims[] = ":";
> +	FILE *f = fopen(dir, "r");
> +
> +	if (f) {
> +		temp = fscanf(f, "%m[^\n]", &value);
> +		if (temp != 1){
> +			tst_res(TINFO, "Read value fail!");
> +        }
> +		else {
> +			if (strstr(value, delims) == NULL){
> +				val = atoi(value);
> +			}
> +			else {
> +				strsep(&value, delims);
> +				val = atoi(value);
> +			}
> +		}
> +		fclose(f);
> +	}
> +
> +	return val;
> +}

We do have SAFE_FILE_SCANF() that does exactly this.

> +void delMap(uint64_t **bufEv,long bufsize)
> +{
> +	long pbufSz;
> +
> +	pbufSz = INTEL_PT_MEMSIZE;
> +
> +	munmap(bufEv[0],pbufSz);
> +	munmap(bufEv[1],bufsize);
> +
> +	free(bufEv);
> +}
> +
> +/*
> + * Will test Intel PT Full Trace mode working normal
> + */

And here as well.

> +static void INTEL_PT_FULL_TRACE_CHECK(void)
> +{
> +	struct perf_event_attr attr = {};
> +	struct perf_event_mmap_page *pmp;
> +	uint64_t aux_head = 0;
> +	BUFSZ = 2 * PAGESIZE;
> +	//set attr for Intel PT trace
> +	attr.type			= Intel_PT_pmu_value(INTEL_PT_PMU_TYPE);
> +	attr.read_format		= PERF_FORMAT_ID | PERF_FORMAT_TOTAL_TIME_RUNNING | PERF_FORMAT_TOTAL_TIME_ENABLED;
> +	attr.disabled			= 1;
> +	attr.config			= BIT(Intel_PT_pmu_value(INTEL_PT_FORMAT_TSC)) | BIT(Intel_PT_pmu_value(INTEL_PT_FORMAT_NRT));
> +	attr.size			= sizeof(struct perf_event_attr);
> +	attr.exclude_kernel		= 0;
> +	attr.exclude_user		= 0;
> +	attr.mmap			= 1;
> +
> +	//only get trace for own pid
> +	FDE = syscall(__NR_perf_event_open, &attr, 0, -1, -1, 0);

You have to use tst_syscall() here and include lapi/syscalls.h instead
of sys/syscall.h.

> +	if (FDE < 0) {
> +		tst_res(TINFO,"Open Intel PT event failed!");
> +		tst_res(TFAIL, "perf trace full mode is failed!");
> +		return;
> +	}
> +
> +	/* allocate memory for trace */
> +	BUFM =  creaMap(FDE,BUFSZ);
> +
> +	if (!BUFM || (BUFM)[0]==MAP_FAILED || (BUFM)[1]==MAP_FAILED) {
> +		tst_res(TINFO,"creaMap failed!");
> +		tst_res(TFAIL, "perf trace full mode is failed!");
> +		return;
> +	}
> +
> +	/* enable tracing */
> +	if(ioctl(FDE, PERF_EVENT_IOC_RESET) != 0) {
> +		tst_res(TFAIL, "ioctl with PERF_EVENT_IOC_RESET is failed!");
> +		return;
> +	}
> +	if(ioctl(FDE, PERF_EVENT_IOC_ENABLE) != 0) {
> +		tst_res(TFAIL, "ioctl with PERF_EVENT_IOC_ENABLE is failed!");
> +		return;
> +	}

We do have SAFE_IOCTL() as well.

> +	/* stop tracing */
> +	if(ioctl(FDE, PERF_EVENT_IOC_DISABLE) != 0) {
> +		tst_res(TFAIL, "ioctl with PERF_EVENT_IOC_DISABLE is failed!");
> +		return;
> +	}
> +
> +	// check if there is some trace generated
> +	pmp = (struct perf_event_mmap_page *)BUFM[0];
> +	aux_head = *(volatile uint64_t *)&pmp->aux_head;
> +	if(aux_head == 0) {
> +		tst_res(TFAIL, "There is no trace, so failed!");
> +		return;
> +	}
> +
> +	tst_res(TPASS, "perf trace full mode is passed!");
> +
> +}
> +
> +/*
> +* clean up for Intel PT test.
> +*/

And here as well.

> +void Cleanup(void) {
> +
> +	//close device id

This is even more obvious comment, please avoid adding comments like
that.

> +	if(FDE != -1){
> +		close(FDE);
> +	}
> +	// free memory

Here as well.

> +	if (!BUFM || (BUFM)[0]==MAP_FAILED || (BUFM)[1]==MAP_FAILED){
> +		delMap(BUFM,BUFSZ);
> +	}
> +}
> +
> +static struct tst_test test = {
> +	.test_all = INTEL_PT_FULL_TRACE_CHECK,
> +	.min_kver = "4.1",
> +	.cleanup = Cleanup,
> +	.needs_root = 1,
> +};

There are various coding-style violations in the code that should be
fixed, you can check for these with the chechpatch.pl script that is
shipped with linux kernel sources.

-- 
Cyril Hrubis
chrubis@suse.cz

      reply	other threads:[~2018-09-11 10:31 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-11  2:33 [LTP] [PATCH ltp] Add Intel PT full trace mode basic test case Ammy Yi
2018-09-11 10:31 ` Cyril Hrubis [this message]

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=20180911103107.GA5168@rei \
    --to=chrubis@suse.cz \
    --cc=ltp@lists.linux.it \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.