All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
To: Julien Desfossez <jdesfossez@efficios.com>
Cc: lttng-dev <lttng-dev@lists.lttng.org>
Subject: Re: [PATCH lttng-ust v2 2/2] Add perf context support for ARMv7
Date: Mon, 27 Jun 2016 21:13:04 +0000 (UTC)	[thread overview]
Message-ID: <2016242403.50143.1467061984638.JavaMail.zimbra__49937.3771752746$1467062007$gmane$org@efficios.com> (raw)
In-Reply-To: <1466722365-2436-2-git-send-email-jdesfossez@efficios.com>

----- On Jun 23, 2016, at 6:52 PM, Julien Desfossez jdesfossez@efficios.com wrote:

> Allow to add perf context to UST traces. ARMv7 does not have a reliable
> way to read perf PMU counters entirely from user-space like we do on
> x86, so this approach requires a system call every time a counter needs
> to be read which has a significant performance impact.
> 
> ARMv7 does not have way to read PMU from userspace because it requires
> write access to the debug coprocessor to select which PMU counter to
> read which defeats user-space/kernel protection. For that reason, the
> bits required to allow user-space access to those registers are not
> enabled in the kernel and Perf does not expose any information in the
> shared mmap page, so we do not know what is the counter index. Also, for
> ARMv7 we cannot the exclude_kernel flag, so the counter stays active

we cannot .. set ?

> even when the process is executing in kernel context (system calls
> mainly).
> 
> This generic approach might work on other architecture, but it has not
> yet been tested so it is not enabled in the code.
> 
> Signed-off-by: Julien Desfossez <jdesfossez@efficios.com>
> ---
> configure.ac                               |  1 +
> liblttng-ust-ctl/ustctl.c                  |  2 +-
> liblttng-ust/lttng-context-perf-counters.c | 84 +++++++++++++++++++++---------
> 3 files changed, 62 insertions(+), 25 deletions(-)
> 
> diff --git a/configure.ac b/configure.ac
> index de462ff..5475640 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -219,6 +219,7 @@ AS_CASE([$host_cpu],
> 	[i[[3456]]86], [UST_SUPPORT_FOR_ARCH_PERF_EVENT_COUNTERS=yes],
> 	[x86_64], [UST_SUPPORT_FOR_ARCH_PERF_EVENT_COUNTERS=yes],
> 	[amd64], [UST_SUPPORT_FOR_ARCH_PERF_EVENT_COUNTERS=yes],
> +	[armv7l], [UST_SUPPORT_FOR_ARCH_PERF_EVENT_COUNTERS=yes],
> 	[UST_SUPPORT_FOR_ARCH_PERF_EVENT_COUNTERS=no])
> AC_MSG_RESULT([$UST_SUPPORT_FOR_ARCH_PERF_EVENT_COUNTERS])
> 
> diff --git a/liblttng-ust-ctl/ustctl.c b/liblttng-ust-ctl/ustctl.c
> index 0165786..97445d5 100644
> --- a/liblttng-ust-ctl/ustctl.c
> +++ b/liblttng-ust-ctl/ustctl.c
> @@ -1742,7 +1742,7 @@ int ustctl_get_instance_id(struct ustctl_consumer_stream
> *stream,
> 	return client_cb->instance_id(buf, handle, id);
> }
> 
> -#if defined(__x86_64__) || defined(__i386__)
> +#if defined(__x86_64__) || defined(__i386__) || defined(__ARM_ARCH_7A__)
> 
> int ustctl_has_perf_counters(void)
> {
> diff --git a/liblttng-ust/lttng-context-perf-counters.c
> b/liblttng-ust/lttng-context-perf-counters.c
> index 725b1b4..a981aa9 100644
> --- a/liblttng-ust/lttng-context-perf-counters.c
> +++ b/liblttng-ust/lttng-context-perf-counters.c
> @@ -91,17 +91,13 @@ uint64_t rdpmc(unsigned int counter)
> 	return low | ((uint64_t) high) << 32;
> }
> 
> -#else /* defined(__x86_64__) || defined(__i386__) */
> -
> -#error "Perf event counters are only supported on x86 so far."
> -
> -#endif /* #else defined(__x86_64__) || defined(__i386__) */
> -
> static
> -uint64_t read_perf_counter(struct perf_event_mmap_page *pc)
> +uint64_t read_perf_counter(
> +		struct lttng_perf_counter_thread_field *thread_field)
> {
> 	uint32_t seq, idx;
> 	uint64_t count;
> +	struct perf_event_mmap_page *pc = thread_field->pc;
> 
> 	if (caa_unlikely(!pc))
> 		return 0;
> @@ -122,6 +118,29 @@ uint64_t read_perf_counter(struct perf_event_mmap_page *pc)
> 	return count;
> }
> 
> +#elif defined (__ARM_ARCH_7A__)
> +
> +static
> +uint64_t read_perf_counter(
> +		struct lttng_perf_counter_thread_field *thread_field)
> +{
> +	uint64_t count;
> +
> +	if (caa_unlikely(thread_field->fd < 0))
> +		return 0;
> +
> +	if (read(thread_field->fd, &count, sizeof(count)) < sizeof(count))

^ This could also be a caa_unlikely().

Thanks,

Mathieu

> +		return 0;
> +
> +	return count;
> +}
> +
> +#else /* defined(__x86_64__) || defined(__i386__) || defined(__ARM_ARCH_7A__)
> */
> +
> +#error "Perf event counters are only supported on x86 and ARMv7 so far."
> +
> +#endif /* #else defined(__x86_64__) || defined(__i386__) ||
> defined(__ARM_ARCH_7A__) */
> +
> static
> int sys_perf_event_open(struct perf_event_attr *attr,
> 		pid_t pid, int cpu, int group_fd,
> @@ -144,6 +163,20 @@ int open_perf_fd(struct perf_event_attr *attr)
> }
> 
> static
> +void close_perf_fd(int fd)
> +{
> +	int ret;
> +
> +	if (fd < 0)
> +		return;
> +
> +	ret = close(fd);
> +	if (ret) {
> +		perror("Error closing LTTng-UST perf memory mapping FD");
> +	}
> +}
> +
> +static
> struct perf_event_mmap_page *setup_perf(
> 		struct lttng_perf_counter_thread_field *thread_field)
> {
> @@ -160,25 +193,10 @@ struct perf_event_mmap_page *setup_perf(
> 	thread_field->fd = -1;
> #endif
> 
> -end:
> 	return perf_addr;
> }
> 
> static
> -void close_perf_fd(int fd)
> -{
> -	int ret;
> -
> -	if (fd < 0)
> -		return;
> -
> -	ret = close(fd);
> -	if (ret) {
> -		perror("Error closing LTTng-UST perf memory mapping FD");
> -	}
> -}
> -
> -static
> void unmap_perf_page(struct perf_event_mmap_page *pc)
> {
> 	int ret;
> @@ -292,7 +310,7 @@ uint64_t wrapper_perf_counter_read(struct lttng_ctx_field
> *field)
> 
> 	perf_field = field->u.perf_counter;
> 	perf_thread_field = get_thread_field(perf_field);
> -	return read_perf_counter(perf_thread_field->pc);
> +	return read_perf_counter(perf_thread_field);
> }
> 
> static
> @@ -363,6 +381,24 @@ void lttng_destroy_perf_counter_field(struct
> lttng_ctx_field *field)
> 	free(perf_field);
> }
> 
> +#ifdef __ARM_ARCH_7A__
> +
> +static
> +int perf_get_exclude_kernel(void)
> +{
> +	return 0;
> +}
> +
> +#else /* __ARM_ARCH_7A__ */
> +
> +static
> +int perf_get_exclude_kernel(void)
> +{
> +	return 1;
> +}
> +
> +#endif /* __ARM_ARCH_7A__ */
> +
> /* Called with UST lock held */
> int lttng_add_perf_counter_to_ctx(uint32_t type,
> 				uint64_t config,
> @@ -413,7 +449,7 @@ int lttng_add_perf_counter_to_ctx(uint32_t type,
> 
> 	perf_field->attr.type = type;
> 	perf_field->attr.config = config;
> -	perf_field->attr.exclude_kernel = 1;
> +	perf_field->attr.exclude_kernel = perf_get_exclude_kernel();
> 	CDS_INIT_LIST_HEAD(&perf_field->thread_field_list);
> 	field->u.perf_counter = perf_field;
> 
> --
> 1.9.1

-- 
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
_______________________________________________
lttng-dev mailing list
lttng-dev@lists.lttng.org
https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

      parent reply	other threads:[~2016-06-27 21:13 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <1466722365-2436-1-git-send-email-jdesfossez@efficios.com>
2016-06-23 22:52 ` [PATCH lttng-ust v2 2/2] Add perf context support for ARMv7 Julien Desfossez
2016-06-27 21:09 ` [PATCH lttng-ust v2 1/2] Keep perf context FD open for other architectures Mathieu Desnoyers
     [not found] ` <1466722365-2436-2-git-send-email-jdesfossez@efficios.com>
2016-06-27 21:13   ` Mathieu Desnoyers [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='2016242403.50143.1467061984638.JavaMail.zimbra__49937.3771752746$1467062007$gmane$org@efficios.com' \
    --to=mathieu.desnoyers@efficios.com \
    --cc=jdesfossez@efficios.com \
    --cc=lttng-dev@lists.lttng.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 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.